Microsoft Access 掲示板

クエリにおいてテーブルの元データが反映されない

7 コメント
views
4 フォロー

お世話になっております。
表題の件について質問します。

テーブルA
社員番号:数値型
氏名:テキスト型
テキスト型データ1
テキスト型データ2
    ・
    ・
    ・

テーブルB
社員番号:数値型
テキスト型データ3
テキスト型データ4
    ・
    ・
    ・

というテーブルがあります。
テーブルAの社員番号とテーブルBの社員番号を結合しクエリCを作りました。
クエリC
社員番号:テーブルA
氏名:テーブルA
テキスト型データ1:テーブルA
テキスト型データ4:テーブルB

テーブルAで新しく社員番号を追加したときクエリCでも自動でテーブルAにある新しい社員番号を表示させたいのですが反映されません。
調べるとテーブルAとテーブルBの両方に同じ社員番号がないと反映されないと書いてありました。
この時テーブルAに社員番号を追加するだけでクエリCにも社員番号が反映され、テーブルBにも反映されるようにはできないのでしょうか?

初歩的な質問で申し訳ありませんが宜しくお願い致します。

おにこ
作成: 2021/07/02 (金) 14:19:09
通報 ...
1
りんご 2021/07/02 (金) 20:37:35 c564b@0e907

 まず、ゼロから始める場合、テーブルBを削除して、テーブルAにテキスト型データ3、テキスト型データ4のフィールドを追加するのが、セオリーだと思います。何か出来ない理由がありますか?
 次に、社員番号に主キーを設定するのが、セオリーだと思いますが、構いませんか?社員番号何番のデータ1を見せてって言われて、あれっどっちのデータ1だっけと迷ったり、追加情報があれば1つに絞れるんですが、という事が禁止されます。先輩後輩だから、同じ社員番号をシェアする、なんて事も禁止されます。先輩が新しい社員番号を貰い、後輩は古い社員番号を譲り受ける、なんて事も禁止されます。

2
りんご 2021/07/02 (金) 20:44:20 c564b@0e907 >> 1

気付くの遅れましたが、テキスト型データ1、テキスト型データ2の属性を持つ社員と持たない社員がいるから、テーブルを分けていると言う事でしょうか?

3
おにこ 2021/07/05 (月) 10:59:14 3e392@b524f

りんご様
回答ありがとうございます。
テーブルAは社員のマスタとして保存しています。
そしてそのマスタを使い別のデータを作りたいのです。
なのでテーブルAで使うデータは社員番号と名前と部署で、テーブルBでは社員の通勤手段や交通費などを管理するデータを使いたいのです。
テーブルBのデータをAに入れてしまうとマスタではなくなってしまうのでテーブルを分けています。
AとBで質問のようにクエリをつくるとAで社員を追加してもBには反映がされずに困っています。

テーブルAの社員番号には主キーを設定しています。

上記の説明で大丈夫でしょうか?
稚拙な文章となり申し訳ありませんが宜しくお願い致します。

5
りんご 2021/07/05 (月) 13:24:11 c564b@0e907 >> 3

 私の回答はフォームとVBAを使う方法です。
 まず、テーブルAの社員番号とテーブルBの社員番号について準備します。テーブルを開いて、それぞれに主キーを設定します。次に、クエリCを開いて、社員番号フィールド同士を結合します。クエリCを実行した時に、それぞれの社員番号フィールドがその他のフィールドと一緒に表示されるようにしておきます。
 クエリCをもとにフォームを作成すると、テキストボックスが自動作成されるので、テーブルAの社員番号がコントロールソースになっているものを選択します。デザインタブのプロパティシートをクリック、イベント項目の更新後処理をクリック、コードビルダーを開きコードを記します。

Me.テーブルB_社員番号 = Me.テーブルA_社員番号

 これで、おそらく希望に答えられたのではないかと思います。
 主キー同士を結合したので、クエリCを開いて、テーブルAの社員番号とテキスト型データ4を新規入力すれば、テーブルBの社員番号が自動登録出来るようになったと思います。しかし、社員番号が新規入力、データ4が未入力の状態で終了すると、自動登録されないと思います。うっかりすると、テーブルBの社員番号がテーブルAの社員番号に自動変更されたりすることもありそうです。だんだん何かおかしいデータベースになっていくでしょう。

テーブルAは社員のマスタとして保存しています。テーブルBのデータをAに入れてしまうとマスタではなくなってしまうのでテーブルを分けています。
 私もマスターテーブルとそれ以外のテーブルで分けていた事があります。オリンピックの選手・競技・運営スタッフ・観客を思い浮かべて、テーブルを用意するみたいな事もやっていました。最近は、関数従属性に従うようにしていますが、昔の癖が邪魔して大変です。
 色々書いてきましたが、私の回答より、Hatenaさんの回答がとても参考になります。いろいろググって見つける情報がまとまっていてオススメです。

4

テーブルAのデータとテーブルBのデータは一対一の関係でしょうか。

だとしたら、下記が参考になると思います。

一対一関係のテーブル設計 - hatena chips

一対多の関係なら、テーブルAをメインフォームとして、テーブルBをサブフォームとして埋め込む設計にするといいでしょう。

7

上記の補足説明をしておきます。

なのでテーブルAで使うデータは社員番号と名前と部署で、テーブルBでは社員の通勤手段や交通費などを管理するデータを使いたいのです。
テーブルAは社員のマスタとして保存しています。テーブルBのデータをAに入れてしまうとマスタではなくなってしまうのでテーブルを分けています。

社員の通勤手段や交通費などのデータが一人の社員に対して1レコードのデータでいいのなら、一対一の関係になります。この場合、データベース的にはテーブルを分けるのはメリットがないです。扱いが面倒になるだけです。
マスターがどうとか、何を基準にしているか分かりませんが、データベース的には、一対一の関係なら、名前や部署と交通手段、交通費に差はありません。
必要に応じてクエリで表示するフィールドを選択して管理すればOKです。
例えば、通勤関係のデータを管理する場合は、社員番号、名前、通勤手段、交通費・・・ を表示するクエリを作成します。
どうしても分けたいということなら、上記のリンク先のように外部結合のクエリを作成して、参照整合性、連鎖更新等を設定しておけば一つのテーブルのように扱うことができます。ただ、特別な理由がないのならメリットはないと思います。


一人の社員に対して、複数のレコードが必用(例えば過去のデータを履歴として残しておきたいというような場合)なら、一対多の関係になります。その場合は、メイン/サブフォーム形式にするのがシンプルでいいでしょう。もし、こちらの場合は、その旨を申し出てくれれば、もう少し詳細に解説します。

6
りんご 2021/07/05 (月) 13:43:47 c564b@0e907

 後半部を訂正させて下さい。
 実はクエリC上で、テーブルAの社員番号とテキスト型データ4を新規入力すると、テーブルBの社員番号が自動登録されるようになりました。しかし、社員番号が新規入力、データ4が未入力の状態で終了すると、自動登録されないので、フォーム上で登録するほうが無難です。

テーブルAは社員のマスタとして保存しています。テーブルBのデータをAに入れてしまうとマスタではなくなってしまうのでテーブルを分けています。

 私もマスターテーブルとそれ以外のテーブルで分けていた事があります。オリンピックの選手・競技・運営スタッフ・観客を思い浮かべて、テーブルを用意するみたいな事もやっていました。最近は、関数従属性に従うようにしていますが、昔の癖が邪魔して大変です。
 色々書いてきましたが、私の回答より、Hatenaさんの回答がとても参考になります。情報がまとまっていてオススメです。