Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi FireDAC: Zwei TDataSets aus einer Query (https://www.delphipraxis.net/177785-firedac-zwei-tdatasets-aus-einer-query.html)

Der schöne Günther 27. Nov 2013 12:08

Datenbank: SQLite • Version: 3.8 • Zugriff über: FireDAC

FireDAC: Zwei TDataSets aus einer Query
 
Hört sich so sinnvoll an wie "Zwei Exceptions auf einmal"

Ich habe bislang dbExpress genutzt, jetzt möchte ich auf FireDAC wechseln. Folgendes Problem, vereinfacht und in Quellcode-Form:

Delphi-Quellcode:
connection: TSQLConnection;
outerResultSet: TDataSet;
innerResultSet: TDataSet;

connection.Execute(
   'SELECT * FROM someTable',
   nil,
   outerResultSet
);

try
   outerResultSet.First();
   while not outerResultSet.eof do begin

      // Tue Dinge mit Tupeln aus outerResultSet
      
      connection.Execute(
         'SELECT * FROM someOtherTable',
         nil,
         innerResultSet
      );
      try
         // Tue Dinge mit den Tupeln aus innerResultSet...
      finally
         innerResultSet.Free();
      end;
      
      // Tue abschließende Dinge mit Tupeln aus outerResultSet

      outerResultSet.Next();
   end;
finally
   outerResultSet.Free()
end;
Die Execute-Methode von TSQLConnection war immer so freundlich, mir ein komplett neues TDataSet anzulegen mit dem ich dann so lange arbeiten konnte, wie ich es gebraucht habe.


Jetzt frage ich mich, wie ich das in FireDAC umsetzen soll. Ich finde keine Methode auf Connection oder Query-Objekten, die mir ein isoliertes TDataSet geben.
Für den obigen Fall bräuchte ich zwei separate Query-Objekte, das fiele mir spontan ein, finde ich aber hässlich. Hinter vorgehaltener Hand erzählt man sich von "MemTables" in FireDAC. Bringt mich das weiter? Einmal eine komplette Kopie des ResultSets (wird schon nicht zu groß) in den Speicher legen (wie das outerResultSet)?

Der schöne Günther 27. Nov 2013 12:58

AW: FireDAC: Zwei TDataSets aus einer Query
 
Da es die FireDAC-Dokumentation in XE5 wohl noch nicht so ganz in die lokale Hilfe geschafft hatte, hat es etwas länger gedauert aber im Endeffekt ist es ganz einfach:

http://docwiki.embarcadero.com/Libra...FDDataSet.Data
Delphi-Quellcode:
FDQuery1.SQL.Text := 'select * from orders; select * from customers';
 
FDQuery1.Open;
FDQuery1.FetchAll;
// assign orders records to FDMemTable1
FDMemTable1.Data := FDQuery1.Data;
 
FDQuery1.NextRecordSet;
FDQuery1.FetchAll;
// assign customers records to FDMemTable2
FDMemTable2.Data := FDQuery1.Data;
Ist ein gutes Beispiel, wie man die Ergebnismenge einer Query in eine
Delphi-Quellcode:
TFDMemTable
kopiert. Dauert insgesamt zwar etwas länger als zwei separate Firedac-Queries aber damit kann ich leben :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:25 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