Pergunta

Eu estou tentando obter um trabalho de consulta que leva os valores (por vezes apenas a primeira parte de uma string) a partir de um controle de formulário. O problema que tenho é que ele só retorna registros quando a corda completo é digitada.

i. na caixa de sobrenome, eu deveria ser capaz de escrever gr, e traz-se

green cinzento Graham

mas no momento ele não está trazendo nada uless a cadeia de pesquisa completo é usado.

Existem 4 controlos de pesquisa no formulário em questão, e eles só são usados ??na consulta se a caixa é preenchido.

A consulta é:

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;
Foi útil?

Solução

Existe um método de acesso para isso!

Se você tem seus controles "filtro" no formulário, por que você não use o método Application.buildCriteria, que permitirá que você adicione seus critérios de filtragem para uma cadeia, em seguida, fazer um filtro para fora desta cadeia, e construir a sua cláusula WHERE na mosca?

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 ...

EDIT: o BuildCriteria irá retornar (por exemplo):

  • 'field1 = "GR"' quando você digita "GR" no controle
  • 'field1 LIKE "GR*"' quando você digita "GR*" no controle
  • 'field1 LIKE "GR*" or field1 like "BR*"' se você digitar 'LIKE "GR*" OR LIKE "BR*"' no controle

PS: se os controles "filtro" no formulário sempre tem a mesma sintaxe (digamos que "search_fieldName", onde "fieldName" corresponde ao campo no conjunto de registros subjacente) e estão sempre localizados na mesma zona (digamos Vamos formHeader), então é possível escrever uma função que irá gerar automaticamente um filtro para a forma atual. Este filtro pode ser definido como o filtro de formulário, ou usado para outra coisa:

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 ...

Outras dicas

Você tem seus trás expressão como. Eu ter reescrito a consulta para remover os comandos IIF desnecessários e para corrigir o seu fim de operandos para o operador 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 & "*");

Eu construí essa consulta, replicando a circunstância mais provável: Eu criei uma tabela fictícia com os campos mencionados e um formulário com os campos e um subformulário com a consulta listados acima sendo atualizada quando o botão de pesquisa foi empurrado. Eu posso fornecer um link de download para o exemplo que eu criei, se você gostaria. O exemplo funciona como esperado. J só pega tanto Jim e João, enquanto John ou Jo única puxa o registro John.

Duas coisas estão acontecendo -. As comparações devem ser revertido e você não está citando cordas corretamente

Deve ser [campo de banco de dados] como "string + wild card parcial"

e todas as cordas precisam estar entre aspas - não tenho certeza por que sua consulta não jogue erros

Assim, o seguinte deve funcionar:

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

Observe o "" "", que é a única maneira de anexar um único aspas duplas em uma string.

Meu único thoguht é que talvez a () é necessária ao grupo como

Por exemplo, um trecho na primeira parte

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

Tem sido um tempo desde que eu acesso usado, mas é a primeira coisa que vem à mente

Esta é uma re-escrita completa para permitir valores nulos nos campos de nome ou a data do campo de nascimento. Esta consulta não irá falhar como demasiado complexo, se o texto é inserido no campo customerid numérico.

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top