.OldValue und .Value in Tabelle eintragen

Ich habe ein Formular, dass die Daten der Tabelle ‚Mitglieder‘ verwaltet.

Private Sub Form\_BeforeUpdate(Cancel As Integer)
 Call AuditTrail(Me, Me!MitgliederID, Nz(FIRMA, ""), Nz(STRAßE, ""), Nz(PLZ, ""), Nz(ORT, ""), Nz(TEL, ""), Nz(FAX, ""))
End Sub

Änderungen der Tabelle ‚Mitglieder‘ werden in der Tabelle ‚Audit‘ festgehalten.

Sub AuditTrail(frm As Form, recordid As Control, FIRMA As String, STRAßE As String, PLZ As String, ORT As String, TEL As String, FAX As String)

 Dim ctl As Control
 Dim varBefore As Variant
 Dim varAfter As Variant
 Dim strControlName As String
 Dim strSQL As String


 On Error GoTo ErrHandler

 For Each ctl In frm.Controls
 With ctl

 If .ControlType = acTextBox Then
 If .Value .OldValue Then

 varBefore = .OldValue
 varAfter = .Value
 strControlName = .NAME

 strSQL = "INSERT INTO Audit (EditDate, User, RecordID, SourceTable, SourceField, BeforeValue, AfterValue, " & \_
 "AuditFIRMA, AuditSTRASSE, AuditPLZ, AuditORT, AuditTEL, AuditFAX) " & \_
 "VALUES (Now()," & \_
 cDQ & Environ("username") & cDQ & ", " & \_
 cDQ & recordid.Value & cDQ & ", " & \_
 cDQ & frm.RecordSource & cDQ & ", " & \_
 cDQ & .NAME & cDQ & ", " & \_
 cDQ & varBefore & cDQ & ", " & \_
 cDQ & varAfter & cDQ & ", " & \_
 cDQ & FIRMA & cDQ & ", " & \_
 cDQ & STRAßE & cDQ & ", " & \_
 cDQ & PLZ & cDQ & ", " & \_
 cDQ & ORT & cDQ & ", " & \_
 cDQ & TEL & cDQ & ", " & \_
 cDQ & FAX & cDQ & ", " & \_

 Debug.Print strSQL
 DoCmd.SetWarnings False
 DoCmd.RunSQL strSQL
 DoCmd.SetWarnings True
 End If
 End If


 End With
 Next
 Set ctl = Nothing
 Exit Sub

ErrHandler:
 MsgBox Err.Description & vbNewLine \_
 & Err.Number, vbOKOnly, "Error"
End Sub

Das funktioniert wunderbar, sofern ein Eintrag existiert und dieser geändert, jedoch nicht gelöscht wird.

Mein Problem sieht wie folgt aus, es andelt sich dabei bspw. um ein Feld, welches ich vier mal hintereinander geändert habe:

vorher nachher Ergebnis

ursprünglich kein Eintrag Eintrag Eintrag in Audit
Eintrag gelöscht leeres Feld kein Eintrag in Audit
Eintrag kein leeres Feld kein Eintrag in Audit
Eintrag geändert kein leeres Feld Eintrag in Audit

Ich möchte jedoch bei jeder Änderung einen Eintrag in die Tabelle Audit, auch wenn vorher oder anschliessend nichts im Feld steht.

Was muss ich ändern?

Grüsse aus Osnabrück,
Hans

Hallo

If .ControlType = acTextBox Then
If .Value .OldValue Then

Was muss ich ändern?

.Value und .Oldvalue zusätzlich auf NULL (IsNull(), bzw. nz() ) prüfen und entspr. handeln.

vielleicht klappt schon dieses:

If nz(.Value,0) nz(.OldValue,0) Then

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Franz,

If nz(.Value,0) nz(.OldValue,0) Then

das klappt wunderbar. Vielen Dank dafür :smile:

… nur dass ich „“ statt 0 verwendet habe.

Ich will es ja nicht übertreiben, aber kann man auch, aus ästhetischen Gründen, falls kein Eintrag vorhanden war, sich in die Tabelle ‚Kein Eintrag vorhanden.‘ und falls ein Eintrag gelöscht wurde ‚Eintrag gelöscht.‘ eintragen lassen?

In der Zeile

If nz(.Value, "") nz(.OldValue, "") Then

