Comment contrôler l'application des mises à jour
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.