Création d'un gestionnaire d'événement OnUpdateRecord

De RAD Studio
Aller à : navigation, rechercher

Remonter à Utilisation du BDE pour placer en mémoire cache les mises à jour - Index


Remarque : Le moteur de base de données Borland (BDE, Borland Database Engine) a été déprécié. Il ne sera donc pas amélioré. Par exemple, le BDE ne prendra jamais en charge Unicode. Vous ne devriez pas entreprendre de nouveaux développements avec BDE. Prévoyez plutôt de migrer vos applications de bases de données existantes de BDE vers dbExpress.

Quand un ensemble de données BDE applique ses mises à jour en mémoire cache, il parcourt les modifications enregistrées dans son cache, essayant de les appliquer aux enregistrements correspondants dans la table de base de données. Au moment où chaque modification, insertion ou suppression est sur le point d'être appliquée, l'événement OnUpdateRecord du composant ensemble de données est déclenché.

Fournir un gestionnaire pour l'événement OnUpdateRecord permet d'effectuer des actions juste avant l'application effective de la mise à jour de l'enregistrement en cours. Ces actions peuvent comprendre une validation spéciale des données, la mise à jour d'autres tables, des substitutions spéciales de paramètres ou l'exécution de multiples objets mise à jour. Un gestionnaire d'événement OnUpdateRecord donne un meilleur contrôle sur le processus de mise à jour.

Voici le code squelette d'un gestionnaire d'événement OnUpdateRecord :

 procedure TForm1.DataSetUpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 begin
   { perform updates here... }
 end;
 procedure TForm1.DataSetUpdateRecord(DataSet: TDataSet;
  UpdateKind : TUpdateKind; var UpdateAction: TUpdateAction);
 begin
   { effectuer les mises à jour ici... }
 end;

Le paramètre DataSet spécifie l'ensemble de données ayant des mises à jour en mémoire cache.


Le paramètre UpdateKind indique le type de mise à jour qui doit être effectué sur l'enregistrement en cours. UpdateKind peut prendre les valeurs ukModify, ukInsert et ukDelete. Si vous utilisez un objet mise à jour, vous devez lui passer ce paramètre lors de l'application de la mise à jour. Vous pouvez aussi avoir besoin d'inspecter ce paramètre si votre gestionnaire effectue un traitement spécial selon le type de mise à jour.


Le paramètre UpdateAction indique si vous avez appliqué la mise à jour. UpdateAction peut prendre les valeurs uaFail (valeur par défaut), uaAbort, uaSkip, uaRetry, uaApplied. Si votre gestionnaire d'événement applique la mise à jour avec succès, donnez à ce paramètre la valeur uaApplied avant de sortir. Si vous décidez de ne pas mettre à jour l'enregistrement en cours, donnez-lui la valeur uaSkip pour préserver les modifications en mémoire cache non appliquées. Si vous ne changez pas la valeur deUpdateAction, toute l'opération de mise à jour de l'ensemble de données est annulée et une exception est déclenchée. Vous pouvez supprimer le message d'erreur (et déclencher une exception silencieuse) en donnant à UpdateAction la valeur uaAbort.

En plus de ces paramètres, vous utiliserez les propriétés OldValue et NewValue pour le composant champ associé à l'enregistrement en cours. OldValue donne la valeur originale du champ telle que récupérée de la base de données. Elle peut servir à localiser l'enregistrement de base de données à mettre à jour. NewValue est la valeur modifiée dans la mise à jour que vous essayez d'appliquer.


Avertissement : Un gestionnaire d'événement OnUpdateRecord, comme un gestionnaire d'événement OnUpdateError ou OnCalcFields, ne doit jamais appeler les méthodes qui modifient l'enregistrement en cours d'un ensemble de données.

L'exemple suivant illustre comment utiliser ces paramètres et propriétés. Il emploie un composant TTable nommé UpdateTable pour appliquer les mises à jour. En pratique, il est plus facile d'utiliser un objet mise à jour, mais l'emploi d'une table illustre plus clairement les possibilités.

 procedure TForm1.EmpAuditUpdateRecord(DataSet: TDataSet;
   UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 begin
   if UpdateKind = ukInsert then
     UpdateTable.AppendRecord([DataSet.Fields[0].NewValue, DataSet.Fields[1].NewValue])
   else
     if UpdateTable.Locate('KeyField', VarToStr(DataSet.Fields[1].OldValue), []) then
       case UpdateKind of
         ukModify:
           begin
             UpdateTable.Edit;
             UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue);
             UpdateTable.Post;
           end;
         ukInsert:
           begin
             UpdateTable.Insert;
             UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue);
             UpdateTable.Post;
           end;
         ukDelete: UpdateTable.Delete;
       end;
         UpdateAction := uaApplied;
 end;
 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet,
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
 {
   if (UpdateKind == ukInsert)
   {
     TVarRec values[2];
     for (int i = 0; i < 2; i++)
       values[i] = DataSet->Fields->Fields[i]->NewValue;
     UpdateTable->AppendRecord(values, 1);
   }
   else
   {
     TLocateOptions lo;
     lo.Clear();
     if (UpdateTable->Locate("KeyField", DataSet->Fields->Fields[0]->OldValue, lo))
       switch (UpdateKind)
       {
         case ukModify:
           UpdateTable->Edit();
           UpdateTable->Fields->Fields[1]->Value = DataSet->Fields->Fields[1]->Value;
           UpdateTable->Post();
           break;
         case ukDelete:
           UpdateTable->Delete();
           break;
       }
   }
   UpdateAction = uaApplied;
 }

Voir aussi

Exemples de code