MS Access VBA DoCmd.ApplyFilter IsNull()评估为false

时间:2011-09-18 10:05:12

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

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

enter image description here 我的代码看起来像这样

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. 网站空白,资产空白 - >返回所有行
  5. 网站空白,选择资产 - >仅过滤资产
  6. 但实际发生的是......

    1. 选择网站,资产空白 - >原理
    2. 选择网站,选择资产 - >原理
    3. 网站空白,资产空白 - > 没有返回任何行
    4. 网站空白,选择资产 - > 没有返回任何行
    5. 所以看起来当Site为空时,IsNull()不会评估为true,因此过滤器的第一部分为FALSE,然后就会退出。

      知道为什么吗?

1 个答案:

答案 0 :(得分: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()