Problem z dodaniem rekordu po Query.Insert

0

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 :)

0
('INSERT INTO adresy (id_klienta, miejscowosc, kod, ulica_i_nr) VALUES (LAST_INSERT_ID(),:p2,:p3,:p4)');
0

Dzięki za odpowiedź. Kod który mi podałeś fajnie skraca mój i zaraz go wprowadziłem ale nie rozwiązuje problemu. Nadal po zapisie wyrzuca błąd że id_klienta nie posiada wartości a po wyjściu z programu w bazie jest wszystko dobrze przypisane. Skrócony kod wygląda tak:

    DataModule2.UniSQL1.SQL.Clear;
    DataModule2.UniSQL1.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)');

    DataModule2.UniSQL1.ParamByName('p1').AsString := DBADVEdit1.Text;
    DataModule2.UniSQL1.ParamByName('p2').AsString := DBADVEdit2.Text;
    DataModule2.UniSQL1.ParamByName('p3').AsString := DBADVEdit3.Text;
    DataModule2.UniSQL1.ParamByName('p4').AsString := DBADVEdit4.Text;
    DataModule2.UniSQL1.ParamByName('p5').AsString := DBADVEdit5.Text;
    DataModule2.UniSQL1.ParamByName('p6').AsString := DBADVEdit6.Text;
    DataModule2.UniSQL1.ParamByName('p7').AsString := DBADVEdit7.Text;
    DataModule2.UniSQL1.ParamByName('p8').AsString := DBADVEdit8.Text;
    DataModule2.UniSQL1.ParamByName('p9').AsString := DBADVEdit9.Text;
    DataModule2.UniSQL1.ParamByName('p10').AsString := DBADVEdit10.Text;
    DataModule2.UniSQL1.Execute;

    DataModule2.UniSQL1.SQL.Clear;
    DataModule2.UniSQL1.SQL.Add('INSERT INTO adresy (id_klienta, miejscowosc, kod, ulica_i_nr) VALUES (LAST_INSERT_ID(),:p2,:p3,:p4)');

    DataModule2.UniSQL1.ParamByName('p2').AsString := DBADVEdit12.Text;
    DataModule2.UniSQL1.ParamByName('p3').AsString := DBADVEdit13.Text;
    DataModule2.UniSQL1.ParamByName('p4').AsString := DBADVEdit14.Text;
    DataModule2.UniSQL1.Execute;

Jak wykonam ten kod bez wcześniejszego Query.Insert to wszystko gra, ładnie dopisuje bez wyrzucania błędu, ale jak najpierw dam Query.Insert (żeby był nowy wiersz) to po zapisie wyrzuca bład. Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1