2016-06-24 17 views
1

私は2回のアクセスがgetData_joingetData_staticに照会があるとします。AccessでサブクエリSQLを動的に変更する方法はありますか。

getData_static

select * from someTable where someTable.property="value" 

getData_join

select * from someTable inner join otherTable on someTable.property=otherTable.property 

データベースはgetData_joinを呼び出すクエリ、例えば、items_getDataをたくさん持っている:

select * from items inner join getData_join on items.property=getData_join.property 

私は、ユーザーがこれらのクエリはgetData_staticまたはgetData_joinを呼び出すかどうかを選択できるようになるフロントエンドにスイッチを設定したいです。そのように、クエリ定義を使用してその場でSQLを定義し、その後

select * from someTable [insertClause] 

と::

をするのではなく、私は多分のようなダミーの句で、一般的な getDataクエリを持っていることについて考えていた、クエリ2つの別々のセットを作ります
Function modify_getData(isJoin As Boolean) As QueryDef 

Dim qdf As QueryDef 

Set qdf = CurrentDb.QueryDefs("getData") 

If isJoin Then 
    qdf.sql = Replace(qdf.sql, "[insertClause]", "inner join otherTable on someTable.property=otherTable.property") 
Else 
    qdf.sql = Replace(qdf.sql, "[insertClause]", "where someTable.property=""value""") 
End If 

Set modify_getData = qdf 

End Function 

問題は、フロントエンドが直接getDataを呼び出さないということです、それはそのように修飾getDataクエリ定義は、ここで使用のではないでしょう作成、items_getDataを呼び出します。変更されたSQLがそれを呼び出す別のクエリで使用されるように、Access内のサブクエリのSQLを動的に変更する方法はありますか?

+0

他の多くのクエリでもフォーム/レポートでも使用されているので、2つの別々のクエリとして扱うことをお勧めします。コードが壊れて、クエリを使用するオブジェクトが失敗します。クエリは非データアプリケーションアイテムなので、あまりにも多くの領域を占有しません。 Plus Accessのエンジンは、VBAスクリプトクエリではなく、保存されたクエリをコンパイルして最適化します。 – Parfait

+1

@パールファット:問題は、スペースではなく、すべてのクエリのメンテナンスだと思います。 – Andre

+0

あなたの置換は一度しか動作しません。なぜなら、その後はqdf.sqlに '[insertClause]'がなくなるからです。 – Andre

答えて

0

すべてのクエリでクエリ名を置き換える必要があります。Db.QueryDefsのループで簡単に行うことができます。

SELECT * FROM getData_staticという参照クエリがあります。

.Sqlを参照して、クエリの現在の状態を確認してください。 「スイッチ」と一致しない場合は、

Set Db = CurrentDb 
For Each qdf in Db.QueryDefs 
    qdf.Sql = Replace(qdf.Sql, "getData_static", "getData_join") 
Next qdf 

またはその逆を実行します。

"getData_static"と "getData_join"は、いずれのクエリでも他の文字列の一部として表示されないように固有のものであることを確認する必要があります。

関連する問題