Microsoft Access 掲示板

フォームでの入力規制 / 7

10 コメント
views
4 フォロー
7
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

このように実装できます

通報 ...
  • 9
    hiroton 2023/06/12 (月) 08:48:38 2ba59@f966d >> 7

    一部修正

    Private Sub 商品ID_BeforeUpdate(Cancel As Integer)
        '//最初の登録の時は何もしない
        If Me.Recordset.RecordCount <= 1 Then Exit Sub
    
        With Me.Recordset.Clone
            If Me!区分け <> !区分け Then
                Me.Undo
                MsgBox "区分けエラー"
            End If
            .close
        End With
    End Sub
    

    Recordset.Cloneを使うと編集前の状態でRecordsetが作成されるようです(考えてみれば当たり前)。最初のレコードの編集でも編集前と編集後を比較できるのでレコード位置のチェックは不要になりました

    参考
    フォームの Recordset, RecorsetClone, RecordSet.Clone の違いとは?(hatena chipsさん)