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

Vba 如何在Access 2007中检测哪些控件触发BeforeUpdate事件,vba,ms-access,ms-access-2007,audit-trail,beforeupdate,Vba,Ms Access,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.

我有一个审计跟踪,它使用
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`
`Dim USR作为字符串
日期
作为ADODB.Connection的Dim连接
将记录集设置为ADODB.RecordSet
Dim-Ctl作为对照
MsgBox“在这里!”
设置Connection=CurrentProject.Connection
Set RecordSet=New ADODB.RecordSet
如果形式![PartsDatabaseX]![RepsSubformX].Visible=True然后
对于Screen.ActiveForm.RepsSubformX.Form.Controls中的每个Ctl
如果Ctl.Tag=“Track”,则
如果Nz(控制值)Nz(控制值),则
SaveToken=True
带记录集
.AddNew
![部件号]=Screen.ActiveForm.RepsSubformX.Form.Controls(“[Part Nbr]”)。值
![记录标识符]=Screen.ActiveForm.RepsSubformX.Form.Controls(“[零件编号]”)。值和Screen.ActiveForm.RepsSubformX.Form.Controls(“[供应商名称]”)。值
![Rep]=USR
![时间戳]=TS
![变更点]=控制源
![更改自]=Ctl.OldValue
![更改为]=控制值
.更新
以
如果结束
如果结束
下一个Ctl
如果结束`
我遇到的问题是,用户进行了两次更改在我的更改历史记录表中记录了三件事-第一次更改记录两次,第二次更改记录一次(只要用户从未离开记录,这种趋势就会持续)。我想做的是能够识别触发
BeforeUpdate
事件的控件,并将其传递给上面的代码,以便它可以检查触发
BeforeUpdate
事件的控件是否不同,并跳过已记录的其他控件。或者,是否有方法防止Access将记录的更改视为新更改?

表单和控件具有:

类似地,当您关闭表单时,以下事件序列 发生:

出口(控制)→ LostFocus(控制)→ 卸载(表格)→ 使停止工作 (表格)→ 关闭(表格)

如果更改了控件中的数据,则会显示BeforeUpdate和AfterUpdate 控件和窗体的事件都发生在退出事件之前 为了控制


你不妨读一读

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

表单![PartsDatabaseX]![RepsSubformX]。表单![Pack Rank].BeforeUpdate=“=ToTracking”(“Pack Rank”)”

在这之后,在检查更改的值时只需添加and语句,这样它就可以只捕获触发
BeforeUpdate
事件的更改,如下所示:

如果Nz(Ctl.Value)Nz(Ctl.OldValue)和Ctl.ControlSource=触发器名称,则

'Record Values

结束如果

我了解事件的顺序,问题在于,由于代码对记录对应的所有控件进行排序,因此它会查找已记录的值并再次记录。我需要一种方法让代码只记录用户离开记录时控件保留的最终状态。我曾尝试使用
OnRecordExit
事件,但我认为它在2007年不受支持。按照MSDN的示例,我使用了
表单![PartsDatabaseX]![RepsSubformX].Form.OnRecordExit=“=ToTracking()”
如果在更新事件后使用表单,我不明白为什么要获得重复的值。我发布上述内容的原因是,我怀疑您的事件是错误的。我还发布了一个可能会有所帮助的链接。关于在正确的时间触发
AfterUpdate
事件,您没有错。问题是,
Ctl.OldValue
在此事件期间不会更新,因此当前值和新值将始终相同。您发布的链接也使用了
BeforeUpdate
事件。