2016-08-19 10 views
1

私が行う必要があるのは、ユーザーによって変更されるフィールドを追跡し、私が使用しているフォームは連続フォームです。データは顧客データです。ユーザーが顧客の姓を変更してから同じ顧客の郵便番号を変更した場合、その情報をどこかに保存してレポートに書き込む必要があります。コントロールに関係なく、フォームのコントロールが更新された後でイベントを発生させる方法はありますか?

収納部に問題はなく、レポートでもありません。私が最も関心を持っていることは、AfterUpdateイベントを30(ええと、30フィールドあります...)と書かなければならないことです。おそらく私が見過ごしている簡単な方法があるような気がします。

フォームのOnDirtyイベントが1回だけ発生することがわかります。フォームがDirtyになったら、それはDirtyです。コントロールが更新されるたびに発生するフォームレベルのイベントはありますか?

+0

jQueryはオプションですか? –

+0

'if me.Dirty then me.dirty = false'を使用しますか? –

+0

@ KobiTate - 残念ながら、これはAccessアプリです。私たちは最終的にそれを移植しようとしていますが、今のところそれを救済する必要があります。 –

答えて

1

"any"コントロールが変更されたときに発生するイベントはありません。実際には、各コントロールのコードを記述しないかぎり、すべてのコントロールのイベントを発生させる開発プラットフォームは認識していません。また、それぞれのコントロールに対してコードが必要なイベントリスナークラスも含まれています。 (実際には、それぞれのコントロールのコードを書き留めてしまうので、実際には脳死の解決策になりがちです)

ただし、特定のフォームのレコードレベルのイベントがあります。したがって、ANYコントロールが変更された場合、更新前のフォームが発生します。その場合、その時点で、レコードがテーブルにコミットされる前の古い値(以前の値)と現在の値を調べることができます。だから、あなたはこのように行くことができる前に更新イベントで

Private Sub Form_BeforeUpdate(Cancel As Integer) 

    ' this event does not fire UNLESS the reocrd be change, 
    ' send to debug window each control that been changed. 

    Dim myControl  As Control 

    For Each myControl In Me.Controls 

     Select Case myControl.ControlType 

      Case acTextBox, acListBox, acComboBox 

       ' text box control, check old vs new value 
       ' but ONLY check for controls that are bound 
       ' to data 

       If myControl.ControlSource <> "" Then 

       If myControl.OldValue <> myControl.Value Then 

        Debug.Print "control " & myControl.Name & " was Changeed from" & "" & _ 
           Nz(myControl.OldValue, "") & " ->" & Nz(myControl.Value, "") 
       End If 
       End If 

     End Select 

    Next myControl 

    End Sub 

上記は、このように、デバッグウィンドウにユーザーによって変更されたコントロールの「リスト」をお送りします。リストボックス、コンボボックスなどの特殊なコードが必要な場合があるので、上記の選択されたケースを使用しました。

関連する問題