Eine OnUpdateRecord-Ereignisbehandlungsroutine erstellen

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Aktualisierungen mit der BDE zwischenspeichern - Index


Hinweis: Die Borland Database Engine (BDE) ist veraltet und wird nicht mehr weiterentwickelt. Die BDE wird Unicode beispielsweise nie unterstützen. Sie sollten mit der BDE keine neuen Entwicklungen vornehmen. Überprüfen Sie, ob Sie Ihre vorhandenen Datenbankanwendungen nicht von der BDE nach dbExpress migrieren können.

Wenn eine BDE-Datenmenge ihre zwischengespeicherten Aktualisierungen anwendet, durchläuft sie die im Zwischenspeicher aufgezeichneten Änderungen und versucht, sie auf die entsprechenden Datensätze in der Basistabelle anzuwenden. Bei der Aktualisierung jedes geänderten, gelöschten oder neu eingefügten Datensatzes wird das Ereignis OnUpdateRecord der Datenmengenkomponente ausgelöst.

Durch die Bereitstellung einer Ereignisbehandlungsroutine für das Ereignis OnUpdateRecord ist es möglich, unmittelbar vor der tatsächlichen Aktualisierung des aktuellen Datensatzes Aktionen auszuführen. Bei diesen Aktionen kann es sich unter anderem um eine spezielle Datenauswertung, die Aktualisierung anderer Tabellen, eine Parametersubstitution oder die Ausführung mehrerer Aktualisierungsobjekte handeln. Eine Ereignisbehandlungsroutine für das Ereignis OnUpdateRecord bietet Ihnen größere Kontrolle über den Aktualisierungsprozess.

Hier eine Quelltextschablone für eine OnUpdateRecord-Ereignisbehandlungsroutine:

 procedure TForm1.DataSetUpdateRecord(DataSet: TDataSet;
  UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 begin
   { perform updates here... }
 end;
 void __fastcall TForm1::DataSetUpdateRecord(TDataSet *DataSet,
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
 {
   // Perform updates here...
 }

Der Parameter DataSet gibt die zwischengespeicherte Datenmenge mit den Aktualisierungen an.

Der Parameter UpdateKind gibt den Typ der für den aktuellen Datensatz auszuführenden Aktualisierung an. Werte für UpdateKind sind ukModify, ukInsert und ukDelete. Wenn Sie ein Aktualisierungsobjekt verwenden, müssen Sie für die Anwendung der Aktualisierungen diesen Parameter übergeben. Außerdem sollten Sie diesen Parameter auswerten, falls Ihre Behandlungsroutine abhängig vom Aktualisierungstyp eine spezielle Verarbeitung vornimmt.

Der Parameter UpdateAction gibt an, ob Sie die Aktualisierung angewendet haben. Werte für UpdateAction sind uaFail (Vorgabe), uaAbort, uaSkip, uaRetry, uaApplied. Konnte Ihre Ereignisbehandlungsroutine die Aktualisierung erfolgreich anwenden, setzen Sie diesen Parameter vor Beendigung der Routine auf uaApplied. Wenn Sie vorhaben, den aktuellen Datensatz nicht zu aktualisieren, setzen Sie den Wert uaSkip, um nicht angewendete Änderungen im Zwischenspeicher beizubehalten. Falls Sie den Wert für UpdateAction nicht ändern, wird die gesamte Aktualisierung für die Datenmenge abgebrochen und eine Exception wird ausgelöst. Sie unterdrücken die Fehlermeldung (eine stumme Exception wird ausgelöst), indem Sie UpdateAction auf uaAbort setzen.

Neben diesen Parametern verwendet man häufig auch die Eigenschaften OldValue und NewValue für die dem aktuellen Datensatz zugeordnete Feldkomponente. OldValue enthält den ursprünglichen Feldwert, der aus der Datenbank abgerufen wurde. Er kann praktisch sein, um den zu aktualisierenden Datensatz in der Datenbank zu finden. NewValue ist der bearbeitete Wert in der Aktualisierung, die Sie anwenden wollen.

Warnung:  Eine Ereignisbehandlungsroutine für OnUpdateRecord sollte wie Ereignisbehandlungsroutinen für OnUpdateError oder OnCalcFields niemals Methoden aufrufen, die den aktuellen Datensatz in einer Datenmenge ändern.

Das folgende Beispiel zeigt, wie diese Parameter und Eigenschaften verwendet werden. Es verwendet die TTable-Komponente UpdateTable, um Aktualisierungen anzuwenden. In der Praxis ist es einfacher, ein Aktualisierungsobjekt zu verwenden, aber die Verwendung einer Tabelle zeigt die verschiedenen Möglichkeiten besser auf.

 procedure TForm1.EmpAuditUpdateRecord(DataSet: TDataSet;
   UpdateKind: TUpdateKind; var UpdateAction: TUpdateAction);
 begin
   if UpdateKind = ukInsert then
     UpdateTable.AppendRecord([DataSet.Fields[0].NewValue, DataSet.Fields[1].NewValue])
   else
     if UpdateTable.Locate('KeyField', VarToStr(DataSet.Fields[1].OldValue), []) then
       case UpdateKind of
         ukModify:
           begin
             UpdateTable.Edit;
             UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue);
             UpdateTable.Post;
           end;
         ukInsert:
           begin
             UpdateTable.Insert;
             UpdateTable.Fields[1].AsString := VarToStr(DataSet.Fields[1].NewValue);
             UpdateTable.Post;
           end;
         ukDelete: UpdateTable.Delete;
       end;
         UpdateAction := uaApplied;
 end;
 void __fastcall TForm1::EmpAuditUpdateRecord(TDataSet *DataSet,
   TUpdateKind UpdateKind, TUpdateAction &UpdateAction)
 {
   if (UpdateKind == ukInsert)
   {
     TVarRec values[2];
     for (int i = 0; i < 2; i++)
       values[i] = DataSet->Fields->Fields[i]->NewValue;
     UpdateTable->AppendRecord(values, 1);
   }
   else
   {
     TLocateOptions lo;
     lo.Clear();
     if (UpdateTable->Locate("KeyField", DataSet->Fields->Fields[0]->OldValue, lo))
       switch (UpdateKind)
       {
         case ukModify:
           UpdateTable->Edit();
           UpdateTable->Fields->Fields[1]->Value = DataSet->Fields->Fields[1]->Value;
           UpdateTable->Post();
           break;
         case ukDelete:
           UpdateTable->Delete();
           break;
       }
   }
   UpdateAction = uaApplied;
 }

Siehe auch

Codebeispiel