Relation maître-détail (M/D)

De Appmethod Topics
Aller à : navigation, rechercher

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


FireDAC offre une prise en charge souple des relations maître/détail entre ensembles de données.

Informations générales

La relation maître-détail vous permet de filtrer automatiquement un ensemble de données détail selon un enregistrement d'ensemble de données maître. Par exemple, l'ensemble de données maître a des enregistrements "Commande" et l'ensemble de données détail a des enregistrements "Ligne de commande". Ainsi, l'ensemble de données détail n'affiche que les lignes pour la commande en cours.

Une configuration particulière n'est pas nécessaire pour l'ensemble de données maître.

FireDAC offre deux méthodes de base pour configurer un ensemble de données détail dans une relation maître-détail :

  • Basée sur des paramètres. Les valeurs des champs de l'ensemble de données maître sont assignées aux paramètres de détail TFDQuery ou TFDStoredProc, puis la requête de l'ensemble de données détail est exécutée à nouveau.
  • Basée sur une plage de valeurs. Les valeurs des champs de l'ensemble de données maître sont utilisées pour appliquer une plage à l'ensemble de données détail. L'ensemble de données détail peut être n'importe quel ensemble de données FireDAC avec l'index actif en cours.

Il est possible de combiner ces méthodes. Pour vous aider à choisir la méthode la plus adaptée, consultez le tableau suivant :

Fonctionnalité Basée sur des paramètres   Basée sur une plage de valeurs  
La requête de détail renvoie un nombre limité d'enregistrements. +
Les enregistrements détail sont actualisés. +
Réduction du trafic et de la charge de travail du SGBD à chaque modification de l'ensemble de données maître. +
Les mises à jour en cache sont préservées lors de la modification de l'ensemble de données maître. +
Fonctionne en mode hors ligne. +
Supporte les mises à jour en cache centralisées avec propagation +

Par ailleurs, FireDAC propose deux modes de mise à jour en cache pour les ensembles de données d'une relation maître-détail :

  • Mode Mises à jour en cache décentralisées : Chaque ensemble de données effectue le suivi des modifications indépendamment des autres.
  • Mode Mises à jour en cache centralisées : Quelques ensembles de données d'une relation maître-détail partagent un même journal de modifications. L'ensemble de données maître peut propager les modifications en cascade dans les ensembles de données détail, y compris en procédant à une incrémentation automatique des valeurs de champs.

Relation maître-détail (M/D) basée sur les paramètres

Pour configurer une relation M/D basée sur les paramètres, effectuez les étapes suivantes :

  1. Déposez un TFDQuery (ou tout autre ensemble de données FireDAC) sur une fiche.
  2. Nommez l'ensemble de données qOrders. C'est l'ensemble de données maître.
  3. Configurez-le en assignant le code SQL comme suit :
 SELECT * FROM {id Orders}
4. Déposez un TDataSource sur une fiche. Nommez-le dsOrders. Définissez sa propriété DataSet sur qOrders.
5. Déposez un TFDQuery sur une fiche. Nommez-le qOrderDetails. C'est un ensemble de données détail.
6. Configurez-le en assignant le code SQL comme suit :
 SELECT * FROM {id Order Details} WHERE OrderID = :OrderID
7. Définissez ensuite la propriété MasterSource sur dsOrders. La configuration de base est terminée.

Comment cela fonctionne-t-il ? FireDAC construit une liste de paires pour qOrderDetails - les champs qOrders et les paramètres qOrderDetails. Voici les éléments composant chaque paire :

  • Lorsque MasterFields n'est pas spécifié, ils portent le même nom ;
  • Sinon, les éléments de la paire ont la même position, les mêmes champs dans la liste MasterFields et les mêmes paramètres dans la collection Params.

Lorsque l'enregistrement qOrders en cours est modifié, FireDAC assigne une valeur de champ correspondante pour chaque paramètre. Dans notre cas, le paramètre qOrderDetails :OrderID prend la valeur de champ qOrder OrderID. Après cela, qOrders est à nouveau exécuté.

Remarque : Les événements BeforeOpen et AfterOpen ne sont pas déclenchés pour un ensemble de données détail. Utilisez plutôt OnMasterSetValue à la place.

Relation maître-détail (M/D) basée sur une plage de valeurs

Pour configurer une relation M/D basée sur une plage de valeurs, effectuez les étapes suivantes :

  1. Déposez un TFDQuery (ou tout autre ensemble de données FireDAC) sur une fiche.
  2. Nommez-le qOrders. C'est l'ensemble de données maître.
  3. Configurez-le en assignant le code SQL comme suit :
 SELECT * FROM {id Orders}
4. Déposez un TDataSource sur une fiche. Nommez-le dsOrders. Définissez la propriété DataSet sur qOrders.
5. Déposez un TFDQuery sur une fiche. Nommez-le qOrderDetails. C'est un ensemble de données détail.
6. Configurez-le en assignant le code SQL comme suit :
 SELECT * FROM {id Order Details}
7. Définissez MasterFields sur ORDERID, IndexFieldNames sur ORDERID et MasterSource sur dsOrders. La configuration de base est terminée.

