Entwickler-Ecke
Datenbanken - Aus einem Formular ein "insert into" in zwei odemehrer table
mrbean_001 - Fr 29.05.09 13:36
Titel: Aus einem Formular ein "insert into" in zwei odemehrer table
Ich möchte aus einem Formular die Eingaben über mehrere Tabellen verteilen.
Wie kann ich z.B. die KundenID, die in customers als AutoIncrement weiterverwenden.
Diese KundenID soll der AddressID zugeordnet werden, um eine eindeutige Zuweisung zu erhalten.
Kann ich am Anfang irgendwie die customers_id deklarieren, sodass ich immer darauf zurückgreifen kann, wie
z.B. in php : $customers_id = ($_POST['customers_id']);
$customers_firstname= ($_POST['customers_firstname']);
$customers_lastname= ($_POST['customers_lastname']);
und über ein array
$sql_data_array = array('customers_firstname' => $firstname,
'customers_lastname' => $lastname);
über ein queryeinfügen und verteilen kann.
Ich hoffe, dass jemand mir diesbezüglich vielleicht helfen kann.
Besten Dank im voraus
Nachfolgen der bisherige code, der zwar geht, aber eben von einem Newbee.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| begin
MyCommand1.SQL.Text := 'INSERT INTO akp_customers (customers_id, customers_gender, customers_firstname, customers_lastname) VALUES ('''', :E_Gender, :E_Nachname, :E_Vorname);'; if E_Frau.Checked =true then MyCommand1.ParamByName('E_Gender').Value := 'f' else MyCommand1.ParamByName('E_Gender').Value := 'm' ;
MyCommand1.ParamByName('E_Nachname').Value := E_Nachname.Text; MyCommand1.ParamByName('E_Vorname').Value := E_Vorname.Text;
if E_Nachname.Text = '' then begin ShowMessage('Bitte den Nachnamen eingeben'); exit; end; if E_Vorname.Text = '' then begin ShowMessage('Bitte den Vornamen eingeben'); exit; end; MyCommand1.Execute ;
MyCommand2.SQL.Text := 'INSERT INTO akp_address_book (address_book_id, customers_id, entry_gender, entry_firstname, entry_lastname) VALUES ('''','''', :E_Gender, :E_Nachname, :E_Vorname);'; if E_Frau.Checked =true then MyCommand2.ParamByName('E_Gender').Value := 'f' else MyCommand2.ParamByName('E_Gender').Value := 'm' ; MyCommand2.ParamByName('E_Nachname').Value := E_Nachname.Text; MyCommand2.ParamByName('E_Vorname').Value := E_Vorname.Text;
MyCommand2.Execute ; MyCommand3.SQL.Text := 'update akp_address_book set customers_id = address_book_id '; MyCommand3.Execute ;
if true then begin ShowMessage('Daten wurden gespeichert'); end; E_Herr.Checked; E_Nachname.Clear; E_Vorname.Clear;
end; |
Moderiert von
Narses: Delphi-Tags hinzugefügt
ffgorcky - Sa 30.05.09 11:55
Also ich hätte den Quelltext eher so geschrieben (was ja aber eigendlich jeder so macht, wie er es gerne möchte):
Wobei ich die Hinweise "//also ist hier die if-else-Abfrage zu ende!" normalerweise auch nicht schreibe.
Ich hoffe nur, dass ich jetzt keine Fehler eingebaut habe.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| begin MyCommand1.SQL.Text := 'INSERT INTO akp_customers (customers_id,customers_gender,customers_firstname, customers_lastname) VALUES ('''', :E_Gender, :E_Nachname, :E_Vorname);'; if E_Frau.Checked =true then MyCommand1.ParamByName('E_Gender').Value := 'f' else MyCommand1.ParamByName('E_Gender').Value := 'm' ;
if not (E_Nachname.Text='') then MyCommand1.ParamByName('E_Nachname').Value := E_Nachname.Text else begin ShowMessage('Bitte den Nachnamen eingeben'); fehlerVorhanden:=true; end; if not E_Vorname.Text = '' then MyCommand1.ParamByName('E_Vorname').Value := E_Vorname.Text else begin ShowMessage('Bitte den Vornamen eingeben'); fehlerVorhanden:=true; end; if not fehlerVorhanden then begin MyCommand1.Execute ;
MyCommand2.SQL.Text := 'INSERT INTO akp_address_book (address_book_id, customers_id, entry_gender, entry_firstname, entry_lastname) VALUES ('''','''', :E_Gender, :E_Nachname, :E_Vorname);'; if E_Frau.Checked =true then MyCommand2.ParamByName('E_Gender').Value := 'f' else MyCommand2.ParamByName('E_Gender').Value := 'm' ; MyCommand2.ParamByName('E_Nachname').Value := E_Nachname.Text; MyCommand2.ParamByName('E_Vorname').Value := E_Vorname.Text;
MyCommand2.Execute ; MyCommand3.SQL.Text := 'update akp_address_book set customers_id = address_book_id '; MyCommand3.Execute ; end; end; |
Aber ich sehe jetzt leider nicht, wo Du der
address_book_id einen Wert zuweist.
mrbean_001 - Sa 30.05.09 12:46
Danke erst einmal für deine Antwort.
Die address_book_id ist AutoIncrement von der table adress_book, die nach dem Ausführen von MyCommand2.SQL.Text gefüllt ist. Das Update, wie du siehst setzt lediglich die beiden IDs gleich. Das ist keine optimale Lösung, da die customers_id nicht wirklich aus der table customers kommt. Wenn z.B. ein truncate in einer table durchgeführt wird, ist das update hinfällig; es wird eine falsche ID zugewiesen.
Meine Vorstellung: Die Eingaben aus den EditFeldern irgendwie zwischenspeichern und dann auf die entsprechenden Tabellen verteilen, möglichst in einem Rutsch. Habe schon wieder Stunden damit verbracht, nach Möglichkeit zu suchen, und hoffe nun auf Hilfe.
Danke im voraus für eure Hilfe
mrbean_001 - So 31.05.09 12:41
Lösung gefunden!!!
Wieder ein Schritt weiter; selbst die grösste Reise beginnt mit dem ersten Schritt.
Aus der Tabelle "customers" wird die customers_id mit
LAST_INSERT_ID() ermittelt.
LAST_INSERT_ID() wird im nächsten (address_book) INSERT INTO an die entsprechende Stelle gesetzt, das war's.
Delphi-Quelltext
1:
| MyCommand2.SQL.Text := 'INSERT INTO akp_address_book (address_book_id, customers_id, entry_gender, entry_firstname, entry_lastname) VALUES ('''',[b]LAST_INSERT_ID()[/b], :E_Gender, :E_Nachname, :E_Vorname);'; |
Die nächste Frage kommt mit Sicherheit.
Danke erst einmal an Alle für deren Inspiration
Moderiert von
Narses: Delphi-Tags hinzugefügt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!