レコードセットのフィルターの問題
-
19-09-2019 - |
質問
私は、レガシーASPクラシックコードでADOレコードセットのフィルターとのトラブルを抱えている、と私は、私はちょうどそれが間違ってやっている場合は、私がやろうとしていることはサポートされ、されているかどうかを理解しようとしています。
私はアイテムのレコードを持っている、と彼らは(アクティブ)1または0(非アクティブ)のステータス、およびオプションのEND_DATEを持っています。私の管理ユーザーインターフェイスでは、私はエンドユーザーに表示する必要があるすべてのアイテムやのみを表示するように制御を持っている:Status = 1 AND ( End_Date is null OR End_Date > Date() )
そのロジックを実装するには、私が試した:
rs.Filter = "Status = 1 AND ( End_Date = null OR End_Date > #" & Date() & "# )"
しかし、私は取得
ADODB.Recordset (0x800A0BB9)
Unknown runtime error
ずっと浮気した後、ADOは、グループ化がAND条件と組み合わせてEND_DATE条件の周りに括弧好きではないようです。私は括弧を取る場合は、この作品ます:
rs.Filter = "Status = 1 AND End_Date = null OR End_Date > #" & Date() & "#"
しかし、それは単なる偶然だ - それは、フィルタ条件を順に評価されているように見える、と私は私が望む結果を得ます。私はAND ORに変更した場合は、括弧は動作します:
rs.Filter = "Status = 1 OR ( End_Date = null OR End_Date > #" & Date() & "# )"
しかし、もちろんのロジックが間違っている - それは、Activeが、期限切れの項目を示しています。
。私は周りの状況を移動する場合は奇妙な、それが再び壊れます:
rs.Filter = "End_Date = null OR Status = 1 AND End_Date > #" & Date() & "# "
同じADODBエラーでクラッシュします。
(それはない、純粋なT-SQLです!)私はと動作しません。どうなるかを予測することができないよう、そして私が読んだドキュメントが期待構文の非常に大雑把です、制限、などとし、すべての私が見てきた例は、ほとんどの二つの条件であります。私は私の条件がすべてその複雑ではないと思います。誰もがそれを行うには良い方法があるかどう私がやろうとしているが、サポートされている場合を教え、またはこの種のロジックに合わせ、包括的なドキュメントとサンプルに私を指すことができますか?
ありがとうございます。
解決
ANDとORの間には優先順位はありません。句は括弧内でグループ化することができます。ただし、グループの句はORで結合し、その後、このようなANDと別の句にグループに参加することはできません。
(姓= 'スミスのOR姓= 「ジョーンズ)AND姓= 'ジョン'
その代わり、あなたはこれを構築します フィルタとしてます:
(姓= 'スミス' AND姓= 'ジョン・')OR
(姓= 'ジョーンズ' AND姓= 'ジョン・')
ですから、このようなあなたのフィルタを作成する必要があります。
rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"
他のヒント
私はあなたのレガシーコードと、おそらく他のものが働いているで作業していることを知っているが、どのようにあなたは、この特定のページにレコードセットを開くのですか?あなたはadovbs.incで定義されたいくつかの定数を使用していますか?
例
rs.Open "SELECT * FROM table1", db, adOpenStatic, adLockPessimistic
あなたはこれをしようとするとどうなります...
タグ
Dim strToday
strToday = Now()
rs.Filter = "Status=1 AND (End_Date = null OR End_Date > """ & strToday & """)"