Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Home : Access 2013)
大量のフィールド入力を簡略化したい
投稿日時: 18/09/16 02:47:45
投稿者: shinta9876

初めまして。よろしくお願いします。
 
今、アパートの部屋の装備品の状態が分かるリストを作成したいと思います。
 
部屋のタイプは1Kと2Kがあり、室名は1Kに台所と洋室、2Kに台所と洋室と和室、部屋装備品はキッチンにコンロと流し台、洋室にはエアコンとカーペット、和室には押し入れと畳があります。装備品の交換日付はそれぞれ違います。
 
テーブルに[部屋タイプ][部屋室名][部屋装備品][装備品交換日]を準備します。
 
リレーションシップを組むと、
 
[t_部屋タイプ]1←∞[t_部屋室名]1←∞[部屋装備品]1←∞[装備品交換日]・・・(1)
 
これで[部屋タイプ]のテーブルを開くと、順に、1Kおよび2Kの下に部屋名を充て、その下に部屋ごとの装備品を充て、その下に装備品ごとの交換日を充てることができると思います。
 
ところで、このアパートには1Kが101号室〜103号室、2Kには201号室〜203号室があります。
ここでテーブル[部屋番号]を準備すると
 
[t_部屋番号]∞→1[t_部屋タイプ]1←∞[t_部屋室名]1←∞[部屋装備品]1←∞[装備品交換日]・・・(2)
 
これでは[部屋タイプ]を開いたとき下につながるテーブルを[t_部屋番号]にするか[t_部屋タイプ]にするか確認画面が開き、部屋番号から(1)を紐づけることができません。
 
[t_部屋タイプ]1←∞[t_部屋番号]1←∞[t_部屋室名]1←∞[部屋装備品]1←∞[装備品交換日]・・・(3)
 
これでは、装備品交換日はともかくとして、部屋番号ごとに部屋室名、部屋装備品をを入力しなくてはならず、部屋番号が増えるほど、装備品が増えるほど、同じ繰り返し入力が延々と続きます。(要は掛け算だから?)また、入力ミスも誘発すると思います。
 
これを避けるためにはどうしたらいいのかわかりません。
繰り返し入力を避けたくて先ず(1)のリレーションシップを組んだのですが。。。。
 
どなたかご教授ください。よろしくお願いいたします。
 

回答
投稿日時: 18/09/16 22:50:05
投稿者: i-brown

そもそも、「リレーションシップ」は入力回数を削減する機能ではなく、「誤ったデータを入力しないように制限する」ための機能です。
「掛け算だから?」とお気づきのように「個別の装備品」に関しては1つ1つが実体を持っているので、「1行」が必要です。その装備品を識別するための「101号室の台所にあるコンロ」と言った部分を間違えないようにする機能がリレーションシップになります。
例えば「101号室の洋室にあるコンロ」は、リレーションシップが適切に設定されていれば入力を禁止することができます。
 
「直積」を使って個々の装備品の交換日付以外の列を作れば、1回目の入力は解決できるのですが、数が少なく、部屋数や装備品の数の増減が少ないようでしたら勉強するよりも直接手入力した方が時間的に早いと思います。

投稿日時: 18/09/17 10:54:35
投稿者: shinta9876

ご回答ありがとうございます。
 
>部屋数や装備品の数の増減が少ないよう
 
そこなんです。
実際に設計したいデーターベースでは、部屋タイプは5種類、部屋番号は100室以上、室名は最大6種類程度、装備品は各室名に対し最大10種類程度、管理したい装備品にはクロスなど頻繁に交換される物品も含まれています。末端の情報は更新日時だけではなく、例えば機種名、色など、装備品の管理のために必要な情報がたくさんあります。
 
掛け算(組み合わせ)とすれば、収納したいデータの枝が増えるほどその組み合わせは爆発的に増えていくことが予想され、気が重くなります。
 
すべての情報を一つのテーブルに書き込む方法も考えましたが、これではデータベースを活用するうえではあまり好ましくないように思えます。
 
例えば(1)は「繰り返される一つのまとまり」だと思うので、これを生かせないかなと。。。
 
