OKB-000262 | Prüfung, welches Feld beim Speichern geändert wurde

Betrifft: ab orgAnice SQL

Frage:
Wie kann beim Speichern eines Datensatzes festgestellt werden, welches Feld und wie geändert wurde?

Lösung:
Seit der Version 4.0.2.502 steht die Eigenschaft .SpecialValue der Klasse Field zur Verfügung. Sie unterscheidet sich von Field.Value dadurch, dass ein optionaler Parameter „Mode“ bestimmt, was zurückgegeben wird. Insbesondere kann sowohl auf den Lese- ( Field.SpecialValue(ORGDB_FIELDEVALMODE_READ) ) als auch den Schreibpuffer ( Field.SpecialValue(ORGDB_FIELDEVALMODE_WRITE) ) zurückgegriffen werden.

Direkt nach dem Positionieren eines neuen Datensatz unterscheiden sich die beiden Werte nicht, nach dem Setzen eines neuen Feldwertes mit Field.Value liefert jedoch die Abfrage des Lesepuffers einen anderen Wert als die Abfrage des Schreibpuffers.

Für den Zeitpunkt der Abfrage eignet sich am besten die Überwachung des Ereignisses Table_BeforeWrite().

Beispiel:

Erstellen Sie in einer Klasse, die auf die Ereignisse der zu überwachenden Tabellen reagiert, die folgende Prozedur ein:

Private Sub mTbl_BeforeWrite(pbContinue As Boolean)
‚ Listet im Direktfenster die Felder, deren Inhalte geändert werden, auf.
‚ Bei Nicht-Dokumentfeldern zusätzlich jeweils mit dem alten und dem neuen Wert.
Dim fld As OrgDbServer31.Field

For Each fld In mTbl.Fields
If fld.Type = ORGDB_FIELDTYPE_DOCUMENT Then
If Not fld.SpecialValue(ORGDB_FIELDEVALMODE_READ) Is fld.SpecialValue(ORGDB_FIELDEVALMODE_WRITE) Then
Debug.Print „Feld “ & fld.Name & “ geändert“
End If
Else
If fld.SpecialValue(ORGDB_FIELDEVALMODE_READ) <> fld.SpecialValue(ORGDB_FIELDEVALMODE_WRITE) Then
Debug.Print „Feld “ & fld.Name & “ geändert: ‚“ & _
fld.SpecialValue(ORGDB_FIELDEVALMODE_READ) & „‚ -> ‚“ & _
fld.SpecialValue(ORGDB_FIELDEVALMODE_WRITE) & „‚“
End If
End If
Next fld
End Sub

Die Prozedur gibt im Direktfenster beim Speichern eines Datensatzes die Namen der geänderten Felder, sowie (bei Nicht-Dokumentfeldern) den alten und den neuen Wert aus.

Zu Testzwecken fügen Sie die Prozedur in die Standardklasse CTableEvents ein, sie reagiert u.a. auf die Ereignisse in den Tabellen Adressen und Aktivitäten.