2

我有一个审计跟踪,它使用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 将记录的更改视为新更改?

4

2 回答 2

1

表单和控件具有事件顺序

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

Exit(控件)→ LostFocus(控件)→ Unload(表单)→ Deactivate(表单)→ Close(表单)

如果您更改了控件中的数据,则控件和窗体的 BeforeUpdate 和 AfterUpdate 事件都会在控件的 Exit 事件之前发生。

您不妨阅读http://support.microsoft.com/kb/197592

于 2014-07-28T18:04:29.790 回答
0

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

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

之后,在检查更改的值时添加一个 and 语句很简单,因此它只捕获引发BeforeUpdate事件的更改,如下所示:

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

'Record Values

End if

于 2014-07-29T19:18:01.290 回答