Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datensätze schnell einfügen bzw. ersetzen (https://www.delphipraxis.net/180241-datensaetze-schnell-einfuegen-bzw-ersetzen.html)

messie 26. Mai 2014 18:42

AW: Datensätze schnell einfügen bzw. ersetzen
 
Moin,

hat mal jemand ein funktionierendes Beispiel für ein Update od Insert mit einer matching und returning-Klausel?
Möglichst so, dass es auch im Flamerobin zu testen ist, denn das bekomme ich gerae nicht hin.
(Ich kann mir die angemessene Geduld heute nicht leisten, sorry)

Grüße, Messie

mkinzler 26. Mai 2014 19:27

AW: Datensätze schnell einfügen bzw. ersetzen
 
In MATCHING schreibst du die Liste der Felder die einen vorhandenen Datensatz identifizieren sollen in RETURNING das rückzulieferende Feld. Z.B. wenn eine Person anhand des Vornamens und Geburtsdatum identifiziert werden soll (Nachname kann sich ja ändern):

SQL-Code:
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Müller', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
-> 1

SQL-Code:
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Peter', 'Müller', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
-> 2


SQL-Code:
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Müller', '24.12.1974') MATCHING ( vorname, gebdat) RETURNING(ID);
-> 3


SQL-Code:
update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Maier', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID);
-> 1

messie 26. Mai 2014 20:07

AW: Datensätze schnell einfügen bzw. ersetzen
 
Hallo Markus,

im Gegensatz zur OH schreibst du den returning-parameter in Klammern und ohne die into-Klausel. Das hilft gegen die merkwürdige Fehlermeldung "unexpected end of command line". Wenn ich dort "returning (RET_ID)" angebe, kann ich danach nicht darauf zugreifen. "ID" wird als nicht bekannt behandelt (obwohl als Spalte vorhanden), RET_ID wird in Klammern nicht als zulässige Spalte bezeichnet.
Hast Du eine korrekte Bezeichnung des Index' beim returning mit einer entsprechenden Abfrage?

Danke, Messie

mkinzler 26. Mai 2014 20:38

AW: Datensätze schnell einfügen bzw. ersetzen
 
Die Klammer ist falsch. Ich habe gerade kein Delphi zu Hand. Aber so sollte es gehen:

Delphi-Quellcode:
var
  sL, slF: TStrings;
  i: Integer;
...
begin
  try
    sl := TStringlist.Create;
    slf := TStringList.Create;
    slf.Delimiter := ';';
    sl.add( 'Susi'; 'Müller'; ...
    ..
    IBQuery.SQL.Text := 'update or insert into Personen ( vorname, nachname, gebdat) values ( :vorname, :nachname, :gebdat ) MATCHING ( vorname, gebdat) RETURNING id;';
    for i := 0 to sl.Count -1 do
    begin
      slf.DelimitedText := sl[i];
      IBQuery.Params[0].Value := slf[0];
      IBQuery.Params[1].Value := slf[1];
      IBQuery.Params[2].Value := slf[2];
      IBQuery.ExecSQL;
      id := IBQuery.Params[3].Value; //oder id := IBQuery.ParamByName('RET_ID').Value;
      ...
    end;
  finally
    slf.Free;
    sl.Free;
   ...
end;

messie 26. Mai 2014 21:07

AW: Datensätze schnell einfügen bzw. ersetzen
 
Hallo Markus,

bei mir klemmt es immer noch...
Kann evtl. jemand Anderes das mal testen?

Grüße, Ulfert

Zitat:

Zitat von mkinzler (Beitrag 1260348)
Die Klammer ist falsch. Ich habe gerade kein Delphi zu Hand. Aber so sollte es gehen:

Delphi-Quellcode:
var
  sL, slF: TStrings;
  i: Integer;
...
begin
  try
    sl := TStringlist.Create;
    slf := TStringList.Create;
    slf.Delimiter := ';';
    sl.add( 'Susi'; 'Müller'; ...
    ..
    IBQuery.SQL.Text := 'update or insert into Personen ( vorname, nachname, gebdat) values ( :vorname, :nachname, :gebdat ) MATCHING ( vorname, gebdat) RETURNING id;';
    for i := 0 to sl.Count -1 do
    begin
      slf.DelimitedText := sl[i];
      IBQuery.Params[0].Value := slf[0];
      IBQuery.Params[1].Value := slf[1];
      IBQuery.Params[2].Value := slf[2];
      IBQuery.ExecSQL;
      id := IBQuery.Params[3].Value; //oder id := IBQuery.ParamByName('RET_ID').Value;
      ...
    end;
  finally
    slf.Free;
    sl.Free;
   ...
end;


mkinzler 26. Mai 2014 21:08

AW: Datensätze schnell einfügen bzw. ersetzen
 
Wo klemmt es den genau?

mkinzler 27. Mai 2014 09:14

AW: Datensätze schnell einfügen bzw. ersetzen
 
Liste der Anhänge anzeigen (Anzahl: 4)
Ich habe es jetzt mal getestet, so funktioniert es in dem Testprogramm ( UniDAC statt IBDAC; aber UniDAC verwendet ja den IBDAC-Provider)

Delphi-Quellcode:
var
  sL, slF: TStrings;
  i, id: Integer;
begin
  try
    sl := TStringlist.Create;
    slf := TStringList.Create;
    slf.Delimiter := ';';
    sl.add( 'Susi;Mueller;01.01.1900');
    sl.add( 'Peter;Mueller;01.01.1990');
    sl.add( 'Susi;Mueller;24.12.1974');
    sl.add( 'Susi;Maier;01.01.1900');
    IBQuery.SQL.Text := 'update or insert into Person ( vorname, nachname, gebdat) values ( :vorname, :nachname, :gebdat ) MATCHING ( vorname, gebdat) RETURNING id;';
    for i := 0 to sl.Count -1 do
    begin
      slf.DelimitedText := sl[i];
      IBQuery.Params[0].Value := slf[0];
      IBQuery.Params[1].Value := slf[1];
      IBQuery.Params[2].asString := slf[2];
      IBQuery.ExecSQL;
      id := IBQuery.Params[3].Value; //oder id := IBQuery.ParamByName('RET_ID').Value;
      UniQuery1.Refresh;
      Application.ProcessMessages;
      ShowMessage( Format( 'Rückgabe: %d', [id]));
    end;
  finally
    slf.Free;
    sl.Free;
  end;
end;

messie 27. Mai 2014 16:17

AW: Datensätze schnell einfügen bzw. ersetzen
 
Moin,

jetzt funzt es bei mir auch. Ich glaube, ich sollte öfter mal den Rechner neu starten.
Ich habe ohnehin das Gefühl, dass Firebird sehr empfindlich auf Energiesparmodi ist.

Danke, Messie


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:55 Uhr.
Seite 4 von 4   « Erste     234   

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