こんにちわ、ろでますです。
M1テーブル(IDと氏名テーブル)-Rテーブル(M1のIDとM2のIDで構成されるテーブル)-M2テーブル(IDと資格が入ってテーブル)
という非常に簡単なリレーショナルデータベースをつくりました。
これで、メインフォームがM1テーブル、サブフォームがM2テーブルの帳票フォームを作れば、例えばM1テーブルの氏名に紐づいたM2テーブルのID1のAさんの資格情報は見れるようになりました。
しかし、このフォームでAさん資格情報を編集することができません。
なのに、メインフォーム上のAさんの名前を変更すると、M1のマスタテーブルは書き換わってしまいます。
私は、資格情報の書き換えはRテーブル上のデータが書き換わって、結果、Aさんの持つ資格情報は書き換わるものだとばかり思っていたのですが・・・。
また、メインフォーム上の「Aさん」などという名前は、リレーショナルのマスタとなっているテーブルのため、逆に編集できないものだと思っていました。
すいません、なぜこういう動きをするのか、どうすればよいのかをご教授願えませんか。
これで本当に各人物の資格情報を見れますか。見れないと思います。
メインもサブもマスターテーブルですので、それぞれのマスターテーブルのデータが表示されるだけです。
マスターテーブルと連結したフォームですので当然そうなります。
この場合、マスターテーブルは書き換えてはいけないので、フォームの設定で更新できないようにしておきます。
例えば、「レコードセット」プロパティを「スナップショット」に設定しておきます。
どの人物がどの資格を持っているかを格納しているテーブルはRテーブルですので、サブフォームのレコードソースはRテーブルにします。サブフォームのM2IDはコンボボックスにして、資格名を表示させるようにしておきます。
あるいは、下記の紹介した方法でIDと資格名の両方から選択できるようにしてもいいでしょう。
コードでも名称でも入力できるコンボボックス - hatena chips
サブフォームコントロールの「リンク親フィールド」と「リンク子フィールド」をM1のIDに設定すればご希望のメイン/サブフォームになります。
人物はメインフォームでレコード移動して切り替えます。あるいは、検索で目的の人物に移動してもいいでしょう。
別の方法として、メインフォームは非連結(レコードソースは空欄)にしておいて、M1を値集合ソースとするコンボボックスまたは、リストボックスを配置して、このコントロール名を「リンク親フィールド」に設定します。
これで、このコンボボックスかリストボックスで人物を選択するとその資格情報がサブフォームに表示されます。
非連結なので、マスターテーブルが更新されることはありません。
例えば、下記で紹介しているようなフォームです。人物の人数が多くても、トグルボタンで50音で絞り込めるので目的の人物に簡単にたどり着けます。
名簿管理フォームの設計 - hatena chips