プロが教えるわが家の防犯対策術!

はじめまして、ACCESS初心者なのですが、困っています。
商品マスターというテーブル(商品ID、メーカー名、品名、型式)があって、見積フォームの
サブフォームの見積詳細フォーム中で、メーカー名、品名、型式をコンボボックスで選択できるようにしており、以前見積もりしたことのある商品をメーカー名、品名、型式をコンボボックスでテーブルから
絞り込みをしながら参照してくるようにしたいのですが、テーブル内にあるレコードと同じものを
選ぶと新しくレコードが追加されてしまいます。同じ場合は追加したくないのですがどうしたら良いのでしょうか?


レコードソースはクエリQ_見積詳細で、
 見積詳細テーブル(見積No、注文No、数量、単価、商品ID)と商品マスター(商品ID、メーカー、
 品名、型式)を商品IDでくっつけているものです。

 コンボボックスは3つあって、
 1つ目のメーカーCoのコンボボックスはコントロールソース メーカー
 値集合ソースはクエリでQ_メーカー
 Q_メーカーは商品マスターのテーブルで
 フィールド・・メーカー テーブル・・商品マスター 集計・・グループ化 表示・・ON
 フィールド・・品名 テーブル・・商品マスター 集計・・グループ化  表示・・OFF
フィールド・・IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo]
        _Is Null,True,[商品マスター]![品名]=[Forms]![見積データフォーム]!
_[見積データフォーム詳細]![品名IDCo]) テーブル・・なし 集計・・グループ化

 2つ目の品名IDCoのコンボボックスはコントロールソース 品名
 値集合ソースはクエリでQ_品名
 Q_品名は商品マスターのテーブルで
 フィールド・・品名 テーブル・・商品マスター 集計・・グループ化  表示・・ON
 フィールド・・メーカー テーブル・・商品マスター 集計・・グループ化 表示・・OFF
 フィールド・・IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo]
        _Is Null,True,[商品マスター]![メーカー]=[Forms]![見積データフォーム]!
_[見積データフォーム詳細]![メーカーCo]) テーブル・・なし 集計・・グループ化

 3つ目の型式Coのコンボボックスはコントロールソース 型式
 値集合ソースはクエリでQ_型式
 Q_型式は商品マスターのテーブルで
 フィールド・・型式 テーブル・・商品マスター 集計・・グループ化  表示・・ON
 フィールド・・品名 テーブル・・商品マスター 表示・・OFF 
        抽出条件 [Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo]
 フィールド・・メーカー テーブル・・商品マスター 表示・・OFF 
        抽出条件 [Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo] 

 上記でやると、絞りこみはできるのですが、型式で同じものが2個表示されたり、レコードが新規
 で追加されてしまいます。
 よろしくお願いします。

A 回答 (7件)

こう書かれてすぐに解るかというとそうでもありません。

長いと逆にうっとうしい。

仕掛けがこう、データがこう、処理した操作がこう、いろいろな要素が絡みます。

回答側が同じことしてうまくいっても質問者側はうまくいかないこともあります。同じ環境を想定し作るのも大変ですし。


基本的に仕掛けた通り動きますから、結果がおかしいときはそうなるようになってしまっている、使い方が違うんだ、と見方を変えるのも手。解き方を学ぶ。


で、
中身は詳しく見てないですが
3つのコンボでの絞りができない?。余計な選択が出ている?。
でしょうか?。

この回答への補足

すみません。文章が下手で><
もともと商品マスターのテーブルにあるレコードと同じものを選びたいときに
メーカー、品名のコンボボックスで絞りこんで、型式コンボボックスに表示させたいのですが、
絞り込めてはいるのですが、型式のコンボボックスで同じ名称のものが2個表示されてしまうのが
1つと、もう1つは商品マスターに既に登録されている商品をコンボボックスで選ぶと、全く同じ
レコードが新規に追加されてしまうことです。

この文章も下手で意味わかりますか?

補足日時:2011/02/07 15:14
    • good
    • 0
この回答へのお礼

すみません。
初めて投稿したもんで、
補足に入ってしまいました。
ごめんなさい。

お礼日時:2011/02/07 15:16

親フォームのコンボボックスの名前はメーカーCOや品名COでしょうか。


詳細のコントロールがメーカーCOや品名COでしょうか。名前付けまちがいないか見る。


コンボには商品マスターにあるもの何種類かの選択のみに絞りたい、そのため値集合に条件式がある、と見受けられます。
フォームの値で検索し画面再表示させる、がしたい。検索値は既に存在しているデータからの絞りこみを候補にしたい、コンボで与える。がしたいのか。

コンボも1つのクエリ結果、Qメーカー、これだけ実行して検証しましたか


コンボのコントロールソースが商品マスターと連結していませんか、コンボの値変われば商品マスターも変わるのでは?。非連結ですか。レコードの作られ方おかしいのは連結項目にも着目。
    • good
    • 0

