Navigation dans la table (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation des commandes (FireDAC)

Utilisation de TFDTable

FireDAC fournit le composant TFDTable pour naviguer dans une table de base de données unique, trier et filtrer des enregistrements, et modifier ses données. TFDTable génère une instruction SELECT de façon transparente en fonction de ses valeurs de propriété et des méthodes appelées, et envoie celle-ci à un SGBD.

TFDTable offre deux principaux modes d'exploitation :

  • Le mode Fenêtre Données dynamiques. Permet la navigation bidirectionnelle dans des volumes de données importants avec une utilisation minimale de la mémoire.
  • Le mode standard. Ce mode est similaire à celui de TFDQuery. TFDTable génère une commande SELECT unique et utilise l'ensemble de résultats pour naviguer dans les enregistrements de table.

Pour ouvrir une table, la propriété TableName doit être spécifiée. Les propriétés IndexFieldNames ou IndexName peuvent également être définies.

Remarque : Pour utiliser la propriété IndexName, fiMeta doit être inclus dans FetchOptions.Items. Par exemple :
FDTable1.TableName := 'CUSTOMERS';
FDTable1.IndexFieldNames := 'CustNo';
FDTable1.Open;

Pour forcer TFDTable à placer les noms de champs entre guillemets, définissez FormatOptions.QuoteIdentifiers sur True.

Remarques sur l'utilisation de TFDTable avec TClientDataSet et TDataSetProvider

Lorsque vous utilisez le composant TFDTable avec TClientDataSet et TDataSetProvider (DataSnap), il arrive que TFDTable soit obligé de ré-ouvrir l'ensemble de données entier pour chaque modification. Pour éviter cette situation, effectuez l'une des actions suivantes :

Mode Fenêtre Données dynamiques

En mode Fenêtre Données dynamiques (LDW), FireDAC interroge et garde en mémoire uniquement 2 * FetchOptions.RowsetSize d'enregistrements, ce qui correspond à une fenêtre dans les données de table. Lorsque l'application parcourt les données de table, FireDAC fait défiler automatiquement la fenêtre Données dynamiques à la position souhaitée ou la positionne directement à cet emplacement. Cette fonctionnalité offre les avantages suivants :

  • Diminution de l'utilisation de la mémoire et possibilité d'utiliser des volumes de données conséquents, de la même manière qu'un ensemble de données unidirectionnel.
  • Activation de la navigation bidirectionnelle, à l'opposé d'un ensemble de données unidirectionnel.
  • Obtention permanente de données à jour, réduisant ainsi le besoin d'actualiser l'ensemble de données.
  • Extraction sans délai de toutes les données des ensembles de résultats, requises pour effectuer le tri, rechercher des enregistrements, accéder au dernier enregistrement, etc.

La propriété Filter, le filtrage de plages de valeurs, les propriétés IndexFieldNames et IndexName, les méthodes Locate et Lookup, la localisation de clés, la définition de RecNo, la définition d'un signet, etc., sont des opérations mises en oeuvre au moyen de commandes SELECT supplémentaires ou par la définition de phrases supplémentaires pour la commande SELECT principale. Un fois que les propriétés Filter, IndexFieldNames ou IndexName ont été modifiées, la position en cours dans l'ensemble de données peut changer également. Pour conserver la position en cours, enregistrez un signet avant la modification et restaurez-le après la modification.

En mode Fenêtre Données dynamiques, la valeur de la propriété Filter est remplacée telle quelle dans la phrase WHERE. Pour rendre l'expression compatible avec le SGBD et avec le moteur d'expression local, l'application peut utiliser le les séquences d'échappement FireDAC. Par exemple :

FDTable1.Filter := 'DateField = {d ' + FormatDateTime('yyy-mm-dd', Trunc(MonthCalendar1.Date)) + '}';
FDTable1.Filtered := True;

Par sa conception, le mode Fenêtre Données dynamiques applique toujours la phrase ORDER BY aux commandes SELECT. La principale condition pour que ce mode fonctionne correctement est la suivante :

  • Une table doit posséder une clé unique ou une clé primaire. Pour plus d'informations, voir Champs d'identification unique.
  • Le tri côté serveur et le tri côté client doivent être identiques. Sinon, TFDTable peut produire des lignes dupliquées et déclencher une erreur de "violation de clé unique".

Même si FireDAC réduit le nombre de commandes SQL générées et exécutées en mode Fenêtre Données dynamiques, il produit toujours une charge de base de données plus importante que TFDQuery. Par conséquent, les développeurs d'application doivent soigneusement choisir à quel moment utiliser TFDTable et le mode Fenêtre Données dynamiques.

Définition du mode Fenêtre Données dynamiques

Le mode Fenêtre Données dynamiques est utilisé lorsque toutes les conditions suivantes sont réunies :

Sinon, le mode standard est utilisé.

Vous pouvez modifier le mode seulement lorsque TFDTable est inactif. Par conséquent, vous ne pouvez modifier CachedUpdates que lorsque la table est inactive. Vous pouvez également améliorer les performances en modifiant FetchOptions.LiveWindowParanoic (vaut False par défaut) et FetchOptions.LiveWindowFastFirst (vaut False par défaut).

Eviter l'erreur de "violation de clé unique" en mode Fenêtre Données dynamiques

Pour que l'ordre de tri de la base de données soit le même que celui côté client, vous pouvez utiliser FormatOptions.SortLocale et FormatOptions.SortOptions pour ajuster l'ordre de tri côté client. Ainsi, les développeurs germanophones pourraient configurer TFDTable pour interroger la base de données Firebird avec le jeu de caractères ISO8859_1 contenant des données chaîne en allemand :

uses
  Windows;
...
// Set locale ID to German phone book collation
FDTable1.FormatOptions.SortLocale := MAKELCID(MAKELANGID (LANG_GERMAN, SUBLANG_GERMAN), SORT_DEFAULT);
// Use the the punctuation and other symbols case insensitive sorting
FDTable1.FormatOptions.SortOptions := [soNoSymbols];
FDTable1.IndexFieldNames := 'NAME';
FDTable1.TableName := 'CUSTOMERS';
FDTable1.Open;

Selon le SGBD utilisé, vous pouvez définir les paramètres supplémentaires suivants :

SGBD Paramètres
Firebird L'insertion de soNoSymbols dans SortOptions peut être requise.
MySQL L'insertion de soNoSymbols dans SortOptions peut être requise.
Oracle L'exécution de ALTER SESSION SET NLS_COMP=ANSI peut être requise.
SQLite Définissez 'SortLocale sur la valeur 0.

Par exemple, les développeurs Oracle pourraient exécuter la commande suivante :

FDConnection1.Connected := True;
FDConnection1.ExecSQL('ALTER SESSION SET NLS_COMP=ANSI');

Il est également recommandé de définir FormatOptions.StrsTrim sur False.

Remarque : Lorsqu'un développeur ne parvient pas à ajuster le tri côté client, il peut désactiver le mode Fenêtre Données dynamiques en définissant la propriété FetchOptions.CursorKind sur ckDefault, ckStatic ou ckForwardOnly.

Voir aussi