Access (一般機能)

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

 
(Windows 10 Home : Access 2016)
255を超えるフィールド数への対処
投稿日時: 17/12/19 17:27:34
投稿者: lucid

引用:
各項目がアンケートの設問だとしたら、フィールドして横に展開するのではなく、下記のように縦に並ぶように設定するのがデータベースの設計原則(正規化)に沿っていると思います。
設問番号 設問名 設問内容
1    設問1  あなたの好きな動物は?
2    設問2  あなたの好きな果物は?
3    設問3  あなたの好きなスイーツは?
・    ・    ・・・・
・    ・    ・・・・

 
先日いただいたアドバイスで、フィールド数が多い場合、上記のように縦にデータを並べるのが良いと教えていただきました。ただ、このようにした場合、解答をどのように保存すれば良いのかがわかりませんでした。
上記例で、たとえば
山田さん 犬 りんご アイスクリーム
田中さん 猫 みかん 杏仁豆腐
鈴木さん 鳥 バナナ クレープ
のような解答を保存したい場合には、どのようなテーブルを用意してあげれば良いのでしょうか。
解答を保存するテーブルやリレーションの作り方など教えていただけないでしょうか。

回答
投稿日時: 17/12/19 18:13:25
投稿者: hatena
投稿者のウェブサイトに移動

前回の回答のテーブルを「T_設問」として、
他に下記のようなテーブルを用意します。
 
T_回答者

回答者ID 氏名 ・・・必用に応じて、回答者情報のフィールドを追加
1    山田
2    田中
3    鈴木

T_回答
回答者ID 設問番号 回答
1      1   犬
1      2   りんご
1      3   アイスクリーム
2      1   猫
2      2   みかん
2      3   杏仁豆腐
・・・・

リレーションシップの設定で、各テーブルを同じフィールド名同士で結合しておきます。
 
回答の入力フォームの設計は、また、こつなどが必用になりますので、とりあえずは上記のテーブルを作製してみてください。
 
それができから、どのような形式で回答者に回答を入力させるか検討します。
例えば、最初に回答者名を選択して、一問ずつ回答にするのか、一覧で回答するかなど、
ご希望の入力方法を検討ください。
 
 

投稿日時: 17/12/20 10:09:03
投稿者: lucid

hatenaさん
返信ありがとうございます。テーブルとリレーションシップを準備しました。
希望の入力方法は下記のようなものです。
 
1.回答者名をテキストボックスに入力してコマンドボタンを押す
2.設問を一覧で表示(20〜30問程度)
3.回答
4.次の設問一覧にタブコントロールで移動
5.2〜4を繰り返す
6.完了
 
※山田さんで入力を完了した後、もう一度山田さんで回答した場合、この2者は別人として扱う。
以上のような条件です。よろしくお願いいたします。

回答
投稿日時: 17/12/20 10:38:37
投稿者: hatena
投稿者のウェブサイトに移動

lucid さんの引用:

1.回答者名をテキストボックスに入力してコマンドボタンを押す
2.設問を一覧で表示(20〜30問程度)
3.回答
4.次の設問一覧にタブコントロールで移動
5.2〜4を繰り返す
6.完了
 
※山田さんで入力を完了した後、もう一度山田さんで回答した場合、この2者は別人として扱う。
以上のような条件です。よろしくお願いいたします。

もう一つ、確認ですが、
回答者が直接フォームに入力するのか、
記入されたアンケート用紙があり、それを見ながら、入力者がフォームに転記していくのか、
どちらですか。
 
 
lucid さんの引用:

※山田さんで入力を完了した後、もう一度山田さんで回答した場合、この2者は別人として扱う。
以上のような条件です。よろしくお願いいたします。

 
T_回答者 テーブルで、回答者IDが別になるようにしておけばいいでしょう。
 
回答者ID 氏名 ・・・必用に応じて、回答者情報のフィールドを追加
1    山田
2    田中
3    鈴木
4    山田
 
回答者IDはオートナンバー型にしておけば、新規レコードで自動採番されるので楽です。
 
ただ、同じ人が2度回答したのか、たまたま同姓同名だったのか、区別がつかなくなりますが、それ辺は大丈夫ですか。

投稿日時: 17/12/20 12:13:56
投稿者: lucid

引用:
回答者が直接フォームに入力するのか、
記入されたアンケート用紙があり、それを見ながら、入力者がフォームに転記していくのか、
どちらですか。

 
記入されたアンケート用紙を見ながら、入力者がフォームに転記していきます。
 
引用:
ただ、同じ人が2度回答したのか、たまたま同姓同名だったのか、区別がつかなくなりますが、それ辺は大丈夫ですか。

 
はい、今回は区別を付ける必要がないので大丈夫だと思います。

回答
投稿日時: 17/12/20 15:33:36
投稿者: hatena
投稿者のウェブサイトに移動

lucid さんの引用:
記入されたアンケート用紙を見ながら、入力者がフォームに転記していきます。

 
いろいろな設計があると思いますが、
自分が設計するならという一例を。
 
テーブル設計は前の回答で。
T_回答者の回答者IDはオートナンバー型にします。
 
