Autor Beitrag
mrbean_001
Hält's aus hier
Beiträge: 7

XP prof SP3
Delphi 2009 Prof, MyAccess
BeitragVerfasst: Fr 29.05.09 13:36 
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.
ausblenden volle Höhe 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 ;

    // begin address_book
    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 address_book
      if true then
      begin
      ShowMessage('Daten wurden gespeichert');
      end;
    E_Herr.Checked;
    E_Nachname.Clear;
    E_Vorname.Clear;

    end;


Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
ffgorcky
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 573

WIN XP/2000 & 7Prof (Familie:Win95,Win98)

BeitragVerfasst: 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.
ausblenden volle Höhe 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' ;
//also ist hier die if-else-Abfrage zu ende!


if not (E_Nachname.Text=''then
    MyCommand1.ParamByName('E_Nachname').Value := E_Nachname.Text
else
  begin
  ShowMessage('Bitte den Nachnamen eingeben');
  fehlerVorhanden:=true;    
  end//also ist hier die if-else-Abfrage zu ende!    
if not E_Vorname.Text = '' then
  MyCommand1.ParamByName('E_Vorname').Value := E_Vorname.Text
else
  begin
  ShowMessage('Bitte den Vornamen eingeben');
  fehlerVorhanden:=true;
  end//also ist hier die if-else-Abfrage zu ende!

if not fehlerVorhanden then
   begin
   MyCommand1.Execute ;

    // begin address_book
    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' ;
    //also ist hier die if-else-Abfrage zu ende!
      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 Threadstarter
Hält's aus hier
Beiträge: 7

XP prof SP3
Delphi 2009 Prof, MyAccess
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7

XP prof SP3
Delphi 2009 Prof, MyAccess
BeitragVerfasst: 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.
ausblenden 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 user profile iconNarses: Delphi-Tags hinzugefügt