電子書籍の厳選無料作品が豊富!

飲食をチェーン展開している会社の本部で顧客管理の仕事をしております。
店舗数は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

A 回答 (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関数に関して補足します。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!