Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Access 2016)
DB投入時、複数回答を1レコードに収める方法はありませんか?
投稿日時: 20/06/27 09:52:43
投稿者: rodemasu

こんばんわ、rodemasuです。
たびたびすいません。
  
続けているうちに、また詰まってしまいました・・・
  
前回の続き&その前の質問の続きの複合になってしまい申し訳ないのですが、
  
[申込者取得資格検定情報]
----------------------------------------------------
FK 申込者ID 長整数型
FK 資格検定ID 長整数型
FK 漢検検定等級ID 長整数型
FK 英検検定等級ID 長整数型
FK 簿記検定等級ID 長整数型
----------------------------------------------------
  
例えばこれで、漢検を持っている人に対して、10個の質問の中から当てはまるものを選びなさいという質問が来たとします。(英検・簿記も同様、ただし、それぞれの検定によって回答内容は異なります)
  
わたしは、これで以下のようなテーブルを変更しました。
  
[申込者取得資格検定情報]
----------------------------------------------------
FK 申込者ID 長整数型
FK 資格検定ID 長整数型
FK 漢検検定等級ID 長整数型
FK 英検検定等級ID 長整数型
FK 簿記検定等級ID 長整数型
FK 漢検回答ID   長整数型
FK 英検回答ID   長整数型
FK 簿記回答ID   長整数型
----------------------------------------------------
  
[漢検回答]
----------------------------------------------------
PK 漢検回答ID 長整数型
  回答    テキスト型
----------------------------------------------------
  
[英検回答]
----------------------------------------------------
PK 英検回答ID 長整数型
  回答    テキスト型
----------------------------------------------------
  
[簿記回答]
----------------------------------------------------
PK 簿記回答ID 長整数型
  回答    テキスト型
----------------------------------------------------
  
しかし、この手法だと、例として挙げるなら
  
FK 漢検回答ID 長整数型
  
フィールドには1つの回答しか入りません。
やり方としては、10個の質問があるなら、
 
----------------------------------------------------
PK 簿記回答ID 長整数型
  質問1フィールド Boolean型
  質問2フィールド Boolean型



----------------------------------------------------
 
といった形にして、それぞれフラグをたてるようにしないとできないのかなと思っています(おそらく)
ここのような場合、1レコードに複数の回答(例えば、回答は1.2.4.9とか)を入れて、クエリで分割して表示できないのでしょうか?
  
何度も質問して・・・なにとぞお願い申し上げます。

投稿日時: 20/06/28 01:22:32
投稿者: rodemasu

こんばんわ、rodemasuです。
 
このスレの本来の質問とは異なってしまって恐縮なのですが、複合キーがいくつかのテーブルの主キーにまたがることはできないのでしょうか。
 
「M1」親テーブル(であってるかな?)のフィールド1・2・3には
 

 PK
1 1 A
1 2 B
1 3 C
1 4 D

 
という数字とデータが入っており、この1・2つのフィールドを主キーにして複合キーを作っています。
 
この場合、このPKを用いて、
「M2」子テーブルでは
 
 
      FK 
山田さん 1 1 
加藤さん 1 3
佐藤さん 1 1

 
になっています。
ではまた別の親テーブル「M3」テーブルがあるとします。
 

 PK
2 1 E
2 2 F
2 3 G

 
とあった場合、M1−M2データベース間のリレーショナルを切った後、さらにM1−M3テーブルとリレーショナルを組もうとすると整合性エラーではじかれてしまします。
 
私は「M1」テーブルと「M3」では完全に主キーがユニークなはずなのになぜだろうと首をかしげています。
 
「M2」テーブルを以下の様に設定したい意味です。
 
      FK 
山田さん 1 1 
加藤さん 1 3
佐藤さん 1 1
田中さん 2 1
伊藤さん 2 3

にしたいと思っています。
 
こうすれば、クエリで
山田さん=A
加藤さん=C
田中さん=E
と取得できると思っていました。
 
ちなみに整合性チェックを入れなければ動操作して、クエリでもデータを取得できるのですが、きちんとした動作ではないですよね・・・。

回答
投稿日時: 20/06/29 09:10:26
投稿者: sk

引用:
DB投入時、複数回答を1レコードに収める方法はありませんか?

回答させていただく前に、一つ確認しておきたいことがあります。
 
もしかして、各テーブルのデータシートビューをそのまま、
そのシステムにおける入力画面(インターフェース)として
使用しようとしていないでしょうか。

投稿日時: 20/06/29 10:50:08
投稿者: rodemasu

こんにちわ、rodemasuです。

引用:

もしかして、各テーブルのデータシートビューをそのまま、
そのシステムにおける入力画面(インターフェース)として
使用しようとしていないでしょうか。

 
すいません、おっしゃる通りです。
今行っている手法は
 
デザインビューでフィールドを作る
⇒データシートビューでレコードにデータを入れていく
⇒テーブル同士のつながりをリレーショナルの画面で設定・確認する。
 
というの3つの工程で行っているだけです。
根本的に間違っていたのでしょうか・・・><
アクセスの機能すらまだよく把握できていなくて申し訳ございません。

回答
投稿日時: 20/06/29 11:31:43
投稿者: sk

