Optimizar código para búsqueda de registros

Lo que intento desde un formulario es que al hacer clic en un botón, se busque la
Palabra que se inserta en el cuadro de texto "txtBuscarObjeto" y te devuelva un registro.
Quiero hacer esa búsqueda en los campos: (TITULO, AUTOR, DISTRIBUIDOR, TRADUCTOR, EDITOR, CANTIDAD) de la tabla "TLibros" de la siguiente manera:

Me.RecordSource = "select * from "TLibros" where Titulo Like '" & txtBuscarObjeto _
& "' OR Titulo like '* " & txtBuscarObjeto & " *' OR Titulo like '" & txtBuscarObjeto _
& " *' OR Titulo like '* " & txtBuscarObjeto & "' OR Titulo like '* " & txtBuscarObjeto _
& ", *'OR Titulo like '" & txtBuscarObjeto & ", *'OR Titulo like '* " & txtBuscarObjeto _
& ",*' OR Titulo like '" & txtBuscarObjeto & ",*' OR Titulo like '* " & txtBuscarObjeto _
& ". *'OR Titulo like '" & txtBuscarObjeto & ". *'OR Titulo like '* " & txtBuscarObjeto _
& ".*' OR Titulo like '" & txtBuscarObjeto & ".*' OR Titulo like '* " & txtBuscarObjeto _
& ": *'OR Titulo like '" & txtBuscarObjeto & ": *'OR Titulo like '* " & txtBuscarObjeto _
& ":*' OR Titulo like '" & txtBuscarObjeto & ":*' OR Titulo like '* " & txtBuscarObjeto _
& "? *'OR Titulo like '" & txtBuscarObjeto & "? *'OR Titulo like '* " & txtBuscarObjeto _
& "?*' OR Titulo like '" & txtBuscarObjeto & "?*'"

Lo que quiero con esto es que cuando busque no tenga en cuenta los signos (:,¿.?) Incluso más si se puede, y que lo buscado sea una palabra y no forme parte de ella, vamos que encuentre "Maria" pero no "Mariano".Esta estructura aún es más larga (no la pongo para no aburrir) puesto que se va a repetir para los seis campos en cuestión que como dije son:
(TITULO, AUTOR, DISTRIBUIDOR, TRADUCTOR, EDITOR, CANTIDAD) y todo en un solo bloque de "OR" concatenadas puesto que se busca en los seis campos a la vez.

El problema que tengo es que salta el mensaje de que hay demasiadas continuaciones de línea o si lo pongo todo en menos líneas aún así salta el mensaje de que la consulta es muy compleja y no se puede ejecutar debido a la enorme cantidad de "or" que tengo.
Hay que tener en cuenta que esta estructura se repite por seis ya que hay seis campos.

Había pensado crear bloques de código mas cortos que hagan lo mismo pero no sabría cómo hacerlo.
En resumen necesitaría simplificar, abreviar, optimizar de alguna manera la estructura para reducir las "or" y que no me salte que la consulta es demasiado compleja.

1 Respuesta

Respuesta
1

Te planteo otra alternativa, por si te soluciona la papeleta, porque lo de la SQL lo veo complicado...

¿Por qué no pones un cuadro combinado que liste los nombres de los campos y lo usas para indicar en qué campo hacer la búsqueda?

Si al cuadro combinado le llamas cboSelCampo, la SQL te quedaría así:

Me.RecordSource = "select * from "TLibros" where " & Me.cboSelCampo & " Like '" & txtBuscarObjeto _
& "' OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto & " *' OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto _
& " *' OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto & "' OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& ", *'OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ", *'OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& ",*' OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ",*' OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& ". *'OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ". *'OR Titulo like '* " & txtBuscarObjeto _
& ".*' OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ".*' OR " & Me.cboSelCampo & "  like '* " & txtBuscarObjeto _
& ": *'OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ": *'OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& ":*' OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & ":*' OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& "? *'OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & "? *'OR " & Me.cboSelCampo & " like '* " & txtBuscarObjeto _
& "?*' OR " & Me.cboSelCampo & " like '" & txtBuscarObjeto & "?*'"

Y filtrarías sólo por el campo seleccionado, lo que simplificaría tu código (no tendrías que repetirla 6 veces), y la ejecución de la consulta (no tiene sentido, que por ejemplo busques María en el campo Cantidad)

Otra alternativa, que no sé si te será viable, será que te crees una consulta y en los criterios le establezcas todas las condiciones (los OR), pero referenciados al cuadro de texto del formulario, y uses esa comsulta como Recordsource.

Hola

