Witam
Mam taki problem. Chce dodać nowy wpis w 2 tabelach bazy MySQL, ale jest to dość skomplikowane bo tabele wyglądają tak że są w nich obu klucze obce, wygląda to mniej więcej tak :
Tabela klienci:
id_klienta
nip
id_adresu_do_faktury(klucz tabeli adresy)
id_adresu_do_wysylki(klucz tabeli adresy)
Tabela Adresy:
id_adresu
id_klienta(klucz tabeli klienci)
miejscowosc
kod
ulica
I teraz pobieram sobie dane aktualnie zaznaczonego wiersza z tych tabel do dbEditow(w celu zrobienia takeigo formularza). Mam 2 przyciski Dodaj i Zapisz. Po dodaj mam wpisane Query.Insert a pod zapisz coś takigo:
var
OstatnieIdKlienci : Integer;
begin
if not DM.bazaConnection.InTransaction then // sprawdzenie czy ktoś już nie jest w transakcji
DM.UniTransactionZapiszKlienta.StartTransaction;
try
DM.UniQueryZapiszKlienta.Connection.Open;
DM.UniQueryZapiszKlienta.Close;
DM.UniQueryZapiszKlienta.SQL.Clear;
DM.UniQueryZapiszKlienta.SQL.Add('INSERT INTO klienci (nip, nazwa_firmy, id_adresu_do_faktury, id_adresu_do_wysylki,id_dystrybutora, znizka, adres_email, bilans_konta,id_uzytkownika,aktywny ) VALUES (:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10)');
DM.UniQueryZapiszKlienta.ParamByName('p1').AsString := DBENip.Text;
DM.UniQueryZapiszKlienta.ParamByName('p2').AsString := DBENazwaFirmy.Text;
DM.UniQueryZapiszKlienta.ParamByName('p3').AsString := DBEIdDoFaktury.Text;
DM.UniQueryZapiszKlienta.ParamByName('p4').AsString := DBEIdDoWysylki.Text;
DM.UniQueryZapiszKlienta.ParamByName('p5').AsString := DBEIdDystrybutora.Text;
DM.UniQueryZapiszKlienta.ParamByName('p6').AsString := DBEZnizka.Text;
DM.UniQueryZapiszKlienta.ParamByName('p7').AsString := DBEEmail.Text;
DM.UniQueryZapiszKlienta.ParamByName('p8').AsString := DBEBilansKonta.Text;
DM.UniQueryZapiszKlienta.ParamByName('p9').AsString := DBEIdUzytkownika.Text;
DM.UniQueryZapiszKlienta.ParamByName('p10').AsString := DBEAktywny.Text;
DM.UniQueryZapiszKlienta.Execute;
DM.UniQueryZapiszKlienta.Close;
DM.UniQueryZapiszKlienta.SQL.Clear;
DM.UniQueryZapiszKlienta.SQL.Add('SELECT @@IDENTITY AS OstatnieID');
DM.UniQueryZapiszKlienta.Open;
OstatnieIdKlienci := DM.UniQueryZapiszKlienta.FieldByName('OstatnieId').AsInteger;
DM.UniQueryZapiszKlienta.Close;
DM.UniQueryZapiszKlienta.SQL.Clear;
DM.UniQueryZapiszKlienta.SQL.Add('INSERT INTO adresy (id_klienta, miejscowosc, kod, ulica_i_nr) VALUES (:p1,:p2,:p3,:p4)');
DM.UniQueryZapiszKlienta.ParamByName('p1').AsString := IntToStr(OstatnieIdKlienci);
DM.UniQueryZapiszKlienta.ParamByName('p2').AsString := DBeMiejscowosc.Text;
DM.UniQueryZapiszKlienta.ParamByName('p3').AsString := DBeKod.Text;
DM.UniQueryZapiszKlienta.ParamByName('p4').AsString := DBeUlica_i_nr.Text;
DM.UniQueryZapiszKlienta.Execute;
DM.UniTransactionZapiszKlienta.Commit; // proba zatwierdzenia i zamknięcia transakcji
XDBGrid1.RefreshDataSet;
except
DM.UniTransactionZapiszKlienta.Rollback;
end;
end;
I teraz po kliknięciu zapisz wyskakuje błąd że id_klienta w tabli adresy musi mieć wartość, ale jak zamknę program to wszystko w bazie jest dobrze zapisane. Wydaję mi się że program to wykonuje 2 razy najpierw wykonując execute a potem zamykając wcześniej otwarty Query.Insert, bo zrobiłem to także wykorzystując zwykle edity gdzie nie musze dawać przycisku Dodaj(pod którym jest Query.Insert) i wszystko śmiga. Ma ktoś może pomysł jak to rozwiązać? Dzięki za podpowiedzi :)