【问题标题】:Tracking value changes when editing a record in Access在 Access 中编辑记录时跟踪值更改
【发布时间】:2017-04-11 01:39:32
【问题描述】:

我正在尝试在编辑记录时跟踪值更改。表单上的所有字段都是未绑定的文本框。

以下是用于插入审计跟踪记录的函数。

Public Function AuditChanges(RecordID As String, UserAction As String)

    Dim DB As Database
    Dim rst As Recordset
    Dim clt As Control
    Dim Userlogin As String

    Set DB = CurrentDb
    Set rst = DB.OpenRecordset("select * from tbl_audittrail", adOpenDynamic)

    Userlogin = Environ("username")

    Select Case UserAction

        Case "Edit"
            For Each clt In Screen.ActiveForm.Controls

                If (clt.ControlType = acTextBox _
                    Or clt.ControlType = accombox) Then
                    If Nz(clt.Value) <> Nz(clt.OldValue) Then
                        With rst
                            .AddNew
                            ![DateTime] = Now()
                            !UserName = Userlogin
                            !FormName = Screen.ActiveForm.Name
                            !Action = UserAction
                            !RecordID = Screen.ActiveForm.Controls(RecordID).Value
                            !FieldName = clt.ControlSource
                            !OldValue = clt.OldValue
                            !Newvalue = clt.Value
                            .Update
                        End With
                    End If
                End If
            Next clt
    End Select

    rst.Close
    DB.Close
    Set rst = Nothing
    Set DB = Nothing
End Function

以下是我如何使用该功能:

Private Sub btnUpdate_Click()

    Set DB = CurrentDb
    Set rs = DB.OpenRecordset("SELECT * FROM ASID", dbOpenDynaset, dbSeeChanges)

        rs.Edit
        rs!ISIN = Me.ISIN
        rs!SECIDTYPE = Me.SECIDTYPE
        rs!ALTSECID = Me.ALTSECID
        rs.Update
        Call AuditChanges("ISIN", "Edit")

     End If

End Sub

问题是当它调用 AuditChanges 时,它直接从

If (clt.ControlType = acTextBox _
    Or clt.ControlType = accombox)

End If

当前表单上的所有字段都是未绑定的文本框,您必须按“添加”命令按钮才能实际添加记录。我认为控件类型一定有问题,但我不确定应该使用哪种控件类型。有什么想法吗?

【问题讨论】:

  • 另外,未绑定的控件没有OldValue
  • 但是要更新一条记录,我必须先检索一条记录,然后更新它上面的某些字段,除了主键。在这种情况下,更新前的值应该被视为 OldValue,对吗?我是编码新手,如果我犯了愚蠢的错误,请原谅我。
  • 很难说,但安德烈是正确的,没有“accombox”这样的东西。您可能应该做的是在其中放置一行代码,上面写着' msgbox "Control Name: & clt.Name & ", ControlType: " & ctl.ControlType '(不带单引号)并将其放入循环中。这个这样您就可以知道每个控件的名称及其类型。我想如果您在页面上看到每个控件的此信息,您就会知道自己做错了什么。
  • 我已经更正了控件类型。我仍然无法跟踪我的更改。有没有其他方法可以做到这一点?我所有的更改都在 acTextBox 中完成,代码甚至没有尝试比较当前值和旧值。如果那是因为未绑定的文本框,还有其他方法可以跟踪 chsnge 吗?谢谢。
  • 当 Access 为您的表提供触发器时,为什么要经历这个麻烦?使用表触发器/数据宏自动捕获更改 >= access 2010

标签: ms-access vba


【解决方案1】:

首先将Option Explicit 放在每个模块的顶部。 它强制执行变量声明并在编译时报告未声明或拼写错误的变量/常量。 要在新模块中自动启用此功能,请在 VBA 编辑器中设置 Require Variable Declaration 选项。 这确实是 VBA 开发的必备。

然后编译器会告诉你accombox不存在,应该是acComboBox

没有Option Explicitaccombox 被初始化为 NULL 变体,并导致整个 If 条件为 NULL,因此永远不会输入。

【讨论】:

  • 谢谢。我会去做的。但我认为这不会有帮助,因为屏幕上没有组合框。
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-05
相关资源
最近更新 更多