首页 > 解决方案 > 通过 Excel 用户窗体编辑 Access 数据库时跟踪更改(创建审计跟踪)

问题描述

我正在从 Excel 数据库转移到 Access 数据库以支持多用户输入。我有 excel 用户表单,我用它来添加和更新存储在共享点中的 Access 数据库。我想在数据库中的单独表中跟踪此数据库中的所有更改,以维护审计跟踪以供以后查看。

这是一个示例更新函数:

Sub Edit()

    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    Application.AutomationSecurity = msoAutomationSecurityLow
        Dim cnn As New ADODB.Connection 'dim the ADO collection class
        Dim rst As New ADODB.Recordset 'dim the ADO recordset class
        Dim dbPath As String
        Dim qry As String
        
     
        dbPath = "Share-point UNC path"
        
        cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbPath & ";Jet OLEDB:Database"
        
        Set rst = New ADODB.Recordset 'assign memory to the recordset
    
        qry = "SELECT * FROM FileNumbers WHERE [File_Number]= '" & EditForm.txtFile.Value & "'"
        
        rst.Open qry, cnn, adOpenKeyset, adLockOptimistic
        
        
        With rst
            .Fields("Archival_id").Value , EditForm.txtArchival.Value
            .Fields("Remarks").Value , EditForm.txtRemarks.Value
            .Fields("Retention Category").Value , EditForm.cmbRetention.Value
            .Update
        End With
        
    rst.Close
    cnn.Close
    
    Set rst = Nothing
    Set cnn = Nothing
End Sub

我想跟踪一个单独的表中的更改,如下所示:

在此处输入图像描述

我可以轻松记录编辑者、编辑日期和时间以及新值。我在记录旧值和编辑的参数时遇到问题,这将是文件编号表中的列名

当我使用 Excel 作为数据库时,我还使用了一个 Log Changes 函数。这是功能:

Sub LogChanges(c As Range, vNew)
    With c
        sep = IIf(Len(titles) > 0, "; ", "") 'need a separator?
        If .Value <> vNew Then
            'track the changes
            titles = titles & sep & .Parent.Cells(1, .Column).Value 'column titles in Row1
            oldValues = oldValues & sep & ValueOrBlank(.Value)  'track old value
            newValues = newValues & sep & ValueOrBlank(vNew)    'track new value
            .Value = vNew                                       'update the cell
        End If
    End With
End Sub

Function ValueOrBlank(v)
    ValueOrBlank = IIf(Len(v) > 0, v, "[blank]")
End Function

然后我使用变量、oldValues、newValues 和标题来更新审计跟踪表。我似乎无法在这里实现此方法。请帮忙

标签: excelvbams-access

解决方案


您不应该在前端(用户表单或数据对象)实现审计跟踪之类的东西。那些东西属于后端(数据库)。前端不应该关心数据是如何存储的以及是否有审计线索。

在数据库上,您通常使用一种称为trigger的机制。触发器是一种在发生数据库事件时运行的脚本,例如插入或更新命令。在这样的触发器中,您可以实现审计跟踪逻辑。

现在在Access中,这些机制的名称不是触发器,而是数据宏,但基本上是相同的想法。我在 SO 上的 Access 中找到了这个关于触发器的答案,它基本上链接到微软关于数据宏的官方文档


推荐阅读