Création d'un gestionnaire d'événement OnUpdateRecord
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
- Application des mises à jour en mémoire cache avec une base de données
- Application des mises à jour en mémoire cache avec les méthodes de composant base de données
- Gestion des erreurs de mise à jour en mémoire cache