hiroton
2023/06/09 (金) 17:30:18
b43ba@f966d
もっと言えば、サブフォームのレコードソースをクエリにして、「区分け」を含むようにすれば更に簡単ですね
「取引明細テーブル」と「商品テーブル」を商品ID
で結合して区分け
フィールドを追加します
自分のグループで自分以外に同じ区分けがあるか?をチェックすればいいので
Not IsNull(DLookup("区分け","Q取引明細","取引ID="&[取引ID]&" AND 明細ID<>"&[明細ID]&" AND 区分け='"&[区分け]&"'"))
で、同じ「区分け」を指定していると判断できます
入力規則で判定するなら、これを使って
=IIf(DCount("*","取引明細テーブル","取引ID=" & [取引ID])<=1 Or Not IsNull(DLookup("区分け","Q取引明細","取引ID="&[取引ID]&" AND 明細ID<>"&[明細ID]&" AND 区分け='"&[区分け]&"'")),[商品ID])
VBAでやるなら、現在サブフォームに読み込まれているレコード内で比較すればいいので
Private Sub 商品ID_BeforeUpdate(Cancel As Integer)
'//最初の登録の時は何もしない
If Me.Recordset.RecordCount <= 1 Then Exit Sub
With Me.RecordsetClone
If Me.CurrentRecord = 1 Then .Next '//先頭レコード同士で比較しない
If Me!区分け <> !区分け Then
Me.Undo
MsgBox "区分けエラー"
End If
.close
End With
End Sub
このように実装できます
通報 ...
一部修正
Recordset.Clone
を使うと編集前の状態でRecordsetが作成されるようです(考えてみれば当たり前)。最初のレコードの編集でも編集前と編集後を比較できるのでレコード位置のチェックは不要になりました参考
フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?(hatena chipsさん)