トップ回答者
openformメソッドで、filterが効かない。

質問
-
回答
-
FilterNameという名前が示しているように、フィルタ(抽出条件)を設定するもので、レコードソースを設定するものではありません。
フォームのレコードソースを元に抽出条件を設定したクエリを指定すれば、フィルタがかかります。
レコードソースと関係ないクエリ、あるいはレコードソースが指定してないフォームで指定しても無視されます。
抽出条件が変わるだけでなく、対象テーブルや結合状態が変わるようなクエリを設定したい場合は、
RecordSourceプロパティに直接クエリ名を設定してください。
コード例
DoCmd.OpenForm "帳票フォーム", , , , , acHidden Forms!帳票フォーム.RecordSouce = "クエリ名" Forms!帳票フォーム.Visible = True
すべての返信
-
Docmd.Openform "帳票フォーム",,"条件クエリ"
帳票フォームの設計時のプロパティでは、データソースは、未設定になっています。ところが、この条件クエリが効きません。しょうがなく、同じクエリ名をデータソースに設定すると、幾つかある条件クエリは、それぞれ動作・表示されます。
なにか、これを有効にする条件などがあるのでしょうか?
データソースが未設定と言うことですが、フォームの「レコードソース」プロパティが空白になっていると言うことでしょうか。もし、そうならば、フォームには何も表示されません。
Openform の第3引数(FilterName)はフィルタを設定するためのもので、ソースに何もないものにフィルタをかけてもやはり何もないことになります。
使い方としては、レコードソースには、テーブルをそのまま設定するか、抽出条件を設定していないクエリを設定して、フィルタをかけたいときに、応じたクエリ名を、第3引数に設定するという使い方をします。
ただ、VBAでフォームを開くときにフィルタをかけるなら、第4引数(WhereCondition)を設定する使い方が一般的です。
Docmd.Openform "帳票フォーム", , ,"抽出条件式"
-
回答有り難うございます。
openformメソッドのヘルプに以下の様な説明があるのですが、
>FilterName 省略可能です。バリアント型 (Variant) の値を指定します。カレント データベースのクエリの有効な名前を文字列式で指定します。
私は、このクエリに寄って、データソースが決まるのだと思っていました。
試しに、基本となるテーブルをプロパティのデータソースに設定して、なおかつ、このFilterにもっと複雑な事をしているクエリを第3パラメータFilterに与えてみると、Filterは、全く無視されて、テーブルが全部表示されてしまいました。
第2パラメータ以降をコメントアウトして、当該クエリをプロパティに記述すると、思った通りのクエリの結果が表示されます。
フォームは、データ表示の枠で、その内容をクエリを切り替えることによって、色々な表示をさせる、というのは、間違った使い方なのでしょうか?
-
FilterNameという名前が示しているように、フィルタ(抽出条件)を設定するもので、レコードソースを設定するものではありません。
フォームのレコードソースを元に抽出条件を設定したクエリを指定すれば、フィルタがかかります。
レコードソースと関係ないクエリ、あるいはレコードソースが指定してないフォームで指定しても無視されます。
抽出条件が変わるだけでなく、対象テーブルや結合状態が変わるようなクエリを設定したい場合は、
RecordSourceプロパティに直接クエリ名を設定してください。
コード例
DoCmd.OpenForm "帳票フォーム", , , , , acHidden Forms!帳票フォーム.RecordSouce = "クエリ名" Forms!帳票フォーム.Visible = True