• ベストアンサー

クエリーから入力フォームの作成

access2000を使って簡単な注文用のフォームを作っています。VBAは初心しゃです。 テーブルとしては、納品伝票(伝票番号、顧客コード)、顧客管理(顧客コード)を作り( )ないのものでリレーション組んでます。 クエリーでリレーションを組み、それを元にフォームを作りました。 希望としては(1)伝票番号の重複がないようにする。 (2)顧客コードから住所を表示させる、顧客コードが登録されていないときにはメッセージを出し、正しい顧客コード(顧客コードのみ)を入力させる。 (1)はクエリーでテキストのデータを条件にし、フォームのVBAで Private Sub 伝票番号_AfterUpdate() If DCount("伝票番号", "Q_納品伝票") >= 1 Then MsgBox "すでに登録されています" Me.Undo DoCmd.GoToControl "顧客名" DoCmd.GoToControl "伝票番号" End If End Sub で上手くできましたが、同じクエリーで(2)も(1)と同様なVBAを組んだところ(顧客デーブルの顧客コードに重複があるときをチェックさせる)、(1)の重複をチェックしなくなってしましまいました。 うまく説明できたが心配ですが、根本的に何か違っていますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.2

>同じクエリーで(2)も(1)と同様なVBAを組んだところ・・ クエリにではなくテーブルを参照するようにすれば良いと思います。 DCount("*", "納品伝票テーブル", "[伝票番号]=Forms![注文フォーム]![伝票番号]")>=1 のようにでも変更してテーブルを見にいくようにすれば両方ともいけると思いますが。 #1の方がテーブルにまかせ・・「重複を許さないインデックス」を付けましょう。 と回答がありますが通常はテーブルに主キーを設定しておくのですが、設定していないのでしょうか?顧客コードと伝票番号は主キーの設定をして重複しないようにしておいてください。テーブル側でも重複されないようチェックされます。 2000ならテーブルの主キーの設定をすれば伝票番号のコントロールで入力し重複があれば伝票番号のコントロールから移動する際(Enterキー押下等)メッセージが出ると思いますが。 顧客コードはコンボボックスにして顧客管理テーブルを参照するようにすれば顧客管理テーブルにあるレコードしか表示されません。そのコンボボックスから顧客コードを選び住所等を顧客管理テーブルから持ってくるようにすれば簡単だと思います。

desk34
質問者

お礼

ありがとうございます。テーブルを見に行くようにしたら、できました。もうひと工夫して完成させようと思います。 また分からないこと質問しますのでよろしくお願いします。

desk34
質問者

補足

>DCount("*", "納品伝票テーブル", "[伝票番号]=Forms![注文フォーム]![伝票番号]")>=1 のようにでも変更してテーブルを見にいくようにすれば両方ともいけると思いますが。 初歩的な質問ですが、この記述をフォームのテキストの更新後処理にすればいいってことですか? 今手元にファイルないので明日にでも実行してみます。 主キーは設定していますよ。同じコード入力してエンター押すと、納品伝票の内容が表示されてしまいます。何か根本的に間違ってるのかなー。

その他の回答 (2)

noname#79209
noname#79209
回答No.3

フォームのレコードソースに質問者さんのようなクエリを使う必要性は感じられません。 私自身はあまりフォームにテーブル等をリンクさせませんが、あえてリンクするとすれば、この場合は納品伝票テーブルでしょう。 顧客の情報は、フォーム上の顧客番号を元に顧客管理テーブルから引っ張ってくれば良いだけです。

desk34
質問者

お礼

ありがとうございます。クエリーにこだわり過ぎたようです

noname#182251
noname#182251
回答No.1

「重複が許されないもの」をチェックするにはVBAなどで、コードを記述するよりもデータベースに任せるできだと考えます。その方が 1.楽である 2.確実である 3.高速である からです。 顧客コード、伝票番号などは「重複を許さないインデックス」を付けましょう。それともなにかそうすることに不都合があるのでしょうか?

desk34
質問者

補足

「重複を許さないインデックス」はテーブルのインデックスですよね?そうすると、重複する伝票番号入力した際に、以前の内容が表示されますよね?(私の理解不足でしたらごめんなさい) できれば、入力フォームに入れた際に「すでに入力されている」表示したいのですが。顧客コードは登録がないときに「登録ありません」などと、表示できればと思っています。 クエリー使っては無理でしょうか?