pickup

目次

主キーの重複登録を事前に防止

こんにちは。伊川(@naonaoke)です。

今回は、主キーの登録時について、エラーがでないように回避する方法を紹介します。

すでに紹介したように、主キーは、

・重複登録ができない。

・空白の入力をゆるさない。

この原則があります。

しかし、主キーはレコードを登録するまで、主キーが重複されているのかわからないのです。

主キーについては、下記を参照してください。

http://keiyu.xyz/2019/10/14/access%e3%81%ae%e4%b8%bb%e3%82%ad%e3%83%bc%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/

問題提起

Aさんは、ACCESSの入力フォームでデータを入力しています。

入力項目は、100項目あり、データを入力完了後、

上記のようなエラーが表示されることがあります。

Aさんは、主キーが重複しているということは、理解していますが、もう一度データ入力することが面倒です。

主キーを入力した時点で、重複判定する方法はないだろうか?

ACCESSは、様々なアクションの後に、VBAのコードを記入できる

これまでみなさんに紹介してきたのは、更新後処理になります。

更新後処理というのは、テキストボックスAに値が入力されたら、テキストボックスBで判定をする。

このような処理を更新後処理といいます。

これは、3連動のコンボボックス作成のときに紹介しています。

http://keiyu.xyz/2019/10/03/access%e3%81%ae%e9%80%a3%e5%8b%95%e3%82%b3%e3%83%b3%e3%83%9c%e3%83%9c%e3%83%83%e3%82%af%e3%82%b9%e3%81%ae%e4%bd%9c%e3%82%8a%e6%96%b9/

今回は、値が入力された時点では、すでに遅いわけです。

つまり、更新前処理というところに、VBAのコードを仕込む必要があります。

このような処理は、Excel、ACCESSでもよく使いますので、この機会にぜひ、みなさんのスキルにしてください。

問題提起2

Aさんは、主キーは4桁であるにもかかわらず、5桁で入力してしまうこともあります。
レコード入力完了後、上司にしかられることが度々あります。
どうにかならないだろうか?

みなさんの、周りにもいらっしゃるのではないでしょうか?

何度言っても主キーの桁を間違えて登録してくる人はいませんか?

大目に見たいのですが、さすがに、10回以上繰り返すと、怒りたくもなります。

そんな、ストレスも今回のブログで解消できます。

主キーは4桁であり、4桁しか登録させない。

桁数入力制限作成手順

使用する関数は、LEN関数とIF構文です。


上記のように、1桁で登録しようとすると、アラートが表示されます。


上の図のように、F_商品というフォームをデザインビューで開きます。

商品コードのテキストボックスを選択して、向かって左側のプロパティーシートを表示させます。

イベントというタブの中に、【更新前処理】という項目選択します。

 

Private Sub 商品コード_BeforeUpdate(Cancel As Integer)
If Len(Me!商品コード) > 0 And Len(Me!商品コード) <> 4 Then
MsgBox "商品コードは4桁だ。手打するな!! "
Cancel = True
Exit Sub
End If
End Sub

桁数入力制限のコード解説

If Len(Me!商品コード) > 0 And Len(Me!商品コード) <> 4 Then

商品コードが0以上で、かつ4以外の時

MsgBox “商品コードは4桁だ。手打するな!! ”

‘メッセージボックスに”商品コードは4桁だ。手打するな!! “と表示

Cancel = True

‘処理をキャンセルして

Exit Sub

‘条件から抜ける

End If

Cancel = True

Exit Sub

この処理も良く使います。

条件から抜けるという処理は、この機会に、是非憶えてください。

主キー重複登録防止作成手順

使う関数は、IF構文と、Withステートメント、Dcount関数です。


上の図のように、F_商品というフォームをデザインビューで開きます。

商品コードのテキストボックスを選択して、向かって左側のプロパティーシートを表示させます。

イベントというタブの中に、【更新前処理】という項目選択します。

ここまでは、同じです。

 

 

Private Sub 商品コード_BeforeUpdate(Cancel As Integer)    
     With Me!商品コード
    If IsNull(.OldValue) Or (.Value <> .OldValue) Then
      If DCount("商品コード", "MT_商品", "商品コード=" & .Value) > 0 Then
        MsgBox "入力された商品コードはすでに使われています!" & _
                vbCrLf & _
                "他の値を再入力してください。", vbOKOnly + vbExclamation
        Cancel = True
      End If
    End If
  End With
End Sub

主キー重複登録防止のコード解説

フォーム上の連結コントロールの値が変更されたかどうかを知るのは  【oldvalue】 プロパティを使用します。

With Me!商品コード

If IsNull(.OldValue) Or (.Value <> .OldValue) Then

‘もし商品コードが、Null(空白) または、データの商品コードが合致していないときは登録可能 ここまでが第一条件

If DCount(“商品コード”, “MT_商品”, “商品コード=” & .Value) > 0 Then

‘だけど、MT_商品から、今入力された商品コードをカウントして、

その商品コードが0以上で、oldvalueと合致しているとき これが、第二条件

MsgBox “入力された商品コードはすでに使われています!” & _

vbCrLf & _

“他の値を再入力してください。”, vbOKOnly + vbExclamation

Cancel = True

第二条件のときは、この条件式を抜ける

End If

End If

End With

完成図


このように、事前に重複登録を防止できます。

今回のコードをまとめる

Private Sub 商品コード_BeforeUpdate(Cancel As Integer)

If Len(Me!商品コード) > 0 And Len(Me!商品コード) <> 4 Then
        MsgBox "商品コードは4桁だ。手打するな!! "
        Cancel = True
        Exit Sub
    End If
Private Sub 商品コード_BeforeUpdate(Cancel As Integer)
     With Me!商品コード
    If IsNull(.OldValue) Or (.Value <> .OldValue) Then
      If DCount("商品コード", "MT_商品", "商品コード=" & .Value) > 0 Then
        MsgBox "入力された商品コードはすでに使われています!" & _
                vbCrLf & _
                "他の値を再入力してください。", vbOKOnly + vbExclamation
        Cancel = True
      End If
    End If
  End With
End Sub

まとめ

ACCESSにおいては、主キーは、大切な役割をはたしています。

桁が違うなどは、論外です。

また、ACCESSは、Excelより、データ管理においては、便利だということを、常に、みなさんの部署に人達に、思わせなければなりません。

システムを作成するのであれば、今回のように、気を使ってあげましょう。

そうすれば、あなたの評判も、ACCESSと同じように上昇すると思います。

サンプルファイルNo17はです
スポンサーリンク

Twitterでフォローしよう

おすすめの記事