【问题标题】:How to detect what control triggers BeforeUpdate event in Access 2007如何在 Access 2007 中检测哪些控件触发了更新前事件
【发布时间】:2014-09-19 20:10:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    表单和控件有Order of Events

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

    Exit(控制)→ LostFocus(控制)→ Unload(表单)→ Deactivate (表格)→关闭(表格)

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

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

    【讨论】:

    • 我理解事件的顺序,问题是由于代码是对记录对应的所有控件进行排序,它正在查找已经记录的值并再次记录它们。我需要一种方法来获取代码以仅记录用户离开记录时控件留下的最终状态。我曾尝试使用 OnRecordExit 事件,但我认为 2007 年不支持它。按照 MSDN 的示例,我使用了 Forms![PartsDatabaseX]![RepsSubformX].Form.OnRecordExit = "=ToTracking()"
    • 如果你在更新事件后使用表单,我不明白为什么你应该得到重复的值。我发布上面的原因是我怀疑你有错误的事件。我还发布了一个可能有帮助的链接。
    • AfterUpdate 事件在正确的时间触发并没有错。问题是 Ctl.OldValue 在此事件期间未更新,因此当前值和新值将始终相同。而且您发布的链接也使用了BeforeUpdate 事件。
    【解决方案2】:

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

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

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

    If Nz(Ctl.Value) &lt;&gt; Nz(Ctl.OldValue) And Ctl.ControlSource = NameOfTrigger Then

    'Record Values
    

    End if

    【讨论】:

      猜你喜欢
      • 2011-10-22
      • 2011-04-16
      • 1970-01-01
      • 2011-04-24
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2014-08-07
      相关资源
      最近更新 更多