El tema de buscar a partir de un combo en un campo determinado ya lo tengo hecho con un filtro.

Lo que necesitaba es que esta búsqueda se pudiera realizar en varios campos a la vez y la idea del combo solo me permite buscar el dato en un campo seleccionado.

Lo que es cierto es que buscar "Maria" en el campo "Cantidad" no tiene sentido incluso podría excluir "Titulo" toda la razón, en todo caso aún tengo 4 campos y lo que querría es buscar en todos ellos a la vez.

El código que te envíe no está en vista Sql de una consulta, en realidad lo tengo en el evento "al hacer clic"  de un botón de comando de un formulario:

Private Sub cmdBuscarLibros_Click()

If txtBuscarLibro <> "" Then

Me.RecordSource = "select * from "TLibros" where ...

end if

Lo que me preguntaba es si habría alguna forma de acortar el código conociendo bien VBA.

Por ejemplo como soy novato uso muchas "if ... then" "if ... then" pero a veces es mejor  usar case que es como "if" anidados y abrevio el código.

Otro ejemplo:

If Me.Volumen > 10 Then
Me.Volumen = "Grande"
Else
me.Volumen= "Pequeño"
End If

Se podría simplificar y acortar el código:

me.Volumen = iif ([Volumen] > 10, "Grande", "Pequeño")

Esto es solo un ejemplo, al que no me quiero ceñir ni ver su lógica pero que muestra cómo en una línea de código he puesto 5 líneas... con esto solo quiero dar una idea de lo que buscaba... si el mismo código que he puesto en un evento "al hacer clic" se puede acortar en Vba para access.

La cosa si es posible, es abreviar el código y los múltiples or anidándolos o no sé...

Gracias Sveinbjorn

Ya sé que no es un código de una consulta en vista SQL, pero lo que le asignas a la propiedad RecordSource del formulario sí es una SQL de una consulta.

A lo que me refería yo era a que te crearas con ese código SQL una consulta de access (un objeto consulta), con los campos con sus respectivos criterios y referenciados al cuadro de texto de tu formulario. Luego en el código de tu botón únicamente tendrías que poner:

Private Sub cmdBuscarLibros_Click()

If txtBuscarLibro <> "" Then

Me.RecordSource = "NombreConsulta"

end if

End Sub

Lamentablemente es la única forma que veo de que simplifiques el código, pues la SQL la vas a tener que escribir detallando todas las posibilidades (los OR), y por lo que veo son muchos.

Si optas por crear la consulta, ten en cuenta que cada criterio en cada campo ha de ir en una fila distinta de la parrilla de diseño. Si pones en la misma fila los criterios de dos campos le estás pidiendo que te muestre los registros que cumplen los dos (como si los unieras con un AND)

Disculpa mi ignorancia por no saber que era SQL, es que no soy muy experto, perdona.

Voy a optar entonces por realizar la consulta que me dices.

Me podrías indicar en "criterio" de cada columna de la consulta qué debo poner exactamente:

Yo he puesto en Criterio del campo Titulo:

como '" & txtBuscarObjeto & "'

O como '* " & txtBuscarObjeto & " *' O como '" & txtBuscarObjeto & " *'

O  como '* " & txtBuscarObjeto & "' O como '* " & txtBuscarObjeto & ",*'                                                                                                                                                        O como '" & txtBuscarObjeto & ", *' O como '* " & txtBuscarObjeto _& ",*'

O como '" & txtBuscarObjeto & ",*' O como '* " & txtBuscarObjeto & ". *'

O como '" & txtBuscarObjeto & ". *'O como '* " & txtBuscarObjeto & ".*'

O como '" & txtBuscarObjeto & ".*' O como '* " & txtBuscarObjeto & ": *'

O como '" & txtBuscarObjeto & ": *' O  como '* " & txtBuscarObjeto & ":*'

O como '" & txtBuscarObjeto & ":*' O  como '* " & txtBuscarObjeto & "? *'

O  como '" & txtBuscarObjeto & "? *'O  como '* " & txtBuscarObjeto & "?*'

O  como'" & txtBuscarObjeto & "?*'"

Podrías detallarme la consulta, qué pongo exactamente en el criterio de la consulta y cómo referenciarlo al cuadro de texto "txtBuscarObjeto" del formulario "FLibros" . Es que no hago bien la consulta.

Gracias por ayudarme

Para hacer referencia al cuadro de texto, debes sustituir txtBuscarObjeto por esto:

[Formularios]![FLibros]![txtBuscarObjeto]