Comment cela fonctionne-t-il ? FireDAC construit une liste de paires pour qOrderDetails - les champs qOrders et qOrderDetails, où les champs de chaque paire ont la même position, les champs maîtres dans MasterFields et les champs détail dans IndexFieldNames.

Lorsque l'enregistrement qOrders en cours est modifié, FireDAC applique la plage de valeurs à qOrderDetails, où les champs détail sont égaux aux champs maître correspondants. Dans notre cas, le champ qOrderDetails OrderID est égal au champ qOrder OrderID.

Combinaison des méthodes

Pour combiner les deux méthodes, une application doit utiliser à la fois la configuration basée sur des paramètres et la configuration basée sur des plages de valeurs et elle doit inclure fiDetails dans FetchOptions.Cache. Ensuite, FireDAC utilise d'abord une relation maître-détail basée sur une plage de valeurs. Si un ensemble de données est vide, FireDAC utilise une relation maître-détail basée sur des paramètres. Les nouveaux enregistrements extraits de la requête sont ajoutés au stockage interne des enregistrements.

Vous pouvez également utiliser le gestionnaire d'événement TFDDataSet.OnMasterSetValues pour remplacer le comportement de la relation maître-détail.

Modification d'ensembles de données détail

Lorsqu'un nouvel enregistrement est inséré dans un ensemble de données détail, les champs participant à la relation M/D sont remplis automatiquement par les valeurs de champs correspondantes de l'ensemble de données maître. La liste de champs de l'ensemble de données détail est définie :

  • Pour une relation maître-détail (M/D) basée sur les paramètres DetailFields, si spécifié. Sinon, les champs portant le même nom que les paramètres.
  • Pour une relation maître-détail (M/D) basée sur une plage de valeurs, les champs index.

Pour insérer un enregistrement détail, l'ensemble de données maître doit avoir l'état navigation (dsBrowse). Il est possible que l'ensemble de données maître et l'ensemble de données détail aient tous deux l'état insertion (dsInsert) ou modification (dsEdit).

Lorsque les ensembles de données maître et détail sont en mode Mises à jour en cache, l'application peut utiliser TFDSchemaAdapter pour activer les mises à jour en cache centralisées avec propagation. Pour cela, la propriété SchemaAdapter des ensembles de données maître et détail doit pointer vers le même TFDSchemaAdapter, et la propriété FetchOptions.DetailCascade de l'ensemble de données détail doit être définie sur True.

Navigation dans une relation maître-détail (M/D)

Lorsqu'une application doit naviguer dans un ensemble de données maître, l'ensemble de données détail est actualisé à chaque modification de l'enregistrement maître. Ce processus consomme beaucoup de ressources et peut entraîner un ralentissement de la navigation. Pour désactiver temporairement la synchronisation maître-détail, une application peut appeler DisableControls / EnableControls pour l'ensemble de données maître :

 qOrders.DisableControls;
 try
   qOrders.First;
   while not qOrders.Eof do begin
     .....
     qOrders.Next;
   end;
 finally
   qOrders.EnableControls;
 end;

Pour imposer la désactivation de la synchronisation M/D, appelez la méthode ApplyMaster sur l'ensemble de données maître. Pour désactiver temporairement la synchronisation M/D pour un ensemble de données détail particulier, utilisez la méthode DisableScroll / EnableScroll de la propriété MasterLink de l'ensemble de données :

 qOrderDetails.MasterLink.DisableScroll;
 try
   qOrders.First;
   while not qOrders.Eof do begin
     if qOrders.FieldByName('OrderID').AsInteger = 100 then begin
       qOrderDetails.ApplyMaster;
       // read qOrderDetails dataset - it is synchronized with qOrders
     end;
     qOrders.Next;
   end;
 finally
   qOrderDetails.MasterLink.EnableScroll;
 end;

Les applications GUI peuvent tirer parti d'une synchronisation M/D retardée. Ainsi, lorsqu'un utilisateur fait défiler une grille, un ensemble de données détail n'est pas immédiatement actualisé. Il le sera avec un léger décalage et uniquement s'il n'y a pas d'autres navigations. Pour utiliser la synchronisation retardée, définissez FetchOptions.DetailDelay pour un ensemble de données détail. Pour désactiver temporairement la synchronisation M/D retardée pour un ensemble de données détail particulier et utiliser la synchronisation immédiate, utilisez la méthode DisableDelayedScroll / EnableDelayedScroll de la propriété MasterLink.

Par défaut, l'ensemble de données détail n'est pas actualisé suite à un changement d'état, un champ de valeurs de champ non-clé ou à une actualisation de l'ensemble de données maître. Cette organisation évite des actualisations supplémentaires des ensembles de données détail. Si vous souhaitez que votre application actualise toujours les ensembles de données détail, définissez FetchOptions.DetailOptimize sur False.

Voir aussi

Exemple

Voir les démos suivantes pour plus de détails :

  • FireDAC\Samples\Comp Layer\TFDQuery\MasterDetail ;
  • FireDAC\Samples\Comp Layer\TFDMemTable\MasterDetail.