次のようなテーブルがあるとします。

「保管場所コード」フィールドの値を見ると、「A」「B」「C」それぞれの文字で始まる3つのグループがあることが分かると思います。
一方、テーブルの直接編集では「優先保管場所」フィールドはどの保管場所コードかに関わらずいくつでも自由にチェックすることができます。
このとき、たとえば保管場所コードが「A」で始まるグループ内では「優先保管場所」は1つだけしか選択できないようにしたいという場合に、フォームを使ってその制限を行う方法の例です。
まず、上記のテーブルをレコードソースとするフォームを作ります。下図のようなデザインで、実行時は”データシート”で表示するものとします。



次に、優先保管場所のチェックボックスが更新されようとするたびに同じグループ内の重複チェックを行うものとし、そのチェックボックスの「BeforeUpdate/更新前処理」イベントプロシージャを次のようにします。
Private Sub 優先保管場所_BeforeUpdate(Cancel As Integer)
'[優先保管場所]の更新前処理
Dim strWhere As String
Dim intChkedCnt As Integer
If Me!優先保管場所 Then ← 1
'優先保管場所がチェックされたとき
'同じグループ内の優先保管場所のチェック数を取得
strWhere = "保管場所コード LIKE '" & Left$(Me!保管場所コード, 1) & "*' " & _ ← 2
"AND 優先保管場所 = True" ← 3
intChkedCnt = DCount("*", "mtbl保管場所マスタ", strWhere) ← 4
If intChkedCnt > 0 Then ← 5
Beep
MsgBox "すでに優先保管場所が設定されています!", vbOKOnly + vbExclamation
Cancel = True
End If
End If
End Sub
- チェックボックスがOFF→ONになったときだけチェックすればよいので、その値で分岐し、Trueのときだけ重複チェックを行います。
- 同じグループ内のレコードは「カレントレコードの保管場所コードの先頭の1文字で始まるもの」を抽出条件とすることで取得できます。
- さらに抽出条件に「優先保管場所がTrueであるもの」を追加することで、既存レコードでチェックボックスがONであるレコードを取得できます。
- それらを条件としてDCount関数で該当レコード数を取得します。
- そのレコード数が0より大きければすでにONのレコードがあることになりますので、警告メッセージを表示して更新をキャンセルします。
実行例:
■同じ「A」で始まるグループにはまだ1つもチェックが付いていないので、どれでもチェックすることができます。

■そこからさらに同じ「A」グループの他のレコードにチェックを付けようとするとメッセージが表示され、更新がキャンセルされます。


 |