①商品フォームから、仕入先の会社IDをコンボボックスで複数登録(現状2つ)できるようにしています。
※同じ商品を複数の会社が取り扱っていることがあるため、複数登録になります。
②このとき、各々の登録した会社フォームにも取扱商品情報として、サブフォームで商品名をリストで表示したいです。
(1)①の段階で、2つのフィールドにわかれているものを、1つのフィールドに合体した方が良いのかと思っているのですが、どうすればよいでしょうか…
(2)また、欲を言えば会社フォームのサブフォームから追加した商品情報について、該当の商品ページに企業を追加できますでしょうか…?
設計のヒントをいただけませんでしょうか。宜しくお願いいたします。
現状のテーブル名と、そこに含まれるフィールド名、主キーフィールド、を提示してもらえますか。
複数の選択肢に情報をつなげる方法 Microsoft Access 掲示板 - zawazawa
で提示されているテーブルと同じものかな?
だとしたら、データベース設計のセオリーとしては、正規化しましょう、ということになりますね。
正規化については、下記のページの「4.正規化」の項目を読んで学習してください。
もう一度学ぶMS-Access
具体的には下記のようにテーブルを分割します。
●T会社
会社ID 主キー
会社名
会社備考
・・・
●T商品
商品ID 主キー
商品名
単価
・・・
●T取扱商品
会社ID 主キー
商品ID 主キー
複数のフィールドに主キーを設定する方法は下記を参照。
複数のフィールドの組み合わせで重複がないようにする - hatena chips
リレーションシップで、同じ名前のフィールド同士結合しておきます。
リレーションシップの設定と効果 - もう一度学ぶMS-Access
T会社とT取扱商品を結合したクエリをレコードソースとする帳票フォームを作成します。
T商品をレコードソースとする単票フォームに、上記のフォームをサブフォームとして埋め込みます。
サブフォームのリンク親フィールド、リンク子フィールドは「会社ID」と設定します(リレーションシップの結合にあわせて自動で設定される場合もあり)
このフォームから、商品を見ながら、扱っている会社名のリストもサブフォームで見れます。また、サブフォームで取り扱い会社を追加することもできます。
逆に、
T商品とT取扱商品を結合したクエリをレコードソースとする帳票フォームを作成します。
T会社をレコードソースとする単票フォームに、上記のフォームをサブフォームとして埋め込みます。
サブフォームのリンク親フィールド、リンク子フィールドは「商品ID」と設定します。
このフォームからは、会社情報を見ながら、扱っている商品のリストもサブフォームで見れます。また、サブフォームで取り扱い商品を追加することもできます。
このような設計にしておけば、取り扱い商品や取り扱い会社の数に制限なくいくらでも追加できます。
仕事が休みに入って、まだ実践できていないのですが、くわしく教えていただきありがとうございます。
お陰様でイメージはできたので、作成するのが楽しみです。インデックスのことも勉強になりました。
教えていただいた方法で設計してみて、問題にぶつかりました。
今まで一対多の形でサブフォーム(データシートビュー)を活用したことしかなかったので気づかなかったのですが
多対多でサブフォームから登録する形にした場合、
①すでに登録しているものかどうかの判断が難しい
②すでに登録されている場合、正確に語句を統一して登録するのが難しい
という2つの問題があります。
解決法としてわたしに思いつくのは、
(1)両方のサブフォームに書き込み可能なコンボボックスを配置する。
もしくは
(2)片方には(商品情報フォームから仕入先を登録するとき)コンボボックスを複数置いて追加する。
もう片方は(仕入先フォームから商品)情報の閲覧のみで、追加ができないようにする。
(1)は得策とは思えないので、(2)になるかと思っているのですが、
それ以外に何か良い方法はありますでしょうか。
すみません。実際に作ってみて、もう1つ問題が発生しました。
サブフォームからデータを追加しようとすると
「レコードを追加できません。T取扱商品の結合キーがレコードセットにありません。」
というエラーが表示されます。
度々すみません。色々いじっていたら、会社フォームのサブフォームから商品データを追加することはできるようになりました。
商品フォームのサブフォームから会社データを追加しようとすると、
「LinkMasterField/リンク親フィールド プロパティ設定でエラーReturnに対応するGoSubがありません。が発生しました。」と出ます。
そのあと、「テーブルT商品にリレーションシップが設定されたレコードが必要なので、レコードの追加や変更はできません。」と出て、追加することができません。
ちなみに会社フォームはオートナンバーではないので、入力するときにコンボボックスで選択して会社IDを入力するような形にしています。
どのようなフォーム設計になっているのか、現状の情報からはよく分からないので、提示のテーブル構成の場合の一般的な設計のサンプルを作成しましたので、ダウンロードして参考にしてください。
案件管理どんぐり.zip
サンプルを見てもらえれば分かると思いますが、
会社情報登録フォーム(F会社)も商品情報登録フォーム(F商品)もサブフォームの項目はコンボボックスで選択するようになっています。コンボボックスは ID で選択しても 名称 を入力してもいいようにしています。(詳細は下記を参照)
コードでも名称でも入力できるコンボボックス - hatena chips
こうすれば、
の問題は解決できると思います。
なお、上記のサンプルには別件の質問のサンプルフォームを入ってます。
解決が難しい問題だとは思うのですが、ここ2ヶ月ほど悩まされており質問いたします。
上記教えていただいた「案件管理どんぐり」を参考に2つフォームを作って運用しているのですが
時々謎のエラー、「引数が無効です」に悩まされます。
色々いじってるとエラーが出なくなったり、同じ状況なのにまた出たりと
完全に謎のエラーです。2か月程ずっと色々試してきましたが、気まぐれなエラーです。
そして、「引数が無効です」と出ても結局選択値が反映されるので、まぁなんとか問題ない感じもするのですが
そのエラーのせいで、メインフォームのIDを引っ張ってこれず、また別のエラーになります。
手動でメインフォームのIDを記入すれば良いのですが、一般ユーザーにそれを求めるわけにもいかず
邪道ですっきりしないのですが、
①引数が無効ですのエラーを表示させない(on error なんとかで対応…?)
②コンボボックスを選択したら自動でメインフォームのIDを引っ張ってくる(コンボボックスの更新後処理で対応…?)
という処理をしようかと考えています・・・
でも気が重く・・・何か解決方法は思い当たりませんでしょうか。
解決方法に結び付く、確認方法などあれば何卒ご教示ください。
ちなみに「引数が無効です」エラーのことは何回も検索し、
xmlでテーブルをエクスポートしてインポートするなどは試しました。
バージョンは2016です。
なにとぞ、宜しくお願いいたします。
スミマセン。いじってたらまた正常に動くようになりました…
何回も繰り返しているので、またおかしくなるかもしれないのですが、とりあえず今日のところは解決しました😰
失礼しました…