In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Stephan
********
Beiträge: 10596
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von Stephan » So, 14.01.2018 16:28

Hallo,

meine Datenbank (interne HSLQB) enthält zwei Tabellen mit folgender Beziehung. Dabei sind FID (nur in Firmen) und MID Primärschlüssel mit Autowerten.

Tabellen-Beziehungen.gif
Tabellen-Beziehungen.gif (9.72 KiB) 2663 mal betrachtet

Die Datenbank-Tabellen sollen nur aus einem Basic-Dialog (kein Formular) mit Daten befüllt werden, hierzu enthält der Dialog alle nötigen Felder (Firma, Abteilung, PLZ, Ort, Strasse, Name, Vorname, Email, Durchwahl).

Der Eintrag in die Datenbank erfolgt nun zuerst in die Tabelle "Firmen" mittels:

Code: Alles auswählen

Sub neuer_datensatz()
'Testdaten (zukünftig aus Dialog auslesen)
x1 = "Firma1"
x2 = "Abteilung1"
x3 = "12345"
x4 = "Testort"
x5 = "Teststrasse"

oDatenquelle = thisDatabaseDocument.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
	oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "INSERT INTO ""Firmen"" (""Firma"", ""Abteilung"", ""PLZ"", ""Ort"", ""Strasse"") " _
	& "VALUES ('"+x1+"','"+x2+"','"+x3+"','"+x4+"','"+x5+"')"
oSQL_Anweisung.executeUpdate(stSql)
End Sub
anschliessend würde ich den für diesen Datensatz automatisch erzeugten Wert für "FID" ermiteln indem ich per SQL für den gerade eingetragenen Datensatz die "FID" abfrage.

Die ermittelte "FID" kann ich nun für die zweite Tabelle ("Mitarbeiter") nutzen um dort die restlichen Werte einzutragen.


Ist dieses Vorgehen der einzig mögliche Weg komplette Datensätze per Makro einzutragen, wenn "FID" und "MID" als Autowerte definiert sein sollen, d.h. muss ich immer erst in Tabelle "Firmen" schreiben damit Base den Autowert für "FID" erzeugt, dann den Autowert auslesen und kann dann erst, in Kenntnis von "FID" in der zweiten Tabelle die zugehörigen Werte eintragen? Oder geht das auch anders?

(ich hoffe ich gehe richtig in der Annahme das das Einbeziehen einer Abfrage prinzipiell nicht helfen kann, weil ja eine Abfrage immer nur Daten aus Tabellen 'zieht' aber nicht Daten in Tabellen übergeben kann)



Gruß
Stephan

RobertG
*******
Beiträge: 1720
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von RobertG » So, 14.01.2018 17:21

Hallo Stephan,

sofern der Fremdschlüssel in Mitarbeiter auch leer bleiben darf (NULL), dann kannst Du auch anders herum befüllen. Damit erzeugst Du dann aber mehr Abfragen und machst es Dir unnötig kompliziert. Mit

Code: Alles auswählen

stSql = "CALL IDENTITY()"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
inID = oAbfrageergebnis.getLong(1)
WEND
erhältst Du den zuletzt vergebenen Wert für ein automatisch vergebenes Primärschlüsselfeld.

Du müsstest bei dem anderen Verfahren also:
Mitarbeiter eingeben (INSERT)
Mitarbeiter ID auslesen (CALL) und als Variable speichern
Firma eingeben (INSERT)
Firma ID auslesen (CALL)
Mitarbeiter Firma ID einfügen (UPDATE für FirmaID WHERE MitarbeiterID = ...)

Folglich: 5 Arbeitsschritte

Umgekehrt:
Firma eingeben (INSERT)
Firma ID auslesen (CALL)
Mitarbeiter eingeben (INSERT)

Nur 3 Arbeitsschritte.

Gruß

Robert

F3K Total
********
Beiträge: 3237
Registriert: Mo, 28.02.2011 17:49

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von F3K Total » So, 14.01.2018 17:32

Hallo Stephan,
ich habe im HSQL-User Guide noch einen anderen Weg gefunden:
In the following example, the identity value for the first INSERT statement is generated automatically using the DEFAULT
keyword. The second INSERT statement uses a call to the IDENTITY() function to populate a row in the
child table with the generated identity value.

