Die Art der Aktualisierung steuern

Aus RAD Studio
Wechseln zu: Navigation, Suche

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.

Siehe auch