Причина возврата всех записей является пустой контроль формы возвращают любое значение, как вы не конкатенации ничего с групповыми символами так возвращает этот шаблон поиска **
в оценке 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 в взаимоисключающих условий:
Когда все поля пусты, NZ()
должны использовать Тильда (~
).
Если хотя бы одно поле не пустое, все оставшиеся пустые поля '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
Можете ли вы показать, что вы пробовали до сих пор, чтобы люди могли видеть, что нужно улучшить. – Skippy
См. Править. –
@Parfait спасибо за форматирование кодовых букв для меня! Все: новое редактирование - удаленная обратная косая черта из образца кода. –