引用:
デザインビューでフィールドを作る
⇒データシートビューでレコードにデータを入れていく
⇒テーブル同士のつながりをリレーショナルの画面で設定・確認する。

リレーショナルデータベースにおけるテーブルというのは
いわば「構造的なデータ(レコード)を保存するための器」であって、
その器にレコードを入れたり、入れたレコードを取り出したりするための
インターフェースは別に作成するのです。
 
Access の場合であれば、データ入力用のインターフェースに
当たるのが「フォーム」、帳票出力用のインターフェースに
当たるのが「レポート」です。
 
恐らく rodemasu さんの場合、Excel の延長のような形で
テーブルというものを認識していらっしゃるようですが、
そもそもそれが誤りです。
 
とりあえず rodemasu さんが目指されるべきなのは、
正しく正規化されたテーブルを元に、
以下のようなフォームを作成することでしょう。
 
https://twitter.com/sk_exe/status/1277427175952547840

回答
投稿日時: 20/06/30 16:24:04
投稿者: sk

ツイッターの方に返信をいただいたようなので、
こちらでまとめて回答させていただきます。
 

引用:
フォーム入力はマスターテーブルの値まで書き替えてしまうのでしょうか?

それが Access における「連結フォーム」や「連結コントロール」の機能です。
 
引用:
この状態で、「Fさんは漢検1級を持っている」でも編集できるのは、
この「何の資格を持っているか?」の部分だけだと思っていたのですが、

その部分の情報に当たるのは、[申込者基本情報]ではなく
[申込者取得資格検定情報]のレコードです。
 
メインフォームのレコードソースが[申込者基本情報]、
サブフォームのレコードソースが[申込者取得資格検定情報]なら、
前者のテーブルのレコードの追加/変更/削除は
メインフォームに対する編集操作によって、
後者のテーブルのレコードの追加/変更/削除は
サブフォームに対する編集操作によって実現されます
 
また、メインフォームとサブフォームが[申込者ID]同士でリンクしている場合、
サブフォームは次のような動作を示します。
 
・[申込者ID]の値が、メインフォームのカレントレコードの
 [申込者ID]の値と同じである[申込者取得資格検定情報]の
 レコードを表示する。
 
・新規レコードの[申込者ID]の既定値は、メインフォームの
 カレントレコードの[申込者ID]と同じ値になる。
 (サブフォームの[申込者ID]の値が自動的に入力される)
 
つまり、「Fさんは漢検1級を持っている」という情報を登録したければ、
メインフォーム上に「 F さんの([申込者ID]が 6 である)基本情報」が
表示されている状態で、そのサブフォームの新規レコードに対して
「( F さんが)漢検1級を取得していることを示す記録」を
入力する操作を行なえばよいのです。
 
F さんが漢検1級の他に英検1級も取得されているなら、
同様に「英検1級を取得していることを示す記録」を
サブフォームの新規レコードとして追加します。
 
引用:
「Fさん」を「Gさん」に変更すると

引用:
マスタテーブルの「Fさん」が「Gさん」に書き換わってしまいます。

メインフォームのカレントレコードの[氏名](をコントロールソースとする
連結テキストボックス)の値を書き換えれば、メインフォームと
連結している[申込者基本情報]のレコードの[氏名]の値も書き換わります。
 
例えば「間違った名前を入力してしまった」とか
「本人から氏名変更願の届け出があった」とかいった場合に、
メインフォーム上の[氏名]に対する編集操作を行なうことになります。
 
引用:
これは、「プロパティシート」にあるそれぞれのオブジェクトに対する
「編集ロック」をかけて対処するしかないのでしょうか。

「メインフォーム上の連結コントロールの値をユーザーに編集させない」
といった画面仕様が決まっているならば、そういう選択肢もあるでしょう。
 
しかし、恐らくまだその辺りのことも決まっていない状況なのではないでしょうか。
 
なお、私が例示したようなレイアウトのフォームは、
履歴書のようなレイアウトの申請書類を見ながら、
1 つの画面を使ってデータ入力を行なう」ということを
想定したものです。
 
・1 枚の履歴書において、氏名や生年月日、住所といった
 個人に関わる基本的な情報を記入する欄は必ず 1 つずつである。
 
・同じ履歴書の中に、その人が取得した資格や検定に関する情報
 (取得した時期、資格/検定の名称)を記入する欄が
 複数行設けられている。
 
・実際に何行分の情報が記入されるか、それぞれの行に
 どんな資格、検定が記入されるかは人によって異なる
 
・ありとあらゆる資格/検定を対象とする場合、1 人の人間に
 取得できる資格/検定の数には上限はなく、また漢検、英検、
 簿記以外の資格や検定が記入されるケースをも想定して
 おかなければならない。
 
いずれにしても、重要なのは「テーブル(データの器)の構造」と
「フォーム(入力画面)のレイアウト」を全く同じものとして
捉えてはいけない、ということです。

投稿日時: 20/07/02 20:18:31
投稿者: rodemasu

こんばんわ、ろでますです。
各方面から色々とアドバイスをいただきまして、フォーム入力の部分は解決いたしました。
 
以降がかなりややこしそうなので、いったんこれはここで閉じさせていただきます。