1

我需要 Access 2010 中的“跟踪更改”功能。我遇到了这个脚本,它应该可以通过一些工作来解决问题。

它清晰易懂,但还不能处理我需要的所有文本框案例。(稍后我将实现其他控件。)这是所编写的相关结构。它被称为表单上的更新前事件的事件过程:

Const cDQ As String = """"

Sub AuditTrail(frm As Form, recordid As Control)

    'Track changes to data.
    'recordid identifies the pk field's corresponding
    'control in frm, in order to id record.

    Dim ctl As Control
    Dim varBefore As Variant
    Dim varAfter As Variant
    Dim strControlName As String
    Dim strSQL As String

    On Error GoTo ErrHandler

    'Get changed values.

    For Each ctl In frm.Controls    
        With ctl
            'Avoid labels and other controls with Value property.
            If .ControlType = acTextBox Then
                If .Value <> .OldValue Then
                    'Add record of change to logging table   
                End If     
            End If     
        End With   
    Next   

    Set ctl = Nothing   
    Exit Sub  

    ErrHandler:
        'Handle error
End Sub   

只要文本框中的值不为空,这将起作用。如果其中一个.Valueor.OldValue为空(或什么都没有——我在这一点上感到困惑),那么不等式就会失败。

我尝试将其中的部分更新With ctl为以下内容。这允许我记录其中一个值(之前或之后)为空的更改。其余被注释掉的东西是我尝试记录值为空但没有改变的所有情况。换句话说,IsNull(ctl)让一切都通过,但我不知道如何再次过滤掉平等的情况。

If .ControlType = acTextBox Then
    If IsNull(ctl) Or .Value <> .OldValue Then
        'If Not (Len(.Value & vbNullString) = 0 And Len(.OldValue & vbNullString) = 0) Then                 

            'If oldValueIsNull Then
            '    varBefore = "--NULL--"
            'Else
            '    varBefore = .OldValue
            'End If

            'If newValueIsNull Then
            '    varAfter = "--NULL--"
            'Else
            '    varAfter = .Value
            'End If

            'Add record of change to logging table

       'End If
    End If
End If

任何帮助表示赞赏。

4

1 回答 1

4

如果您乐于避免可能不适合所有人的整个 null 问题,您可以说

If .Value & "" <> .OldValue & "" Then 

这将比较字符串。

于 2012-11-13T19:56:30.890 回答