Val*_*Val 0 vbscript ado filter recordset asp-classic
我在传统的ASP Classic代码中使用ADO Recordset上的过滤器时遇到了问题,而我正在尝试了解我是否不支持我正在尝试做什么,或者我是否只是做错了.
我有一个Items记录集,它们的状态为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() & "# )"
Run Code Online (Sandbox Code Playgroud)
但我明白了
ADODB.Recordset (0x800A0BB9)
Unknown runtime error
Run Code Online (Sandbox Code Playgroud)
经过多次愚弄,似乎ADO不喜欢End_Date条件下的分组parens与AND条件相结合.如果我把parens拿出来,这有效:
rs.Filter = "Status = 1 AND End_Date = null OR End_Date > #" & Date() & "#"
Run Code Online (Sandbox Code Playgroud)
但这只是一个意外 - 它看起来像是按顺序评估过滤条件,所以我得到了我想要的结果.如果我将AND更改为OR,则parens工作:
rs.Filter = "Status = 1 OR ( End_Date = null OR End_Date > #" & Date() & "# )"
Run Code Online (Sandbox Code Playgroud)
但当然这种逻辑是错误的 - 它显示了活动但过期的项目.
奇怪的是,如果我移动条件,它会再次破裂:
rs.Filter = "End_Date = null OR Status = 1 AND End_Date > #" & Date() & "# "
Run Code Online (Sandbox Code Playgroud)
崩溃时出现相同的ADODB错误.
我似乎无法预测什么会起作用,哪些行不通,我读过的文档在预期的语法上非常粗略(它不是纯粹的T-SQL!),限制等等以及我所有的例子.我们看到最多有两个条件.我认为我的条件并不复杂.任何人都可以告诉我,如果有更好的方法可以支持我是否支持,或者指向我那些符合这种逻辑的综合文档和样本?
谢谢!
小智 5
AND和OR之间没有优先权.子句可以在括号内分组.但是,您不能将OR加入的子句分组,然后将该组加入另一个带AND的子句,如下所示:
(LastName ='Smith'或LastName ='Jones')AND FirstName ='John'
相反,您将构建此过滤器:
(LastName ='Smith'AND FirstName ='John')或
(LastName ='Jones'AND FirstName ='John')
所以你必须像这样构建你的过滤器:
rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10227 次 |
| 最近记录: |