habe ich es schon probiert, klappt nicht.

Ich habe auch schon folgendes versucht:

varBefore = .OldValue

If varBefore = "" Then
 varBefore = "Kein Eintrag vorhanden."
End If

varAfter = .Value

If varAfter = Null Then
 varAfter = "Eintrag gelöscht."
End If

Klappt leider auch nicht. Es sei denn, ursprünglich war kein Eintrag vorhanden, dann wird in genau nur dem Fall ‚Kein Eintrag vorhanden‘ in die Tabelle Audit eingetragen.
Aber nicht, wenn ein Eintrag gelöscht wurde und/oder danach wieder eingetragen wurde.
Also von der Problematik wie vorher.

Grüsse aus Osnabrück,
Hans

Hallo,

etwa so:
If nz(varBefore,"") ="" Then

wenn „varBefore“ eine Variable von Datentyp Variant ist

Ansonsten mußt Du halt debuggen und den Code mal im Einzelschritt durchlaufen, um zu shen, was so alles passiert…

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

etwa so:
If nz(varBefore,"") ="" Then

wenn „varBefore“ eine Variable von Datentyp Variant ist

varBefore ist Variant.

Folgendes habe ich versucht, führte jedoch zu Fehler 494, Objekt erforderlich:

 If Nz(varBefore, "") = "" Then
 Nz(varBefore, "") = "Kein Eintrag vorhanden."
 Else
 Nz(varBefore, "") = .OldValue
 End If

Ansonsten mußt Du halt debuggen und den Code mal im
Einzelschritt durchlaufen, um zu shen, was so alles
passiert…

Ok, das hab ich noch nie gemacht, bin Anfänger. Ich habe im VB-Editor auf Debuggen geklickt und anschliessend auf Einzelschritt (F8). Irgendwie ist aber nichts passiert.

Grüsse aus Osnabrück,
Hans

Hallo,

naja , der Code ist ja auch etwas daneben…

irgendwie so:

If Nz(varBefore, „“) = „“ Then
Msgbox"Kein Eintrag vorhanden."
Else
varBefore = .OldValue
End If

Zum Debuggen solltest Du erst einen Haltepunkt setzen (links neben einer Codezeile auf den „Rahmenbereich“ des Rensters klicken. DAnn erscheint ein brauner Punkt, der einen Haltepunkt darstellt.
Beim Abarbeiten des Codes bleibt er an dieser Stelle stehen und man kann mit F8 im Einzelschritt „weiterfahren“.

Viele Grüße vom Bodensee
Franz , DF6GL

PS: Feedback erwünscht!

Hallo Hans,

quick & dirty erstelle dir einfach mal eine eigene Funktion:

Public Function isNIX(xData)
isNIX = False

isNIX = IsNull(xData)
If isNIX Then Exit Function
isNIX = IsEmpty(xData)
If isNIX Then Exit Function
isNIX = Len(xData) = 0
If isNIX Then Exit Function
isNIX = (xData = False)
If isNIX Then Exit Function
isNIX = xData = 0
If isNIX Then Exit Function

End Function

Dann sollte das so funktionieren:

 If isNIX(varBefore) Then
 varBefore = "Kein Eintrag vorhanden"
 Else
 varBefore = .OldValue
 End If

oder kürzer:
varBefore = iif(isNIX(varBefore),"Kein Eintrag vorhanden",.OldValue)

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo Wolfgang,

die von Dir vorgeschlagene Funktion habe ich in ein Modul Namens ‚basNullLeer‘ eingefügt.

Für varAfter habe ich geschrieben

 If isNIX(varAfter) Then
 varAfter = "Eintrag gelöscht."
 Else
 varAfter = .Value
 End If

Ergebnis:

Bsp. Anhand der Änderung des Inhalts des Feldes ‚ORT‘ in der Tabelle ‚Mitglieder‘ und der Dokumentierung in der Tabelle ‚Audit‘ und den betreffenden Feldern für die Fälle:

a) Eintrag lag vor
b) ursprünglich kein Eintrag vorhanden (NULL)
c) Eintrag wurde vormals gelöscht ("")
d) Eintrag löschen

Fall Mitglieder.Ort Änderung Audit.BeforeValue Audit.AfterValue Audit.AuditORT

