【问题标题】:MS Access VBA DoCmd.ApplyFilter IsNull() evaluating falseMS Access VBA DoCmd.ApplyFilter IsNull() 评估为假
【发布时间】:2011-09-19 01:39:30
【问题描述】:

我正在编写一些 VBA 来在我的 MS Acccess 数据库中创建一个搜索页面,但在 Search_Click() 子中的 DoCmd.ApplyFilter 遇到了一些问题。

我的代码是这样的

Private Sub Search_Click()
DoCmd.ApplyFilter "", _
    "([site] = [Forms]![SWP Search]![txtSite] " & _
          " Or IsNull([Forms]![SWP Search]![txtSite])) " & _
    "AND " & _
    "([asset] = [Forms]![SWP Search]![txtAsset] " & _
        " Or IsNull([Forms]![SWP Search]![txtAsset]))"
End Sub  

或者在伪代码中...

 Shows results where true...
([site column] = txtbox1 OR isnull(txtbox1)) 
AND 
([asset col  ] = txtbox2 OR isnull(txtbox2))

显然,想要的功能如下...

  1. 已选择站点,资产空白 -> 仅在站点上过滤
  2. 已选择站点,已选择资产 -> 过滤两者
  3. 网站空白,资产空白 -> 返回所有行
  4. 网站空白,已选择资产 -> 仅过滤资产

但实际发生的是……

  1. 已选择站点,资产空白 -> 有效
  2. 网站选择,资产选择 -> 作品
  3. 网站空白,资产空白 -> 没有返回行
  4. 网站空白,已选择资产 -> 没有返回行

所以看起来当 Site 为空白时,IsNull() 没有评估 true,因此过滤器的第一部分为 FALSE,然后事情就退出了。

知道为什么吗?

【问题讨论】:

    标签: ms-access vba ms-access-2010


    【解决方案1】:

    尝试使用IsEmpty() 而不是IsNull() 会有所作为,即

          "(IsEmpty([Forms]![SWP Search]![txtSite]) " & _
          " Or [site] Like [Forms]![SWP Search]![txtSite] )" & _
    "AND" & _
        "( IsEmpty([Forms]![SWP Search]![txtAsset])" & _
        " Or [asset] Like [Forms]![SWP Search]![txtAsset] )"
    

    因为空的 txtbox 可能会返回空字符串,而不是您期望的 NULL。或者将文本框值与空字符串进行比较,可能首先使用trim()

    【讨论】:

    • IsEmpty() 仅适用于 Variant 类型的变量。
    • 原来我为组合框设置了默认值""。我认为这意味着 NULL,但显然不是。我检查了调试器,IsNull() 在空时没有评估为真。所以我摆脱了默认值,IsNull() 工作得很好。问题解决了!
    • 如果您希望默认值为 Null,请将默认值属性设置为“Null”(不带引号)。
    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    相关资源
    最近更新 更多