Возвращает записи, которые частично соответствуют значению
Вопрос
Я пытаюсь заставить работать запрос, который принимает значения (иногда только первую часть строки) из элемента управления form.Проблема, с которой я сталкиваюсь, заключается в том, что он возвращает записи только тогда, когда введена полная строка.
т. е.в поле фамилия я должен иметь возможность ввести gr, и это приведет к появлению
зеленый серый грэм
но в настоящее время это ничего не выдает, если не используется полная строка поиска.
В рассматриваемой форме есть 4 элемента управления поиском, и они используются в запросе только в том случае, если поле заполнено.
Запрос заключается в :
SELECT TabCustomers.*,
TabCustomers.CustomerForname AS NameSearch,
TabCustomers.CustomerSurname AS SurnameSearch,
TabCustomers.CustomerDOB AS DOBSearch,
TabCustomers.CustomerID AS MemberSearch
FROM TabCustomers
WHERE IIf([Forms]![FrmSearchCustomer]![SearchMember] Is Null
,True
,[Forms]![FrmSearchCustomer]![SearchMember]=[customerid])=True
AND IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null
,True
,[Forms]![FrmSearchCustomer]![SearchFore] Like [customerforname] & "*")=True
AND IIf([Forms]![FrmSearchCustomer]![SearchLast] Is Null
,True
,[Forms]![FrmSearchCustomer]![SearchLast] Like [customersurname] & "*")=True
AND IIf([Forms]![FrmSearchCustomer]![Searchdate] Is Null
,True
,[Forms]![FrmSearchCustomer]![Searchdate] Like [customerDOB] & "*")=True;
Решение
Для этого есть Способ доступа!
Если у вас есть свои элементы управления "filter" в форме, почему бы вам не использовать метод Application.buildCriteria, который позволит вам добавить ваши критерии фильтрации в строку, затем создать фильтр из этой строки и создать ваше предложение WHERE "на лету"?
selectClause = "SELECT TabCustomers.* FROM TabCustomers"
if not isnull(Forms!FrmSearchCustomer!SearchMember) then
whereClause = whereClause & application.buildCriteria(your field name, your field type, your control value) & " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchFore) then
whereClause = whereClause & application.buildCriteria(...) & " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchLast) then
whereClause = whereClause & application.buildCriteria(...) & " AND "
endif
if not isnull(Forms!FrmSearchCustomer!SearchDate) then
whereClause = whereClause & application.buildCriteria(...) & " AND "
endif
--get rid of the last "AND"
if len(whereClause) > 0 then
whereClause = left(whereClause,len(whereClause)-5)
selectClause = selectClause & " WHERE " & whereClause
endif
-- your SELECT instruction is ready ...
Редактировать:buildCriteria вернет (например):
'field1 = "GR"'
когда вы вводите "GR" в поле управления'field1 LIKE "GR*"'
когда вы печатаете"GR*"
в системе управления'field1 LIKE "GR*" or field1 like "BR*"'
если вы наберете'LIKE "GR*" OR LIKE "BR*"'
в системе управления
PS:если ваши элементы управления "filter" в вашей форме всегда имеют одинаковый синтаксис (скажем, "search_fieldName", где "fieldName" соответствует полю в базовом наборе записей) и всегда расположены в одной и той же зоне (скажем, formHeader), тогда возможно написать функцию, которая автоматически сгенерирует фильтр для текущей формы.Затем этот фильтр можно установить в качестве фильтра формы или использовать для чего-то другого:
For each ctl in myForm.section(acHeader).controls
if ctl.name like "search_"
fld = myForm.recordset.fields(mid(ctl.name,8))
if not isnull(ctl.value) then
whereClause = whereClause & buildCriteria(fld.name ,fld.type, ctl.value) & " AND "
endif
endif
next ctl
if len(whereClause)> 0 then ...
Другие советы
У тебя есть выражение "НРАВИТСЯ" наоборот.Я переписал запрос, чтобы удалить ненужные команды IIF и исправить ваш порядок операндов для оператора LIKE:
SELECT TabCustomers.*
FROM TabCustomers
WHERE (Forms!FrmSearchCustomer!SearchMember Is Null Or Forms!FrmSearchCustomer!SearchMember=[customerid])
And (Forms!FrmSearchCustomer.SearchFore Is Null Or [customerforname] Like Forms!FrmSearchCustomer!SearchFore & "*")
And (Forms!FrmSearchCustomer!SearchLast Is Null Or [customersurname] Like Forms!FrmSearchCustomer!SearchLast & "*")
And (Forms!FrmSearchCustomer!Searchdate Is Null Or [customerDOB] Like Forms!FrmSearchCustomer!Searchdate & "*");
Я построил этот запрос, повторив наиболее вероятное обстоятельство:Я создал фиктивную таблицу с упомянутыми полями и форму с полями и подчиненную форму с запросом, перечисленным выше, которые обновляются при нажатии кнопки поиска.Я могу предоставить ссылку для скачивания на созданный мной пример, если вы хотите.Пример работает так, как ожидалось.J выбирает только Джима и Джона, в то время как Джон или Джо извлекают только запись Джона.
Происходят две вещи - сравнения должны быть отменены, и вы неправильно цитируете строки.
Это должно быть [поле базы данных] типа "частичная строка + подстановочный знак".
и все строки должны быть заключены в кавычки - не уверен, почему ваш запрос не выдает ошибок
Итак, должно сработать следующее:
,[customerforname] Like """" & [Forms]![FrmSearchCustomer]![SearchFore] & "*""" )=True
Обратите внимание на """" это единственный способ добавить к строке одинарную двойную кавычку.
Моя единственная проблема заключается в том, что, возможно, a () необходим для группировки подобных
Например, фрагмент первой части
,[Forms]![FrmSearchCustomer]![SearchFore] Like ([customerforname] & "*"))=True
Прошло некоторое время с тех пор, как я пользовался access, но это первое, что приходит на ум
Это полная перезапись, позволяющая использовать нули в полях имени или даты рождения.Этот запрос не будет отклонен как слишком сложный, если в числовое поле customerid будет введен текст.
SELECT TabCustomers.CustomerForname AS NameSearch, TabCustomers.CustomerSurname AS SurnameSearch, TabCustomers.CustomerDOB AS DOBSearch, TabCustomers.customerid AS MemberSearch
FROM TabCustomers
WHERE TabCustomers.customerid Like IIf([Forms]![FrmSearchCustomer].[Searchmember] Is Null,"*",[Forms]![FrmSearchCustomer]![Searchmember])
AND Trim(TabCustomers.CustomerForname & "") Like IIf([Forms]![FrmSearchCustomer].[SearchFore] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchFore] & "*")
AND Trim(TabCustomers.CustomerSurname & "") like IIf([Forms]![FrmSearchCustomer].[Searchlast] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchLast] & "*")
AND (TabCustomers.CustomerDOB Like IIf([Forms]![FrmSearchCustomer].[SearchDate] Is Null,"*",[Forms]![FrmSearchCustomer]![SearchDate] ) Or TabCustomers.CustomerDOB Is Null)