dポイントプレゼントキャンペーン実施中!

Accessにて販売管理システムを構築しています。
以下の構成にてテーブルがあります。
------------------------------
T_見積伝票(メイン)
 ・見積ID(主キー)
 ・顧客名
 ・見積日
------------------------------
T_見積明細(サブ)
 ・明細ID(主キー)
 ・見積ID
 ・商品名
 ・数量
 ・単価
------------------------------
T_受注伝票(メイン)
 ・受注ID(主キー)
 ・顧客名
 ・受注日
------------------------------
T_受注明細(サブ)
 ・明細ID(主キー)
 ・受注ID
 ・商品名
 ・数量
 ・単価
------------------------------
*主キーはすべてオートナンバーにて採番されるようにしています。
T_見積伝票とT_見積明細がリレーション
T_受注伝票とT_受注明細がリレーション

実現したいことは、T_見積伝票&T_見積明細に入力された内容が
実際に受注となった場合、「受注に転記」のようなボタンを設置し
クリックすることで、T_受注伝票&T_受注明細に複製できればと思っています。
T_見積伝票とT_受注伝票にはいくつか異なるフィールドがあるので、(見積日と受注日)
対応するフィールドの内容のみコピーしたいです。
逆にT_見積明細とT_受注明細は主キーとなってるIDのみ違うだけで
それ以外は全て同じフィールドにて構成されていますので
全部コピーしたいです。

色々と調べた結果、追加クエリを使うといいみたいですが
追加クエリ自体がよく分からず質問させて頂きました。
宜しくお願い致します。

A 回答 (2件)

>この記述で複数の明細をコピーできるのでしょうか?


出来ますよ。条件を満たすレコードを自動的に全て追加できます。

例えば、見積伝票(見積ID=1)に複数の明細がある場合、

SELECT * FROM T_見積明細 WHERE T_見積明細.見積ID = 1;

上記の【選択】クエリで、複数のレコードが【選択】できますよね。これと同様に【追加】クエリなら、複数のレコードが【追加】されます。SQL(クエリ)の便利なところです。こういう言語を非手続き型言語と言います。

今回のプログラムでは、受注IDの問題があったので、前半はDAOのRecordsetを使って、手続き型の処理をしています。後半はSQLを使って非手続き型の処理をしています。
    • good
    • 0
この回答へのお礼

有り難うございます!
SELECTの例、すごくよく分かりました。
ネットで調べていても、同じように記述するとは書いていましたが
なぜ、これだけで複数のレコードが追加されるのか、までは
書いておらず、四苦八苦していたところでした。
このレスを頂いたことで、悩んでいた問題が一気に解決しました。
で、本題のメインフォームとサブフォーム内の複数レコードのコピーですが
先のレスと合わせて試したところ、希望した動作になりました!
(受注IDはMAXで取得できました。)
本当に有り難うございますm(_ _)m

お礼日時:2007/01/29 19:36

>逆にT_見積明細とT_受注明細は主キーとなってるIDのみ違うだけで


見積IDと受注IDも異なりますよね。
追加クエリでは、T_受注伝票に追加した時に振られるオートナンバーが取得できないので、追加したレコードの受注IDが分からなくなります。

スタンドアロンで使用すると言う前提なら、Max(受注ID)で取得可能かな。

----------------------------------------
VBAを使ってよいなら。

見積伝票の入力フォームに、「受注に転記」ボタンを追加して、クリック時のイベントプロシージャに下記を記述。

Private Sub コマンド0_Click()
 Dim rs As DAO.Recordset
 Dim SQL As String
 Dim ID As Long
 
 '受注伝票に追加(DAOを利用)
 Set rs = CurrentDb.OpenRecordset("T_受注伝票", dbOpenDynaset)
 rs.AddNew
 ID = rs![受注ID] '受注IDを取得
 rs![顧客名] = Me![顧客名]
 rs![受注日] = Date '受注日には今日の日付を入れてます。
 rs.Update
 rs.Close
 Set rs = Nothing
 
 '受注明細に追加(追加クエリを利用)
 SQL = "INSERT INTO T_受注明細 ( 受注ID, 商品名, 数量, 単価 ) "
 SQL = SQL & "SELECT " & ID & " as 受注ID, T_見積明細.商品名, T_見積明細.数量, T_見積明細.単価 "
 SQL = SQL & "FROM T_見積明細 "
 SQL = SQL & "WHERE T_見積明細.見積ID=" & Me![見積ID] & ";"
 
 CurrentDb.Execute SQL
 
 DoCmd.OpenForm "受注伝票フォーム", , , "[受注ID]=" & ID
End Sub

これで、受注伝票、受注明細に追加して、ついでに受注伝票フォームを開きます。

この回答への補足

コードを含めた詳しい説明有り難うございます!

>>逆にT_見積明細とT_受注明細は主キーとなってるIDのみ違うだけで
>見積IDと受注IDも異なりますよね。
すみません、主キーは同じで、仰る通り見積IDと受注IDが異なります。
--------------------------------------------------------------
 '受注明細に追加(追加クエリを利用)
 SQL = "INSERT INTO T_受注明細 ( 受注ID, 商品名, 数量, 単価 ) "
 SQL = SQL & "SELECT " & ID & " as 受注ID, T_見積明細.商品名, T_見積明細.数量, T_見積明細.単価 "
 SQL = SQL & "FROM T_見積明細 "
 SQL = SQL & "WHERE T_見積明細.見積ID=" & Me![見積ID] & ";"
 
 CurrentDb.Execute SQL
--------------------------------------------------------------
すみません、この記述で複数の明細をコピーできるのでしょうか?
(疑っているとかいうわけではなく、While等の繰り返し処理って
必要なくとも可能なのでしょうか?)

補足日時:2007/01/29 18:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A