2

BeforeUpdate次のコードを使用して、イベントを使用してサブフォームで行われた変更を追跡する監査証跡があります。

`Dim USR As String
Dim TS As Date
Dim Connection As ADODB.Connection
Dim RecordSet As ADODB.RecordSet
Dim Ctl As Control
MsgBox "Here!"
Set Connection = CurrentProject.Connection
Set RecordSet = New ADODB.RecordSet
If Forms![PartsDatabaseX]![RepsSubformX].Visible = True Then
    For Each Ctl In Screen.ActiveForm.RepsSubformX.Form.Controls
        If Ctl.Tag = "Track" Then
            If Nz(Ctl.Value) <> Nz(Ctl.OldValue) Then
            SaveToken = True
                With RecordSet
                    .AddNew
                    ![Part Number] = Screen.ActiveForm.RepsSubformX.Form.Controls("[Part Nbr]").Value
                    ![Record Identifier] = Screen.ActiveForm.RepsSubformX.Form.Controls("[Part Nbr]").Value & Screen.ActiveForm.RepsSubformX.Form.Controls("[Supplier Name]").Value
                    ![Rep] = USR
                    ![Time Stamp] = TS
                    ![Change Point] = Ctl.ControlSource
                    ![Change From] = Ctl.OldValue
                    ![Change To] = Ctl.Value
                    .Update
                End With
            End If
        End If
    Next Ctl
End If`

私が抱えている問題は、ユーザーが 2 つの変更を行い、変更履歴テーブルに 3 つのことが記録されていることです。最初の変更は 2 回、2 回目の変更は 1 回です (この傾向は、ユーザーが離れない限り続きます)。記録)。私がやりたいのは、イベントをトリガーしたコントロールを特定してBeforeUpdate上記のコードに渡すことで、イベントをトリガーしたコントロールだけBeforeUpdateが異なるかどうかを確認し、すでにログに記録されている他のコントロールをスキップできるようにすることです。または、Access がログに記録された変更を新しいものとして認識しないようにする方法はありますか?

4

2 に答える 2

1

フォームとコントロールにはイベントの順序があります:

同様に、フォームを閉じると、次の一連のイベントが発生します。

Exit (コントロール) → LostFocus (コントロール) → Unload (フォーム) → Deactivate (フォーム) → Close (フォーム)

コントロールのデータを変更した場合、コントロールの Exit イベントの前に、コントロールとフォームの両方の BeforeUpdate イベントと AfterUpdate イベントが発生します。

http://support.microsoft.com/kb/197592をお読みください。

于 2014-07-28T18:04:29.790 に答える
0

答えはずっと私を見つめていました...BeforeUpdateイベントを各コントロールに割り当てると、呼び出す関数に変数を渡して、何が送信されたかをプログラムに伝えることができます。

Forms![PartsDatabaseX]![RepsSubformX].Form![Pack Rank].BeforeUpdate = "=ToTracking(""Pack Rank"")"

その後、変更された値をチェックするときに and ステートメントを追加するだけで、次のBeforeUpdateようにイベントを開始した変更のみがキャプチャされます。

If Nz(Ctl.Value) <> Nz(Ctl.OldValue) And Ctl.ControlSource = NameOfTrigger Then

'Record Values

End if

于 2014-07-29T19:18:01.290 に答える