RAD Studio |  |

Influencing How Updates Are Applied
See Also
Collapse All

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

Copy Code

    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:

Copy Code

    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;

Copy Code

    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;
    }

Note: You can use the UpdateFlags property to influence how updates are applied even if you are updating to a dataset and not using dynamically generated SQL. These flags still determine which fields are used to locate records and which fields get updated.
See Also

Resolving Update Errors On the Provider

Editing Delta Packets Before Updating the Database

Screening Individual Updates

Applying Updates to Datasets That do Not Represent a Single Table

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!