Si ese criterio lo pusiste en una sólo fila (la primera de criterios) en el campo Titulo, en el campo autor lo has de ponerlo en la segunda fila, en el campo distribuidor en la tercera, y así sucesivamente.

Si cada O lo tienes en una fila distinta, al cambiar de campo vas a tener que seguir añadiendo filas de criterios (si te lo permite access)

Lo mejor es que vayas construyendo la SQL en vista diseño poco a poco, es decir, sin meter todos los O de una vez, para que veas si va funcionando o no.

 La consulta no me funciona. Algo hago mal. Disculpa mi torpeza.

¿Se trata de una consulta de "selección" o de otro tipo de consulta?

¿En criterio pongo entonces en cada columna de campo esto no?

como '" & [Formularios]![FLibros]![txtBuscarObjeto] & "'      (solo te indico parte del código para que me confirmes)

No me funciona y no sé por qué, no lo entiendo.

Podrías enviarme un archivo con un ejemplo de cómo hacer la consulta referenciando el criterio al cuadro de texto del formulario.

No hace falta que pongas todas las búsquedas o "or multiples" que necesito, con ver la estructura sería suficiente.

Muchas gracias

Ahí te va.

La consulta "Consulta Juan" es cómo te quedaría la consulta si quisieras buscar "Juan" con todas las opciones que planteas en los 5 campos.

La otra consulta te muestro un par de opciones referenciadas al control del formulario.

El botón del formulario tiene el código con la SQL para lo 5 campos (como la que tienes tú, imagino, pero con menos saltos de linea), que sería lo que te recomiendo (quitando el campo Cantidad, que seguramente es el que te de problemas)

Hola Sveinbjorn y gracias por todo.

¿Probaste el ejemplo que me enviaste?

Es que la consulta "Juan" no se puede abrir porque dice que es demasiado compleja y por tanto no puedo ver nada.  Ya me dices...

Lo único es lo del código del botón... te acuerdas que me comentabas en las anteriores respuestas, (en tu segunda respuesta)  que en el botón del form  habría que poner que el "recordsource = nombre de la consulta"                           pero en el ejemplo que me envías, en el botón no aparece lo que me comentaste, que te añado a continuación:

"A lo que me refería yo era a que te crearas con ese código SQL una consulta de access (un objeto consulta), con los campos con sus respectivos criterios y referenciados al cuadro de texto de tu formulario. Luego en el código de tu botón únicamente tendrías que poner:

Private Sub cmdBuscarLibros_Click()

If txtBuscarLibro <> "" Then

Me.RecordSource = "NombreConsulta"

end if

End Sub"

Esto es lo que me comentaste pero...

en realidad el código del botón no lleva el nombre de la consulta sino su SQL. De todas formas me da error...

Ejemplo:

En el formulario si buscas "juan" o "jose" que son textos que hay en el registro, da error en tiempo de ejecución o "expresión demasiado compleja".

De nuevo la cantidad de "or" en el código del botón fastidia todo creo. Ya me confirmas si es eso.

Entonces he probado  poniendo esto que me dijiste en su momento y funciona.

Me.RecordSource = "Consulta Referenciada"  (es el nombre de consulta de parámetros)

Lo único que veo que cuando cierro la BD y la vuelvo a abrir y busco algo en el form lo que antes funcionaba ahora dice: error al cargar biblioteca DLL

¿Será porque uso access 2003? ¿cómo lo soluciono en 2003? el caso es que funciona si pongo en el botón Me.RecordSource = "NombreConsulta" pero luego cierro la BD y la vuelvo a abrir y da error biblioteca DLL. Vaya

Ya me dices... gracias por todo

El ejemplo sí lo probé y funciona perfectamente, pero yo tengo instalado access 2013. Igual el problema está en que tu tienes access 2003...

En el botón deje el código como tu lo tenías para comprobar lo que decías de los errores que te daba (demasiados saltos y expresión muy compleja)

En 2003 ni idea de cómo solucionarlo, y como no lo tengo, no puedo hacer pruebas.

Si el formulario lo vas a usar solamente para mostrar información, no editarla, puedes probar a hacer distintas consultas (una por cada campo), y luego una consulta de union de esas consultas. Sería algo así, si las llamas consulta1, consulta2...

Select * from consulta1 UNION ALL Select * from consulta2 UNION ALL....

No sé si te funcionará o te dará algún problema, lo que me lleva a mi primera sugerencia, que no busques a la vez en todos los campos, jejeje...

Y si no, siempre puedes optar por subir tu versión de access.

Yo más no te puedo decir, al tener tantos criterios, la SQL no la puedes simplificar, a menos que reduzcas el número de los mismos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas