Access (VBA)

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

 
(Windows 10 Home : Access 2010)
クエリSQL文の書き換え
投稿日時: 20/10/19 12:18:48
投稿者: mmiwa

いつもありがとうございます
 
クエリのSQL文をDAOを利用して以下のように書き換えを行うことがあります
ADOを利用して書き換えてみたいと考え、ADOによるSQL文の書き換えを検索しましたが
DAOを利用したものばかりでADOを利用したものをヒットできずに困っています
 
教えていただけないでしょうか
 
<現状>
Dim myDB As Database
Dim Qdf As QueryDef
 
Set myDB = CurrentDb
Set Qdf = myDB.QueryDefs("クエリ1")
 
mySQL="select …
Qdf.sql = mySQL

回答
投稿日時: 20/10/19 13:53:38
投稿者: sk

引用:
クエリのSQL文をDAOを利用して以下のように書き換えを行うことがあります
ADOを利用して書き換えてみたいと考え、ADOによるSQL文の書き換えを検索しましたが
DAOを利用したものばかりでADOを利用したものをヒットできずに困っています

恐らくそちらの方法は何かと使い勝手が悪いからでしょう。
 
即効テクニック より:
https://www.moug.net/tech/acvba/0040008.html
 
・ADODB / ADOX を使用する場合、クエリの作成と削除は出来るが、
 作成済みのクエリの SQL を直接書き換えることは出来ない。
 (どうしてもやる場合は、削除してから追加という流れになる)
 
・作成するクエリの種類に応じて Append 先が異なる。
 ( Views コレクション、Procedures コレクションのいずれか)
 
・任意のクエリを削除する場合も上記と同様、
 Views コレクションと Procedures コレクションの
 どちらに存在するかを調べる必要がある。

回答
投稿日時: 20/10/19 14:08:02
投稿者: Suzu

残念ながら、ADO単体として、クエリオブジェクトのSQLを書き換える機能はありません。
 
ADOX と併用する事で可能となります。【Sumple1】
 
Views コレクションと CommandText プロパティの使用例 (VB)
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/views-collection-commandtext-property-example-vb
 
 
DDL を使用したくとも、ALTER VIEW ステートメントは、Accessに対しては機能しませんので
エラーとなります。【Sumple2】
 
 
DROP VIEW と、CREATE VIEW ステートメントを使用して 既存のクエリを削除→作成なら可能です。【Sumple3】
 

Sub Sumple1()
    '要参照設定
    ' Microsoft ActiveX Data Objects 2.8 Library
    ' Microsoft AOD Ext. 2.8 for DDL and Security

    Dim cn As ADODB.Connection
    Dim cat As ADOX.Catalog

    Set cn = CurrentProject.Connection

    Set cat = New ADOX.Catalog

    Set cat.ActiveConnection = cn
    With cat.Views("クエリ13")
        .Command.CommandText = "SELECT * FROM 末日;"
    End With
    Set cat = Nothing
    Set cn = Nothing
End Sub

 
Sub Sumple2()
    '要参照設定
    ' Microsoft ActiveX Data Objects 2.8 Library

    Dim cn As ADODB.Connection

    Set cn = CurrentProject.Connection
    
    cn.Execute "ALTER VIEW クエリ51 AS SELECT * FROM 末日;"

    Set cn = Nothing
End Sub

 
Sub Sumple3()
    '要参照設定
    ' Microsoft ActiveX Data Objects 2.8 Library

    Dim cn As ADODB.Connection
    Dim cmd As ADODB.Command

    Set cn = CurrentProject.Connection

    Set cmd = New ADODB.Command
    cmd.ActiveConnection = cn

    cmd.CommandText = "DROP VIEW クエリ51"
    cmd.Execute

    cmd.CommandText = "CREATE VIEW クエリ51 AS SELECT * FROM 末日;"
    cmd.Execute

    Set cn = Nothing
End Sub

回答
投稿日時: 20/10/19 14:24:15
投稿者: sk

sk さんの引用:
・ADODB / ADOX を使用する場合、クエリの作成と削除は出来るが、
 作成済みのクエリの SQL を直接書き換えることは出来ない

Suzu さんの引用:
Views コレクションと CommandText プロパティの使用例 (VB)
https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/views-collection-commandtext-property-example-vb

出来ましたね。失礼しました。

回答
投稿日時: 20/10/19 17:34:10
投稿者: Suzu

sk さんの引用:
・作成するクエリの種類に応じて Append 先が異なる。
 ( Views コレクション、Procedures コレクションのいずれか)
 
・任意のクエリを削除する場合も上記と同様、
 Views コレクションと Procedures コレクションの
 どちらに存在するかを調べる必要がある。

 
それが抜けてました。VIEWとは限りませんでしたね。
 
選択クエリ は VIEW でした。
クロス集計クエリ、削除クエリ、更新クエリ、追加クエリ(INSERT INTO〜SEELECT) は Procedure でした。
 
SELECTが入るかで 決まるのかと思いきや そうでも無いみたい。
個人的には DAOで処理してしまいますので全ては調べていません。

回答
投稿日時: 20/10/20 09:22:12
投稿者: sk

引用:
選択クエリ は VIEW でした。

厳密に言えば「パラメータがない選択クエリ」が View ですね。
 
引用:
クロス集計クエリ、削除クエリ、更新クエリ、追加クエリ(INSERT INTO〜SELECT) は Procedure でした。

それらに加えて、パラメータクエリ、ユニオンクエリ、
データ定義クエリ、パススルークエリも
Procedure として扱われます。

回答
投稿日時: 20/10/21 10:25:50
投稿者: Suzu

sk さんの引用:
引用:
選択クエリ は VIEW でした。

厳密に言えば「パラメータがない選択クエリ」が View ですね。
 
引用:
クロス集計クエリ、削除クエリ、更新クエリ、追加クエリ(INSERT INTO〜SELECT) は Procedure でした。

それらに加えて、パラメータクエリ、ユニオンクエリ、
データ定義クエリ、パススルークエリも
Procedure として扱われます。

 
追加情報ありがとうございます。

投稿日時: 20/10/21 14:32:02
投稿者: mmiwa

skさん、Suzuさん
 
お返事遅くなりました
 
ADOとADOXとの併用が必要なんですね
大変勉強になりました
 
DAOに比べてやや煩雑なので
(慣れればそうでもないかもしれませんが…)
しばらくはDAOで書き換えることになりそうです
 
せっかく教えていただいたのに
申し訳ありません
 
本当にありがとうございました