There is a lot of stuff here. Please bear with me. I'm trying to implement Allen Browne's Audit Log
http://allenbrowne.com/AppAudit.html The pdf is attached.
I've studied it and added the code as described to my app.
I want to understand the how it is supposed to work(of course I have errors too)
There are four functions. Right now I'm focused on edit.
The AuditEditBegin("Diodes", "audTempDiodes", "audID", Nz(Me.audID, 0), bWasNewRecord) function is called in the form BeforeUpdate event.
The AuditEditEnd("Diodes", "audTempDiodes", "audDiodes", "audID", Nz(Me!audID, 0), bWasNewRecord) function is called in the form AfterUpdate event.
So if I open the form to edit a record. Then edit a text box value. When is the form BeforeUpdate event called?
When is the form AfterUpdate event called?
...and
... the Nz(Me.audID,0) in AuditEditBegin It is supposed to be passing the value of the field audID. But when executed I get Compile error: Method or data member not found and .audID is highlighted.
Here is the function call and function:
Call AuditEditBegin("Diodes", "audTempDiodes", "audID", Nz(Me.audID, 0), bWasNewRecord)
Function AuditEditBegin(sTable As String, sAudTmpTable As String, sKeyField As String, _
lngKeyValue As Long, bWasNewRecord As Boolean) As Boolean
'On Error GoTo Err_AuditEditBegin
'Purpose: Write a copy of the old values to temp table.
' It is then copied to the true audit table in AuditEditEnd.
'Arugments: sTable = name of table being audited.
' sAudTmpTable = name of the temp audit table.
' sKeyField = name of the AutoNumber field.
' lngKeyValue = Value of the AutoNumber field.
' bWasNewRecord = True if this was a new insert.
'Return: True if successful
'Usage: Called in form's BeforeUpdate event. Example:
' bWasNewRecord = Me.NewRecord
' Call AuditEditBegin("tblInvoice
", "audTmpInvoice", "InvoiceID", Me.InvoiceID, bWasNewRecord)
Dim db As DAO.Database ' Current database
Dim sSQL As String
'Remove any cancelled update still in the tmp table.
Set db = DBEngine(0)(0)
sSQL = "DELETE FROM " & sAudTmpTable & ";"
db.Execute sSQL
' If this was not a new record, save the old values.
If Not bWasNewRecord Then
sSQL = "INSERT INTO " & sAudTmpTable & " ( audType, audDate, audUser ) " & _
"SELECT 'EditFrom' AS Expr1, Now() AS Expr2, NetworkUserName() AS Expr3, " & sTable & ".* " & _
"FROM " & sTable & " WHERE (" & sTable & "." & sKeyField & " = " & lngKeyValue & ");"
db.Execute sSQL, dbFailOnError
End If
AuditEditBegin = True
Exit_AuditEditBegin:
Set db = Nothing
Exit Function
Err_AuditEditBegin:
Call LogError(Err.Number, Err.Description)
Resume Exit_AuditEditBegin
End Function
Thanks,
Brooks
BeforeUpdate gets fired just before a record is saved, either by an explicit call for a save, or you tried to move off the record.
<<When is the form AfterUpdate event called?>>
After the record is actually saved. If the save was triggered by trying to move to a new record, you have not as yet moved to the new record.
It's important to note that Before and After update are fired both for new (inserted records and records that were already existing and simply updated.
In addition, for new records, the AfterInsert fires after the AfterUpdate. For a new record, here's the order of events:
BeforeInsert > BeforeUpdate > AfterUpdate > AfterInsert.
<<audID>>
make sure you have a field in the forms underlying recordsource or control named as that.
What you can do is put a breakpoint on that line (or a stop on the line above it) and when the code halts, hover over the reference to see if it gives you a value.
Use F8 to step through the code line by line, or F5 to continue from that point.
Jim.