MS Access VBA DoCmd.ApplyFilter IsNull () с оценкой false - PullRequest
0 голосов
/ 18 сентября 2011

Я пишу несколько VBA для создания страницы поиска в моей базе данных MS Acccess и сталкиваюсь с некоторыми проблемами с DoCmd.ApplyFilter в подпункте 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. Пустой сайт, выбран актив -> Фильтр только по активу

Но что на самом деле происходит ...

  1. Сайт выбран, Актив пуст -> работает
  2. Сайт выбран, Актив выбран -> работает
  3. Сайт пуст, Актив пуст -> строк не возвращено
  4. Пустой сайт, выбран актив -> строк не возвращено

Таким образом, похоже, что когда Site пуст, IsNull () не оценивает true, поэтому первая часть фильтра - FALSE, и вещь тут же закрывается.

Есть идеи, почему?

1 Ответ

1 голос
/ 18 сентября 2011

Попробуйте использовать 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().

...