Microsoft Access 掲示板

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

10 コメント
views
4 フォロー
4
hiroton 2023/06/09 (金) 11:48:13 b43ba@f966d

関数は「機能をひとまとめにしたもの」なので、そこだけ抜き出せば何らかの値に置き換わります。複雑な計算式はメモ帳などで整形してみると理解しやすくなります

┌=IIf(
│ ┌DCount("*"
│ │,"取引明細テーブル"
│ │,"取引ID=" & [取引ID]
│ └)<=1
│,[商品ID]
│,┌DLookUp("商品ID"
│ │,"商品テーブル"
│ │,"区分け='" & 
│ │ ┌DLookUp("区分け"
│ │ │,"商品テーブル"
│ │ │,"商品ID=" & 
│ │ │ ┌DLookUp("商品ID"
│ │ │ │,"取引明細テーブル"
│ │ │ │,"取引ID=" & [取引ID] & " AND 明細ID <> " & [明細ID]
│ │ │ └)
│ │ └) & "' AND 商品ID=" & [商品ID]
│ └)
└)

※区分け取得部分のDLookup関数を調整

サブフォームに一番最初に区分けAの商品を選んだ場合、BやC(つまりA以外)が選べない様にしたい

これをプログラミング的な思考に置き換えていきます

本手法は入力規則を使うことにしたので、「入力可能な商品IDかどうかを判定し、入力可能であればその商品IDを入力規則の値にする」様な計算式を作成します

まず、「サブフォームに一番最初に区分けAの商品を選んだ」の時点で「最初の入力」の場合と「2回目以降の入力」で別な処理を行う必要が出ます。つまり、「何の制限もない初回入力」と「制限のかかる2回目以降」を作る必要があります

'//サブフォームのデータ単位で最初の入力と2回目以降の入力を切り分ける処理
┌=IIf(
│ ┌DCount("*"
│ │,"取引明細テーブル"
│ │,"取引ID=" & [取引ID]
│ └)<=1
│,(最初の入力)
│,(2回目以降の入力)
└)

「(最初の入力)」はどんな商品IDでも入力できる必要があるので、入力規則としては「どんな商品IDが指定されても同じ商品IDになるような式」とします。つまり自分自身を設定すれば解決です

「(2回目以降の入力)」は、「自身の区分け」と「入力済みデータの区分け」が同じかどうかを判定し、処理を分岐(そのまま入力、または、入力規則のエラーとしてメッセージ表示)させます
ただ、入力規則を使う関係上、「同じかどうか」だけでなく、「同じ場合は自身の商品ID」という結果が必要になります。そこで、DLookup関数を使って商品テーブルから「(入力済みデータの区分け)+自身の商品ID」のレコードの商品IDを求めています
これで、自身が同じ区分内の商品かチェックされるという仕組みです

'//(2回目以降の入力)部分
│,┌DLookUp("商品ID"
│ │,"商品テーブル"
│ │,"区分け='" & 
│ │ (入力済みデータの区分け)
│ │  & "' AND 商品ID=" & [商品ID]
│ └)

「(入力済みデータの区分け)」の取得方法はそのまま関数が何をやっているのか考えてみてください。


取引明細テーブルに区分けデータも記録しているのであれば、区分け判定部分の計算式はもう少し単純にできそうですね


実装方法はいくつか考えられますが、「入力規則に計算式を一つ入れればいい」が謳い文句として簡単そうに見えたのでそれで実現しています。(VBA使ったほうがすっきりする回答になるんですけどね)

通報 ...