以下のコードについてお教えいただければと思います。
フォーム上のテキストボックスに入力された6ケタの年月に基づき、
パススルークエリでデータ抽出を行うつもりです。
この後に、新たにテーブル作成をしようと思っています。
しかし、以下のコードでは
(1) 書き込むTestテーブルを準備し、保存しておく必要があるかと思います。
(現在は、別に作ったクエリオブジェクトの形式を流用しています)
(2) 繰り返し数が多く、相当な時間を使います。
(3) Loopの代わりにと、SQLでINTO~を挿入したらエラーになってしまいます。
Testテーブルを都度削除し、一回で全件を追加する方法はないでしょうか。
Private Sub PassThru()
Dim qd As QueryDef
Dim rsSub As DAO.Recordset, rsMain As DAO.Recordset
Dim str月初 As String, str月末 As String
Dim i As Long
Const strConnect As String = "ODBC;****"
Set dbs = CurrentDb
Set qd = dbs.CreateQueryDef("")
qd.Connect = strConnect
qd.ReturnsRecords = True
str月初 = Format(DateSerial(Left(Me.txt年月, 4), Right(Me.txt年月, 2), 1), "yyyymmdd"))
str月末 = Format(DateSerial(Left(Me.txt年月, 4), Right(Me.txt年月, 2) + 1, 0), "yyyymmdd")
qd.SQL = "SELECT * FROM MAINDATA WHERE((DATE>=" & str月初 & ") And (DATE<=" & str月末 & "))"
Set rsSub = qd.OpenRecordset()
'****テーブルへの書き込み。フィールド数(20)×レコード数(約1500)回まわる
DoCmd.RunSQL "delete * from Test"
Set rsMain = dbs.OpenRecordset(Name:="Test", Type:=dbOpenTable)
Do Until rsSub.EOF
For i = 0 To rsSub.Fields.Count - 1
rsMain.AddNew
rsMain.Fields(i)=rsSub.Fields(i)
Next
Loop
End Sub
No.1ベストアンサー
- 回答日時:
これはですね。
パススルークエリーではなくふつうのクエリーですよね。この方式ですとデーターセットが使えないと一回でまとめて更新は無理です。つまりAccessではなくC#でSQLサーバーとAccsessを両方使うとかなら出来ます。
データーセットに読み込めばソースの形式は何でも構わないので。メモリ上に展開してメモリでリレーションを掛け更新もできます。
もしどうしてもAccessを使いたい場合は本当にパススルークエリをプロフラムでその都度作るしかありません。そのパススルークエリーを元にさらにふつうのテーブル作成クエリを作成しDoCmdなどで実行するしかありません。
まずパススルークエリを作成する前に、同じクエリは削除します。
Dim CAT As ADOX.Catalog
On Error GoTo errc
Set CAT = New ADOX.Catalog
Set CMD = New ADODB.Command
Deleteobj = True
CAT.ActiveConnection = CurrentProject.Connection
If CAT.Procedures.Count > 0 Then
For Each i In CAT.Procedures
If i.Name = クエリの名前 Then
CAT.Procedures.Delete (i.Name)
End If
Next
Exit Function
End If
そのあとに新しいSQLでパススルークエリのオブジェクトを作成します。
qd.SQL = "SELECT * FROM MAINDATA WHERE((DATE>=" & str月初 & ") And (DATE<=" & str月末 & "))"
Set CMD.ActiveConnection = CAT.ActiveConnection
CMD.CommandText = qd.SQL
CMD.ActiveConnection.Properties("Jet OLEDB:ODBC Command Time Out") = 0
CMD.Properties("Jet OLEDB:ODBC Pass-Through Statement") = True
CMD.Properties _
("Jet OLEDB:Pass Through Query Connect String") = _
"ODBC;DRIVER=SQL Server;SERVER=" & server ";DATABASE=" & database
CAT.Procedures.Append クエリの名前, CMD
CAT.Procedures.Refresh
これでAccessにクエリオブジェクトが作成されています。
テーブル作成クエリは予め作成しておいても構いません。名前は同じなので。
この後にそのテーブル作成クエリを実行します。
ご回答いただき、ありがとうございました。
私、C#やSQLサーバーはおろかADOの使い方もろくに分からず、DAOばかりで
ご示唆いただいた内容をヒントとして頂戴するのみとなりました。大変申し訳ありません。
上記の質問で、ふつうのクエリをパススルークエリと呼んでいたのは、
クエリオブジェクトの作成とほぼ似た作業をしてくれるためでした。
結果、パススルークエリ、作成クエリをオブジェクトとして予め保存しておいて
プロシージャ内で以下の作業を行うことで、一応の決着としました。
(1)DoCmd.DeleteObject でテーブルを削除
(2)実際に作ったパススルークエリのSQL、Connectを変更
(3)実際に作ったテーブル作成クエリをDoCmdで実行
そもそも引っ掛かりの原因は、クエリオブジェクトを残さずコードだけで始末するのが
最上だと思い込んでいたところにあるような気がします。
不勉強な範囲については、また出直してきたいと思います。
このたびはありがとうございました。また機会あれば、お教えいただけると幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) ACCESS DAO で不要なテーブルのフィールド(列)の削除 4 2022/06/23 12:13
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Access(アクセス) アクセス レポートを開いたときにパラメーターの自動入力がしたい 4 2022/11/30 11:21
- Visual Basic(VBA) Excel VBA でデータ転記について 1 2023/03/07 19:11
- Access(アクセス) docmd.gotorecordを起動するには 5 2022/06/17 15:20
- Access(アクセス) DoCmd.SearchForRecord が動かない時の解決方法 3 2022/07/22 15:31
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
ACCESSでパススルークエリにパラメータを使用したい
その他(データベース)
-
パススルークエリ&ACCESSテーブル VBA抽出方法
SQL Server
-
[Access] パススルークエリーで実行すると遅い
Access(アクセス)
-
-
4
Access→Oracleデータ参照にはADOとパススルークエリどちらが良い?
その他(データベース)
-
5
パススルークエリの動的パラメータの指定方法
その他(データベース)
-
6
アクセスのエラー「クエリには出力フィールドが1つ以上必要です。」
その他(Microsoft Office)
-
7
アクセスで入力したデータの順番が変わってしまいます
その他(ビジネス・キャリア)
-
8
ODBCの接続に失敗しました(3146)について
その他(Microsoft Office)
-
9
クロス集計クエリの結果をテーブルにしたい
Access(アクセス)
-
10
ACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ
Access(アクセス)
-
11
Accessでテーブルからテーブルにデータをコピーしたい
その他(データベース)
-
12
ACCESSのSQL
Access(アクセス)
-
13
2つのテーブルに共通するレコードを削除したい
Access(アクセス)
-
14
ACCESSフォーム入力後の確定
Access(アクセス)
-
15
accessの処理が遅い
その他(データベース)
-
16
ACCESS のクエリー実行に異常に時間がかかる
その他(データベース)
-
17
SQL文で パラメータが少なすぎます エラー
Access(アクセス)
-
18
アクセス VBAについて FROM句の構文エラー
Access(アクセス)
-
19
Access クエリ実行が急に非常に遅くなりました。
Access(アクセス)
-
20
ACCESSからのODBC接続のみ応答なしになる
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
Accessクエリでの、LIKE条件
-
2つのテーブルを比較して一致し...
-
Accessでテーブルからテーブル...
-
ACCESSで指定されたテーブルか...
-
Accessの追加クエリで既存のテ...
-
ACCESSに同時アクセス(編集)を...
-
リンクテーブルを CopyObject ...
-
Accessレコードの追加や変更が...
-
AccessをMDBファイルで使う場合...
-
SQLで日付を条件に削除したい
-
ODBCで接続するとDBに変更/追加...
-
ツリー構造をRDBで表現するには?
-
データ型の変更
-
Accessのフォームの並び替えを...
-
データベースで変更の多いテー...
-
DAOのTableDefs("TblName").Con...
-
3つの表を1つに縦に連結する
-
Access SELECT INTO に関する質...
-
AccessのDlookupの引数設定につ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでテーブル名やクエリ名...
-
ACCESSに同時アクセス(編集)を...
-
Accessでvlookupみたいなことは...
-
Accessでテーブルからテーブル...
-
Accessクエリでの、LIKE条件
-
Accessレコードの追加や変更が...
-
access テーブル内のレコード...
-
3つの表を1つに縦に連結する
-
SQLで日付を条件に削除したい
-
Accessの追加クエリで既存のテ...
-
SQLで条件指定結合をしたいがNU...
-
デザインビューで、連結式 を...
-
ツリー構造をRDBで表現するには?
-
ACCESSで指定されたテーブルか...
-
リンクテーブルを CopyObject ...
-
2つのテーブルを比較して一致し...
-
時間の足し算
-
ODBCで接続するとDBに変更/追加...
-
パススルークエリをテーブル作...
-
INSERT時にデータ登録とmaxの発...
おすすめ情報