再現しようにもどうなのかあいまいでわかりませんでした。




で、
いったんコンボは忘れる、使わない。

コンボをテキストボックスにして実行。
テキストに値入れてサブフォームに絞り込み結果を表示する。
これができてないと始まりません。

それで
テキストで入力をより効果的にするためにコンボに置き換える。


確実にできたところから積み重ねです。
    • good
    • 0

回答では有りませんけれど、一読してください。


一般的にAccessなどに限らず質問される際は
アプリケーションのバージョンとOSのバージョンを明記。

質問内容に関連するテーブルのテーブル名とフィールド名とそのデータ型
出来ればサンプルデータ

クエリの場合は、クエリのSQL文
(クエリをデザインビューで開いて、右クリック→SQLビュー)
を提示されれば回答者も回答しやすいですし、その後のやり取りも
SQL文で出来ますのでスムースに進みます。
なるべくテーブルのサンプルデータとその求めたい結果もしくは途中経過

フォームやレポートの説明は難しいのですが、全く白紙の回答者が
そちらの状況のイメージが出来るような説明。

VBAなら省略せずに全文
(ある程度理解が進んでいればピンポイントでも・・?)


>絞りこみはできるのですが、型式で同じものが2個表示されたり、
はSQL文に問題があるような気がしますが
>レコードが新規で追加されてしまいます
こちらは想像力を逞しくしても???
お邪魔しました。
    • good
    • 0
この回答へのお礼

お礼遅くなり申し訳ございません。

質問内容に関連するテーブルのテーブル名とフィールド名とそのデータ型
出来ればサンプルデータ
→サンプルデータとありますがどうすればデータを添付できるのでしょうか?
 可能であれば実際のデータを皆さんに見てもらいたいです。

お礼日時:2011/02/14 13:38

http://www.geocities.jp/masa7251/tips/access/acs …
http://www.accessclub.jp/bbs3/0212/superbeg67800 …
「コンボ」「抽出」「フォーム」3つのキーワードでも良いので
確実な事例を探してみる。
特に、
コンボの使い方、値集合ソースを中心に、見直しすること。
どこかサンプルを見て作業したのならそこから。

「絞りこみはできるのですが、型式で同じものが2個表示されたり、レコードが新規
 で追加されてしまいます。」

同じものが2個表示
→値を設定しているクエリで2件表示されていないか、確認

レコードが新規
→どういう状態からどう操作したらレコード追加、か確認
→コンボボックスはレコードソースに格納しないでも良い項目では?

見積フォーム
→コンボボックスはここには無いのですか?。
ここで指定して、それに該当するものをサブフォームで表示したいのでは?。


適当にやっていたのでは結果はでません。
クエリ → フォーム → サブフォーム → コンボ と、
使い方をおおよそ理解できているか。
できていないままやろうとしているなら
こんなことが今後も続いてしまうので、やり方を考えなおした方が良いです。
    • good
    • 0
この回答へのお礼

すみません。返信が遅くなりました。
いろいろ考えて下さってありがとうございます。

コンボの使い方、値集合ソースを中心に、見直しすること。
どこかサンプルを見て作業したのならそこから。
http://www.mahoutsukaino.com/ac/access2007/07_db …
このフォーム、サブフォームを参考に作って絞り込みは自分でいろんなページを参考に作りました。 

同じものが2個表示
値を設定しているクエリで2件表示されていないか、確認
→Q_型式で2個表示されます。

レコードが新規
どういう状態からどう操作したらレコード追加、か確認
→サブフォーム上で次のレコードを作成しようとすると追加されます。
コンボボックスはレコードソースに格納しないでも良い項目では?
→商品マスターに無いものを手打ちした場合は商品マスターに追加したいです。

見積フォーム
コンボボックスはここには無いのですか?。
→コンボボックスはサブフォーム見積詳細フォームにのみです。

本当に初心者なので書かれていることを理解するのもむづかしいです。

お礼日時:2011/02/14 13:32

>レコードが新規で追加されてしまいます。




サブフォームの形式は帳票フォーム、あるいは
データシート形式とします。
見積書をフォームで作成する場合、過去の見積データが
そのまま、見積明細テーブルにあれば、新しい行で
コンボボックスを開いてデータを表示すれば、
Accessは新しい行、すなわち新規レコードに
移動した、ということを暗黙に行ないます。
この場合は、まだフォームの左には鉛筆マークの
ままで、まだレコードの確定はしていませんが、
新規レコードに移動した、という事実は残ります。
鉛筆マークが黒い三角形になる、すなわち
さらに次の行に進んだ場合は、そのレコードは
確定して保存されます。

もし、このレコードを確定させたくない、というのならば、
レコードを削除するか、Undoをする必要があります。
このとき、明細テーブルにオートナンバーのような
フィールドがあると、ことはもっと複雑になります。

