0

我正在编写一些 VBA 来在我的 MS Access 数据库中创建一个搜索页面,并DoCmd.ApplyFilterSearch_Click()sub 中遇到了一些麻烦。

在此处输入图像描述 我的代码看起来像这样

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 ,然后事情就退出了。

知道为什么吗?

4

1 回答 1

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()首先使用。

于 2011-09-18T10:21:54.453 回答