ACCESSでのテーブル設計と検索

このQ&Aのポイント
  • テーブル業者とテーブル担当者、テーブル商品を管理するテーブル案内履歴について
  • フォーム業者とフォーム担当者からフォーム案内履歴を開く際の情報入力方法について
  • 考え方として適切な点とヒント、アドバイスをお願いします
回答を見る
  • ベストアンサー

ACCESSでのテーブル設計と検索

 テーブル業者(ギョウシャメイカタカナ)と、テーブル担当者(タントウシャメイカタカナ)と、テーブル商品(ショウヒンメイカタカナ)と、  *テーブル案内履歴(ギョウシャメイカタカナID)(タントウシャメイカタカナID)(ショウヒンメイカタカナID)があります。*  ()内は保存してあるフィールド名です。  対応したフォーム、フォーム業者、フォーム担当者、フォーム商品、フォーム案内履歴、も作りました。  テーブル担当者は、現在フィールド名、(ギョウシャメイカタカナID)を使いテーブル業者とリレーションシップを設定しています。  ひとつの業者に担当者は0人の時もあれば5人の時もあります。担当者のいない業者は、本社対応なので担当者テーブルにはデータはありません。  案内履歴テーブルを作るにあたり、担当者がいるところには(ギョウシャメイカタカナ)と、(タントウシャメイカタカナ)情報を持ち、担当者がいないところは、(ギョウシャメイカタカナ)だけを保存しようと思います。  業者数は500社ぐらいです。  **フォーム業者、からフォーム案内履歴をコマンドボタンを使って開くと(ギョウシャメイカタカナ)を入力して、フォーム担当者からフォーム案内履歴を開くと(ギョウシャメイカタカナ)と(タントウシャメイカタカナ)を入力しようと思っています。**  *から*と、**から**で、考え方として間違っているところがあるのでしょうか。 また、この考え方で可能なら、*から*と、**から**を実現するためのヒントとアドバイスよろしくお願い致します。

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

  • ベストアンサー
回答No.6

つぎに履歴に担当者・業者IDを自動入力する方法です。(こちらが本題ですね) VBAなどを使用せず、クエリやマクロで作成できる物にしてみました。 サブフォームのあるフォームをを二つ使用することを試してみて下さい。 業者担当者がいない場合は、「担当者なし」というレコードを各業者毎に用意して下さい。 例) 担当者ID 1 / 業者ID 156 / 担当者カナ タントウナシ    担当者ID 2 / 業者ID 223 / 担当者カナ タントウナシ  1.業者を選択すれば 担当者が表示される親子関係のフォーム作成 《F_業者担当》   非連結で業者選択フィールドを作成 コンボウィザードで TBL業者のIDとカナを選択し   キー列を表示しない のチェックを外しておく  → cmb業者 とする   TBL担当者を値にサブフォーム作成 《Sub_業者担当》   サブフォームのプロパティで親フィールド 〈cmb業者〉   子フィールドはサブフォームの業者名IDのテキストコントロール名を入力 2.担当者を選択すれば担当者の案内履歴を表示させる親子関係のフォームを作成 《F_担当案内》   No2の回答と内容が異なります。   非連結のコンボボックスを作るのではなく、オートフォームの単票形式を使用して TBL担当者の   フォーム作成 担当ID 業者ID 担当カナ 全て表示   そのフォームをデザインビューで開き、フォームのサイズを広げて、サブフォームを作成し、案内履歴を表示させる 《Sub_担当案内》   親フィールド 子フィールド共に 〈担当者ID〉とする   《Sub_担当案内》 の業者IDフィールドの規定値に 《F_担当案内》の業者フィールドを指定 3. 《Sub_業者担当》 に 担当者 A,B,C,Dとあるとき、担当者Bをダブルクリックすると   担当者Bの値が表示された 《F_担当案内》 を開くマクロ作成 《M_担当案内Open》     アクション フォームを開く   フォーム名 《F_担当案内》   ビュー フォームビュー   Where条件式  [担当者ID]=[Forms]![フォーム2].[Sub_業者担当].[Form].[担当者ID]      《Sub_業者担当》 のプロパティのダブルクリックイベントに 《M_担当案内Open》 を設定 この方法で 業者から担当者を選んでダブルクリック → 担当者が別フォームで開く → 担当者のサブフォームの 新規入力画面に 担当者ID 業者IDともに 規定値として自動表示されます。

