過去ログ

                                Page     128
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
   通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫   
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 ▼マスターの再登録を防止するには  やまざき 02/12/1(日) 9:40
   ┗Re:マスターの再登録を防止するには  yu-ji 02/12/2(月) 10:17
      ┗Re:マスターの再登録を防止するには  やまざき 02/12/2(月) 12:37
         ┗Re:マスターの再登録を防止するには  yu-ji 02/12/2(月) 14:01
            ┗Re:マスターの再登録を防止するには  やまざき 02/12/2(月) 22:17
               ┗Re:マスターの再登録を防止するには  yu-ji 02/12/3(火) 10:25
                  ┗Re:マスターの再登録を防止するには  やまざき 02/12/3(火) 14:31
                     ┗Re:マスターの再登録を防止するには  yu-ji 02/12/3(火) 15:49
                        ┣Re:マスターの再登録を防止するには  やまざき 02/12/3(火) 17:35
                        ┗Re:痛恨のミス(^^;  yu-ji 02/12/4(水) 9:31
                           ┗Re:痛恨のミス(^^;  やまざき 02/12/8(日) 18:46

 ───────────────────────────────────────
 ■題名 : マスターの再登録を防止するには
 ■名前 : やまざき
 ■日付 : 02/12/1(日) 9:40
 -------------------------------------------------------------------------
   初めて質問いたします。ユーザーが同じデータを二回以上登録してしまうため防止策を考えたいのですが、以下のようにしても上手くいきません。
Private Sub 表示顧客名_Exit(Cancel As Integer)
  Dim n As Integer
  With Me
    If !前 = !表示顧客名 Then
      Exit Sub
    End If
    n = DCount("[顧客番号]", "顧客名簿", "顧客名='" & Me!表示顧客名 & "'")
    If n <> 0 Then
      If MsgBox("同じ名前の登録が以前あります。登録しますか", vbOKCancel) = vbCancel Then
        Cancel = True
        Exit Sub
      End If
    End If
    子顧客名簿更新 "顧客名='" & !表示顧客名 & "'"
  End With
End Sub
同じ名前を登録してもnに0が入ってしまいます。半角、全角の判定や、スペースの問題を無視するような設定があったような気がするし、他にも問題があるんでしょうか。どなたかご指導お願いします。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : yu-ji  ■日付 : 02/12/2(月) 10:17  -------------------------------------------------------------------------
   こんにちは。

▼やまざき さん:
>初めて質問いたします。ユーザーが同じデータを二回以上登録してしまうため
>防止策を考えたいのですが、以下のようにしても上手くいきません。

>同じ名前を登録してもnに0が入ってしまいます。半角、全角の判定や、
>スペースの問題を無視するような設定があったような気がするし、他にも
>問題があるんでしょうか。どなたかご指導お願いします。

そちらの背景がよく分かりませんが、ExitよりBeforUpdateイベントの方がいいと
思います。Exitをキャンセルしても、次のオブジェクトに移らないだけで
登録は終わってるので(非連結(テキスト?)なら問題ないと思いますが)

と、プログラムを見て、気になったのは以上だけです。


で。
とりあえず、何が問題なのかをデバッグしながら確かめられました?
正しい顧客名を入力した時に、nにはちゃんと値が入りました?
そうであれば、あげられた通り、スペースや半角/全角の可能性が高そうですね。
・・・というか、実際半角/全角やスペースの違いで登録されて
しまったのかどうかは、データを見れば分かりますよね?
それで見てみて、どうすればいいか?ってことなのかな?

自分は、スペースの問題を無視するような設定というのは知りませんが、
Option Compare Text
を設定しておくと、半角/全角を区別しなくなるはずです。
また、スペースは、TrimやReplaceを使って修正すればいけるかな?

ちなみに、これはテキストボックスなんですよね?
コンボボックスにすると都合が悪いですか?
コンボボックスなら、入力ミスとかが少なくなると思うし、”リストの項目と
同じものだけ受け付ける”の「入力チェック」で”はい”にすれば、同じ項目しか
受け付けないので、それだと簡単ですが。
#ご存知で、敢えて使ってなかったのなら、すみません(^^;

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : やまざき  ■日付 : 02/12/2(月) 12:37  -------------------------------------------------------------------------
   返答ありがとうございます。投稿後、以前の質問等確認したところ、同じような内容がありました。最後の方が知りきれトンボになっており、結論がでていないように感じました。アクセス2000でやってます。テキストボックスは非連結です。Debug.Print で表示させて見てますが、色々なデータで試していますが、nには一度も0以外の数値が入ったことはありません。正直原因は良くわかりません。困っています。ご意見ください。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : yu-ji  ■日付 : 02/12/2(月) 14:01  -------------------------------------------------------------------------
   ▼やまざき さん:
>テキストボックスは非連結です。

だったら、Exitイベントでも問題ないですね。


>Debug.Print で表示させて見てますが、色々なデータで試していますが、nには
>一度も0以外の数値が入ったことはありません。

ん?
顧客名簿に既に存在している顧客名を入力しても、nに0が入るということですか?

半角/全角や空白が入ってたりしてて、別物と判断されているわけではないですか?
それであれば、その対策のプログラムを追加してやればいいだけですが。

あと、コンボボックスの件について触れられてませんが、テキストボックスで
やりたいということなのかな?
#もちろん、テキストボックスでも、二重登録は防げますが。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : やまざき  ■日付 : 02/12/2(月) 22:17  -------------------------------------------------------------------------
   対象になっているテーブルは顧客名簿です。一応リストボックスをふりがなでLikeで検索した後、無い場合新規登録という手順をふんでいるんですが、それでもなお間違えて、名前の二重登録がされます。顧客には同じ名前の人が複数いることは充分考えられるため、重複不可には出来ません。単純にDcountの使い方に何か問題があるんでしょうか。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : yu-ji  ■日付 : 02/12/3(火) 10:25  -------------------------------------------------------------------------
   #んー、微妙に会話がずれてる?(笑)

と、ちょこっと勘違いしてました。
このフォームって顧客名の新規登録の為のものなんですよね?
その新規登録時に過去でかぶってる名前がないかどうかをチェックして、
もし存在していれば(同名別人かもしれないので)確認メッセージを出して
登録させると。

じゃあ、コンボボックスなんかで他の顧客名を表示させても、あんまり
意味なさそうですね(^^;

>>>Debug.Print で表示させて見てますが、色々なデータで試していますが、nには
>>>一度も0以外の数値が入ったことはありません。
>>ん?
>>顧客名簿に既に存在している顧客名を入力しても、nに0が入るということですか?

この回答はどうなんでしょうか?

>一応リストボックスをふりがなでLikeで検索した後、無い場合新規登録という
>手順をふんでいるんですが、それでもなお間違えて、名前の二重登録がされます。

その手順というのは、最初の書き込みのプログラムのことですか?
リストボックスとふりがなでLike検索は、あのプログラムにはないように
思えるのですが、別のプログラムでなにかしてるのかな?

「間違えて」というのは、誰が間違えて?
プログラム?ユーザー?
ユーザーということであれば、Msgboxのチェックもいれているので、あとは
どうしようもないのでは(^^;
#Cancelを標準に設定しとくぐらいかな?

>単純にDcountの使い方に何か問題があるんでしょうか。

自分の最初の書き込みにも書きましたが、プログラム的には問題はない
(使い方が間違ってるとかってことはない)と思います。Dcountも含めて。
#「顧客名簿」テーブルの中の「顧客名」フィールドのデータが、
#現在のフォームにある「表示顧客名」テキストボックスの値と
#同じものがあれば、その個数をカウントするという使い方でいいのであれば。

とりあえず、顧客名簿に既に存在している顧客名を入力した時(コピー&ペーストして
全く同じ内容を貼り付けた場合に)、Dcountはカウントするのか、しないのか
教えてください。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : やまざき  ■日付 : 02/12/3(火) 14:31  -------------------------------------------------------------------------
   度々の返信ありがとうございます。また言葉足らずで申し訳ありません。リストボックス云々は新規登録フォームに入る前の処理の説明で、今回の質問には余り関係の無いことです。すいません。間違えるのはユーザーですが、管理が行き届かない事業所での使用なので何とか防止が出来るようにしてあげたいと思っているわけです。
 いわれるようにカットアンドペーストでやってみたところ、nには1が入り、Msgboxのチェックもかかりました。結果わかったことは、ユーザーが登録した顧客名の後ろにスペースが入っていたのです。おさがわせしました。
 これを防止するには、顧客名データをテーブルに挿入するときにTrimをかける以外方法が無いんでしょうか。テーブルデータがこの状態(スペースが入った状態)のまま入力データと比較する方法は無いものでしょうか。ご助言をお願いいたします。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : yu-ji  ■日付 : 02/12/3(火) 15:49  -------------------------------------------------------------------------
   ▼やまざき さん:
>いわれるようにカットアンドペーストでやってみたところ、nには1が入り、
>Msgboxのチェックもかかりました。結果わかったことは、ユーザーが登録した
>顧客名の後ろにスペースが入っていたのです。おさがわせしました。

原因がはっきりしたら、対策も立てやすいですよね(^^

>これを防止するには、顧客名データをテーブルに挿入するときにTrimをかける
>以外方法が無いんでしょうか。テーブルデータがこの状態(スペースが入った状態)
>のまま入力データと比較する方法は無いものでしょうか。ご助言をお願いいたします。

えと、テーブルのデータにもスペースが入っていて、それは修正できないという
ことでしょうか?
もし修正可能なのであれば、一度登録済のデータを変換した方がいいのでは?
#前後の空白をなくし、途中の空白は半角空白1つのみにするというような感じに。
#個人的には、可能であればこうしておいた方がいいと思います。

そうした場合には、今後の入力プログラムは以下のような感じのを追加すれば
OKだと思います。

*******************

  Dim Old_StrCheck As String
  Dim StrCheck As String
  Dim n As Long
  
  StrCheck = Me!表示顧客名
  StrCheck = Trim(StrCheck)  '前後の空白を削除
  StrCheck = Replace(StrCheck, " ", " ", , , vbTextCompare) '全角空白を半角空白に
  
  '半角空白が複数個ある場合1つだけにする
  Do
    Old_StrCheck = StrCheck
    StrCheck = Replace(StrCheck, " ", " ", , , vbTextCompare)
  Loop Until Old_StrCheck = StrCheck
  
  n = DCount("顧客番号", "顧客名簿", "顧客名 = '" & Me!表示顧客名 & "'")

*******************

それはできないということであればDcountでは無理なので、顧客名簿の顧客名
を一つ一つチェックして、顧客名簿の顧客名を変数に入れて空白を除去し、同じく
入力した顧客名の空白除去して比較・・・・という感じのプログラムになると思います。
#こっちを選択した場合、以上の説明だけで分かりますか?
#分からなければ、プログラムを記述するんで、ADOでやってるかDAOでやってるかを
#教えてくださいね。

 ───────────────────────────────────────  ■題名 : Re:マスターの再登録を防止するには  ■名前 : やまざき  ■日付 : 02/12/3(火) 17:35  -------------------------------------------------------------------------
   頂いたコードでやってゆきます。本当に丁寧なご指導大変ありがとうございました。御世話になりました。

 ───────────────────────────────────────  ■題名 : Re:痛恨のミス(^^;  ■名前 : yu-ji  ■日付 : 02/12/4(水) 9:31  -------------------------------------------------------------------------
   >  '半角空白が複数個ある場合1つだけにする
>  Do
>    Old_StrCheck = StrCheck
>    StrCheck = Replace(StrCheck, " ", " ", , , vbTextCompare)
>  Loop Until Old_StrCheck = StrCheck
>  
>  n = DCount("顧客番号", "顧客名簿", "顧客名 = '" & Me!表示顧客名 & "'")

アホかっちゅーねん(^^;>自分

わざわざ変換したデータを使わずに、元データを使ったら、変換した意味がない
ですね、はい(^^;;;;

n = DCount("顧客番号", "顧客名簿", "顧客名 = '" & StrCheck & "'")

こっちが正解です。

すみませんでした。 m(__)m

#ちゃんと、この書き込み見てくれるかなぁ?

 ───────────────────────────────────────  ■題名 : Re:痛恨のミス(^^;  ■名前 : やまざき  ■日付 : 02/12/8(日) 18:46  -------------------------------------------------------------------------
     Me!表示顧客名=StrCheck
としました。大丈夫です。ご心配ありがとうございます。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 128