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

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

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

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

Q&A

解決済

2回答

4958閲覧

Accessで2つのサブフォーム間で連携したい

na999

総合スコア2

Access

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

0グッド

0クリップ

投稿2021/04/27 07:45

編集2021/04/27 11:47

前提の前提(質問者の知識レベル)

RDBは以前から触っていましたが、Accessは勉強を始めて1週間程度のため、説明不足な点等あるかもしれません。ご容赦ください。

前提

利用者とその人の注文を管理する以下のようなテーブルがあります。

利用者

  • 利用者ID(Pkey)
  • 名前

注文履歴

  • 注文履歴ID(Pkey)
  • 利用者ID
  • 注文日
  • 備考

注文明細

  • 注文明細ID(Pkey)
  • 注文履歴ID
  • 商品
  • 個数

これらのテーブル間には、以下のリレーションを作成しています。

  • 利用者.利用者ID(1) - 注文履歴.利用者ID(N)
  • 注文履歴.注文履歴ID(1) - 注文明細.注文履歴ID(N)

実現したいこと

利用者のフォームを作り、利用者1人1人ごとに、注文履歴とその明細を見れるようなビューを作りたいと考えています。

試したこと

フォームウィザードを使って利用者をキーとして全ての属性を表示させるフォームを作った場合、注文履歴と注文明細がそれぞれ独立したサブフォームとして利用者フォームの中に配置され、注文履歴の1行を選択することで、注文明細の内容が自動的に切り替わるようになります。

これで完全に実現したいことを実現できているのですが・・・

困っていること

後学のために、フォームウィザードを使わずに同様のことを実施しようと考えました。
注文履歴と注文明細に相当するフォームをデータシート形式で作成し、利用者フォームに両フォームをサブフォームとして配置し、各サブフォームのプロパティで以下を指定しています。

サブフォーム:sub_注文履歴 のプロパティ

  • リンク親フィールド:利用者ID
  • リンク子フィールド:利用者ID

サブフォーム:sub_注文明細 のプロパティ

  • リンク親フィールド:sub_注文履歴.Form.注文履歴ID
  • リンク子フィールド:注文履歴ID

これによって、利用者を切り替えた時に注文履歴のサブフォームは該当する利用者の履歴のみが表示されるようになったのですが、注文履歴を選択しても、注文明細のサブフォームが切り替わりません。

前述した通り、フォームウィザードを使って同様のビューを作り、できあがった各サブフォームのプロパティなどを見る限り、同様に設定できているのですが、それだけでは足りないサブフォーム間の連携のための何か設定があるのでしょうか。

その他

このあたりの学習が現状手探りになっており、なかなか効率が上がらず困っています。
一応、「できるAccess2019」という書籍を1冊ざっと学習はしたのですが、少し凝ったことをやろうとすると途端に手探りになってしまっています。複雑なフォームを作るにあたり、この辺の書籍(やサイト)がおすすめ、といった情報も、もしもあれば是非教えていただけると助かります。

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

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

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

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

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

guest

回答2

0

解決済みですが、コメントの下記の余談に反応して、

余談ですが、オブジェクト指向的な考え方からすると、サブフォーム側に親フォームに依存したコードが書かれているとサブフォームの再利用性が無くなってしまうという感覚があったため、サブフォーム側は弄られていないだろうという勝手な思い込みのもと、サブフォーム側のイベントを確認するという考えに至りませんでした。Accessのお作法?そもそもVBAのお作法?がまだよくわかっておりませんが、一旦はこれ(サブフォーム側でイベントを書く)で実現可能なことはわかったため、まずはこれで進めてみようと思います。

親フォーム側に子フォームのイベントを記述することも可能です。

WithEventsを付けたFormオブジェクトを宣言することで、Formのイベントを記述することができます。

vba

1Option Compare Database 2Option Explicit 3Private WithEvents subF As Access.Form 4 5Private Sub Form_Load() 6 Set subF = Me.sub_注文履歴.Form 7 subF.OnCurrent = "[Event Procedure]" 8End Sub 9 10Private Sub subF_Current() 11 Me.sub_注文明細.Requery 12End Sub

これで、サブフォーム側に親フォームに依存したコードを記述する必要はなくなりますので、サブフォームの再利用性が損なわれることはないです。

投稿2021/04/28 05:13

編集2021/04/28 05:15
hatena19

総合スコア33699

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

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

na999

2021/04/28 09:53

hatena19さん、わざわざ私の呟きに対して、とても有効なコメントをありがとうございます! なるほどなるほど・・・こういう書き方もあるのですね。勉強になります。 これならサブフォームの用途を限定することがなく再利用性が上がりそうですね。
guest

0

ベストアンサー

利用者を切り替えた時に注文履歴のサブフォームは該当する利用者の履歴のみが表示されるようになったのですが、注文履歴を選択しても、注文明細のサブフォームが切り替わりません。

この事柄だけみると、sub_注文明細は注文履歴のユーザーの先頭の注文履歴IDが表示されているという事になりますから、sub_注文履歴の注文履歴IDに問題があるという事になりそうです。

sub_注文履歴は一覧(帳票フォーム)なのではないですか?
で、sub_注文明細はsub_注文履歴の先頭の注文履歴IDから変更されないと。

一覧で選択したレコードという事なら、参照している注文履歴IDは選択した内容に応じて値が変更されなければなりませんから、そういった所にウイザードとの違いがあるかもしれません。
ウイザードで作成されたもののイベント処理を確認されては如何でしょうか。

投稿2021/04/27 08:09

sazi

総合スコア25173

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

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

na999

2021/04/27 11:56

saziさん、ありがとうございます。 メインフォームのイベントはこれまでも散々確認していたのですが、サブフォーム側のVBAを確認していませんでした。確認したところ、注文履歴側のサブフォームに、currentイベントとして、注文明細側のRequeryが記載されていました。同様のコードをお手製のフォームにも記述してみたところ、意図した動作をしてくれました。ありがとうございます!! 余談ですが、オブジェクト指向的な考え方からすると、サブフォーム側に親フォームに依存したコードが書かれているとサブフォームの再利用性が無くなってしまうという感覚があったため、サブフォーム側は弄られていないだろうという勝手な思い込みのもと、サブフォーム側のイベントを確認するという考えに至りませんでした。Accessのお作法?そもそもVBAのお作法?がまだよくわかっておりませんが、一旦はこれ(サブフォーム側でイベントを書く)で実現可能なことはわかったため、まずはこれで進めてみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問