通过Excel用户表单编辑Access数据库时跟踪更改(创建审核跟踪)

通过Excel用户表单编辑Access数据库时跟踪更改(创建审核跟踪),excel,vba,ms-access,Excel,Vba,Ms Access,我正在从Excel数据库转向Access数据库,以支持多用户输入。 我有excel用户表单,用于添加和更新存储在sharepoint中的Access数据库。我想在数据库中的一个单独的表中跟踪该数据库中的所有更改,以维护一个审计跟踪,以便以后进行审查 这是一个示例更新函数: Sub Edit() Application.DisplayAlerts = False Application.ScreenUpdating = False Application.Automati

我正在从Excel数据库转向Access数据库,以支持多用户输入。 我有excel用户表单,用于添加和更新存储在sharepoint中的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
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
我想在一个单独的表中跟踪更改,该表如下所示:

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

当我使用Excel作为数据库时,我还使用了日志更改功能。这就是功能:

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
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
子日志更改(c作为范围,vNew)
用c
sep=IIf(Len(titles)>0,“;”,“)”需要分隔符吗?
如果.Value vNew,则
"跟踪变化"
titles=标题&sep和.Parent.Cells(1,.Column.Value)第1行中的列标题
oldValues=oldValues&sep&ValueOrBlank(.Value)'跟踪旧值
newValues=newValues&sep&ValueOrBlank(vNew)'跟踪新值
.Value=vNew'更新单元格
如果结束
以
端接头
函数值空白(v)
ValueOrBlank=IIf(Len(v)>0,v,“[空白]”)
端函数

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

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

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


现在在Access中,这些机制的名称不是触发器,而是数据宏,但基本上是相同的想法。我在Access上发现了这一点,它基本上链接到了Microsoft关于

的官方文档。这种方式的问题是我使用Excel用户表单而不是Access表单来填充数据库。在使用Userform编辑数据库时,我找不到任何跟踪更改的解决方案。这就是想法:在前端,您可以发出Update或Insert语句。这些不是真正在客户端执行的,而是作为命令发送到后端(Excel不是真正更新数据库,而是向Access发送更新请求)。在那里,触发器应该触发,这样除了您请求的更新之外,还可以执行其他操作——在您的例子中,在审计跟踪表中写入新旧值。我发现了一篇关于这方面的好文章:非常感谢您的帮助!由于某些原因,当我从VBA userform更新数据库时,不会触发AfterUpdate事件。但是,当我在数据库中手动更改某些内容时,它工作得非常好。你能帮忙吗?