Die Art der Aktualisierung steuern
Nach oben zu Auf Aktualisierungsanforderungen des Client reagieren
Mit dem Ereignis OnUpdateData kann der Datenmengen-Provider festlegen, wie die Datensätze des Delta-Pakets in die Datenbank geschrieben werden.
Standardmäßig werden Änderungen im Delta-Paket mithilfe automatisch generierter SQL-Anweisungen (UPDATE, INSERT oder DELETE) in die Datenbank geschrieben. Beispiel:
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
Wenn Sie nichts anderes festlegen, werden alle Felder der Datensätze des Delta-Pakets in die UPDATE- und WHERE-Klauseln aufgenommen. Sie können aber einzelne Felder ausschließen. Eine Möglichkeit besteht z.B. darin, der Eigenschaft UpdateMode des Providers einen Wert zuzuweisen. UpdateMode kann die folgenden Werte annehmen:
Werte für UpdateMode:
Wert | Bedeutung |
---|---|
upWhereAll |
In der WHERE-Klausel werden alle Felder verwendet. |
upWhereChanged |
Nur Schlüsselfelder und Felder, die geändert wurden, werden verwendet. |
upWhereKeyOnly |
Nur Schlüsselfelder werden verwendet. |
In manchen Fällen ist noch mehr Einflussnahme erforderlich. In der obigen Anweisung könnten Sie beispielsweise verhindern, dass das Feld EMPNO geändert wird, indem Sie es aus der UPDATE-Klausel ausschließen. Die Felder TITLE und DEPT könnten aus der WHERE-Klausel ausgeschlossen werden, um Aktualisierungskonflikte zu vermeiden, wenn andere Anwendungen die Daten geändert haben. Mithilfe der Eigenschaft ProviderFlags können Sie festlegen, in welchen Klauseln ein bestimmtes Feld berücksichtigt werden soll. ProviderFlags ist eine Menge, die beliebige Werte aus der folgenden Tabelle enthalten kann.
Werte für ProviderFlags:
Wert | Beschreibung |
---|---|
pfInWhere |
Das Feld erscheint in der WHERE-Klausel der generierten INSERT-, DELETE- und UPDATE-Anweisungen, wenn UpdateMode den Wert upWhereAll oder upWhereChanged besitzt. |
pfInUpdate |
Das Feld erscheint in der UPDATE-Klausel der generierten UPDATE-Anweisungen. |
pfInKey |
Das Feld wird in der WHERE-Klausel generierter Anweisungen verwendet, wenn UpdateMode den Wert upWhereKeyOnly besitzt |
pfHidden |
Das Feld ist in Datensätzen enthalten, um die Eindeutigkeit sicherzustellen. Der Client kann es jedoch weder anzeigen noch verwenden. |
Die folgende Behandlungsroutine für OnUpdateData ermöglicht die Aktualisierung des TITLE-Felds und benutzt die Felder EMPNO und DEPT zur Bestimmung des gewünschten Datensatzes. Tritt ein Fehler auf und wird ein zweiter Versuch gemacht, den Datensatz allein über den Schlüssel zu lokalisieren, sucht die generierte SQL nur nach dem Feld 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;
}
Anmerkung: Mit der Eigenschaft UpdateFlags können Sie Aktualisierungen auch dann steuern, wenn Sie eine Datenmenge aktualisieren, ohne dynamisch generiertes SQL einzusetzen. Auch in diesem Fall legen die Flags fest, über welche Felder Datensätze gesucht und welche Felder aktualisiert werden.