NYAN-ta
質問者

お礼

ありがとうございました!!! こんなに丁寧に教えて頂いているにもかかわらず、 途中で何度もつまづきましたが、やっとやっと完成しました!!! 本当に何度も何度もありがとうございました。 p-applepie様に回答頂けなければ不可能でした。 ただ、これをまた1から自力で再現するのは私には出来そうにありません。。。 本当にありがとうございました。また是非教えて頂きたいです。

その他の回答 (5)

回答No.5

業者よりも担当者が多かったんですね。 ざっと読んでいたせいで 自社担当者だと誤解してました。 業者の担当者という意味ですね。失礼しました。 担当者<業者 と思ってNo2にサブフォームの方法だと、 >親フォームに非連結で業者をコンボボックスで選択形式で表示 ではなく 担当者をコンボボックスで表示 が正解ですね。 -------- 業者→担当者と絞り込んで 新規入力画面のそれぞれのフィールドに自動入力の前に まずは No3の補足で、履歴を見たい・・という話がありましたので その件から。 サブフォームを利用して、あいまい検索をして履歴を出すことが可能です。 1.親フォーム(F_検索)を作成し、テキストボックスを二つ作成。 (それぞれ txt業者 txt担当者 とする) 2.サブフォームを作成する前に検索用クエリ(Q_検索)を作成。  クエリの元ソースは テーブル案内履歴の業者IDや担当者ID部分を翻訳した(カナを表示させた)クエリを使用。  業者の抽出条件に Like "*" & [Forms]![F_検索]![txt業者] & "*"  担当者の抽出条件に Like "*" & [Forms]![F_検索]![txt担当者] & "*" と設定 3.F_検索 に Q_検索 を使用した サブフォーム Sub_検索 を作成。 4.マクロ(M_検索)を作成。 アクションは 再クエリ Sub_検索 5.F_検索にコマンドボタン作成 アクションを M_検索とする これで曖昧検索が出来ます。 例えば txt業者 に ヤマ とインプットすると ヤマダショウジ モトヤマショウテン ヤマグチサンギョウ サヤマ・・・などと ヤマが含まれる内容が全て検索されます。(もちろん文字数を増やすと絞り込まれます) 更にtxt担当者に スズキ と入れると、 業者名に ヤマがついて 担当者がスズキさんのものが 検索されます。 Sub_検索 を Excelエクスポートするマクロを作成しておいてコマンドボタンに設定しておけば 検索結果をExcel出力することもできます。

回答No.4

もう少し教えて下さい。 業者数が500程度という事でしたが、担当者は何名ぐらいでしょうか? 一つの業者に0~5人の担当者がいると書かれていましたので 担当者数>業者数 でしょうか? 教えて頂いたマスタの構成だと、担当者マスタ>業者マスタとなるかと 思ったのですが。

NYAN-ta
質問者

補足

ありがとうございます!!! >担当者数>業者数 でしょうか? その通りです。900人くらいです。 どうぞ宜しくお願い致します。

回答No.3

すみません。先のリンクは間違いです。 再度リンクを貼ります

参考URL:
http://www.wanichan.com/pc/ac2000/form02.htm
NYAN-ta
質問者

補足

