2011-09-18 74 views
0

我正在写一些VBA在我的MS Acccess数据库中创建一个搜索页面,并跑入在Search_Click()子一些麻烦DoCmd.ApplyFilter的MS Access VBA DoCmd.ApplyFilter ISNULL()评估假

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. 网站的空白,资产选择 - 资产只有

>过滤但是,什么是实际发生的情况是。 ..

  1. 站点选择,资产空白 - >工作
  2. 站点选择,选择资产 - >工作
  3. 网站的空白,空白的资产 - >个没有行返回
  4. 网站的空白,资产选择 - >没有行返回

所以它看起来像当网站是空白的,ISNULL()是不是真正的评估等的第一部分过滤器是假的,只是在那里退出然后。

任何想法,为什么?

回答

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()

+0

IsEmpty()仅适用于Variant类型的变量。 –

+0

事实证明,我为组合框设置了默认值“'”'。我认为这将意味着NULL,但显然它不。我检查了调试器,当空的时候IsNull()没有被评估为true。所以我摆脱了默认值,'IsNull()'效果很好。问题解决了! –

+0

如果您希望默认值为Null,请将默认值属性设置为“Null”(不带引号)。 –