T_回答者 をソースとする単票フォームを作成します。
回答者IDのテキストボックスの「タブストップ」は「いいえ」に設定します。
このフォームの名前を、F_回答入力 とします。
 
クエリを作成して、T_設問 と T_回答 を追加して、設問番号で結合します。
 
T_設問 から、設問名、設問内容フィールドを表示させます。
T_回答 から、設問番号、回答者ID、回答 を表示させます。
さらに、下記のフィールドを作成します。
 
フィールド ページ: ([設問番号]-1)/20
 
※20問毎に表示する場合、30問毎なら20を30に。
 
このクエリをソースとする帳票フォームを作成します。
フォーム上に配置するテキストボックスは、設問番号、設問内容、回答 の3つ。
「設問内容」は「編集ロック はい」「タブストップ いいえ」にしておく。
このフォームの名前を、F_回答入力_S とします。
 
「F_回答入力」上にオプショングループ「opページ」を配置して、そこにトグルボタンを必要ページ数分配置します。オプショングループは横長にして、トグルボタンを横に並べるようにするとそれらしくなります。
 
サブフォームコントロールを配置してプロパティを下記のように設定します。
ソースオブジェクト F_回答入力_S
リンク親フィールド 回答者ID;opページ
リンク子フィールド 回答者ID;ページ
名前 回答入力_S
 
これで取りあえず、
メインフォームで氏名を入力、サブフォームで、
設問番号、回答の順で入力できますが、
設問番号を入力するのは面倒だと思いますので、
メインフォームの「氏名」テキストボックスのこう更新後処理のイベントプロシージャを下記のように記述します。
 
Private Sub 氏名_AfterUpdate()
    If Me.回答入力_S.Form.Recordset.RecordCount = 0 Then
        CurrentDb.Execute _
            "INSERT INTO T_回答 ( 回答者ID, 設問番号 ) " & _
            "SELECT '" & Me.氏名 & "', 設問番号 FROM T_設問;", _
            dbFailOnError
        Me.回答入力_S.Requery
    End If
End Sub

 
これで、設問番号と設問内容がサブフォームに表示されて、回答だけ入力すればいいようになります。
「説問番号」の「タブストップ いいえ」に設定しておくといいでしょう。
 
「opページ」のトグルボタンでページの切り替えることができます。
 
以上です。実際にサンプルを作成して動作確認してないので、設定漏れがあるかもしれませんが、だいたい、このような構想でいけるはずです。

投稿日時: 17/12/21 11:00:07
投稿者: lucid

hatenaさん
 
詳細に解説していただきありがとうございます。
今作成しているところなのですが、F_回答入力フォームを開いたときに
パラメーターの入力 opページ
パラメーターの入力 ページ
というダイアログが出てしまいます。これはどのように回避すればいいのでしょうか。

回答
投稿日時: 17/12/22 02:24:10
投稿者: hatena
投稿者のウェブサイトに移動

lucid さんの引用:
今作成しているところなのですが、F_回答入力フォームを開いたときに
パラメーターの入力 opページ
パラメーターの入力 ページ
というダイアログが出てしまいます。これはどのように回避すればいいのでしょうか。

メインフォーム「F_回答入力」上のオプショングループの名前は、opページ になってますか。
また、サブフォーム「F_回答入力_S」のレコードソースのクエリに「ページ」というフィールドはありますか。
なければ、空いてるフィールド欄に、下記のように設定してください。
 
ページ: ([設問番号]-1)/20
 

投稿日時: 17/12/26 15:52:38
投稿者: lucid

引用:
メインフォーム「F_回答入力」上のオプショングループの名前は、opページ になってますか。

ありがとうございます。修正したところ「パラメーターの入力 opページ」は出なくなりました。
引用:
ページ: ([設問番号]-1)/20

については、
「指定されたフィールド'[設問番号]'がSQLステートメントのFROM句にある複数のテーブルを参照しました。」
というエラーが出たのでテーブルにT_回答を指定したのですが
「クエリ式 'T_回答.[([設問番号]-1)/20]' の不要な')'があります。」
となったため、
ページ: ([T_回答.設問番号]-1)/20
としました。
 
また、サブフォームで20問を一覧できるようにするため
F_回答入力_Sの規定のビューを単票フォームから帳票フォームに変更しました。
 
ページフィールドの値が0から始まる値だったので、トグルボタンのデータタブのオプション値を0から始まるよう修正しました。
opページのデータの既定値を0に変更しました。
 
ページフィールドの値が小数のままだとページ切り替えが効かないようでしたので
ページ: Int(([T_回答.設問番号]-1)/20)
として、ページフィールドの値が切り捨ての整数になるよう調整しました。
 
更新後処理のイベントプロシージャについては
"SELECT '" & Me.回答者ID & "', 設問番号 FROM T_設問;", _

とすることで無事帳票フォームに設問1〜20がセットされ、トグルボタンを押すことで設問21以降もセットされていることが確認できました。
 
フィールドを増やすのではなく、縦にならべていくやり方が少しわかったような気がします。
アドバイスしていただき、どうもありがとうございました。