Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   CallBack nach Query Refresh (https://www.delphipraxis.net/206158-callback-nach-query-refresh.html)

Ykcim 24. Nov 2020 17:30

Datenbank: MySQL • Version: 5 • Zugriff über: FireDac

CallBack nach Query Refresh
 
Hallo Zusammen,

ich bin mir nicht sicher, ob das Thema hierhin oder in Programmieren allgemein gehört.

Ich habe mehrere DataSets die ich mit Daten befülle. Das Abspeichern muss ich aber in einer bestimmten Reihenfolge tun, damit ich die automatischen ID's vorher noch in den nachfolgenden DataSets hinzufügen kann.

Beispiel
DataSet_Firma wird gespeichert und der neue Datensatz bekommt die ID 7
DataSet_Login soll eine Mail-Adresse, ein Passwort und die ID von Firma bekommen.

Also speichere ich das DataSet_Firma, mache einen Refresh.
Dann rufe ich die Procedure auf, die DataSet_LogIn speichert
Setze im DataSet_LogIn die ID von Firma (7)
Speichere das DataSet_LogIn

Ich wollte es gerne mit einer CallBack machen (bin aber in dem Thema unerfahren).

Delphi-Quellcode:
//Speicher-Procedure
procedure TForm_CompanyReg.Save_Company(AOnDataRecieved: TDataRecievedCallback);
begin
   Try
      if DataModule_Client.DataSet_NewCompany.State<>dsBrowse then begin
         DataModule_Client.DataSet_NewCompany.FieldByName('land_id').AsInteger:=5;
         DataModule_Client.DataSet_NewCompany.FieldByName('sprache_id').AsInteger:=1;
         DataModule_Client.DataSet_NewCompany.Post;
      end;
      DataModule_Client.DataSet_NewCompany.ApplyUpdates;
      DataModule_Client.DataSet_NewCompany.Refresh;

      if Assigned(AOnDataRecieved) then begin
         AOnDataRecieved;
      end;
   Except
      ShowMessage('Es hat einen Fehler beim Speichern gegeben');
      Exit;
   End;
end;
//CallBack als Test
procedure TForm_CompanyReg.Save_CompEnvironment;
begin
   ShowMessage('CallBack: '+IntToStr(DataModule_Client.DataSet_NewCompany.FieldByName('Company_id').AsInteger)); //Test-Zweck
end;

//Aufruf
procedure TForm_CompanyReg.btn_forCompanyClick(Sender: TObject);
begin
   Save_Company(@Save_CompEnvironment);
end;
Aber leider wird die CallBack sofort aufgerufen. Da die Datenbank nicht synchron ist, wird der Wert 0 statt dem Wert 7 angezeigt. Warte ich einen Moment und frage den Wert mit einem Button ab, bekomme ich die 7...

Wie kann ich es erreichen, dass die CallBack erst aufgerufen wird, wenn der Refresh beendet ist? Ich würde es gerne mit einer CallBack machen.

Vielen Dank
Patrick

hoika 24. Nov 2020 23:14

AW: CallBack nach Query Refresh
 
Hallo,
warum holst du dir die neue ID nicht vorher (Generator, Sequence).

Poelser 25. Nov 2020 06:19

AW: CallBack nach Query Refresh
 
Zitat:

Zitat von hoika (Beitrag 1477902)
(Generator, Sequence).

Das geht in Firebird, aber MySQL? IIRC gibt's da die Kombination aus Sequenz/Generator nicht.

LG aus dem hohen Norden, Edmund

Ykcim 25. Nov 2020 16:31

AW: CallBack nach Query Refresh
 
Ich fürchte, das geht mit MySQL nicht...

Was ist eigentlich der wirkliche Nutzen von CallBacks? Es macht meiner Meinung (und ich bin mir da nicht sicher!) nur Sinn, wenn aus etwas gewartet werden muss. Aber dann brauche ich einen Trigger, der feststellt, dass die "Wartezeit" vorbei ist.
Aber ich will nicht so einen Schrott bauen, wie etwa eine while_Schleife , mit der ich eine gewisse Zeit lang prüfe, ob die Company_ID noch 0 ist (das ist nämlich der Ausgangswert) und erst weiterlaufe, wenn die Zeit um ist oder der Wert ungleich 0 ist. Da muss es doch etwas besseres geben...

Viele Gruß aus Mitteldeutschland ;-)

Patrick

Uwe Raabe 25. Nov 2020 21:41

AW: CallBack nach Query Refresh
 
Wie ist TDataRecievedCallback deklariert?

hoika 25. Nov 2020 21:59

AW: CallBack nach Query Refresh
 
Hallo,
https://dev.mysql.com/doc/refman/8.0...increment.html

Interessant wird es ab dem Last_Insert_ID.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz