Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   FireDAC INSERT oder EDIT (https://www.delphipraxis.net/212713-firedac-insert-oder-edit.html)

DaCoda 20. Mär 2023 15:43

Datenbank: MariaDB • Version: 11 • Zugriff über: FireDAC

FireDAC INSERT oder EDIT
 
Hallo,
ich habe eine Tabelle, die einmal pro Sekunde "geupdatet" werden soll (in einer TIdThreadComponent);

Ich versuche das derzeit so, was aber nicht richtig funktioniert (Erhängt sich meistens sehr schnell):

Code:
procedure TKommunikation.trdSqlDatenRun(Sender: TIdThreadComponent);
var
  Loop: Integer;
begin
  for Loop := 1 to MaxmaschinenIndex do begin
    if (MaschinenListe[Loop].FrameType = 'TYP1') OR (MaschinenListe[Loop].FrameType = 'TYP2') then begin
        LogMaschinendatenToTempSql(Loop);
    end;
  end;
  Sleep(1000); //SqlDatenSleepTime);
end;

procedure TKommunikation.LogMaschinendatenToTempSql(Index: Integer);
begin
  Daten.tblMaschinendaten_Temp.Open;
  Daten.tblMaschinendaten_Temp.Filtered := False;
  Daten.tblMaschinendaten_Temp.Filter := 'MaschinenIndex = ' + QuotedStr(Index.ToString);
  Daten.tblMaschinendaten_Temp.Filtered := True;
  DbgInfo('Index: ' + Index.ToString + ' - Recordcount: ' + Daten.tblMaschinendaten_Temp.RecordCount.ToString);
  if Daten.tblMaschinendaten_Temp.RecordCount = 0 then begin
      Daten.tblMaschinendaten_Temp.Insert;
  end else begin
      Daten.tblMaschinendaten_Temp.Edit;
  end;

  Daten.tblMaschinendaten_TempMaschinenIndex.AsInteger := Index;
  Daten.tblMaschinendaten_TempTemperatur.AsInteger := MaschinenDaten[Index].ActTemperature;
  Daten.tblMaschinendaten_TempPartial_Stueckzaehler.AsInteger := MaschinenDaten[Index].Partial_Pcs;
  Daten.tblMaschinendaten_TempTotal_Stueckzaehler.AsInteger := MaschinenDaten[Index].Total_Pcs;
  Daten.tblMaschinendaten_Temp.Post;
  Daten.tblMaschinendaten_Temp.Close;
end;

Uwe Raabe 20. Mär 2023 15:49

AW: FireDAC INSERT oder EDIT
 
Ist tblMaschinendaten_Temp ein TFDTable oder eine TFDQuery?

DaCoda 20. Mär 2023 15:56

AW: FireDAC INSERT oder EDIT
 
tblMaschinendaten_Temp ist ein TFDTable.

himitsu 20. Mär 2023 16:12

AW: FireDAC INSERT oder EDIT
 
Und warum?

Das Ding läd sinnlos die komplette Tabelle,
wobei eine Query, mit WHERE anstatt Filter, nur den einen Datensatz behandelt.


Und MairaDB kann auch ein InsertOrUpdate
https://mariadb.com/kb/en/insert-on-...te-key-update/
womit garkein Datensatz runtergeladen werden muß, weil es reicht "ein" einfaches Execute abzuschicken.



PS: https://www.delphipraxis.net/10311-r...ed%3Dtrue.html

Eventuell hilft IsEmpty oder EoF, anstatt RecordCount.
Und was natürlich geht auch
Delphi-Quellcode:
if Daten.tblMaschinendaten_TempMaschinenIndex.IsNull then
oder
Delphi-Quellcode:
if Daten.tblMaschinendaten_TempMaschinenIndex.AsInteger <> Index then
,
denn entweder ist kein Datensatz ausgewählt und hat somit NULL, oder es gibt Einen und er hat den entsprechenden Index. :stupid:

DaCoda 20. Mär 2023 16:43

AW: FireDAC INSERT oder EDIT
 
@himitsu:

InsertOrUpdate im query habe ich schon probiert, aber ich bin irgendwie zu unwissend, es klappt einfach nicht,
von daher mein Cryptoconstruct mit der Table etc.

Ich möchte ja nur, wenn MaschinenIndex vorhanden, dann it neuen Daten updaten und wenn nicht da, dann anlegen mit den Daten...

Uwe Raabe 20. Mär 2023 17:57

AW: FireDAC INSERT oder EDIT
 
Zitat:

Zitat von DaCoda (Beitrag 1520120)
InsertOrUpdate im query habe ich schon probiert, aber ich bin irgendwie zu unwissend, es klappt einfach nicht,
von daher mein Cryptoconstruct mit der Table etc.

Dann sollte man vielleicht besser das Grundproblem beheben.

dataspider 23. Mär 2023 13:30

AW: FireDAC INSERT oder EDIT
 
himitsu hat ja schon einen Link zu UpdateOrInsert für MariaDB zur Verfügung gestellt.

Das Beispiel auf der Seite:

SQL-Code:
INSERT INTO ins_duplicate VALUES (1,'Antelope')
  ON DUPLICATE KEY UPDATE animal='Antelope';
ist doch recht simple und sollte einfach umzusetzen sein.
Das wäre auch aus meiner Sicht die sinnvollste Lösung.

Alternativ könnte man erst mit einem Statement feststellen, ob ein Datensatz mit Bedingung x existiert und dann im Code entscheiden,
ob ein Update oder Insert - Statement danach kommt.
Ist auf jeden Fall schneller als mit TTable!

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:28 Uhr.

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