CREATE TABLE star (id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,firstname VARCHAR(20),lastname VARCHAR(20))
CREATE TABLE movies (starid INTEGER, movieid INTEGER PRIMARY KEY, title VARCHAR(40))
INSERT INTO star (id, firstname, lastname) VALUES (DEFAULT, 'Felix', 'the Cat')
INSERT INTO movies (starid, movieid, title) VALUES (IDENTITY(), 10, 'Felix in Hollywood')
Das habe ich versucht, DEFAULT bringt einen Fehler, wenn aber die Auto-ID Felder weggelassen werden, funktioniert es:

Code: Alles auswählen

INSERT INTO "Firmen" ("Firma","Abteilung",PLZ,"Ort","Strasse") VALUES ('XXX','ABC','DE-12345','M-ORT','S-Strasse');
INSERT INTO "Mitarbeiter"(FID,"Name" ,"Vorname","Email" ,"Durchwahl") VALUES (IDENTITY(),'Meyer', 'Horst','Horst.Meyer@Firma.com','1234567')
So wird die zunächst erzeugte FID direkt in die Mitarbeitertabelle übernommen.
Gruß R

Stephan
********
Beiträge: 10596
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von Stephan » So, 14.01.2018 17:46

Hallo Robert,
RobertG hat geschrieben:
So, 14.01.2018 17:21
Mit

Code: Alles auswählen

stSql = "CALL IDENTITY()"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
inID = oAbfrageergebnis.getLong(1)
WEND
erhältst Du den zuletzt vergebenen Wert für ein automatisch vergebenes Primärschlüsselfeld.
interessant, das spart Arbeit (ich hatte vor es mit WHERE und diversen AND zu machen)
Du müsstest bei dem anderen Verfahren also:
Mitarbeiter eingeben (INSERT)
Mitarbeiter ID auslesen (CALL) und als Variable speichern
Firma eingeben (INSERT)
Firma ID auslesen (CALL)
Mitarbeiter Firma ID einfügen (UPDATE für FirmaID WHERE MitarbeiterID = ...)

Folglich: 5 Arbeitsschritte

Umgekehrt:
Firma eingeben (INSERT)
Firma ID auslesen (CALL)
Mitarbeiter eingeben (INSERT)

Nur 3 Arbeitsschritte.
OK, dann lag ich ja richtig.


Gruß
Stephan

Stephan
********
Beiträge: 10596
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von Stephan » So, 14.01.2018 18:10

Hallo F3K Total,
Das habe ich versucht, DEFAULT bringt einen Fehler, wenn aber die Auto-ID Felder weggelassen werden, funktioniert es:
Das ist noch etwas eleganter.

Leider muss in Praxis wohl trotzdem eine Verzweigung in den Code, denn "FID" in Mitarbeiter sollte nur geschrieben wenn zumindest ein sonstiges Datenfeld in "Mitarbeiter" Inhalt hat - ich habe das nicht erwähnt, aber in Praxis wird es auch unvollständige Datensätze geben dürfen und hierbei wird es wohl auch Datensätze zu Firmen ganz ohne Mitarbeitereintrag geben.


Gruß
Stephan

F3K Total
********
Beiträge: 3237
Registriert: Mo, 28.02.2011 17:49

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von F3K Total » So, 14.01.2018 18:35

Hallo Stephan,
Stephan hat geschrieben:
So, 14.01.2018 18:10
Das ist noch etwas eleganter.
denke ich auch, und wenn es keinen Mitarbeiter gibt, muss man nur die zweite INSERT-Zeile weglassen.
Gruß R

RobertG
*******
Beiträge: 1720
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von RobertG » So, 14.01.2018 20:01

Hallo R,

habe ich natürlich direkt in das Handbuch übernommen.

Gruß

Robert

F3K Total
********
Beiträge: 3237
Registriert: Mo, 28.02.2011 17:49

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von F3K Total » So, 14.01.2018 20:12

Hallo Robert,
Klasse!
Kann ggf. mal gebraucht werden, meist, per verknüpftem Unterformular, braucht man das ja nicht.

Gruß Rik

Stephan
********
Beiträge: 10596
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: In Datenbank mit verbundenen Tabellen per Basic Datensätze schreiben

Beitrag von Stephan » So, 14.01.2018 20:16

und wenn es keinen Mitarbeiter gibt, muss man nur die zweite INSERT-Zeile weglassen
das meinte ich mit "Verzweigung", denn im Code ist diese Prüfung (ob ein Mitarbeiter eingetragen werden soll) ja ein If-Then.


Gruß
Stephan

Antworten