Возврат записей, которые частично соответствуют значению - PullRequest
4 голосов
/ 22 октября 2008

Я пытаюсь заставить работать запрос, который получает значения (иногда только первую часть строки) из элемента управления формы. У меня проблема в том, что он возвращает записи, только когда введена полная строка.

т.е. в поле с фамилией я должен набрать 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;

Ответы [ 5 ]

5 голосов
/ 22 октября 2008

Для этого есть метод доступа!

Если у вас есть элементы управления «фильтр» в форме, почему бы вам не использовать метод 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 ...
5 голосов
/ 22 октября 2008

Ваше выражение НРАВИТСЯ задом наперед. Я переписал запрос, чтобы удалить ненужные команды 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 берет только Джима и Джона, а Джон или Джо только берут запись Джона.

2 голосов
/ 22 октября 2008

Происходят две вещи - сравнения должны быть отменены, и вы не цитируете строки должным образом.

Это должно быть [поле базы данных] как "частичная строка + подстановочный знак"

и все строки должны быть заключены в кавычки - не уверен, почему ваш запрос не выдает ошибок

Так должно работать следующее:

,[customerforname] Like  """" & [Forms]![FrmSearchCustomer]![SearchFore] & "*""" )=True

Обратите внимание на "" "", который является единственным способом добавить одиночную двойную кавычку в строку.

0 голосов
/ 22 октября 2008

Это полное переписывание, чтобы учесть нулевые значения в полях имени или поле даты рождения. Этот запрос не будет слишком сложным, если текст будет введен в числовое поле 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)
0 голосов
/ 22 октября 2008

Мое единственное, что, возможно, нужно (), чтобы сгруппировать подобные

Например, фрагмент первой части

,[Forms]![FrmSearchCustomer]![SearchFore] Like ([customerforname] & "*"))=True

Прошло много времени с тех пор, как я использовал доступ, но это первое, что приходит на ум

...