Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
複数のレコードを1つのれこーどにしたい
投稿日時: 20/01/16 19:31:02
投稿者: アロー

回答お願い致します。
 
現在見積書システムを作成しております。
 
[T_消耗品]のテーブルがあり、品名,型番,単価,Yes/No型のフィールドがあります。
Yes/No型で選択したレコードのみ抽出する選択クエリ[C_選択消耗品]を作っています。
選択するレコードはその都度数も変わり、10レコード前後になります。
 
この選択したレコードを使い見積書を作るのですが、見積書には他にも顧客先名などを入力しないといけません。そこで[T_見積データ]をコードソースとした[F_見積データ]を作成し、サブフォームで[C_選択消耗品]を埋め込みました。
 
上記のような設計にしたのですが、[F_見積データ]で見積書を1件作成しても、[C_選択消耗品]クエリで10件程度のレコードが選択されているので、それを1件の見積データとして管理する方法が分からず困っております。
いっそのこと、[C_選択消耗品]クエリの複数のレコードを1レコードにまとめられれば管理しやすいと思ったのですが、無理でしょうか?
他にこのような複数の選択レコードを1件として管理する方法(後でデータを見返すことがあります)などありますでしょうか?1件ごとに連番を振って、同じ番号のデータを1件としてフォームに表示できるなどありましたら教えていただきたいです。
 
よろしくお願い致します。

回答
投稿日時: 20/01/17 10:00:54
投稿者: sk

引用:
[T_消耗品]のテーブルがあり、品名,型番,単価,Yes/No型のフィールドがあります。
Yes/No型で選択したレコードのみ抽出する選択クエリ[C_選択消耗品]を作っています。

引用:
そこで[T_見積データ]をコードソースとした[F_見積データ]を作成し、
サブフォームで[C_選択消耗品]を埋め込みました

[T_消耗品]がいわゆる商品マスターに当たるテーブルなのであれば、
フォームのデザイン以前にテーブルの設計に問題があると言わざるを得ません。
 
[T_見積データ]が 1 つ 1 つの見積書(のヘッダー部分)の情報を
記録するためのテーブルなのであれば、そのテーブルに従属するのは
「見積書の明細」を記録するためのテーブルであるべきです。
 
引用:
上記のような設計にしたのですが、[F_見積データ]で見積書を1件作成しても、
[C_選択消耗品]クエリで10件程度のレコードが選択されているので、
それを1件の見積データとして管理する方法が分からず困っております。

「正規形テーブルではなく非正規形テーブルでデータを管理したい」と
いう意味でおっしゃっているのであれば、あまりお奨めできません。
 
「見積書ごとに各明細の金額を合計した結果を得たい」という意味で
おっしゃっているのであれば、そういう集計クエリを作成なされば
よろしいでしょう。

投稿日時: 20/01/19 15:46:20
投稿者: アロー

回答有難うございます。
 

引用:
[T_消耗品]がいわゆる商品マスターに当たるテーブルなのであれば、
フォームのデザイン以前にテーブルの設計に問題があると言わざるを得ません。
 
[T_見積データ]が 1 つ 1 つの見積書(のヘッダー部分)の情報を
記録するためのテーブルなのであれば、そのテーブルに従属するのは
「見積書の明細」を記録するためのテーブルであるべきです。

 
やはり設計自体に問題がありましたか。
選択クエリを使うことで楽にしようと思ったのが駄目でした。
 
今後の設計として考えているのが、
仰るように、[T_消耗品]が商品マスターになっていますので、この[T_消耗品]をサブフォームとし、
メインフォーム[T_見積データ](見積書の詳細データ)としようと思っています。
 
メインフォーム[T_見積データ] (単票形式:見積書の明細)
サブフォーム[T_消耗品] (データシート形式:ID,品名,型番,単価)
として、[T_見積データ]に(商品番号1,2,3…、品名1,2,3…、型番1,2,3…)のように複数のフィールドを作り、
Private Sub 商品番号1_AfterUpdate()
Me.品名1 = DLookup("品名", "T_消耗品", "ID=" & Me.商品番号1)
Me.型番1 = DLookup("型番", "T_消耗品", "ID=" & Me.商品番号1)
Me.単価1 = DLookup("単価", "T_消耗品", "ID=" & Me.商品番号1)
End sub
Private Sub 商品番号2_AfterUpdate()
Me.品名2 = DLookup("品名", "T_消耗品", "ID=" & Me.商品番号2)
Me.型番2 = DLookup("型番", "T_消耗品", "ID=" & Me.商品番号2)
Me.単価2 = DLookup("単価", "T_消耗品", "ID=" & Me.商品番号2)
End sub

こんな感じで、商品番号フィールドに[T_消耗品]のIDを入力すると拾ってくるようにしようと思います。
商品マスターの[T_消耗品]をサブフォームにしているのは、商品のIDが同じ画面で分かるようにする為だけに表示させます。
上記のVBAですが、IDがオートナンバー型、商品番号は数値型ですが、これで大丈夫でしょうか?もっと簡単に記述する方法などあるのでしょうか?特にこれでも問題なければこのまま記述しようと思います。
 
この設計で問題ないでしょうか?
 
よろしくお願い致します。

回答
投稿日時: 20/01/20 13:59:17
投稿者: sk

引用:
[T_消耗品]が商品マスターになっていますので、この[T_消耗品]をサブフォームとし、
メインフォーム[T_見積データ](見積書の詳細データ)としようと思っています。

引用:
この設計で問題ないでしょうか?

(以下、P は主キー)

[T_見積書]
----------------------------------------------
P 見積書ID            オートナンバー型
  見積書作成日        日付/時刻型
  発注者名称          テキスト型
  受注者名称          テキスト型
  物件名称            テキスト型
  説明事項            メモ型(長いテキスト型)
  見積有効期限        日付/時刻型
----------------------------------------------

[T_見積書明細]
----------------------------------------------
P 見積書ID            長整数型
P 見積書明細番号      長整数型
  商品ID              長整数型
  商品単価            通貨型
  商品数量            長整数型
  課税区分            整数型
----------------------------------------------

[T_商品マスタ]([T_消耗品]に相当)
----------------------------------------------
P 商品ID              長整数型
  型番                テキスト型
  商品名称            テキスト型
  商品標準単価        通貨型
  課税区分            整数型
  商品説明            メモ型(長いテキスト型)
----------------------------------------------

以上のようなテーブル構成がサンプルとしては挙げられます。
(あくまでざっくりとした例です)
 
その上で、フォーム設計に関しては以下のような構成に
するとよいでしょう。
 
1. [T_見積書明細]をレコードソースとする帳票フォーム
   [F_見積書明細]を作成する。
 
2. [F_見積書明細]の詳細セクション上に、[商品ID]をコントロールソース、
   [T_商品マスタ]を値集合ソースとする連結コンボボックス[商品ID]を
   配置する。
 
3. 連結コンボボックス[商品ID]の[更新後処理]イベントの発生時に
   カレントレコードの[商品単価]と[課税区分]の値を
   自動的に設定するマクロ/イベントプロシージャを作成する。
 
4. [T_見積書]をレコードソースとする単票フォーム
   [F_見積書]を作成する。
 
5. [F_見積書]の詳細セクション上に、[F_見積書明細]をソースオブジェクトとする
   サブフォームコントロールを配置し、[見積書ID]同士でリンクするようにする。

投稿日時: 20/01/23 16:46:36
投稿者: アロー

有難うございます。
 
教えていただいた設計でほぼ狙い通りに作成することができました。
 
この度は有難うございました。