Microsoft Access 掲示板

サブフォームが更新されない

5 コメント
views
4 フォロー

お世話になります。

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

「暫定クエリ」というクエリは作られるのですが、「暫定クエリ」をレコードソースとしているサブフォームが更新されません。メインフォームを開きなおせば更新されます。

どこがおかしいのでしょうか。

nokonoko
作成: 2023/10/20 (金) 16:18:07
通報 ...
1
hiroton 2023/10/20 (金) 16:41:44 45e50@f966d

ACCESSでそのような、「クエリそのものを入れ替える処理をする」のがおかしい。ですかね。そうしなければならない理由がちょっと思いつかないです

2
nokonoko 2023/10/20 (金) 17:37:13 c4a93@54883

ありがとうございます。
考え方自体が違ったようですね。

サブフォームに使われているクエリをのWHERE条件を変化させたかったので、ソースのクエリごと毎回生成させようかと思ったのですが。

3
hiroton 2023/10/20 (金) 17:54:13 45e50@f966d

フォームに設定したレコードセットに対してWHERE条件を追加したい場合、フォームのフィルター(Filter)プロパティを操作すると良いです

Form.Filter プロパティ (Access)

「レコードソースに設定したクエリ自体にWHERE条件が含まれていて、その条件を変更したい」というのはのはちょっと困難なので、そういう場合はその部分のWHERE条件を外した状態のクエリをレコードソースに設定して、やはりフィルタープロパティで操作すると良いです
デフォルトのWHERE条件を設定したい場合はフォームの読み込み時イベントで設定すればいいでしょう

4

すでにhirotonさんから的確な回答が付いていますので、蛇足ですが、
レコードソースに設定したクエリは、フォーム読み込み時にレコードセットとして開かれて読み込まれます。
その後、クエリのSQLを変更したとします。
そこで、フォームを再クエリしても、クエリからレコードセットを再読込せずに、現状のレコードセット(つまり変更前のSQLのまま)として再読込します。
よって、変更したSQLは反映されません。

hirotonさんの回答にあるように、
Where句の変更ならForm.Filterプロパティ、Order By句の変更なら、Form.OrderByプロパティで設定すればいいでしょう。

もし、それ以外の部分でSQLを変更したい場合(例えばFROM句とか...)は、いったんRecordSourceプロパティを解除してから再設定すると反映されます。

Me![サブフォーム].Form.RecordSource = ""
Me![サブフォーム].Form.RecordSource = "暫定クエリ"
5
nokonoko 2023/10/23 (月) 09:54:25 c4a93@54883

お二方、ご丁寧な説明有難うございました。
無事解決しました。