質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

3回答

1696閲覧

MS Access 繰り返し大量のデータ手入力を容易にする方法はありますか?

Attl

総合スコア2

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2020/08/18 04:41

編集2020/08/18 05:07

#実現したいこと
Access上で大量発生する入力データについて、手入力の一部を省力化できないか?

#お尋ねしたいテーマ
建物の中にある室の子メータ(電気、ガス、水道)の検針値をデータ化したいと思います。
そこで、以下のように構築してみました。
検針データ管理DB

 クエリ
q01_建物名:建物名称 (t01)
q02_建物名_室番号:建物名称と部屋番号 (t01,t02)
q11_建物毎検針月:建物名称と検針月の組み合わせ(t01,t11)
q12_建物毎検針科目:建物名称と検針科目の組み合わせ(t01,t17)

実行結果はこうなりました。
実行結果

建物毎に検針月を入力する

建物の子メータの検針日を入力する

検針科目(電気、ガス、水道)を指定し、各々の検針値を入力する

予想通りに動作しています。

 なお、
・建物毎に検針科目があったりなかったりすること(建物全てで電気・ガス・水道を検針するわけではない)
・将来的にエクセルのピボットテーブルで処理できるようにもしたいこと

を想定し、検針表テーブルは、検針科目ごとにフィールドを準備するのではなく(テーブルを横に広げることをせず)、検針科目フィールドを準備し、コード化した検針科目名を選択して検針値を入力する形にしてみました。


#皆様に質問
ところで、例えば1建物当たり100室のように対象室が増えると、
1か月1建物当たり400回繰り返し科目を選択する必要があります。
登録された建物数×登録された室数×検針科目なので、繰り返し入力の回数がうなぎ上りに増えていきます。
コンボボックスで選択ができるとは言え、科目選択で間違いが発生する確率が高くなると思います。

そこで、例えば
「建物-室番号-検針月-室番号-建物毎の検針科目」の組み合わせはあらかじめ生成し、検針値だけオペレータが入力するということを実現したいのです。

試しに「建物-室番号-検針月-室番号-建物毎の検針科目」の組み合わせをクエリで出力してみましたが、出力結果一つ一つにユニークコードを与えることができません。 (当然かもしれませんが・・)

クエリ結果例
クエリ結果例
(赤枠部分に検針値を入力できるように検討してみましたが、クエリ結果にユニークコードが出ないため、検針値テーブルとリンクできないと思い至りました。)

  何か良い方法・アイディアはありませんか?
皆様が大量にデータを取り扱うDBを設計される場合、どのように工夫されていますか?
よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tosi

2020/08/18 08:47

(基本)参考程度です 基本Accessでリレーションシップを使った事がありません。 自由度が下がるのと、VBAを使うので障害時の解析が難しくなる為です。 「建物-室番号-検針月-室番号-建物毎の検針科目」で入力イメージがありますので、これを想定したForm画面を作成し、実際の運用では入力内容を一旦VBAが受け取り、それをSQL文にてデータベースへ書き込み更新する方法を取ると思います。(私の場合ですが) ---------------------------------------------------------------- (入力画面) 今回は画面的にキー:請求月+建物をヘッドへ入力することで、部屋番号(縦行)・検針科目(横列)で一覧表示させて入力すると便利そうです。 但し、この場合はテーブル構成と画面レイアウトを一致させる事が難しくなります。その為、画面入力専用のワークテーブルを一つ別に作ります。 運用では、請求月+建物のキー値を入力する事で、ワークテーブルへ必要データを書き込み、この内容をForm画面へ表示させリンスを取ります。 (科目ランクが部屋毎にバラバラですと列名で一工夫必要かも・・・) ---------------------------------------------------------------- (テーブル) マスタ:建物(住所含む)・部番号・検針科目 ジャーナル:検針明細(1レコードに1検針値)建物・部屋番・子メータ情報等全項目を入れて保守性を高める。 画面特殊マスタ:画面専用ワークマスタ(建物+部屋番号+検針科目) ---------------------------------------------------------------- 以上の様な感じでやると思います。 だだ、VBAに習熟していないと難しいです。また、追加・変更・削除の機能を加える必要がありますので、割と大掛かりな物になる可能性あります。
Attl

2020/08/18 10:40

ご回答ありがとうございます。 >入力内容を一旦VBAが受け取り、それをSQL文にてデータベースへ書き込み更新する方法を取ると思います。 貴殿のこの一言、イメージとしては大変よくわかります。 ただ、VBAもSQLも自分にスキルが全くないに等しいため、そこにたどり着くにはかなり時間がかかりそうです。 だだ、この方法で具体的に実装できる方がいらっしゃるということは、自分が本当にやりたいことがあてずっぽうではないことがわかりましたので、それだけでも大変心強く思います。 ご提案ありがとうございました。 今後とも機会がありましたらぜひ。
dameo

2020/08/19 21:47

