如何检测哪些控件在Access 2007中触发BeforeUpdate事件

时间:2014-07-28 15:26:22

标签: vba access-vba ms-access-2007 audit-trail beforeupdate

我有一个审计跟踪,它使用BeforeUpdate事件来跟踪使用以下代码对子表单所做的更改:

`Dim USR As String
Dim TS As Date
Dim Connection As ADODB.Connection
Dim RecordSet As ADODB.RecordSet
Dim Ctl As Control
MsgBox "Here!"
Set Connection = CurrentProject.Connection
Set RecordSet = New ADODB.RecordSet
If Forms![PartsDatabaseX]![RepsSubformX].Visible = True Then
    For Each Ctl In Screen.ActiveForm.RepsSubformX.Form.Controls
        If Ctl.Tag = "Track" Then
            If Nz(Ctl.Value) <> Nz(Ctl.OldValue) Then
            SaveToken = True
                With RecordSet
                    .AddNew
                    ![Part Number] = Screen.ActiveForm.RepsSubformX.Form.Controls("[Part Nbr]").Value
                    ![Record Identifier] = Screen.ActiveForm.RepsSubformX.Form.Controls("[Part Nbr]").Value & Screen.ActiveForm.RepsSubformX.Form.Controls("[Supplier Name]").Value
                    ![Rep] = USR
                    ![Time Stamp] = TS
                    ![Change Point] = Ctl.ControlSource
                    ![Change From] = Ctl.OldValue
                    ![Change To] = Ctl.Value
                    .Update
                End With
            End If
        End If
    Next Ctl
End If`

我遇到的问题是,用户进行了两次更改,我的更改历史记录表中记录了三项内容 - 第一次更改为记录两次,第二次更改为记录一次(此趋势一直持续到用户永远不会离开记录)。我想要做的是能够识别触发BeforeUpdate事件的控件并将其传递给上面的代码,以便它可以检查是否只有触发BeforeUpdate事件的控件是否不同并跳过其他已经登录的人。或者,有没有办法阻止Access将记录的更改视为新的?

2 个答案:

答案 0 :(得分:1)

表单和控件有Order of Events

  

同样,当您关闭表单时,会发生以下事件序列   发生:

     

退出(控制)→LostFocus(控制)→卸载(窗体)→取消激活   (表格)→关闭(表格)

     

如果您已更改控件中的数据,则为BeforeUpdate和AfterUpdate   控件和表单的事件发生在Exit事件之前   对于控制。

您可能希望阅读http://support.microsoft.com/kb/197592

答案 1 :(得分:0)

答案一直盯着我...当我将BeforeUpdate事件分配给每个控件时,我可以让它将变量传递给它调用的函数告诉我程序是什么发了它:

Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate = "=ToTracking(""Pack Rank"")"

之后,在检查更改的值时添加和声明是一件简单的事情,因此它只捕获引发BeforeUpdate事件的更改,如下所示:

If Nz(Ctl.Value) <> Nz(Ctl.OldValue) And Ctl.ControlSource = NameOfTrigger Then

'Record Values

End if