2

Access 2010: 3 つのブール型フィールド (Field_A、Field_B、および Field_C) を含むテーブルがあります。

データ入力フォームでは、ユーザーはこれらのオプションのいずれかをチェック (値を TRUE にする) できる必要がありますが、一度に TRUE にできるオプションは 1 つだけです。Field_B が既に true であり、ユーザーがそれを変更して Field_C が TRUE に選択されているオプションである場合、Field_C のフォームのボックスをチェックする前に、まず Field_B の選択を解除する (FALSE にリセットする) 必要があります。

したがって、これらのフィールドごとに検証コードが必要です。ユーザーが 1 つのフィールドを TRUE に設定しようとすると、他の 2 つのフィールドのステータスをチェックします。他の両方のフィールドが現在 FALSE である場合、現在のフィールドを TRUE に変更できます。ただし、他のフィールドのいずれかが現在 TRUE の場合、別の選択が既に存在することを示すポップアップ メッセージが作成され、先に進む前に他のフィールドを FALSE に変更する必要があります。

はい/いいえオプションの数値を使用してこれを試し、関心のあるフィールド (たとえば Field_A) を TRUE (値 = -1) に変更できるようにする前に、他の 2 つの値の合計をゼロにする必要がある条件付き検証を設定しました。 ) ( のようなものですが([Field_B] + [Field_C]) =0、構文エラーが発生し続けました。私はこれに十分慣れていないので、それが本当に単純な構文の問題なのか、それともまったく異なるアプローチが必要なのかわかりません。

最後の情報 - 3 つのフィールドすべてを FALSE に設定しても問題ないため、別のフィールドが TRUE から FALSE に戻された場合に、そのうちの 1 つを強制的に TRUE にする必要はありません。

4

2 に答える 2

0

データ入力フォームの背後にある少しのコードでうまくいくはずです。これらの行に沿って何かを試してください:

Option Compare Database
Option Explicit

Private Sub Field_A_BeforeUpdate(Cancel As Integer)
    Const ThisField = "Field_A"
    If Me.Field_A.Value Then
        If Me.Field_B.Value Then
            ShowMyMessage "Field_B", ThisField
            Cancel = True
        ElseIf Me.Field_C.Value Then
            ShowMyMessage "Field_C", ThisField
            Cancel = True
        End If
    End If
End Sub

Private Sub Field_B_BeforeUpdate(Cancel As Integer)
    Const ThisField = "Field_B"
    If Me.Field_B.Value Then
        If Me.Field_A.Value Then
            ShowMyMessage "Field_A", ThisField
            Cancel = True
        ElseIf Me.Field_C.Value Then
            ShowMyMessage "Field_C", ThisField
            Cancel = True
        End If
    End If
End Sub

Private Sub Field_C_BeforeUpdate(Cancel As Integer)
    Const ThisField = "Field_C"
    If Me.Field_C.Value Then
        If Me.Field_B.Value Then
            ShowMyMessage "Field_B", ThisField
            Cancel = True
        ElseIf Me.Field_A.Value Then
            ShowMyMessage "Field_A", ThisField
            Cancel = True
        End If
    End If
End Sub

Private Sub ShowMyMessage(OtherField As String, CurrentField As String)
    MsgBox _
            "You must un-select """ & OtherField & """" & _
                " before you can select """ & CurrentField & """", _
            vbExclamation, _
            "Mutually exclusive options conflict"
End Sub
于 2013-05-28T08:32:26.507 に答える
0

これら 3 つのチェック ボックスには、次の 2 つの組み合わせを使用できます。

  1. すべてFalse(チェックなし)
  2. 1 つだけTrue(チェック)

つまり、これらのチェック ボックスの値の合計は 0 または -1 でなければなりません。

? False + False + False
 0 
? False + False + True
-1 

フォームのコード モジュールに関数を追加できます...

Private Function checkBoxProblem() As Boolean
    Dim blnReturn As Boolean
    Dim intSum As Integer
    Dim strPrompt As String

    intSum = Nz(Me.Field_A, 0) + Nz(Me.Field_B, 0) + Nz(Me.Field_C, 0)
    If Not (intSum = 0 Or intSum = -1) Then
        strPrompt = "only one box can be checked"
        MsgBox strPrompt
        blnReturn = True
    Else
        blnReturn = False
    End If
    checkBoxProblem = blnReturn
End Function

次に、これら 3 つのチェック ボックスのそれぞれの更新前イベントから関数を呼び出します。

Private Sub Field_A_BeforeUpdate(Cancel As Integer)
    Cancel = checkBoxProblem
End Sub
Private Sub Field_B_BeforeUpdate(Cancel As Integer)
    Cancel = checkBoxProblem
End Sub
Private Sub Field_C_BeforeUpdate(Cancel As Integer)
    Cancel = checkBoxProblem
End Sub
于 2013-05-28T14:33:37.927 に答える