Я пишу несколько VBA для создания страницы поиска в моей базе данных MS Acccess и сталкиваюсь с некоторыми проблемами с DoCmd.ApplyFilter
в подпункте Search_Click()
.
Мой код выглядит так
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))
Очевидно, что желаемая функциональность заключается в следующем ...
- Сайт выбран, Актив пуст -> Фильтр только на сайте
- Сайт выбран, Актив выбран -> Фильтр на оба
- Пустой сайт, Пустой актив -> Вернуть все строки
- Пустой сайт, выбран актив -> Фильтр только по активу
Но что на самом деле происходит ...
- Сайт выбран, Актив пуст -> работает
- Сайт выбран, Актив выбран -> работает
- Сайт пуст, Актив пуст -> строк не возвращено
- Пустой сайт, выбран актив -> строк не возвращено
Таким образом, похоже, что когда Site пуст, IsNull () не оценивает true, поэтому первая часть фильтра - FALSE, и вещь тут же закрывается.
Есть идеи, почему?