クエリー(QueryDefs)に
~sq〜 や
~TMPCLP〜 という名前のゴミやオバケと思えるものが出てくることがあります。その原因を追求してました。
ただ、あくまで私の出した結論であって 100%正しいかどうかは疑問ですので、信じるかどうかは皆さんにお任せします。
さて、この変な名前のクエリーは Access95までは出現していませんでした。つまり、
Access97になって出現したようです。
システムテーブル
MSysObjects のフィールド
Type = 5 のものがクエリーに関する情報らしく、フィールド
Flags がクエリーの種類をあらわしていると思われます。また、
Flags の値は QueryDefオブジェクトの Typeプロパティの値に一致しているようです。
参考までに、まともな(データベース ウィンドウに表示されている)クエリー(QueryDefオブジェクト)の
Typeプロパティの値は...選択クエリーは
0 (dbQSelect)、削除クエリーは
32 (dbQDelete)、更新クエリーは
48 (dbQUpdate)、追加クエリーは
64 (dbQAppend)等...(カッコ内は VBAの組み込み定数)。
ゴミやオバケと思われているクエリーには 2種類ありました。
一つは
Flags = 1 となっている
ゴミ。
クエリーを削除した直後に出現しましたが、ファイルを閉じる等のタイミングだと思うんですが、
勝手に消滅します。このクエリーの名前は
~TMPCLPxxxxx というような感じで作成されるようです。
もう一つが
Flags = 3 となっているもので、ゴミでもオバケでもありませんでした(考え方によってはオバケと言えるかもしれませんけどね)。
具体的には、
フォームやレポートのレコードソース(RecordSource)プロパティが(クエリービルダを使ったりして)SQL文になっている場合や、コンボボックス等のコントロールの値集合ソース(RowSource)プロパティが前述のレコードソース プロパティと同様に SQL文になっているような場合に出現します。
これらの
QueryDefオブジェクトの
名前(Name)は、以下のような命名規則だと思われます。
Form の RecordSource に対応するもの |
~sq_fフォーム名 |
Report の RecordSource に対応するもの |
~sq_rレポート名 |
Form の Control の RowSource に対応するもの |
~sq_cフォーム名^sq_cコントロール名 |
Report の Control の RowSource に対応するもの |
~sq_dレポート名^sq_dコントロール名 |
そして結論としては
...「(本当の)クエリーの一覧を取得する場合はQueryDefsコレクションから QueryDefオブジェクトの Typeプロパティが 1 または 3 のものを除外する」ということです。
その後、
Access2000で
テーブル(TableDefs)に
~TMPCLP〜 という名前のものが出てきました。でも上記クエリーの場合とは異なり
Flags = 1 にはなっていないのです。でも
他の正常な(?)オブジェクトでは Flags が偶数だったので、当面完璧と思える結論は...
「Typeプロパティが奇数のものを除外する」ということです。