この手の定形入力は開発者側で入力用のExcelシートを作成し、オペレータさんにExcelに打ち込んでもらいつつ、それを付随するVBAなどで簡易チェックしてから送ってもらってました。受け取ったExcelデータはさらにDB上のデータと付き当ててしっかり検証するため、またVBAが活躍します。その後、VBAから直接SQLを叩いてDBに入力するか、アプリによってはExcelごと入力できることが多かったです。 Excelは大抵の業務用PCに入ってるので、操作も慣れてる人が多いのと、ちょっとした要望にもVBAで手早く応えることができること、また、一次入力データから投入データまでが統一されて、そのまま入力データの証拠として保管しておけるのもいいところだと思います。
Attl

2020/08/20 15:25

ご回答ありがとうございます。 実際にはそのような運用もあるのですね。 やっとAccessでそれらしい形が組めるようになった程度ですので、 具体的にどうすればいいかを理解するのは多分この先の話になると思いますが、 実装できるように勉強を続けようと思います。 ありがとうございました。
guest

回答3

0

ベストアンサー

「建物-室番号-検針月-室番号-建物毎の検針科目」の組み合わせはあらかじめ生成し、検針値だけオペレータが入力するということを実現したいのです。

更新対象のテーブルは「t16_検診内訳」ですよね。
(建物-室番号-検針月-室番号-建物毎)=(t16_検診内訳.検診表CD)

(検針科目)=(t16_検診内訳.検診科目CD)
でユニークに表せられてますよね。

「建物-室番号-検針月-室番号-建物毎の検針科目」の組み合わせをクエリで出力してみましたが、出力結果一つ一つにユニークコードを与えることができません。

(検診表CD,検診科目CD)が該当していると思うのですが?

※マイルールのCDとIDの使い分けの説明が無いとリレーションの関係が回答者にはわかりませんよ。
質問には直接関係ありませんが、作成されているリレーションシップをみると、サロゲートキー寄りでナチュラルキーを上手く使い分けてないように感じます。
例えば、部屋番号CDがあるテーブルには建物名CDがセットであった方が、余分なクエリーは作成しなくて済むと思います。

投稿2020/08/20 02:00

編集2020/08/20 02:03
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Attl

2020/08/20 16:03

ご回答ありがとうございます。 読み下すのに時間がかかっております。 マイルールの説明については気が付きませんでした。 1側主キーをID,多側キーをCDとしています。リレーションシップを組む時、テーブル側/リレーションテーブル側の選択を見誤らないようにするつもりで表記を変えてます。 ○○ID 1←∞ ○○CD という関係です。 >サロゲートキー 言われてみれば、サロゲートキー(オートナンバーで生成させる)を意識しています。 格納したいデータの中に重複するものがたくさんあるので、ナチュラルキーはうまく作り出せる自信がありません。 >余分なクエリ クエリについては、ほしい集合が実現できるか確認するため作るという意図もあります。 >(検診表CD,検診科目CD) つまり、複数の多側のキーの組み合わせで、ユニークキーを作れるということを申されているのでしょうか? 宜しく願いいたします。
sazi

2020/08/20 16:19 編集

> ○○ID 1←∞ ○○CD という関係です。 要は外部キーの場合にIDをCDとしているって事ですよね。 その説明が無いと、読み手としてはリレーションの関係が明確ではないのです。 > 複数の多側のキーの組み合わせで、ユニークキーを作れるということ そうです。
guest

0

オペレーターの方が入力されるのであれば、
(1) なるべくマウスは使わず、キーボードだけで入力できる
(2) できればアルファベットは使わず、テンキーだけで入力できる
と喜ぶと思います。

投稿2020/08/18 05:44

kitasue

総合スコア314

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Attl

2020/08/18 10:45

ご回答ありがとうございます。 確かに冗長な操作体系は苦痛ですよね。 気を付けるようにします。 ありがとうございました。
guest

0

まず、ユーザーにテーブルやクリエから直接入力させるという設計はやめましょう。

ユーザーがうっかりデータを削除したりするとアンドゥはききませんので取り返しがつかないです。
デザインビューして設計を変更されちゃう恐れもあります。
危険すぎます。

フォームから入力させる設計にしましょう。
フォームの場合は、メイン/サブフォーム形式を使う場合が多いです。

サブフォームを含むフォーム (一対多のフォーム) を作成する - Access

「建物-室番号-検針月-室番号-建物毎の検針科目」の組み合わせはあらかじめ生成し、検針値だけオペレータが入力するということを実現したいのです。

下記で紹介している方法の応用で可能だと思います。

帳票フォームで項目(行)を固定表示する - hatena chips

メインフォームは非連結フォームにしておいて、
建物、検診月、辺りはコンボボックスで選択させて、リンク親フィールドに設定すると、建物、検診月 でサブフォームのデータを絞り込めます。

かなり複雑なテーブル設計なので、難易度は高そうですが。
もう少しシンプルなテーブル構成にできそうな気もします。

投稿2020/08/18 05:28

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Attl

2020/08/18 10:44

ご回答ありがとうございます。 設計方針についてのコメント、ありがとうございます。 何せ独学でやっと最近なんとなく動くDBを作れるようになった程度なので、何がスマートでどれが現実的なのかよく知りません。 大変勉強になります。 ご紹介いただいたURL先を拝見させていただきました。 参考にしながら試しに実装してみようと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問