-複写?何に何を?
-クエリで?結果は出力されるけれどもユニークコードがつけられない?
-(1)のデータを「一行」に直す???どうやって???
 
私に知識が無く、どうすればブレイクスルーできるかよくわからないのです。
 
>「直積」を使って個々の装備品の交換日付以外の列を作れば、1回目の入力は解決できる
>勉強
 
ご示唆いただいた内容はどのようなものなのでしょうか。
具体的にご教示いただければ幸いです。

回答
投稿日時: 18/09/17 13:00:31
投稿者: i-brown

> 部屋タイプは5種類、
> 部屋番号は100室以上
> 室名は最大6種類程度
> 装備品は各室名に対し最大10種類程度
> 管理したい装備品にはクロスなど頻繁に交換される物品も含まれています
> 末端の情報は更新日時だけではなく、例えば機種名、色など、装備品の管理のために必要な情報がたくさんあります。
 
問題を分けて考えると「末端の情報」には、「機種名、色、更新日時」が必要なのですが、
それらを区別するときにどのような呼び名で呼びますか?
例えば「101号室和室のカーテン」であれば、装備品を呼び分けるためのキー列は「部屋番号、部屋、装備品名」となります。(部屋名が決まれば部屋タイプは決まるので、装備品の識別に部屋タイプは不要)
 
自分で設計するなら、
「部屋番号、部屋名、装備品名、機種名、色、更新日時」のテーブル(A)を作って、データ更新は個々で行います。「部屋タイプ・部屋番号・室名」は別のテーブル(B)に登録し、必要に応じてAと結合します。
(同じ部屋に複数のカーテンがあるときの管理とかどうするのでしょうか? 「装備品タイプ」「連番」などに列を分割して管理もできますが、今度は「者とデータの照合はどうする?」という問題にぶつかります。)
 
最初にデータを入力するのが面倒なようなので、直積クエリについて説明すると、
テーブルXの列Aに「1,2,3」、列Bに「a,b,c」と3行ずつデータがあったとするとき、例えば
SELECT T1.A, T2.B FROM X AS T1, X AS T2;
というSQLを実行すると、1a,1b,1c,2a,2b,2c,3a,3b,3cと全ての組み合わせを出力させるクエリのことです。
(FROM句で、複数のテーブルをカンマ区切りで指定すると直積結合になります)
「掛け算」のデータはこのようなクエリで実行できますし、存在してはいけない組み合わせはWHERE句で指定します。
 
初回のデータ生成だけだと思いますので、Accessでクエリを書かなくても、Excel VBAの多重Forループでも何でも、現在お持ちのスキルでできることでデータを作ってしまえば良いでしょう。 大切なのは、管理情報を常に最新に維持し続けることです。

投稿日時: 18/09/17 20:47:29
投稿者: shinta9876

ご回答ありがとうございます。
 
>テーブル(A)-略-テーブル(B)-略-必要に応じてAと結合します。
・すべてを一本のリレーションシップに組みこまない
・テーブルAとテーブルBをクエリで結合して結果を吐き出す
という解釈で良いでしょうか?
 
 
>同じ部屋に複数のカーテン
「重複する名称の設備」は存在しますが取り付け部位が異なることから、例えば「東側カーテン1」とかユニークなネームをつけることで回避することを想定しています。
 
>Excel VBAの多重Forループでも何でも、現在お持ちのスキルでできることでデータを作ってしまえば良いでしょう。
 
エクセルVBAは多少触れる程度なのですが、
 
先ず「部屋パターン×部屋室名×装備品(=1部屋番号当たりの集合)」の結果を部屋数分準備したエクセル表を作成し、アクセスにインポートする、という解釈でよいでしょうか?
 
 
恐れ入りますがよろしくお願いいたします。

回答
投稿日時: 18/09/18 07:37:10
投稿者: i-brown

直積クエリは忘れて、ExcelからAccessにデータをインポートするほうがお勧めです。成功をお祈りします。
 
補足ですが、Accessにインポートした後「○○号室の○部屋の○○」という装備品を識別するための列は、テーブルのデザインビューで複数列を選択して右クリックし「主キー」指定しておくと、重複データを拒否するようになるのでお勧めです。

トピックに返信