【问题标题】:Audit trail code not picking up combobox list changes审核跟踪代码未获取组合框列表更改
【发布时间】:2018-01-26 09:08:47
【问题描述】:

我看过这个帖子:Saving changes to a multivalued ComboBox via AuditTrail

并试图获取花絮并将其放入我的代码中,但它不起作用!我不太擅长 SQL,但我需要完成这项工作。这是我的代码,它适用于文本框,但有人可以告诉我确切的位置和确切的内容,我需要为我的组合框下拉列表更改放置什么?

提前致谢!!

Function LogChanges(lngID As Long, Optional strField As String = "")
    Dim dbs As DAO.Database
    Dim rst As DAO.Recordset
    Dim varOld As Variant
    Dim varNew As Variant
    Dim strFormName As String
    Dim strControlName As String


    varOld = Screen.ActiveControl.OldValue
    varNew = Screen.ActiveControl.Value
    strFormName = Screen.ActiveForm.NAME
    strControlName = Screen.ActiveControl.NAME
    Set dbs = CurrentDb()
    Set rst = dbs.TableDefs("ztblDataChanges").OpenRecordset

    With rst
        .AddNew
        !FormName = strFormName
        !ControlName = strControlName
        If strField = "" Then
            !FieldName = strControlName
        Else
            !FieldName = strField
        End If
        !RecordID = lngID
        !UserName = Environ("username")
        If Not IsNull(varOld) Then
            !OldValue = CStr(varOld)
        End If
        !NewValue = CStr(varNew)
        .Update
    End With
    'clean up
    rst.Close
    Set rst = Nothing
    dbs.Close
    Set dbs = Nothing
End Function

【问题讨论】:

  • “它不起作用”是什么意思?请更好地描述您想要做什么、做了什么、预期会发生什么以及您观察到的情况(包括任何错误消息)。
  • 请注意,在 Access 中使用 VBA 的审计跟踪很容易绕过,即使您正在使用已编译的数据库文件。在 Access 中,审计的首选选项是数据宏。有关示例实现,请参阅 this page
  • 我最初用宏,newold 做审计功能,但发现代码更好,审计表字段也不多。当我提到它不起作用时-让我更好地解释一下。我正在创建一个库存调度数据库。有 8 个可能的季度日期更改是文本框。审核代码获取对这些文本框的更改。我还需要用户在库存日期更改时必须使用的“更改原因”和“更改发起者”下拉列表。有 8 个变更原因和 5 个发起人可供选择。对这些下拉列表中的任何一个所做的更改都不会显示在审核表中。
  • 可能不需要这些,但是审计表字段有:LogID、FormName、ControlName、FieldName、RecordID、UserName、OldValue、NewValue、TimeStamp
  • 我想我可以将宏和那些字段添加回表中,只为新旧下拉字段......宏确实适用于这些。

标签: vba ms-access drop-down-menu combobox audit-logging


【解决方案1】:

您无法使用.Value.OldValue 获取多值字段的值。这些属性总是返回Null。据我所知,没有可靠的方法来获取旧值(此外,适当的审计跟踪不需要旧值,因为如果所有内容都得到正确审计,旧值就是之前添加的新值)。

仅保存新值时,如果要将它们保存到文本字段而不是多值字段中,则可以使用以下内容:

使用此函数获取所有选定项的字符串值:

Public Function JoinMVF(MVFControl As Control, Optional Delimiter As String) As String
    Dim i As Variant
    For Each i In MVFControl.ItemsSelected
        JoinMVF = JoinMVF & MVFControl.ItemData(i) & Delimiter
    Next i
End Function

然后,将您的记录集片段调整为以下内容:

With rst
    .AddNew
    !FormName = strFormName
    !ControlName = strControlName
    If strField = "" Then
        !FieldName = strControlName
    Else
        !FieldName = strField
    End If
    !RecordID = lngID
    !UserName = Environ("username")
    If Not IsNull(varOld) Then 'varOld will always be Null for a multi-valued field
        !OldValue = CStr(varOld) 'Thus this will never get called
    End If
    'Add some If multivalued field then
    !NewValue = JoinMVF(Screen.ActiveControl, "; ")
    .Update
End With

【讨论】:

  • 谢谢!我的组合框更改现在正在记录。唯一的问题是,如果用户从列表中选择一个值,因为我没有保存按钮,我只是在他们从字段中移动时将表单保存为保存 - 即使他们不小心选择了审计跟踪,也会记录每一次更改一个值,然后选择另一个。当这个人点击保存时,我可以如何保持最后一个字段的变化?
  • 由于您实际上不再使用Control.OldValue,因此您可以使用Form_BeforeUpdate 操作来调用此代码。您可以创建一个已更改控件的集合(对于每个控件,在它们的更新后事件中,检查它们是否已添加到集合中,如果没有则添加它们),然后为每个控件调用此代码。此外,如果审核以某种方式失败,这允许您取消记录更新。
  • @Erika 我仍然没有收到关于最后一次更改的回复。它是否按要求工作?如果是,请将此答案标记为正确答案。否则,请评论什么不起作用。
  • 是的,它正在工作 - 但看不到如何将其标记为正确。
  • 投票按钮旁边应该有一个灰色的复选标志(请参阅i.stack.imgur.com/fdNG0.jpg
猜你喜欢
  • 2014-12-08
  • 1970-01-01
  • 2018-05-04
  • 2013-03-17
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多