brasiman
asked on
Transaction Log in Access Database
We are looking for a way to create a transaction log in Access 2010, when changes are made in a table, this transaction log populates when the change was made. We want a record created in a transaction log to keep track of any changes in a table. Specifically, we have a table with multiple columns that have check boxes (Columns 1-5 on the attached image). We are looking for a way to track when those check boxes are checked. On our table that has multiple columns with check boxes (Table 1), there is an ID column. On the transaction log, we need it to reference the ID column from the table (Table 1) and which column was checked (Columns 1-5). I hope that makes sense. Thanks!!
Example.jpg
Example.jpg
If you are updating using bound forms, you can use the forms before update event to trap the New value and Old value and write them to a log. You'd need to write a piece of code that cycles all the appropriate controls and compares the oldvalue and value values and write where they're different along with any other data you want.
Kelvin
Kelvin
ASKER
We will be changing the data in a form, which is tied to the table.
If you are updating directly into the table, or use unbound forms, then sadly, you're out of luck
Kelvin
Kelvin
ASKER
What about this? http://www.fontstuff.com/access/acctut21.htm
Forms tied to the table are bound forms.
K
K
ASKER
I can change it so we are entering the data on the table.
I have the following function that does that, just call it from the forms BeforeUpdate event.
Public Function SaveHistoryChanges(Optional sTable As String = "", Optional sField As String = "", Optional vValue As Variant = "", Optional lID As Long = 0)
Dim ssql As String, cNtrl As Control
If Len(sTable) = 0 Then sTable = Screen.ActiveForm.Name
If lID = 0 Then lID = Nz(Screen.ActiveForm.ID, 0)
On Error Resume Next
For Each cNtrl In Screen.ActiveForm.Controls
If (TypeOf cNtrl Is TextBox Or TypeOf cNtrl Is ComboBox Or TypeOf cNtrl Is CheckBox Or cNtrl.ControlType = 107) Then
If Nz(cNtrl.Value) <> Nz(cNtrl.OldValue) And cNtrl.Visible = True And cNtrl.Enabled = True Then
If Not IsNull(cNtrl.OldValue) And Not (TypeOf cNtrl Is CheckBox) Then
If Nz(tLookup("ID", "HistoryChanges", "TableName = '" & sTable & "' and FieldName = '" & cNtrl.ControlSource & "' and TableID = " & lID), 0) = 0 Then
ssql = "Insert into HistoryChanges (TableName, FieldName, Value, TableID)"
ssql = ssql & " Values ('" & sTable & "','" & cNtrl.ControlSource & "','" & cNtrl.OldValue & "'," & lID & ")"
CurrentProject.Connection.Execute ssql
End If
End If
ssql = "Insert into HistoryChanges (TableName, FieldName, Value, Initial, TableID)"
ssql = ssql & " Values ('" & sTable & "','" & cNtrl.ControlSource & "','" & cNtrl.Value & "','" & GetInitial & "'," & lID & ")"
CurrentProject.Connection.Execute ssql
End If
End If
Next
End Function
"I can change it so we are entering the data on the table. "
No!, you must use bound forms!
K
The code above is just what is needed.
No!, you must use bound forms!
K
The code above is just what is needed.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Yes as Jim notes, you can use Data Macros if you are using the ACCDB format. I've tested this and created a transaction log and it seems to work quite well. Just an FYI.
ASKER
Hi bfuchs, do I need to change any of the code text to match my columns and table name? On my first question, I attached an image of my table and column names. Thanks!
No, the only thing needed is to create a table named HistoryChanges with the following fields.
TableName, FieldName, Value, Initial, TableID
TableName, FieldName, Value, Initial, TableID
Abandon Q
OM Gang