最速怪談選手権

Accessでクエリに式を入れてあるのですが、
その式をSQLのwhere句で抽出できないものでしょうか?

クエリ(管理台帳クエリ)のフィールドの式は

次回検査日: DateAdd("yyyy",[検査周期],[最終検査日])

となっており、VBAで

strSQL = "select 次回検査日 from 管理台帳クエリ where 次回検査日 <= #" & txtDate & "#"
lstTbl.RowSource = strSQL

を実行してもlstTblには何も表示されません。

txtDateは日付の入っているテキストボックス、lstTblはリストボックスです。
検査周期と最終検査日は、管理台帳テーブルに定義されているフィールドで、
検査周期には、1~3の数字が入っています。

ちなみに最終検査日に変えてみると、問題なく抽出できます。

いろいろ調べてもよくわからず、煮詰まっています。
次回検査日をテーブルに定義するしかないのでしょうか?

よろしくお願いします。

A 回答 (2件)

確かめたわけではないですが、下記の式だとどうでしょうか。



strSQL = "select 次回検査日 from 管理台帳クエリ where CDate(次回検査日) <= #" & txtDate & "#"


あるいは、

strSQL = "select 次回検査日 from 管理台帳クエリ where 最終検査日 <= DateAdd("yyyy",-[検査周期], #" & txtDate & "#)"

この回答への補足

もしや、と思って、クエリのフィールドの式を

次回検査日: CDate(DateAdd("yyyy",[検査周期],[最終検査日]))

としてみましたが、同じでした。

なお、「order by句」についても、次回検査日を入れると挙動不審です(泣

前にwhere句があるとソートされるのですが、
where句がないとリストが真っ白に‥。

↓正常に走るSQLの例
"select 管理台帳ID, 次回検査日 from 管理台帳クエリ where 部署ID = '" & txtBusho & "' order by 次回検査日 desc, 管理台帳ID"

↓リストが真っ白になるSQLの例
"select 管理台帳ID, 次回検査日 from 管理台帳クエリ order by 次回検査日 desc, 管理台帳ID"

なんどウォッチ式を確認しても、SQL文に不備はないような気がしますけれども‥。

補足日時:2014/01/31 13:04
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

CDate関数の使用ですが、ダブルクオーテーションでくくられたSQL文の中にVBA関数を記述しても、機能しないようです。

DateAdd関数については、SQL構文の外に出して、

strSQL = "select 次回検査日 from 管理台帳クエリ where 最終検査日 <= " DateAdd("yyyy", -RS1!検査周期, txtDate)

と書けばうまくいくかもしれません。

ただこれだと2回SQLを実行(1回目は検査周期の抽出)しなければならないですね。それでも単純な計算式にもかかわらずテーブルにフィールドを増やさなければならないという無駄よりは、ましかもしれませんが‥。

お礼日時:2014/01/31 12:40

#1さんの回答へ横レスさせて下さい



文字列中に”を含めたい場合は、2重に書くとOKです。

strSQL = "select 次回検査日 from 管理台帳クエリ where 最終検査日 <= DateAdd("”yyyy””,-[検査周期], #" & txtDate & "#)"
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やはり最終検査日を条件として次回検査日を抽出するしかないようですね。

hatena1989様への補足でも書きましたが、
クエリに式を入れて、それを抽出・ソート条件に使うと、どうも誤動作するような感じです。

最終検査日を使って抽出がうまくいったとしても、次回検査日でのソートがおかしくなってしまい、お手上げ状態‥。

最終検査日に1年か2年か3年を足すだけの次回検査日を、わざわざ台帳マスタにフィールド定義するのが野暮な感じですけれども、仕方がないので定義しました。

台帳に実在するフィールドのクエリですと、抽出・ソートとも正常に動作しています。
仕様の限界なのかもしれません。

お礼日時:2014/02/05 13:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す