2017-02-02 15 views
0

Я создал форму поиска, которая использует поля внутри нее для фильтрации содержащейся подформы. Это отлично работает, за исключением случаев, когда поля поиска пустые, все записи в показе запроса.Извлечь пустой запрос в форме поиска, когда поля поиска пустые

Я бы хотел (а) пользователей, чтобы увидеть записи, пока они не начнут заполнять критерии поиска (только если поля поиска пустые).

Примечание: Не все критерии поиска требуются, поэтому некоторые поля могут быть пустыми при использовании формы.

Другое примечание: Я НЕ пытаюсь отфильтровать пустые поля в запросе.

*** EDIT: У меня есть форма, давайте назовем его ФРБИ. В этой форме есть подформация, назовем ее sfmB. Источником записи для sfmB является запрос, который мы будем называть qryB.

Пример запроса (который снова работает как надо):

SELECT FieldA, FieldB, FieldC, FieldD, FieldE 
FROM tblA 
WHERE (FieldA Like "*" & [Forms]![frmA]![FieldA] & "*") 
    AND (FieldB Like "*" & [Forms]![frmA]![FieldB] & "*") AND ...; 

Пытались:

WHERE (IIf(IsNull([Forms]![frmA]![FieldA])=True, "", FieldA 
        Like "*" & [Forms]![frmA]![FieldA] & "*"))... 

Также пробовал:

WHERE (IIf([Forms]![frmA]![FieldA])="", "", FieldA 
      Like "*" & [Forms]![frmA]![FieldA] & "*")... 

Также пробовал:

WHERE (IIf([Forms]![frmA]![FieldA])=Null, "", FieldA 
      Like "*" & [Forms]![frmA]![FieldA] & "*")... 
+1

Можете ли вы показать, что вы пробовали до сих пор, чтобы люди могли видеть, что нужно улучшить. – Skippy

+0

См. Править. –

+0

@Parfait спасибо за форматирование кодовых букв для меня! Все: новое редактирование - удаленная обратная косая черта из образца кода. –

ответ

0

Причина возврата всех записей является пустой контроль формы возвращают любое значение, как вы не конкатенации ничего с групповыми символами так возвращает этот шаблон поиска ** в оценке LIKE. Как показано ниже с пустыми строками или нулями, этот шаблон поиска возвращает все записей, которые имеют любой непустой символ.

SELECT FieldA, FieldB, FieldC, FieldD, FieldE 
FROM tblA 
WHERE (FieldA Like "*" & '' & "*") 
    AND (FieldB Like "*" & '' & "*") AND ...;  

SELECT FieldA, FieldB, FieldC, FieldD, FieldE 
FROM tblA 
WHERE (FieldA Like "*" & NULL & "*") 
    AND (FieldB Like "*" & NULL & "*") AND ...; 

Для решения рассмотрит конкатенацию символа (ы), которые не будут отображаться в вас колонке с заменой NZ(). Ниже логики теперь будут возвращены все записи по значениям поиска формы, как есть. Однако, если значения формы пустые, NZ() заменяет ~, и любые записи с этим символом в столбце возвращаются. Предполагая, что в этой колонке не существует тильды, никаких записей не выводится.

