毎回大変お世話になっています。
今回は部品名や会社名等の入力フォームで名前の重複入力チェックを下記コードで行っています(更新前イベントに設定。これは部品登録用)。重複チェックは色々なフォームで使ってますのでモジュール化して共通化出来たらいいなと思っています。
プロシージャの引数にID、品名、条件、テーブル名になると思いますが、モジュール化となるとMe.は使えないのでどう
したらいいの分かりません。アイデアあれば宜しくお願いします。
Dim buID As Variant, buName As Variant, joken As String, ck As Integer
Dim modori As Variant
buID = Me.[部品ID]
buName = Me.[部品型番]
If IsNull(buName) Then
Exit Sub
End If
joken = "[部品型番] = '" & buName & "' And [部品ID] <> " & buID
ck = DCount("*", "[T部品一覧]", joken)
If ck = 0 Then
Exit Sub
Else
modori = MsgBox("『" & buName & "』は登録済みですが、編集続けますか?", vbYesNo + vbDefaultButton2 + vbExclamation)
End If
If modori = vbYes Then
Exit Sub
Else
MsgBox "入力を取り消します"
Me.Undo
End If
```
共通化する前に、そのコードで問題ないのか疑問があります。
部品IDと部品型番の組み合わせで重複をチェックしてますが、部品IDが異なれば部品型番に重複があってもいいのでしょうか。現状のコードだと部品型番に重複があっても登録可能になっています。
あと、更新前処理で Me.Undo してしまうとすべての入力が取り消されてしまいますがそれで問題ないですか。
あと、データベース設計で重複チェックは、テーブル設計の方でインデックスなどを使用して設定するのが確実ですが、その設定はしていますか。
車輪の再開発に意味があるのかしら?データベース設計が杜撰なだけでしょう。
hatenaさん ありがとうございます。確かにテーブルインデクスで重複なしにするといいのですが、品名入力時に注意喚起メッセージを出せるといいと思ったのです。[部品ID] <>としてますので編集中の分以外をチェックさせています。というのは例えば品名を”あいう”でレコード保存後に”え”を追加入力後に”え”を削除した場合にはメッセージが出ない様にしたいからです。あと Me.Undo にすると確かにすべての入力が取り消されるので品名部のみを元に戻した方がいいですね。
なるほど。レコード保存時(フォームの更新前処理)ではなく品名入力時(テキストボックスの更新前処理)でチェックしたいと言うことですね。そういうUIもありますね。
重複を排除するにはインデックスとこれの両方とも設定しておくと確実ですね。
ということなので、今回の[部品型番]だけでなくいろいろな場面での重複チェックを共通化したいと言うことですね。
まずは共通化する前に品名テキストボックスの更新前処理にコードを書くことになります。
その場合、質問のコードだと下記のようなフローになってます。
自レコード以外のIDで[部品型番]に重複がないかチェック(DCount)
↓
重複がなければ Exit Sub
重複があるときはメッセージで「編集を続けるか」確認
↓
「はい」で更新して次へ
「いいえ」で[部品型番]の入力を元に戻す
これだと、重複があった場合に「はい」を選択すると部品型番の重複を許すことになりますが、
それでいいのでしょうか。
とりあえずこれを確認したいと思います。
hatenaさん ありがとうございます。流れとしてはそうなります。部品区分があり、異なる区分で同じ品名を登録する場合がありますので。うっかりしてましたが条件を下記の様にした方がいいですね
Dim Kubun AS Long Kubun=Me.[区分] の変数追加して
joken = "[部品型番] = '" & buName & "' And [部品ID] <> " & buID & " AND [区分]=" & kubun
これで同じ区分内での同じ品名の重複をチェック(編集中の部品ID分は除く)
宜しくお願いします。
hatenaさん 曖昧な返信になってました(すみません)。区分条件をそれにするならば同じ区分内での重複は不可にしなくてはなりませんので「編集を続けるか」確認はなしになります。