2017-05-06 8 views
0

申し訳ありませんいくつかの興味深いやりとりがあり、私の熟練したVBAの猫の助言がほしいと思っています。更新前イベントConundrumアクセスVBA

詳細:

  1. は、フォーム上のチェックボックスを持っています。このチェックボックスは、テーブルにバインドされています。
  2. 元のフォームのサブフォームにコンボボックスがあります。
  3. メインフォームのbeforeupdateイベントには、Checkbox = Trueでコンボボックスをnullにすることができないかどうかをチェックするデータ検証があります。これは、必要な更新を行わずにユーザーがレコードを切り替えることを防ぐためのものです。

問題は、データの整合性を強化するとともに、できるだけUIの流れを妨げないようにすることです。 beforeupdateイベントでは、beforeupdateイベントが発生したサブフォームにフォーカスを切り替えるときに、UI FlowでINFロックが作成されるため、Cancel = Trueを使用できないことに注意してください。別の問題は、更新イベントが発生すると、チェックボックスの値がテーブルに書き込まれることです。チェックボックスのチェックを外すと、ソートの別のループが作成されます。これまで

私の解決策:前更新イベント

If Checkbox = True and IsNull(Me!ComboBox) = True Then 
    lastRecord = Me.CurrentRecord 
    chkBool = True 
end if 

Form_Currentイベント

currRecord = Me.CurrentRecord 

If currRecord <> lastRecord And chkBool = True Then 
    DoCmd.GoToRecord acDataForm, "form", acGoTo, lastRecord 
    GoTo Exit_Form_Current 
ElseIf currRecord = lastRecord And chkBool = True Then 
    'do stuff 
    vbSql = "Update Statement" 
    DoCmd.RunSQL vbSql 
    chkBool = False 
    Me.Refresh 
End If 

では、このアプローチするより良い方法はありますか?それとも私はそれにアプローチしなければならないのかなんて邪魔な仕事ですか?残念ながら、私はそれを回避するために、サブフォームが連続したサブフォームである必要があるため、再設計できません。

答えて

0

まず、あなたは正しくヌルをチェックする必要があります。

If Me!Checkbox = True And IsNull(Me!ComboBox) Then 
    lastRecord = Me.CurrentRecord 
    chkBool = True 
End If 

はその後、これはコードの2番目の作品と一緒にどのように機能するかを評価します。

+0

私はちょうど参考のために擬似コードを投稿しました。 –

0

あなたは「メインフォームのbeforeupdateイベントでは、チェックボックス= Trueかどうかをチェックしてコンボボックスをヌルにすることはできません」というデータ検証があります。 1つのアプローチは、メインフォームのbeforeupdateイベントまで待機しないことです。チェックボックスがオンになるとすぐにチェックを行います。コンボボックスがnullの場合は、チェックを行わないでください。最初にサブフォームにユーザーを強制します。それは他の問題を引き起こすかもしれませんが...

関連する問題