p-applepie様 何度もありがとうございます。知らなかった方法を教えて頂き大変勉強になりました。 またサブフォームを使うことにより、当初想像していなかった担当者毎の案内履歴を見れるという思わぬ拾物もしました。 >それとも既にマスタは出来ていて、業者を検索→表示させるマスタで 検索をかけたあと、コマンドボタンを押すと案内履歴の業者欄に 自動入力される事を希望されていますか? その通りです。 新規に入力することもありますが、p-applepie様のご指導にあった通りサブフォームを作ることによって前者もクリアできました。 現在できていること テーブル業者 ID ギョウシャメイ テーブル担当者 ID ギョウシャメイID タントウシャメイ テーブル案内履歴 ID ギョウシャメイID タントウシャメイID 案内日 ギョウシャメイ-----ギョウシャメイID タントウシャメイ-----タントウシャメイID はリレーションシップ済み 今現在、テーブル案内履歴にはフォーム業者から案内した場合、フィールド名(ギョウシャメイID)のみに、フォーム担当者から案内した場合、(タントウシャメイID)のみに、データが入力されるようになっています。 今後、テーブル案内履歴を元に案内履歴検索を行う場合、タントウシャメイカタカナで検索すると同姓同名の人がいる為、担当者の所属会社をテーブル案内履歴の(ギョウシャメイID)欄にデータとして入力しておいたほうがいいのではと思うのですが、いかがなものでしょう。 レポートとして出力するときにも、担当者の所属企業(ギョウシャメイ)がすぐ分かりいいのではと思っています。 >担当者+業者の場合は、簡単な方法がどれかすぐに思いつきません。 クエリだけで作成出来るか↑と同じ方法で親子関係を3階層にする事で 解決出来るかもしれませんが、VBAでDAOかADOを使用する事がが必要かも・・。 "DAOかADO"----難しそうですね。 今回は本当にありがとうございます。

回答No.2

一点目が解決して何よりです。 二点目についてご質問します。 >**フォーム業者、からフォーム案内履歴をコマンドボタンを使って >開くと(ギョウシャメイカタカナ)を入力して、フォーム担当者から >フォーム案内履歴を開くと(ギョウシャメイカタカナ)と >(タントウシャメイカタカナ)を入力しようと思っています。** フォーム業者 フォーム担当者はそれぞれどのような目的のフォームでしょうか。 フォーム業者は業者マスタを新規入力する目的のフォームで、 コマンドボタンをクリックすると、その業者に対しての 案内履歴を新規入力出来るということでしょうか。 それとも既にマスタは出来ていて、業者を検索→表示させるマスタで 検索をかけたあと、コマンドボタンを押すと案内履歴の業者欄に 自動入力される事を希望されていますか? 後者の場合、もっとも簡単な方法は親子関係のあるフォーム(サブフォーム)を 使用する方法かとおもいます。 親フォームに非連結で業者をコンボボックスで選択形式で表示 (コンボ1とする) 子フォームに入力用の案内履歴をサブフォームで表示させます。 子フォームのプロパティで親フィールドコンボ1と手入力 子フィールドを案内履歴の中の業者フィールド(txt_業者とする)の名前を手入力。 ここで一旦親子のフォームを保存します。(フォーム1とする) 再びフォーム1を開き、子フォームのtxt_業者フィールドの規定値を =[Forms]![フォーム1]![コンボ1] とインプットすれば、フォーム1、コンボ1で選択した業者名が自動入力されます。 担当者+業者の場合は、簡単な方法がどれかすぐに思いつきません。 クエリだけで作成出来るか↑と同じ方法で親子関係を3階層にする事で 解決出来るかもしれませんが、VBAでDAOかADOを使用する事がが必要かも・・。 少し考えてみます。

参考URL:
http://www.btvm.ne.jp/~toyumi/foumu.html
回答No.1

こんにちは。 ごめんなさい。いまいち意図されているリレーションシップの 親子関係が判りませんでした。 A:業者 あり / 担当者 あり   B:業者 なし / 担当者 あり C:業者 あり / 担当者 なし D:業者 なし / 担当者 なし という4パターンが存在しうるということでしょうか。 または、A or C と言う形で必ず業者はありになるのでしょうか? A or C しか存在しない場合は、業者と担当者を紐つけたクエリを作成して クエリ結果をフォーム案内履歴の中にリストとして テーブルギョウシャメイカタカナ : テーブルタントウシャカタカカナと 2列表示させるのがいいと思うのですが・・。

