お世話になっております。 SQLServerのデータをODBC経由で
接続しております。 今回、パススールクエリの内容を動的に
書き換えるコードを作成しています。
Accessのリンクテーブル経由のクエリの書き換えは
以下のコードでSQL文の内容の変更は正常にできます。
変数「cat」ADOXのCatalogを
VBエディターで確認するとAccessで作成した
[q2]クエリは、VBエディターの、ViewのItem情報で取得できいます。
パススールクエリの名前に変更するとViewのItemには
存在していない事まではわかりました。
※調査方法はブレークポイントを設けて、デバック時にVBエディターの
「式」の情報から調査しています。
以下Accessのクエリであれば、SQL文の内容を書きかえ可。
Private Sub コマンド46_Click()
Dim cat As New ADOX.Catalog
Dim cmd As New ADODB.Command
cat.ActiveConnection = CurrentProject.Connection
Set cmd.ActiveConnection = cat.ActiveConnection
cmd.CommandText = "SELECT * FROM OnlineData;"
cat.Views("q2").Command = cmd
Set cat = Nothing
Set cmd = Nothing
MsgBox ("完了")
End Sub
コードに以下のODBCの接続情報を追加。
しかし、パススールクエリはVBエディターのViewには反映されませんでした。
そこで、アクセス側のクエリを以下のソースで実行したとき、
パススールクエリに更新されました。
SQL文も書き換えられました。
そこで、続けてコードを実行したところ、
パススールクエリはVBエディターのViewには反映されず、
実行時エラー ’3265’
要求された名前、または序数に対する項目はコレクションで見つかりませんでした。
とでます。
----------------------------------------------------------------------------------------
Private Sub コマンド46_Click()
Dim cat As New ADOX.Catalog
Dim cmd As New ADODB.Command
cat.ActiveConnection = CurrentProject.Connection
Set cmd.ActiveConnection = cat.ActiveConnection
cmd.CommandText = "SELECT * FROM OnlineData;"
'以下の情報を追加してみましたが、Viewに該当するパススールの
'情報をデバック時に取得でてきませでした。
cmd.Properties("Jet OLEDB:ODBC Pass-Through Statement") = True
cmd.Properties ("Jet OLEDB:Pass Through Query Connect String") = _
"ODBC;DSN=test01;database=testProduction;UID=testUser;PWD=*****;
cat.Views("q2").Command = cmd
Set cat = Nothing
Set cmd = Nothing
MsgBox ("完了")
End Sub
VBAからパススールのオブジェクト情報にアクセスする方法が
現在調査中ですが、詳しい情報をお持ちでしたら
ご教示していただければ幸いです。
追記 DAOでのQueryDefsでの記述も検討していますが、将来的に
オラクル、MySQLなどの接続を考えてADOで統一したいと考えております。
取り敢えずググっただけなので的外れでしたら、ごめんなさい。
Views コレクションおよび CommandText プロパティの例 (VB)
' Get the command.
Set cmd = cat.Views("AllCustomers").Command
これに相当するコードが必要なのかしら。
cat.Procedures("q2")
ではいかがですか?
cat をVBEのウォッチ式で観察したところ、
cat.Tables
・システムテーブル
・リンクテーブル
・ローカルテーブル(というのかわかりませんが、Accessのテーブル)
cat.Procedures
・ローカルテーブルのみを参照するクエリ
・パススルークエリ
cat.Views
・リンクテーブルを参照するクエリ
となるようです。
りんごさん、toneさん
ご教示ありがとうございます。
cat.Procedures("q2").Command = cmd
でパススルークエリのSQL文を書き換えることができました‼
とても嬉しいです‼
これでSQLServerなどの
ウィンドウ関数(OLAP関数)がAccess側で
柔軟に使用するとこができます。
お忙しいところお力添えいただき
誠にありがとうございました。
これからもよろしくお願いします。
以上