我有一个审计跟踪,它使用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将记录的更改视为新的?
答案 0 :(得分:1)
表单和控件有Order of Events:
同样,当您关闭表单时,会发生以下事件序列 发生:
退出(控制)→LostFocus(控制)→卸载(窗体)→取消激活 (表格)→关闭(表格)
如果您已更改控件中的数据,则为BeforeUpdate和AfterUpdate 控件和表单的事件发生在Exit事件之前 对于控制。
答案 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