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
どんな助けでも大歓迎です。