過去のデータを参照して、もしそのデータのレコードを
サブフォームに表示したいというのであれば、
本来は、別のフォームで明細テーブルを参照するようにし、
必要ならば、その行、すなわちレコードをダブルクリック
したら、見積を作成しているサブフォームに追加する
ような仕組みにするのが、ベストです。この方法は
それほどややこしいことをすることはありません。

また、見積を作成するフォームのサブフォームには
過去の見積データを保存しているテーブルではなく、
見積作成専用の見積明細テーブルと同じ構造の
見積作業用明細テーブルを用意し、それを商品
テーブルなどの他とのクエリを作成して、サブ
フォームのレコードソースにします。
当然ながら、メインフォームのレコードソースの
のもとになる見積テーブルも同様の見積作業用
テーブルを用意します。
見積が作成できたら、そのデータをメインフォームの
データは見積テーブル、サブフォームのデータは
見積明細テーブルに追加し、用が終われば、その
見積作成フォームのデータは削除するように
します。

このようにすると、参照するつもりだけなのに、
参照した途端に、新しいレコードが追加されて
しまった、というやっかいなことは無くなります。

つまり、過去のデータを検索するフォームを
作成し、その中に適当なデータがあれば、その
レコードをダブルクリックして、見積作成
フォームにコピーするようにします。したがって、
今サブフォームの明細で設定しているコンボボックスの
検索方法を検索フォームのレコード以外のフォームに
おいて、コンボボックスで検索したら検索条件で
レコードを絞り込むようにすればよろしいかと。

なお、明細のサブフォームのコンボボックスは
商品テーブルのデータのみにします。

Q_メーカー、Q_品名、Q_型式などの
コンボボックスの値集合ソースのクエリは
SQL文を表示してもらえれば、もっと具体的な
回答ができるかもしれません。
    • good
    • 0
この回答へのお礼

返信が遅くなり申し訳ございません。
いろいろ回答してもらってありがとうございます。
参考になるURLがありましたら教えて頂けませんか?
ちなみに
Q_メーカーのSQLは
SELECT 商品マスター.メーカー
FROM 商品マスター
GROUP BY 商品マスター.メーカー, 商品マスター.品名, IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo] Is Null,True,[商品マスター]![品名]=[Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo])
HAVING (((IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo] Is Null,True,[商品マスター]![品名]=[Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo]))=True));

Q_品名は
SELECT 商品マスター.品名
FROM 商品マスター
GROUP BY 商品マスター.品名, 商品マスター.メーカー, IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo] Is Null,True,[商品マスター]![メーカー]=[Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo])
HAVING (((IIf([Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo] Is Null,True,[商品マスター]![メーカー]=[Forms]![見積データフォーム]![見積データフォーム詳細]![メーカーCo]))=True));

Q_型式は
SELECT 商品マスター.型式
FROM 商品マスター
WHERE (((商品マスター.品名)=[Forms]![見積データフォーム]![見積データフォーム詳細]![品名IDCo] Or (商品マスター.品名) Is Null Or (商品マスター.品名) Is Null));
です。
解りますか?

お礼日時:2011/02/14 13:13

>→Q_型式で2個表示されます。


基になっているクエリでレコードが2個なので2個、
SQLの「DISTINCT」で対処できる可能性あります。

>レコードが新規
フォームのプロパティ「レコード追加の許可」で対処できる可能性あります。

この2つを学習してみてください。

おかしい、と思ったときは、フォームならプロパティ、クエリを中心に
「そのように仕向けている」と思っても良いです。
クエリで正しいデータを取得できていて、それでコンボボックスに定義できる、
というもの。使い方がおかしい?と見なおす。
どこかにおかしいかも、というところがある、のがほとんどです。
サブフォームを扱うには
フォーム1面の動作はある程度理解できている必要あります。


・・・・のときはどうなる、xxxxのときはどうなる、
こういうのを整理して把握していく。
いろいろ高度なこといきなりやると原因がどこにあるのか探すことになりますが、
1つずつ段階踏んで理解していれば、不安なところは覚えたての箇所に限られます。
これは間違っていないから、
ここにおかしい箇所がある、そういう見方になってきます。

ACCESS
http://www.happy2-island.com/access/gogo03/capte …
http://www.tsware.jp/index.htm
http://www.accessclub.jp/index.html
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
2個表示される問題は教えて頂きましたDISTINCTで解決できました!
久しぶりに前進できました!
レコード追加の件ですが、商品マスターにない型式をコンボボックスで手打ちした場合
は商品マスターのレコードに追加しないといけません。
また、商品マスターのテーブルと一致したデータでも見積もり詳細テーブルには追加し、
商品マスターには追加しないようにしたいのですが、ネットとかで調べるとどうやら
すごく難しそうです。このレベルの僕に可能なのでしょうか?
これまでがネットを参考に理解が不充分で作ってきていたので原因を探すのが大変です><

お礼日時:2011/02/15 13:27

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

関連するカテゴリからQ&Aを探す