Comment contrôler l'application des mises à jour

De RAD Studio
Aller à : navigation, rechercher

Remonter à Comment répondre aux demandes de mise à jour des clients

L'événement Provider.OnUpdateData permet également au fournisseur d'ensemble de données d'indiquer comment les enregistrements d'un paquet delta sont appliqués à la base de données.

Par défaut, les modifications placées dans le paquet delta sont écrites dans la base de données en utilisant des instructions SQL UPDATE, INSERT ou DELETE générées automatiquement, par exemple :

UPDATE EMPLOYEES
set EMPNO = 748, NAME = 'Smith', TITLE = 'Programmeur 1', DEPT = 52
WHERE
EMPNO = 748 and NAME = 'Smith' and TITLE = 'Programmeur 1' and DEPT = 47

Si vous ne spécifiez pas le contraire, tous les champs des enregistrements du paquet delta sont utilisés dans les clauses UPDATE et WHERE. Vous pouvez néanmoins exclure certains champs. Vous pouvez le faire en utilisant la propriété UpdateMode du fournisseur. UpdateMode peut prendre l'une des valeurs suivantes :

Valeurs de UpdateMode :

Valeur Signification

upWhereAll

Tous les champs sont utilisés pour la recherche (dans la clause WHERE).

upWhereChanged

Seuls les champs clés et les champs modifiés sont utilisés pour la recherche.

upWhereKeyOnly

Seuls les champs clé sont utilisés pour la recherche.

Vous pouvez avoir besoin d'un contrôle encore plus précis. Par exemple, dans l'instruction précédente, vous pouvez empêcher que le champ EMPNO ne soit modifié en le retirant de la clause UPDATE et enlever les champs TITLE et DEPT de la clause WHERE pour empêcher des conflits de mise à jour quand d'autres applications ont modifié les données. Pour spécifier la clause dans laquelle un champ spécifique apparaît, utilisez la propriété ProviderFlags. ProviderFlags est un ensemble qui peut inclure les valeurs du tableau suivant :

Valeurs de ProviderFlags :

Valeur Description

pfInWhere

Le champ apparaît dans la clause WHERE des instructions INSERT, DELETE et UPDATE générées lorsque UpdateMode a pour valeur upWhereAll ou upWhereChanged.

pfInUpdate

Le champ apparaît dans la clause UPDATE des instructions UPDATE générées.

pfInKey

Le champ est utilisé dans la clause WHERE des instructions générées lorsque UpdateMode a pour valeur upWhereKeyOnly.

pfHidden

Le champ est inclus dans les enregistrements afin de garantir l'unicité, mais il ne doit pas être visible ou utilisé du côté client.


Par exemple, le gestionnaire d'événement OnUpdateData suivant permet au champ TITLE d'être mis à jour et utilise les champs EMPNO et DEPT pour rechercher l'enregistrement désiré. Si une erreur se produit et qu'une seconde tentative de recherche est effectuée uniquement basée sur la clé, l'instruction SQL générée recherche uniquement le champ EMPNO :

procedure TMyDataModule1.Provider1UpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
  with DataSet do
  begin
    FieldByName('TITLE').ProviderFlags := [pfInUpdate];
    FieldByName('EMPNO').ProviderFlags := [pfInWhere, pfInKey];
    FieldByName('DEPT').ProviderFlags := [pfInWhere];
  end;
end;
void __fastcall TMyDataModule1::Provider1UpdateData(TObject *Sender, TCustomClientDataSet *DataSet)
{
  DataSet->FieldByName("EMPNO")->ProviderFlags.Clear();
  DataSet->FieldByName("EMPNO")->ProviderFlags << pfInWHere << pfInKey;
  DataSet->FieldByName("TITLE")->ProviderFlags.Clear();
  DataSet->FieldByName("TITLE")->ProviderFlags << pfInUpdate;
  DataSet->FieldByName("DEPT")->ProviderFlags.Clear();
  DataSet->FieldByName("DEPT")->ProviderFlags << pfInWhere;
}

Remarque :  Vous pouvez utiliser la propriété UpdateFlags pour contrôler comment les mises à jour sont appliquées même si vous actualisez un ensemble de données sans utiliser d'instructions SQL générées dynamiquement. Ces indicateurs indiquent quand même les champs utilisés pour rechercher des enregistrements et les champs actualisés.

Voir aussi