Filtrage des enregistrements (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des ensembles de données (FireDAC)


Tous les ensembles de données FireDAC offrent des possibilités de filtrage des enregistrements en local. Une fois qu'un filtre est appliqué, FireDAC n'a pas besoin des enregistrements, il filtre les enregistrements dans le cache de l'ensemble de données local. En interne, FireDAC construit et gère une liste d'enregistrements filtrés. Ainsi, lorsque le filtrage s'applique à de gros volumes d'enregistrements, l'opération peut prendre du temps, mais la navigation au sein des enregistrements est ensuite aussi rapide que s'il n'y avait pas de filtrage.

Filtrage standard

Les ensembles de données FireDAC fournissent des options pour filtrer les enregistrements en utilisant une approche standard :

  • La propriété Filter vous permet de spécifier une expression conditionnelle sous la forme d'une chaîne. Après avoir spécifié la valeur de Filter, définissez la propriété Filtered sur True pour activer le filtre. Par exemple :
FDQuery1.Filter := 'OrderID in (10150, 10151, 10152)';
FDQuery1.Filtered := True;
  • Le gestionnaire d'événement OnFilterRecord vous permet d'implémenter le filtrage sous la forme de code Delphi. Après avoir spécifié le gestionnaire OnFilterRecord, définissez la propriété Filtered sur True pour activer le filtre. Par exemple :
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;

Filtrage par plage de valeurs

Lorsque l'ensemble de données est trié en utilisant la liste de champs, l'application applique le filtrage en utilisant une plage de valeurs de champs. C'est la méthode la plus efficace pour limiter les enregistrements, car elle utilise les structures d'index internes des ensembles de données.

Les méthodes suivantes contrôlent le filtrage :

  • SetRangeStart -- attribue à l'ensemble de données un état permettant de définir la valeur minimale d'une plage et d'effacer les valeurs précédentes.
  • EditRangeStart -- attribue à l'ensemble de données un état permettant de définir la valeur minimale d'une plage tout en préservant les valeurs précédentes.
  • SetRangeEnd -- attribue à l'ensemble de données un état permettant de définir la valeur maximale d'une plage et d'effacer les valeurs précédentes.
  • EditRangeEnd -- attribue à l'ensemble de données un état permettant de définir la valeur maximale d'une plage tout en préservant les valeurs précédentes.
  • ApplyRange -- active le filtrage d'une plage de valeurs après avoir spécifié les valeurs minimale et maximale.
  • SetRange -- combine SetRangeStart, SetRangeEnd et ApplyRange en une seule méthode.
  • CancelRange -- annule le filtrage de la plage de valeurs.

Les propriétés suivantes contrôlent le filtrage :

  • IsRanged -- autorise l'obtention du mode de filtrage de plage en cours.
  • KeyExclusive -- obtient ou définit l'inclusion de valeurs minimale et maximale dans une plage de valeurs filtrée.
  • KeyFieldCount -- obtient ou définit le nombre de champs d'index à utiliser dans le filtrage de la plage.

Par exemple :

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;

Filtrage selon l'état des enregistrements

La propriété FilterChanges permet de filtrer des enregistrements selon leur état de modification. Ce type de filtrage peut être seulement utilisé dans le mode Mises à jour en cache. Par exemple, pour n'afficher que les enregistrements modifiés et supprimés, procédez comme suit :

FDQuery1.FilterChanges := [rtModified, rtDeleted];

Pour filtrer les enregistrements n'ayant pas pu être traités par l'appel à ApplyUpdates, utilisez la propriété FilterChanges et définissez sa valeur sur rtHasErrors.

Autres options

D'autres options permettent de limiter le nombre d'enregistrements visibles, comme :

Veuillez également noter que FireDAC ne prend pas en charge pas le filtrage sur les champs de type fkCalculated ou fkLookup. A la place, l'application utilise les champs fkInternalCalc et fkAggregate dans les opérations de filtrage.

TFDTable et filtrage

En mode Fenêtre Données dynamiques, TFDTable utilise le filtrage côté serveur (WHERE) dans les situations suivantes :

  • Pour la propriété Filter. Notez que le contenu de la propriété Filter est envoyé à une base de données tel qu'il est. Vous pouvez utiliser les séquences d'échappement FireDAC pour rendre une expression compatible avec un SGBD et avec le moteur d'expression local.
  • Pour un TFDTable détail dans une relation maître-détail.
  • Quand une plage de valeurs est appliquée à un TFDTable.

En mode Fenêtre Données dynamiques, TFDTable utilise le filtrage côté client pour :

  • L'événement OnFilterRecord.
  • La propriété FilterChanges.

Voir aussi

Exemples