NYAN-ta
質問者

補足

 ありがとうございます。できました。  A or C と言う形で必ず業者はあります。クエリを使って実現させればよかったのですね、早速試してみました。  成功です。これで5時間考えていたので助かりました。  もうひとつの問題点の、**から** ”業者数は500社ぐらい” のヒントもいただけないでしょうか。  できれば **フォーム業者、からフォーム案内履歴をコマンドボタンを使って開くと(ギョウシャメイカタカナ)を入力して、フォーム担当者からフォーム案内履歴を開くと(ギョウシャメイカタカナ)と(タントウシャメイカタカナ)を入力しようと思っています。**  の入力をフォームが開いたときにカレントレコードの(ギョウシャメイカタカナ)と(タントウシャメイカタカナ)を自動入力させたいのです。  かさねがさねすいませんが、アドバイスよろしくお願いいたします。

関連するQ&A

  • Access2000のリレーションシップのエラーについて

    どのくらい説明すればいいのかわからないのですが、アクセス2000でリレーションシップの設定をするときに、 「主テーブルで参照されているフィールド用の固有インデックスがありません。」 というエラーメッセージが出てきてリレーションを作る事が出来ません。 問題なのは3つのテーブルのリレーションなのですが、それぞれのインデックスをチェックすればいいのだとは思いますが、対象となったフィールドは主キーではないので、重複は許可していますが、一応どちらもインデックスは作成しています。 どのようなリレーションシップかというと、業者テーブルと商品テーブルと販売履歴テーブルのリレーションで、 商品テーブルの業者IDと業者テーブルのIDのリレーション→左内部結合(商品テーブルの全フィールドに入れる) 業者テーブルの業者IDと販売履歴の業者IDのリレーション→右内部結合 は出来るのですが、商品テーブルの商品名と値段フィールドと、販売履歴の対応する部分についてのリレーションについてもたせようとするとエラーが出てしまいます。このようなリレーションはいらないのでしょうか? どちらも固有の値でない量のリレーションだからなのでしょうか? この二つのフィールドの参照整合性をどう保てばいいのか教えて下さい。

  • アクセス2003 テーブルの設計について

    工事管理システムを作成しています。 月ごとの担当者ごとの今月売上金額や今月粗利金額を手入力で テーブルに保存(格納)しておきたいのですが、テーブルの設計が分からず困っています。。 ■今月販売テーブル [フィールド名] 年月 担当者名 今月売上金額 今月粗利金額 年月には[2013/10][2013/11]・・・と年月を入力して準備しています。 複数の担当者がいるために担当者名を入力して準備すると [2013/10 田中][2013/10 山田]・・・・とひと月×担当者の人数が必要になります。 また、担当者が増えた場合に手間が発生してしまいます。 元々の考え方が間違っていると思いますので、アドバイスをいただけたらありがたいです。 「今月販売」フォームで入力したい年月と担当者名を選択して入力出来ないかと考えています。

  • 私が考えたAccessのテーブル設計に問題がないか教えてください。

    Access2003を使用しています。 前任者が作成したデータベースに修正を加えています。 顧客からの問合せを記録しているT対応履歴という名のテーブルがあります。 対応履歴ID・・・主キー(オートナンバー型) 顧客No 顧客名 商品番号 問合せ区分 問合日 完了日 弊社担当者 内容 原因 対応 備考 などがあります。 その中に修理料金が発生し、修理を依頼した取引先との記録も残すフィールドを加えました。 でも、これは1レコードにつき全て発生するというわけではなくて、どちらかと言えばまれです。 内容としては、次のものがメインになります。 数量 実施日 請求日 支払日 入金確認日 取引先ID・・・取引先テーブルとつながっているため必要 テーブルの設計をするのがはじめての頃だったので、対応履歴の中に加えてしまいました。 別々のテーブルにわけることも考えたのですが、フォームやレポートのリンクがうまくいかなかったので結局一緒にしてしまいました。 やはりこのような場合は、テーブルをわけたほうがよかったのでしょうか? そのように思うのですが、設計の自信がないため確認させていただきたいのです。 今のところ、その料金が発生した場合のデータは10件ほどです。 今からでも、テーブルをわけたほうがよいのでしょうか? 2ヵ月後ぐらいには料金が発生するような事例が増えると言われています。 直すなら今のうちだと思っています。 設計にお詳しい方、どうぞよきアドバイスをいただけないでしょうか? よろしくお願いいたします。

  • ACCESS フォーム設計

    ACCESS2003を使用して、基本情報と明細のテーブルとフォーム設計をしています。基本テーブルに担当者IDと氏名があり、明細テーブルにも担当者IDと氏名があります。明細のフォームで、担当者IDを入力したら、基本情報にある担当者名を自動表示し、明細テーブルに書き込みたいのですが、=DLookup("[氏名]", "[基本情報]", "[担当者ID] = " & Forms("明細")("[担当者ID]")) を指定しても、うまく動作しません。明細フォームの氏名のコントロールソースを空白にしても、テーブルとリンクしてもだめです。 又、明細の更新フォームとして、担当者IDを入力したら、該当レコードの内容を全て表示し、変更内容を入力後、同一主キーでUPDATEモードで書き込む方法も教えてください。

  • Access フォームから複数テーブルの入力は?

    フィールドが300ぐらいあるので項目ごとにテーブルで分けています。 1つにまとめるクエリを作成して、そのクエリを元にフォームを作成しました。 テーブルはフィールド名:品番で1対1のリレーションを組んでいます。 テーブル:商品カラー  ・フィールド:品番  ・フィールド:カラー テーブル:商品サイズ  フィールド:品番  フィールド:サイズ クエリのフィールド  フィールド名:品番 (商品カラーのフィールド:品番を指定)  フィールド名:カラー (商品カラーのフィールド:カラーを指定)  フィールド名:サイズ (商品サイズのフィールド:サイズを指定) この場合、品番をフォームから入力すると商品カラーの品番のみ入力されます。 商品カラーと商品サイズの品番を同時にファームから入力は出来ないでしょうか? 現在は10テーブルありますが1つのテーブルにまとめたほうがいのでしょうか?

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • Access マスターテーブル

    Accessについて。 テーブル1がID(主キー)、注文日、商品番号、納期など入力欄の項目で、テーブル2が商品番号(主キー)、商品名で商品のマスターテーブルになっています。 商品番号を入力すれば商品名が表示されるようにクエリを作成し、そのクエリからフォームを作っています。 ここまでは良いのですが、新しい商品番号を入力したときに限りフォームから商品名も入力する事でマスターテーブルに登録されるようにしたいのですが、どうすれば良いでしょうか?

  • Accessのフォームとテーブルについて教えてください。

    Access2003を使用しています。 既存のフォームAにフィールド3個を増やしました。 フォームAはテーブル(1)と連動していました。 追加したフィールドはテーブル(6)のものです。 ところがフォーム上で追加フィールドに入力が出来なくなりました。3フィールドのうち、ひとつはコンボボックスです。表示はされますが確定ができません。 フォームAのSQLステートメントではテーブル(1)・(6)以外にテーブル(2)・(3)・(4)・(5)が結合されています。 フォームAからするとテーブル(2)・(3)・(4)・(5)のデータはIDの名称を見るための参照用です。 テーブル(6)は、追加フィールドのコンボボックスが参照用で、他の2追加フィールドは、フォームから入力してテーブル(6)に反映させたいものです。 テーブル(6)の画面では入力できます。 フォーム上からは入力できません。 設定が何か欠けているからでしょうか? 他の質問では2つのテーブルをひとつのフォームにする場合は、クエリを別に設けた方がいいとなっています。フォームが出来上がっているので、できればクエリを設けずに行いたいのですが、よくない方法でしょうか? 手順なども踏まえて教えていただけると助かります。 よろしくお願いいたします。

  • access検索フォームからメイン、サブフォームへ

    access初心者です。 先日、「メイン、サブフォームの入力」について質問した者です。 取引先の会社情報を管理するために、access2007で顧客管理を作成しています。 現在、取引先本社情報とその支店情報を新規登録及び既存顧客を編集するフォーム「会社登録フォーム」と「会社検索フォーム」を主にVBAで作成しています。 <実現したいこと>: 既存顧客を編集する場合は「会社検索フォーム」から抽出し、「選択」ボタンで会社情報を「会社登録フォーム」に呼び出し、本社及びその支店情報を編集する。 <困っていること>: 「会社検索フォーム」から顧客を選択後、「会社登録フォーム」では、支店情報は変わりますが、本社情報が変わりません。 (メッセージ:「リレーションシップが設定されたレコードがテーブル'支店テーブル'にあるので、 レコードの削除や変更を行うことはできません。」というメッセージがでます。) <会社登録フォームの環境>: 会社の本社情報をメインフォーム、その会社の支店情報をサブフォームに、単票形式のタブコントロールで複数画面にして、支店ごとに分けて入力できる登録フォームを作成しています。 本社テーブルの会社IDを主キーに、支店テーブルの支店IDを主キーにしてリレーションシップを設定し、クエリ「Q_本社支店」というテーブルを作成しています。 <会社検索フォームの環境>: ・「Q_本社支店」テーブルを元に「会社検索フォーム」を作成しています。 ・「会社名」「支店名」等で検索し、データシートで表示します。 ・ 抽出されたレコードの「選択」ボタンで、「会社ID」を「会社登録フォーム」の本社情報の「会社ID」に代入します。 色々調べてやってはみたのですが、上手くいきません。 行き詰まり感があり、困っております。 ご教授のほどよろしくお願いいたします。

  • ACCESSでテーブルでの自動入力

    ACCESS 2007を使っています。 SQLとかは分かりません。(貼り付けとかも、そもそもどこに貼り付けるのかもよく分かりません) 得意先(100件)を、営業担当者(5人)にそれぞれに割り振ります。 得意先テーブル(得意先ID、名前、住所、担当者ID、営業担当者名)(とりあえずは、営業担当者名だけは空白) 営業担当者テーブル(担当者ID、営業担当者名)を 作成します。 クエリのほうで、以下の二つのテーブルの以下の要素を合体させたものを作ります。 得意先テーブルの(得意先ID、名前、住所、担当者ID) 営業担当者テーブルから(営業担当者名) すると、 得意先クエリ(得意先ID、名前、住所、担当者ID、営業担当者名)まで入ったもの、がつくれます。このクエリは、得意先ID、担当者ID両方がきちんと入力された項目のみがリストアップされます。 それで、以下疑問点なのですが、 ・基本的に、得意先の情報を新規で入力していく際は、この得意先クエリをベースに作成された、得意先フォームから入力していくというのが一般的なのでしょうか。 (テーブル自体に、上記の得意先テーブルに、得意先名まで入ったものを作成することは普通は、しないのでしょうか。入っていた方が何かと便利かと思うのですが、そういった用途には、クエリを基にしたフォームを使うものなのか。あくまでテーブルはデータの保管場所と考え、クエリを使用上の入出力の基本窓口にすべきなのでしょうか) ・現段階で、上記の得意先テーブルで、担当者IDが入力されていないものが多数あるのですが、(エクセルで取り込んだデータ)、この得意先クエリでは、それらは表示されません。そうすると、得意先テーブルから入力していく必要があります。その場合は、得意先テーブル自体か、そこから作られたフォームに、担当者ID(実際にはこれが、代理店IDで、結構多数あるのですが)、を入力していく形になるかと思います。この場合、得意先テーブルだけをベースとしたクエリやフォームをつくり、担当者IDの入力を(入力しやすい形、自動的に選択できるなど)にして、入力をとりあえず終えきるというのは基本でしょうか。 とりとめもない質問になってしまいましたが、よろしくおねがいします。 基本的な考え方など分かればと思います。

専門家に質問してみよう