• 締切済み

フォームで顧客データ入力の際に、氏名の重複データの検索を更新前処理する式を教えて下さい。

飲食をチェーン展開している会社の本部で顧客管理の仕事をしております。 店舗数は6店舗あり、多い店舗で現在7000件、少ない店舗で300件ほどのデータを管理しております。 フォームにて、氏名を入力時に重複データを検索する方法を試行錯誤しておりますが、 このサイトでのご回答やWEB検索などで、なんとか下記の式を記述し、重複チェックを完了するまでに至りました。 チェック後の処理に『リンク元の顧客テーブルを開く』(←(1)です)式を記入しておりますが、『重複データを検索した結果を表示する (テーブルもしくはフォームにて)』式に変更したいのです。 重複チェックの方法は『氏名+郵便番号+住所』でチェックしたいと考えています。 そのような処理が出来る具体的な式を、どなたかご指南お願い致します! ----------------------------------------- Private Sub 氏名_BeforeUpdate(Cancel As Integer) Dim db As Database Dim rs As Recordset Set db = CurrentDb Set rs = db.OpenRecordset("顧客A", dbOpenDynaset) rs.FindFirst ("氏名 = '" & Me!氏名 & "'") If Not rs.NoMatch Then If MsgBox("重複しています。詳細データを参照しますか?", vbOKCancel) = vbOK Then DoCmd.OpenTable "顧客A" ←(1) End If End If End Sub

みんなの回答

noname#140971
noname#140971
回答No.1

顧客マスター: ID__氏名__________郵便番号__住所 01__鈴木 一郎___1111111__東京都大田区太田町1-1 02__中村 主水___1111112__東京都大田区太田町1-2 Private Sub 氏名_AfterUpdate()   顧客重複チェック End Sub Private Sub 住所_AfterUpdate()   顧客重複チェック End Sub Private Sub 郵便番号_AfterUpdate()   顧客重複チェック End Sub Private Sub 顧客重複チェック()   Dim Answer  As Integer   Dim strSQL  As String   Dim strDatas As String   If Len(Me.氏名 & "") And Len(Me.郵便番号 & "") And Len(Me.住所 & "") Then     strSQL = "SELECT * FROM 顧客マスター WHERE 氏名='" & Me.氏名 & _         "' AND 郵便番号='" & Me.郵便番号 & _         "' AND 住所='" & Me.住所 & "'"     strDatas = DBSelect(strSQL, vbCrLf, vbCrLf)     If Len(strDatas) Then       Answer = Verify("重複しています。詳細データを参照しますか?")       If Answer = vbYes Then         Warning "以下の顧客情報が既に登録されています。" & vbCrLf & vbCrLf & strDatas       End If     End If   End If End Sub 以上のコードで、重複していると次のような警告メッセージが表示されます。 =================================================== [警告] --------------------------------------------------- 以下の顧客情報が既に登録されています。 鈴木 一郎 1111111 東京都大田区太田町1-1 ==================================================== 改善点1、[氏名]、[郵便番号]、[住所]のいずれかが変更された時に 顧客重複チェック() をコールしています。 改善点2、データ検索と重複データの取得を同時に行っています。 改善点3、重複データの表示は MsgBox で済ませています。(これで、用は足りるんじゃないですか?) Public Function Verify(ByVal Msg As String, _             Optional ByVal DefaultButton As Integer = vbDefaultButton1) As Integer   Verify = MsgBox(Msg, vbYesNo + vbQuestion + DefaultButton, " 確認") End Function Public Sub Warning(ByVal Msg As String)   MsgBox Msg, vbExclamation, " 警告" End Sub Verify()、Warning() は、単に、 MsgBox 関数の引数を省略するための関数で意味はありません。 さて、質問者と大きく違うのは SQL文を作成しチェックと呼び込みを同時に行っていることです。 さて、質問者と大きく違うのは DBSelect関数を利用している点です。 [イミディエイト] ? DBSelect("SELECT * FROM 顧客マスター WHERE ID=1", vbCrlf, vbCrlf) 1 鈴木 一郎 1111111 東京都大田区太田町1-1 ? DBSelect("SELECT * FROM 顧客マスター WHERE ID=1") 1;鈴木 一郎;1111111;東京都大田区太田町1-1; DBSelect() では、列の区切りは既定値で(;)、レコードの区切りは("")です。 顧客重複チェック()では、列の区切りとレコードの区切りに vbCrLf を指定して警告メッセージに相応しく整形。 さて、問題は、こういう全体構想が質問者の目指す方向とマッチしているかどうかです。 「そういう方向も検討の余地があるかな?」と思われるのであれば DBSelect関数に関して補足します。

関連するQ&A