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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

1回答

2861閲覧

【Access】従業員の勤怠内容を登録するフォームで、他テーブルの値をコンボボックスに表示して記入させたい

ryoya_access

総合スコア34

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

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

コンボボックス

GUIの要素のひとつです。Listboxと同様にいくつかのうちひとつを選択する機能だが、Comboboxの場合は選択されたもののみがデフォルトとして表示される。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/07/27 06:39

###従業員の勤怠内容を登録するフォームで他テーブルの値をコンボボックスに表示して記入させたい

Access(2007-2016)で、従業員の勤怠管理のデータベースを作りたいと思っています。

従業員の勤怠内容を登録する登録フォームを作っているのですが、思うように作成できず、ただ時間ばかりが過ぎていくため
こちらで質問させていただくことにしました。

以下、詳細になります。

テーブルとリレーション

〇使用テーブルは7つで、以下のようにリレーションを組んでいます。

イメージ説明

リレーションの主な意図としては、以下のようになっています。

〇勤怠テーブルと稼働テーブルが1:多
例)
勤怠テーブル(1):Aさんが7/1に8時間働いた
稼働テーブル(多):↑の内訳は、受注明細Aに3時間、受注明細Bに4時間、受注明細Cに1時間だった

〇受注テーブルと受注明細テーブルが1:多
例)
受注テーブル(1):顧客Aから7/1に受注があった
受注明細テーブル(多):↑の受注内容は、タスクAとタスクCの契約だった

受注テーブル(1):顧客Bから7/3に受注があった
受注明細テーブル(多):↑の受注内容は、タスクBとタスクCとタスクEの契約だった

1.顧客テーブル---------------
顧客ID:オートナンバー
顧客名:短いテキスト

顧客ID 顧客名
1 ○○商事
2 ○○広告
3 ○○電気

2.受注テーブル---------------
受注No:オートナンバー
受注日:日付
顧客ID:数値

受注No 受注日 顧客ID
1 2020/07/01 1
2 2020/07/01 2
3 2020/07/01 3
4 2

3.受注明細テーブル-------------
受注明細No:オートナンバー
受注No:数値
タスクID:数値
予算額:数値

受注明細No 受注No タスクID 予算額
1 1 2 200
2 1 3 300
3 2 1 100
4 2 2 200
5 2 3 300
6 3 4 400
7 3 5 500
8 4 2 0

4.タスクテーブル----------------
タスクID:オートナンバー
タスク名:短いテキスト

タスクID タスク名
1 業務A
2 業務B
3 業務C
4 業務D
5 業務E

5.勤怠テーブル----------------
勤怠管理No:オートナンバー
社員ID:数値
出社日:日付
出社時間:日付/時刻
退社時間:日付/時刻

勤怠管理No 社員ID 出社日 出社時間 退社時間
1 1 2020/07/02
2 2 2020/07/02
3 3 2020/07/02
4 1 2020/07/03
5 2 2020/07/03
6 3 2020/07/03
7 4 2020/07/03
8 5 2020/07/03
9 3 2020/07/07

6.稼働テーブル------------------
稼働管理No:オートナンバー
勤怠管理No:数値
受注明細No:数値
稼働時間:数値

稼働管理No 勤怠管理No 受注明細No 稼働時間
1 1 1 1
2 1 1 2
3 1 3 2
9 2 1 4
10 2 2 3
11 3 3 2
12 4 3 2
13 5 3 1
14 5 1 3
15 6 1 4
16 7 2 5
17 7 3 4
18 8 3 3
19 9 8 2

7.社員テーブル------------------
社員ID:オートナンバー
社員名:短いテキスト

社員ID 社員名
1 一郎
2 二郎
3 三郎
4 四郎
5 五郎

作成したフォーム

〇以上のテーブルのうち、「勤怠テーブル」「稼働テーブル」のすべての項目を用いて、以下のようなサブフォーム付きのフォームを作成しました。メインフォームが勤怠テーブルのもの、サブフォームが稼働テーブルのものです。

勤怠管理NOと稼働管理Noはオートナンバーなので、ユーザーはメインフォームの「社員ID」「出社日」「出社時間」「退社時間」、サブフォームの「受注明細NO」と「稼働時間」を記入する形式を想定しています。

イメージ説明

【質問内容】ここで、受注明細Noの代わりに、顧客名とタスク名を入力することで、勤怠登録を成立させる方法はあるのでしょうか。

利用するユーザー視点だと、「どの顧客の、どのタスクに、どのくらいの時間をかけたのか」という形で入力をさせたい。
しかしAccessのテーブル構造の視点だと、先に挙げたテーブル・リレーションが最適なように思えてしまいます。

この両者を両立させるために、もっと最適なテーブル・リレーションの組み方があるのか、それともフォームの作り方を工夫すれば解決できるのか、お知恵を貸していただきたいです。そもそもテーブルとリレーションの組み方が不適切な場合は、その点についてもアドバイスいただきたいです。

アクセスを触ってまだ日が浅いため初歩的な質問になっているかもしれませんが、どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

受注明細Noの代わりに、顧客名とタスク名を入力することで、勤怠登録を成立させる方法はあるのでしょうか。

稼働テーブルの受注明細№を(受注№、タスクID)に置き換えます。
併せて、受注明細テーブルのプライマリーを(受注№、タスクID)にします。

プライマリーは単一の項目である必要は無く、複数の項目でも可能です。
ですのでこの場合は、オートナンバーによるサロゲートキーではなく、(受注№、タスクID)のナチュラルキーであれば良いかと思います。

投稿2020/07/27 06:58

sazi

総合スコア25327

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

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

ryoya_access

2020/07/27 07:32

ご回答いただきありがとうございます。「プライマリーは単一の項目である必要は無く、複数の項目でも可能です。」>> 調べたところまさにこれでした。サロゲートキー、ナチュラルキーという概念を知らずに、主キーとリレーションを組んでおりました。大変勉強になりました、ありがとうございました。
ryoya_access

2020/07/27 08:17

重ねての質問になりすみません。教えていただいたようにした結果、「受注明細No」の代わりに「受注No」と「タスクID」での入力が可能になったのですが、この「受注No」の代わりに「顧客名」で入力するにはどのようにすればよいのでしょうか。 「受注No」をコンボボックスにして、コントロールソースに「受注No」、連結列1、書式の列数3、列幅0cm,0cm,3cmにすることで顧客IDでの入力はできるようになったのですが、ここを顧客「名」で入力したいのですが叶わずにいます。 どのようにすれば解決できるでしょうか。
sazi

2020/07/27 08:24

受注Noと顧客IDは1:1ではないので、顧客名では受注№の絞り込みにしか使えないのでは? そこからさらに、受注№を特定するインターフェースが必要だと思います。
ryoya_access

2020/07/27 08:27

「受注No」「顧客ID」「顧客名」をフィールドに取ったクエリAを作成し、コンボボックスにした「受注No」の値集合ソースをクエリAに設定。連結列1、書式の列数3、列幅0cm,0cm,3cmにすることで解決できました。
ryoya_access

2020/07/27 08:30

※1つ上のコメントはsazi様のコメントを読む前に投稿したものです。 コメントいただきありがとうございます。確かにそうですね、ここからは独力で頑張れそうなので、実現目指して引き続き頑張ります。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問