Filtern von Datensätzen (FireDAC)

Aus Appmethod Topics
Wechseln zu: Navigation, Suche

Nach oben zu Arbeiten mit Datenmengen (FireDAC)


Alle FireDAC-Datenmengen stellen Methoden zum lokalen Filtern von Datensätzen bereit. Nach Übernahme eines Filters benötigt FireDAC keine Datensätze, sondern filtert Datensätze im lokalen Datenmengenzwischenspeicher. FireDAC erstellt und verwaltet intern eine Liste der gefilterten Datensätze. Bei großen Datensatzmengen kann die Filteraktivierung lange dauern, aber die folgende Navigation in den Datensätzen ist genauso schnell wie ohne Filterung.

Standardfilterung

Die FireDAC-Datenmengen stellen Optionen zum Filtern von Datensätzen anhand eines Standardvorgehens bereit:

  • Mit der Eigenschaft Filter können Sie einen bedingten Ausdruck als String angeben. Setzen Sie nach dem Festlegen des Wertes von Filter die Eigenschaft Filtered auf True, um den Filter zu aktivieren. Zum Beispiel:
 FDQuery1.Filter := 'OrderID in (10150, 10151, 10152)';
 FDQuery1.Filtered := True;
  • Mit der Ereignisbehandlungsroutine OnFilterRecord können Sie die Filterung als Object Pascal-Code implementieren. Setzen Sie nach dem Festlegen der Ereignisbehandlungsroutine OnFilterRecord die Eigenschaft Filtered auf True, um den Filter zu aktivieren. Zum Beispiel:
 FDQuery1.OnFilterRecord := Form1FilterRecord;
 FDQuery1.Filtered := True;
 
 procedure TForm1.Form1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
 var
   iOrderID: Integer;
 begin
   iOrderID := DataSet.FieldByName('OrderID').AsInteger;
   Accept := (iOrderID = 10150) or (iOrderID = 10151) or (iOrderID = 10152);
 end;

Filtern nach Wertebereich

Wenn die Datenmenge anhand der Felderliste sortiert ist, wendet die Anwendung die Filterung auf Basis eines Bereichs von Feldwerten an. Dies ist der effektivste Weg zum Eingrenzen von Datensätzen, weil dabei die internen Indexstrukturen der Datenmenge verwendet werden.

Die folgenden Methoden steuern die Filterung:

  • SetRangeStart – versetzt die Datenmenge in einen Zustand, der das Festlegen des niedrigsten Bereichswertes und das Löschen der vorherigen Werte ermöglicht.
  • EditRangeStart – versetzt die Datenmenge in einen Zustand, der das Festlegen des niedrigsten Bereichswertes ermöglicht, wobei die vorherigen Werte beibehalten werden.
  • SetRangeEnd – versetzt die Datenmenge in einen Zustand, der das Festlegen des höchsten Bereichswertes und das Löschen der vorherigen Werte ermöglicht.
  • EditRangeEnd – versetzt die Datenmenge in einen Zustand, der das Festlegen des höchsten Bereichswertes ermöglicht, wobei die vorherigen Werte beibehalten werden.
  • ApplyRange – aktiviert die Bereichsfilterung, nachdem der niedrigste und der höchste Wert festgelegt wurden.
  • SetRange – kombiniert SetRangeStart, SetRangeEnd und ApplyRange in einer einzigen Methode.
  • CancelRange – bricht die Bereichsfilterung ab.

Folgende Eigenschaften steuern die Filterung:

  • IsRanged – ermöglicht das Ermitteln des aktuellen Bereichsfilterungsmodus.
  • KeyExclusive – ermittelt oder setzt die Einbeziehung der niedrigsten und höchsten Werte in einen gefilterten Bereich.
  • KeyFieldCount – ermittelt oder setzt die Anzahl der in der Bereichsfilterung zu verwendenden Indexfelder.

Zum Beispiel:

 FDQuery1.IndexFieldNames := 'ORDERID;ORDERDATE';
 FDQuery1.SetRangeStart;
 FDQuery1.KeyExclusive := False;
 FDQuery1.KeyFieldCount := 1;
 FDQuery1.FieldByName('OrderID').AsInteger := 10150;
 FDQuery1.SetRangeEnd;
 FDQuery1.KeyExclusive := False;
 FDQuery1.KeyFieldCount := 1;
 FDQuery1.FieldByName('OrderID').AsInteger := 10152;
 FDQuery1.ApplyRange;

Filtern nach Datensatzstatus

Die Eigenschaft FilterChanges ermöglicht die Filterung von Datensätzen auf Basis ihres Änderungsstatus. Dieser Filterungstyp kann nur im Modus "Zwischengespeicherte Aktualisierungen" verwendet werden. Verwenden Sie beispielsweise Folgendes, um nur geänderte und gelöschte Datensätze anzuzeigen:

 FDQuery1.FilterChanges := [rtModified, rtDeleted];

Wenn beim Filtern von Datensätzen ApplyUpdates nicht ausgeführt wird, setzen Sie den Wert der Eigenschaft FilterChanges auf rtHasErrors.

Weitere Optionen

Zum Eingrenzen der angezeigten Datensätze stehen weitere Optionen zur Verfügung. Zum Beispiel:

Beachten Sie, dass FireDAC die Filterung von Feldern mit dem Typ fkCalculated oder fkLookup nicht unterstützt. Stattdessen verwendet die Anwendung die Felder fkInternalCalc und fkAggregate für die Filterung.

TFDTable und Filterung

TFDTable im Modus Live-Datenfenster verwendet in den folgenden Fällen die serverseitige Filterung (WHERE):

  • Für die Eigenschaft Filter. Der Inhalt der Eigenschaft Filter wird unverändert an eine DB gesendet. Sie können mit FireDAC-Escape-Sequenzen einen Ausdruck so anpassen, dass er mit einem DBMS und mit der lokalen Ausdrucks-Engine kompatibel ist.
  • Für eine Detail-TFDTable in der Haupt/Detail-Beziehung.
  • Wenn für TFDTable ein Bereich verwendet wird.

TFDTable im Modus "Live-Datenfenster" verwendet die clientseitige Filterung für:

  • Das Ereignis OnFilterRecord.
  • Die Eigenschaft FilterChanges.

Siehe auch

Beispiele

Die folgenden Demos enthalten weitere Einzelheiten dazu:

  • FireDAC\Samples\Comp Layer\TFDQuery\Filter
  • FireDAC\Samples\Comp Layer\TFDMemTable\MasterDetail