お世話になります。
Dim db As dao.Database
Dim qdf As QueryDef
Dim strSQL,strquery As String
Set db = CurrentDb
strquery="暫定クエリ"
strSQL = "(中略)"
Set qdf = db.CreateQueryDef(strquery, strSQL)
Me![サブフォーム].Requery
「暫定クエリ」というクエリは作られるのですが、「暫定クエリ」をレコードソースとしているサブフォームが更新されません。メインフォームを開きなおせば更新されます。
どこがおかしいのでしょうか。
ACCESSでそのような、「クエリそのものを入れ替える処理をする」のがおかしい。ですかね。そうしなければならない理由がちょっと思いつかないです
ありがとうございます。
考え方自体が違ったようですね。
サブフォームに使われているクエリをのWHERE条件を変化させたかったので、ソースのクエリごと毎回生成させようかと思ったのですが。
フォームに設定したレコードセットに対してWHERE条件を追加したい場合、フォームのフィルター(Filter)プロパティを操作すると良いです
Form.Filter プロパティ (Access)
「レコードソースに設定したクエリ自体にWHERE条件が含まれていて、その条件を変更したい」というのはのはちょっと困難なので、そういう場合はその部分のWHERE条件を外した状態のクエリをレコードソースに設定して、やはりフィルタープロパティで操作すると良いです
デフォルトのWHERE条件を設定したい場合はフォームの読み込み時イベントで設定すればいいでしょう
すでにhirotonさんから的確な回答が付いていますので、蛇足ですが、
レコードソースに設定したクエリは、フォーム読み込み時にレコードセットとして開かれて読み込まれます。
その後、クエリのSQLを変更したとします。
そこで、フォームを再クエリしても、クエリからレコードセットを再読込せずに、現状のレコードセット(つまり変更前のSQLのまま)として再読込します。
よって、変更したSQLは反映されません。
hirotonさんの回答にあるように、
Where句の変更ならForm.Filterプロパティ、Order By句の変更なら、Form.OrderByプロパティで設定すればいいでしょう。
もし、それ以外の部分でSQLを変更したい場合(例えばFROM句とか...)は、いったんRecordSourceプロパティを解除してから再設定すると反映されます。
お二方、ご丁寧な説明有難うございました。
無事解決しました。