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

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

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

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

Q&A

解決済

2回答

1096閲覧

accessのサブフォームについて。

bee96

総合スコア8

Access

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

0グッド

0クリップ

投稿2020/09/25 00:24

編集2020/09/25 00:57

顧客情報を登録するメインフォームの中にサブフォームがあります。
メインフォームでは顧客の基本情報を入力し、サブフォームではタブコントロールにして
顧客の色々な情報を入力させています。

その中のサブフォームについて質問です。
サブフォームには顧客の住所を登録/表示させています。
テキストボックスとしては、転居年月日、郵便番号、住所があります。
テーブルはT_顧客住所歴です。

メインフォームで顧客IDなどを入力させているのでサブフォームでは顧客IDや氏名は省略しています。
そのせいなのか登録後にT_顧客住所歴を見ると、社員番号、転居年月日、郵便番号、住所は登録されているのに
氏名だけがなぜか入力されていません。

ちなみにメインフォームのレコードソースであるT_顧客マスタとT_顧客住所歴は参照整合性でリレーションシップを組んでいます。
タブコントロール内にある他のサブフォームも同じように氏名だけが登録されません。

こちらの改善法、氏名も入力されるような方法などありましたら教えて頂きたいです。
お手数をおかけしますが宜しくお願いします。

追記します。
サブフォームなどにはVBAを使っていないので省略します。
T_顧客マスタ
顧客コード:数値型
氏名:短いテキスト
契約状況:短いテキスト
性別:短いテキスト
生年月日:日付/時刻型
契約日:日付/時刻型
解約日:日付/時刻型

T_住所歴
顧客コード:数値型
氏名:短いテキスト
転居年月日:日付/時刻型
郵便番号:短いテキスト
都道府県:短いテキスト
市区町村:短いテキスト
番地:短いテキスト

T_ 顧客マスタが1、T_ 住所歴が多としてリレーションシップを組んでいます。

その他足らない情報などありましたらご指摘お願いいたします。

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

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

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

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

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

DreamTheater

2020/09/25 00:32

VBAコードとテーブルのカラム情報を追記してください。
guest

回答2

0

メインフォームで顧客IDなどを入力させているのでサブフォームでは顧客IDや氏名は省略しています。

サブフォームで入力を省略できるのは、メインフォームでリンクフィールドに指定されたものだけです。
また、リンクフィールドに指定するものは、通常メインフォームの一意キーです。

投稿2020/09/25 00:41

編集2020/09/25 00:46
sazi

総合スコア25327

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

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

bee96

2020/09/25 01:00

それでは、登録するときはタブコントロール内にあるいくつかサブフォームに何回も氏名と顧客コードを入れなければいけないことになるんですね・・・ なにか良い方法ありますでしょうか。
sazi

2020/09/25 03:47

他の回答で理解されたみたいなので、蛇足ですが、 理由として、現在のテーブルが正規化されていない(項目の重複)という事ですので、他にも類似があるかもしれませんね。
guest

0

ベストアンサー

一対多の関係のテーブルになってますが、リンクフィールド以外に一側(メインフォーム側)にあるデータと同じもの(氏名)を多側(サブフォーム側)に重複して格納する目的はなんでしょうか。

通常は重複するデータを2箇所には保存しないというのがデータベース設計の基本です。

結婚等で名前が変わった時の旧名も保存しておきたいということでしょうか。
だとしても、そんなに頻繁にあることではないと思いますので、一側に旧名フィールドを持たせるというのが一般的な設計です。

以上を踏まえて、もし多側にも氏名を保存する合理的な理由がある場合は、
親リンクフィールド、子リンクフィールドに下記のように両方のフィールドを設定すれば可能ではあります。

text

1顧客コード;氏名

ただし、上記の設定だともし、氏名が変わった場合は、改名以前のデータが表示されなくなります。
氏名が変わっても表示させたい場合は、リンクフィールドは「顧客コード」だけにして、VBAで適切なタイミングでサブフォームの氏名の既定値を設定することになりますね。

投稿2020/09/25 01:27

編集2020/09/25 01:41
hatena19

総合スコア34075

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

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

bee96

2020/09/25 01:39

確かに、重複させる必要はありませんね・・・ Excelに出力させるときに商品コードや氏名があれば便利かなと思い入れたんだと思います。
hatena19

2020/09/25 01:42

だとするなら、クエリで2つのテーブルを結合して、必要なフィールドを表示させて、それをエクセルにエクスポートすればいいでしょう。
bee96

2020/09/25 02:29

ありがとうございます。 設定するとリンクフィールドのデータ型が合わないため・・・と表示されました。 これは顧客コードが数値、氏名がテキストだからでしょうか?
hatena19

2020/09/25 02:40

えっと、T_住所歴 に氏名フィールドは持たせたままで、サブフォームの親リンクフィールド、子リンクフィールドを設定しているという話でしょうか。 それとも、エクスポート用のクエリを作成しているときの話でしょうか。
bee96

2020/09/25 02:43

エクスポート用ではなく質問の本題になります。申し訳ございません。 T_住所歴から氏名フィールドは削除致しました。 そのうえでリンクフィールドを設定しましたがそれは間違いでしょうか?
hatena19

2020/09/25 02:45

ならリンク親フィールド、リンク子フィールドはどちらも、 顧客コード と設定すればいいだけです。 最初の状態です。
bee96

2020/09/25 02:47

ありがとうございました! とても簡単な問題だったのですね・・・ お手数をおかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問