関連記事:レコードセットでなく、SQLで挿入する方法はこちら↓
ray88.hatenablog.com
■ 以下のようなパラメータクエリ「Q_インサート」を作成したとします。
パラメータはフィールド部分の 担当者:[Offfiser] と
抽出条件部分の >=[price] の部分
このクエリにパラメータの値を渡し、実行後結果をレコードセットに格納。
装入先のT_インサートテスト用 テーブルについてもレコードセットに格納し
レコードセットからレコードセットに値を挿入していきます。
※過去記事、「パラメータクエリの実行し結果をSQLでテーブルに挿入」では、
実行結果をそのまま挿入できますが、レコードセット同士で挿入する場合、
別名カラムについてはうまく参照できませんので、実際クエリを作成する
際は、クエリテーブルには別名カラムは作成せず変数に持たせるように
なるかと思います。今回は過去記事との動作比較用にそのままにしています。
■T_テストテーブルのフィルターをかけていない状態は以下
■挿入先テーブル T_インサートテスト用のテーブルは以下
■コードは以下
ここでは単純にパラメータを”木村さん”、1500 としてますが、実務では変数で
設定したり、フォームのコントロールで設定したりするようになります。
Sub testParam() Dim daoDb As DAO.Database Dim daoQd As DAO.QueryDef Dim strSQL As String Dim RS As Recordset Dim RS2 As Recordset Set daoDb = CurrentDb Dim strOffiser As String 'まずクエリーのオブジェクトを取得します Set daoQd = daoDb.QueryDefs("Q_インサート用") With daoQd 'クエリーのオブジェクトに対して設定を行います。"抽出する顧客ID" などがパラメータ名です .Parameters("[price]") = 1500 .Parameters("[Offiser]") = "木村さん" '設定後のクエリーオブジェクトを元にRecordsetを開きます Set RS = .OpenRecordset End With '別名カラムはうまく動作しないようなので挿入する値を変数に格納 strOffiser = "木村さん" 'レコード件数の確認。一旦最終行に移動しないとレコードがある場合「1」しか返ってこない RS.MoveLast Debug.Print RS.RecordCount '対象レコードなければ処理終了。対象レコードが存在する場合は最初の行に戻す If RS.RecordCount = 0 Then MsgBox "対象レコードがありません" RS.Close Set RS = Nothing Exit Sub Else RS.MoveFirst End If 'レコード挿入先のテーブルをレコードセットに格納する Set RS2 = daoDb.OpenRecordset("T_インサートテスト用", dbOpenDynaset) Do Until RS.EOF RS2.AddNew With RS2 !ID = RS!ID !代理店コード = RS!代理店コード !タイトル = RS!タイトル !著者 = RS!著者 !出版社 = RS!出版社 !価格 = RS!価格 !年月 = RS!年月 !キャンセルフラグ = RS!キャンセルフラグ '別名カラムだけ、変数を使って挿入 !担当者 = strOffiser 'これを忘れたら更新されない .Update End With '次の行に進む(これを忘れると無限ループ!) RS.MoveNext Loop '終了処理 RS.Close: RS2.Close Set RS = Nothing: Set RS2 = Nothing End Sub
■実行結果
パラメータの値もちゃんと反映されています。