AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datensätze schnell einfügen bzw. ersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Datensätze schnell einfügen bzw. ersetzen

Ein Thema von messie · begonnen am 4. Mai 2014 · letzter Beitrag vom 27. Mai 2014
Antwort Antwort
Seite 4 von 4   « Erste     234   
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#31

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

  Alt 26. Mai 2014, 19:42
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#32

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

  Alt 26. Mai 2014, 20:27
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):

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

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


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


update or insert into Personen ( vorname, nachname, gebdat, ...) values ( 'Susi', 'Maier', '01.01.1990') MATCHING ( vorname, gebdat) RETURNING(ID); -> 1
Markus Kinzler
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#33

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

  Alt 26. Mai 2014, 21:07
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#34

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

  Alt 26. Mai 2014, 21:38
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;
Markus Kinzler
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#35

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

  Alt 26. Mai 2014, 22:07
Hallo Markus,

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

Grüße, Ulfert

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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#36

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

  Alt 26. Mai 2014, 22:08
Wo klemmt es den genau?
Markus Kinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#37

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

  Alt 27. Mai 2014, 10:14
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;
Miniaturansicht angehängter Grafiken
1.jpg   2.jpg   3.jpg   4.jpg  
Markus Kinzler
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#38

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

  Alt 27. Mai 2014, 17:17
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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