Pregunta

Estoy intentando que funcione una consulta que toma los valores (a veces solo la primera parte de una cadena) de un control de formulario. El problema que tengo es que solo devuelve registros cuando se escribe la cadena completa.

es decir, en el cuadro del apellido, debería poder escribir gr, y aparece

verde gris Graham

pero en este momento no está mostrando nada a pesar de que se usa la cadena de búsqueda completa.

Hay 4 controles de búsqueda en el formulario en cuestión, y solo se usan en la consulta si el cuadro está completado.

La consulta es:

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

Solución

¡Hay un método de acceso para eso!

Si tienes tu " filtro " controles en el formulario, ¿por qué no usa el método Application.buildCriteria, que le permitirá agregar sus criterios de filtrado a una cadena, luego hacer un filtro de esta cadena y construir su cláusula WHERE sobre la marcha?

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

EDITAR: la buildCriteria volverá (por ejemplo):

  • 'field1 = " GR "' cuando escribe " GR " en el control
  • 'field1 LIKE " GR * "' cuando escribe " GR * " en el control
  • 'field1 LIKE " GR * " o field1 como " BR * " ' si escribe ' LIKE " GR * " O ME GUSTE " BR * " ' en el control

PS: si tu " filtro " los controles en su formulario siempre tienen la misma sintaxis (digamos " search_fieldName " ;, donde " fieldName " corresponde al campo en el conjunto de registros subyacente) y siempre están ubicados en la misma zona (digamos formHeader), entonces es posible escriba una función que generará automáticamente un filtro para el formulario actual. Este filtro puede configurarse como el filtro de formulario o usarse para otra cosa:

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

Otros consejos

Tienes tu expresión LIKE al revés. He reescrito la consulta para eliminar los comandos IIF innecesarios y para corregir su orden de operandos para el 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 & "*");

Construí esa consulta replicando la circunstancia más probable: creé una tabla ficticia con los campos mencionados y un formulario con los campos y un subformulario con la consulta enumerada anteriormente que se actualizó cuando se presionó el botón de búsqueda. Puedo proporcionar un enlace de descarga al ejemplo que creé si lo desea. El ejemplo funciona como se esperaba. J solo recoge a Jim y John, mientras que John o Jo solo extraen el registro de John.

Dos cosas están sucediendo: las comparaciones deben invertirse y no se están cotizando las cadenas correctamente.

Debería ser [campo de la base de datos] como " cadena parcial + comodín "

y todas las cadenas deben estar entre comillas, sin saber por qué la consulta no genera errores

Entonces, lo siguiente debería funcionar:

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

Observa el " " " " esa es la única manera de agregar una comilla doble a una cadena.

Mi único problema es que tal vez se necesita un () para agrupar similares

Por ejemplo, un fragmento de la primera parte

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

Hace mucho tiempo que no uso el acceso, pero es lo primero que me viene a la mente

Esta es una reescritura completa para permitir valores nulos en los campos de nombre o el campo de fecha de nacimiento. Esta consulta no será demasiado compleja si se ingresa texto en el campo numérico de ID de cliente.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top