【问题标题】:Access 2010 - Audit Trail with composite primary keysAccess 2010 - 具有复合主键的审计跟踪
【发布时间】:2015-10-30 07:15:46
【问题描述】:

我一直无法找到解决这个问题的方法,所以我希望你们中的一些人能有所帮助。我正在尝试为 Access 数据库创建审计跟踪以跟踪更改。我的许多表都有复合主键(多个字段组合以唯一标识记录)。我获得了审计模块的以下代码:

Const cDQ As String = """"

Sub AuditTrail(frm As Form, recordid As Control)

'Track changes to data.   'recordid identifies the pk field's corresponding
'control in frm, in order to id record.
Dim ctl As Control
Dim varBefore As Variant
Dim varAfter As Variant
Dim strControlName As String
Dim strSQL As String
On Error GoTo ErrHandler
'Get changed values.
For Each ctl In frm.Controls

With ctl
'Avoid labels and other controls with Value property.

Select Case .ControlType

Case acTextBox
If .Value <> .OldValue Then
varBefore = .OldValue
varAfter = .Value
strControlName = .Name
'Build INSERT INTO statement.
strSQL = "INSERT INTO " _
& "Audit (EditDate, RecordID, SourceTable, " _
 & " SourceField, BeforeValue, AfterValue) " _
 & "VALUES (Now()," _
 & cDQ & recordid.Value & cDQ & ", " _
 & cDQ & frm.RecordSource & cDQ & ", " _
 & cDQ & .Name & cDQ & ", " _
 & cDQ & varBefore & cDQ & ", " _
 & cDQ & varAfter & cDQ & ")"
 '& cDQ & Environ("username") & cDQ & ", " _

'View evaluated statement in Immediate window.

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

Case acComboBox
If .Value <> .OldValue Then
varBefore = .OldValue
varAfter = .Value
strControlName = .Name
'Build INSERT INTO statement.
strSQL = "INSERT INTO " _
& "Audit (EditDate, User, RecordID, SourceTable, " _
& " SourceField, BeforeValue, AfterValue) " _
& "VALUES (Now()," _
'& cDQ & Environ("username") & cDQ & ", " _
& cDQ & recordid.Value & cDQ & ", " _
& cDQ & frm.RecordSource & cDQ & ", " _
& cDQ & .NAME & cDQ & ", " _
& cDQ & varBefore & cDQ & ", " _
& cDQ & varAfter & cDQ & ")"

'View evaluated statement in Immediate window.

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


Case acListBox
If .Value <> .OldValue Then
varBefore = .OldValue
varAfter = .Value
strControlName = .Name
'Build INSERT INTO statement.
strSQL = "INSERT INTO " _
& "Audit (EditDate, User, RecordID, SourceTable, " _
& " SourceField, BeforeValue, AfterValue) " _
& "VALUES (Now()," _
& cDQ & Environ("username") & cDQ & ", " _
& cDQ & recordid.Value & cDQ & ", " _
& cDQ & frm.RecordSource & cDQ & ", " _
& cDQ & .Name & cDQ & ", " _
& cDQ & varBefore & cDQ & ", " _
& cDQ & varAfter & cDQ & ")"

'View evaluated statement in Immediate window.

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

End Select

End With
Next
Set ctl = Nothing
Exit Sub

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

End Sub

然后在单个表单的代码中,我有以下代码来运行模块:

Option Compare Database

Private Sub Form_BeforeUpdate(Cancel As Integer)
Call AuditTrail(Me, HeaderID)
End Sub

我发现当我将 HeaderID 的字段名称替换为单值主键的名称时,代码可以正常工作。当我的表有多个字段构成主键时,我不确定如何格式化“HeaderID”来识别这些值的组合。我也以某些形式查找表格,但我不确定这是否会导致问题。

我收到的错误消息:

编译错误: ByRef 参数类型不匹配

任何想法将不胜感激!

谢谢你, 蒂芙尼

【问题讨论】:

    标签: ms-access vba ms-access-2010 audit-trail


    【解决方案1】:

    您的 AuditTrail 子例程将表单和数据编辑所在的控件作为其参数。因此,当您传递“Me”和字段(控件)的名称时,实际上是在将当前表单和控件传递给子例程。当您将“HeaderID”更改为控件名称以外的任何内容时,您将收到“类型不匹配”错误,因为您的子例程需要一个控件而不是一条数据。

    您需要调整 AuditTrail 子例程以获取您实际想要存储在表中的索引值。如果您的组合 ID 是由三个值组成的字符串,则将 AuditTrail 子例程的参数从“控制”更改为“字符串”。

    【讨论】:

    • 谢谢。这是有道理的,也是我没有考虑过的。我已尝试按照建议修改模块,但仍然收到相同的错误。我将继续为此努力。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2011-11-26
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2014-05-21
    • 2015-10-23
    相关资源
    最近更新 更多