• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESSでのテーブル設計と検索)

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

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

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

  • ベストアンサー
回答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社ぐらい” のヒントもいただけないでしょうか。  できれば **フォーム業者、からフォーム案内履歴をコマンドボタンを使って開くと(ギョウシャメイカタカナ)を入力して、フォーム担当者からフォーム案内履歴を開くと(ギョウシャメイカタカナ)と(タントウシャメイカタカナ)を入力しようと思っています。**  の入力をフォームが開いたときにカレントレコードの(ギョウシャメイカタカナ)と(タントウシャメイカタカナ)を自動入力させたいのです。  かさねがさねすいませんが、アドバイスよろしくお願いいたします。