a) Bochum Berlin Kein Eintrag vorhanden Eintrag gelöscht Berlin
b) Hamburg Kein Eintrag vorhanden Eintrag gelöscht Hamburg
c) Dresden Kein Eintrag vorhanden Eintrag gelöscht Dresden
d) München Kein Eintrag vorhanden Eintrag gelöscht 

Erhofft habe ich mir jedoch:

Fall Mitglieder.Ort Änderung Audit.BeforeValue Audit.AfterValue Audit.AuditORT

a) Bochum Berlin Bochum Berlin Berlin
b) Hamburg Kein Eintrag vorhanden Hamburg Hamburg
c) Dresden Kein Eintrag vorhanden Dresden Dresden
d) München München Eintrag gelöscht 

Liegt der Fehler nun in der Funktion oder in den if/then/else Abfragen bzgl. varBefor und varAfter?

Grüsse aus Osnabrück,
Hans

Hallo Franz,

eine Messagebox kann ich leider nicht gebrauchen.

Da ich einen Eintrag brauche, den ich später Ausdrucken muss, habe ich nun folgendes geschrieben:

 If Nz(varBefore, "") = "" Then
 varBefore = "Kein Eintrag vorhanden."
 Else
 varBefore = .OldValue
 End If

… und adäquat dazu auch für varAfter.

Ergebnis:

Bsp. Anhand der Änderung des Inhalts des Feldes ‚ORT‘ in der Tabelle ‚Mitglieder‘ und der Dokumentierung in der Tabelle ‚Audit‘ und den betreffenden Feldern für die Fälle:

a) Eintrag lag vor
b) ursprünglich kein Eintrag vorhanden (NULL)
c) Eintrag wurde vormals gelöscht ("")
d) Eintrag löschen

Fall Mitglieder.Ort Änderung Audit.BeforeValue Audit.AfterValue Audit.AuditORT

a) Bochum Berlin Bochum Bochum Berlin
b) Hamburg Kein Eintrag vorhanden Eintrag gelöscht Hamburg
c) Dresden Kein Eintrag vorhanden Eintrag gelöscht Dresden
d) München Kein Eintrag vorhanden Eintrag gelöscht 

Erhofft habe ich mir jedoch:

Fall Mitglieder.Ort Änderung Audit.BeforeValue Audit.AfterValue Audit.AuditORT

a) Bochum Berlin Bochum Berlin Berlin
b) Hamburg Kein Eintrag vorhanden Hamburg Hamburg
c) Dresden Kein Eintrag vorhanden Dresden Dresden
d) München München Eintrag gelöscht 

Die varBefore und varAfter spiegeln nur im Fall a) das wieder, wie es gedacht ist, in den anderen drei Fällen leider nicht. Woran kann das liegen?

Grüsse aus Osnabrück,
Hans

Hallo Wolfgang,

die von Dir vorgeschlagene Funktion habe ich in ein Modul
Namens ‚basNullLeer‘ eingefügt.

ok

Für varAfter habe ich geschrieben

If isNIX(varAfter) Then
varAfter = „Eintrag gelöscht.“
Else
varAfter = .Value
End If

nö, das kann nicht funktionieren, du hast zwei Werte und änderst hier nur einen!

If .Value .OldValue Then

= wenn alter Wert und neuer Wert unterschiedlich sind

varBefore = .OldValue

= alter Wert

varAfter = .Value

= neuer Wert

Liegt der Fehler nun in der Funktion oder in den if/then/else
Abfragen bzgl. varBefor und varAfter?

genau in der if/then/else Abfragen bzgl. varBefor und varAfter

varBefore = iif(isNix(.OldValue),„war NIX drin“,.OldValue)
varAfter = iif(isNix(.Value),„ist NIX mehr drin“,.Value)

Grüße aus Schönberg (Lübeck)
Wolfgang
(Netwolf)

Hallo Wolfgang,

Liegt der Fehler nun in der Funktion oder in den if/then/else
Abfragen bzgl. varBefor und varAfter?

genau in der if/then/else Abfragen bzgl. varBefor und varAfter

varBefore = iif(isNix(.OldValue),„war NIX drin“,.OldValue)
varAfter = iif(isNix(.Value),„ist NIX mehr drin“,.Value)

Wow! Ich bin begeistert :smile:
Funktioniert 1a!!

1000 Dank und ein schönes WE.

Grüsse aus Osnabrück,
Hans