代码之家  ›  专栏  ›  技术社区  ›  Val

记录集筛选器的问题

  •  0
  • Val  · 技术社区  · 15 年前

    我在旧的ASP经典代码中对ADO记录集的过滤器有问题,我试图了解我尝试做的是不受支持,还是只是做错了。

    我有一个项目记录集,它们的状态为1(活动)或0(不活动),以及可选的结束日期。在我的管理用户界面中,我有一个控件,可以显示所有项目,也可以仅显示应向最终用户显示的项目: 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似乎不喜欢将结束日期条件与与与条件结合起来进行分组。如果我把帕伦斯拿出来,这就行了:

    rs.Filter = "Status = 1 AND End_Date = null OR End_Date > #" & Date() & "#"
    

    但这只是个意外——看起来过滤条件是按顺序评估的,所以我得到了我想要的结果。如果我把and改为or,parens就工作了:

    rs.Filter = "Status = 1 OR ( End_Date = null OR End_Date > #" & Date() & "# )"
    

    当然,这个逻辑是错误的——它显示活动的但过期的项目。

    奇怪的是,如果我移动周围的条件,它会再次断裂:

    rs.Filter = "End_Date = null OR Status = 1 AND End_Date > #" & Date() & "# "
    

    出现相同ADODB错误时崩溃。

    我似乎无法预测什么会起作用,什么不会起作用,我读过的文档对预期的语法非常粗略(它不是纯T-SQL!),限制等,以及我看到的所有例子,最多有两个条件。我认为我的情况并不那么复杂。有人能告诉我,我正在尝试做的事情是否得到支持,是否有更好的方法来做它,或者向我指出与这种逻辑相匹配的综合文档和示例吗?

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  5
  •   Bertine    15 年前

    ADO Recordset Object Filter Property :

    和和或之间没有优先权。子句可以在括号内分组。但是,不能将由或联接的子句分组,然后用和将组联接到另一个子句,如下所示:

    (姓='Smith'或姓= “琼斯”)和firstname='john'

    相反,您可以构造这个 过滤器如下:

    (lastname='smith'和firstname= “约翰”或

    (lastname='jones'和firstname= “约翰”

    所以你必须这样构造你的过滤器:

    rs.Filter = "( Status = 1 AND End_Date = null ) OR ( Status = 1 AND End_Date > #" & Date() & "# )"
    
        2
  •  0
  •   Fionnuala    15 年前

    您可能会发现这篇文章很有趣: PRB: Cannot Filter ADO Recordsets for Nulls

        3
  •  0
  •   Daniel    15 年前

    我知道您正在处理旧代码,可能还有其他事情正在处理,但是您如何在这个特定的页面中打开记录集?您是否使用了在adovbs.inc中定义的常量?

    例如:

    rs.Open "SELECT * FROM table1", db, adOpenStatic, adLockPessimistic
    
        4
  •  0
  •   Michael Riley - AKA Gunny    15 年前

    当你尝试这个的时候会发生什么…

    Dim strToday
    strToday = Now()
    rs.Filter = "Status=1 AND (End_Date = null OR End_Date > """ & strToday & """)"