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   

これは、テキストボックス内の値が空白でない限り機能します。またはのいずれ.Value.OldValueがnull(または何もない-この点で混乱している)の場合、不等式は失敗します。

内のパーツを以下に更新してみWith ctlました。これにより、値の1つ(前または後)がnullであった変更をログに記録できます。コメントアウトされた残りの部分は、値がnullであるが、変更されないすべてのケースを記録するための私の試みです。言い換えれば、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 に答える