The OnUpdateData event gives your dataset provider a chance to indicate how records in the delta packet are applied to the database.
By default, changes in the delta packet are written to the database using automatically generated SQL UPDATE, INSERT, or DELETE statements such as
UPDATE EMPLOYEES set EMPNO = 748, NAME = 'Smith', TITLE = 'Programmer 1', DEPT = 52 WHERE EMPNO = 748 and NAME = 'Smith' and TITLE = 'Programmer 1' and DEPT = 47
Unless you specify otherwise, all fields in the delta packet records are included in the UPDATE clause and in the WHERE clause. However, you may want to exclude some of these fields. One way to do this is to set the UpdateMode property of the provider. UpdateMode can be assigned any of the following values:
UpdateMode values
Value |
Meaning |
upWhereAll |
All fields are used to locate fields (the WHERE clause). |
upWhereChanged |
Only key fields and fields that are changed are used to locate records. |
upWhereKeyOnly |
Only key fields are used to locate records. |
You might, however, want even more control. For example, with the previous statement, you might want to prevent the EMPNO field from being modified by leaving it out of the UPDATE clause and leave the TITLE and DEPT fields out of the WHERE clause to avoid update conflicts when other applications have modified the data. To specify the clauses where a specific field appears, use the ProviderFlags property. ProviderFlags is a set that can include any of the values in the following table
ProviderFlags values
Value |
Description |
pfInWhere |
The field appears in the WHERE clause of generated INSERT, DELETE, and UPDATE statements when UpdateMode is upWhereAll or upWhereChanged. |
pfInUpdate |
The field appears in the UPDATE clause of generated UPDATE statements. |
pfInKey |
The field is used in the WHERE clause of generated statements when UpdateMode is upWhereKeyOnly. |
pfHidden |
The field is included in records to ensure uniqueness, but can't be seen or used on the client side. |
Thus, the following OnUpdateData event handler allows the TITLE field to be updated and uses the EMPNO and DEPT fields to locate the desired record. If an error occurs, and a second attempt is made to locate the record based only on the key, the generated SQL looks for the EMPNO field only:
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; }
Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
|
What do you think about this topic? Send feedback!
|