SELECT FieldA, FieldB, FieldC, FieldD, FieldE 
FROM tblA 
WHERE (FieldA Like "*" & NZ([Forms]![frmA]![FieldA], '~') & "*") 
    AND (FieldB Like "*" & NZ([Forms]![frmA]![FieldB], '~') AND ...; 

Оказывается, для всемерного осуществления NZ() стоимость замещения должны быть заменены динамически.Таким образом, рассмотреть вопрос о включении VBA в взаимоисключающих условий:

  1. Когда все поля пусты, NZ() должны использовать Тильда (~).

  2. Если хотя бы одно поле не пустое, все оставшиеся пустые поля 'NZ() должны использовать оператор подстановочных знаков, звездочку (*).

Dim i As Integer, num_search_fields As Integer 
Dim strSQL As String 
Dim var As Variant 

i = 0 
num_search_fields = 5 
' LOOP THROUGH ALL SEARCH FIELDS 
For Each var in Array("FieldA", "FieldB", "FieldC", "FieldD", "FieldE") 
    If IsNull(Forms("frmA").Controls(var).Value) Then 
     i = i + 1 
    End If 
Next var 

' CONDITIONALLY BUILD SQL 
If i = num_search_fields Then 
     strSQL = "SELECT FieldA, FieldB, FieldC, FieldD, FieldE" _ 
       & " FROM tblA" _ 
       & " WHERE (FieldA Like '*' & NZ([Forms]![frmA]![FieldA], '~') & '*')" _ 
       & " AND (FieldB Like '*' & NZ([Forms]![frmA]![FieldB], '~') & '*')" _ 
       & " AND (FieldC Like '*' & NZ([Forms]![frmA]![FieldC], '~') & '*')" _ 
       & " AND (FieldD Like '*' & NZ([Forms]![frmA]![FieldD], '~') & '*')" _ 
       & " AND (FieldE Like '*' & NZ([Forms]![frmA]![FieldE], '~') & '*')" 
Else 
     strSQL = "SELECT FieldA, FieldB, FieldC, FieldD, FieldE" _ 
       & " FROM tblA" _ 
       & " WHERE (FieldA Like '*' & NZ([Forms]![frmA]![FieldA], '*') & '*')" _ 
       & " AND (FieldB Like '*' & NZ([Forms]![frmA]![FieldB], '*') & '*')" _ 
       & " AND (FieldC Like '*' & NZ([Forms]![frmA]![FieldC], '*') & '*')" _ 
       & " AND (FieldD Like '*' & NZ([Forms]![frmA]![FieldD], '*') & '*')" _ 
       & " AND (FieldE Like '*' & NZ([Forms]![frmA]![FieldE], '*') & '*')" 
End If 

' ASSIGN SQL STRING TO SUBFORM RECORDSOURCE 
Forms!frmA!subform.Form.RecordSource = strSQL 
Forms!frmA!subform.Form.Requery 
+0

Еще раз спасибо за форматирование моего кода кода для кодаблока для меня, но когда это было сделано, мне пришлось отредактировать его, чтобы удалить предыдущий «\», который не является частью моего кода, но был необходим для форматирования, чтобы показать амперсанд. Я обновил образец кода, чтобы показать «*» вместо «\\ *» –

+0

Обновлено соответствующим образом. Но независимо от обратной косой черты или нет, концепция такая же. Этот шаблон поиска времени находится где угодно в строке, а не между '\'. – Parfait

+0

Мой запрос обновлен, и это работает отлично. Спасибо! \ * танец радости \ * –

0

Попробуйте это:

WHERE ([Forms]![frmA]![FieldA] Not Is Null) AND (FieldA Like "*" & [Forms]![frmA]![FieldA] & "*") 
0

Если вы не хотите никаких записей возвращается, когда все критерии поиска пустая, то вы должны явно и отдельно проверить для этого условия в вашем ИНЕКЕ. Что-то вроде:

SELECT FieldA, FieldB, FieldC, FieldD, FieldE 
FROM tblA 
WHERE 
    NOT (IsNull([Forms]![frmA]![FieldA]) 
     AND IsNull([Forms]![frmA]![FieldB]) 
     AND IsNull([Forms]![frmA]![FieldC]) 
     AND IsNull([Forms]![frmA]![FieldD]) 
     AND IsNull([Forms]![frmA]![FieldE])) 
    AND (FieldA Like "*" & [Forms]![frmA]![FieldA] & "*") 
    AND (FieldB Like "*" & [Forms]![frmA]![FieldB] & "*") AND ...; 

Так что, если все поля поиска на ФРБИ равны нулю, то условие внутри NOT (...) скобок будет TRUE, то NOT превратит это в FALSE и так вся ваша WHERE статья будет FALSE и ни одной строки будут возвращены. Если таковые имеются, если поля поиска имеют значение, то внутри NOT (...) будет FALSE, NOT превратит это TRUE, а затем все остальные условия, применяемые остальной частью вашего предложения WHERE, войдут в игру.

EDIT - Я только что перечитал ответ от Parfait, и на самом деле я считаю, что это более аккуратное решение!

+0

Я тоже пытаюсь это решение ... я предполагаю, что я что-то пропускаю в переводе, потому что результаты совпадают с моими исходными запросами. Все еще работаю над этим! –