2011-09-18 75 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」(不帶引號)。 –