Buscar personalizado

Esto haciéndome una base de datos de música y me gustaría poder buscar:
Introduciendo en un formulario una etiqueta en blanco en la que pudiera escribir o bien el titulo, cantante, género, palabra clave o el nº de registro.
Éstos son algunos de los campos que forman la tabla "música" en la que se basa el formulario pero la verdad no sé cómo hacer la macro si es que hiciera falta.
Me gustaría que al escribir el texto en la etiqueta me buscara en esos campos de la tabla en la que se basa el formulario y que lo hiciera tanto si es el texto exacto que hay en esos campos como si solo lo contiene, vamos que también busque por aproximación al texto.
Soy novato en esto de access y la verdad no sé cómo hacerlo ni dónde introducir el código necesario. Sé que para esto puedo usar la herramienta "buscar y reemplazar" pero es que me gustaría personalizar la base de datos con cuadros combinados, botones, etiquetas etc. Para cuidar el diseño.

1 respuesta

Respuesta
1
Lo que estás pidiendo es un poco complicado y, ciertamente, no tengo ni idea de cómo podría articularse lo que pides. Tendría que pensármelo, y tampoco puedo asegurar que sacara nada en claro. Ahí sí que no doy para más ;)
De todas maneras te propongo un sistema algo diferente, pero que también queda muy bien a efectos de diseño. Simplemente te lo explico por encima para que te puedas hacer una idea de cómo funcionaría. Si te pareciera una buena idea me lo comentas y te explico cómo se hace:
1.- En tu formulario crearías un combo que te mostraría los campos que tú quisieras, pudiendo elegir por el que quieres filtrar.
2.- Tendrías el textbox donde escribirías la palabra a buscar. Esta palabra no tendría por que ser exacta: la búsqueda se haría por aproximación
3.- Tendrías un botón para ejecutar la búsqueda
4.- El formulario te devolvería, filtrados, los valores obtenidos del campo seleccionado.
Bueno. Pues ya me dirás qué te parece.
Hola Neckkito
Ante todo gracias por tu ayuda
La solución que me das me parece perfecta, lo único que como soy un poco inexperto por favor te agradecería que me la detallaras lo mas concreto posible todo lo necesario... cómo crear y dónde el combo, el textbox, etc.
Los campos donde necesito buscar son 4 principalmente: "titulo" "cantante", "género" y "registro" y como te comenté pertenecen al formulario "ficha-música" que a su vez los coge de la tabla "música" en la que se basa el formulario. Las búsquedas deberían ser por aproximación, la palabra a buscar no sería siempre la exacta.
Si necesitas más datos no dudes en indicármelo.
Muchas gracias por tu tiempo y la paciencia.
Te explico cómo puedes hacerlo, pero antes una advertencia: voy a coger literalmente los datos que me proporcionas. Eso significa que si las palabras llevan tilde yo utilizaré la tilde. Si en realidad no las hubieras acentuado gráficamente deberás corregirlo en el código que te indicaré más adelante. La idea es que todos los nombres deben ser exactamente iguales a los que tú tengas en tu BD.
Dicho lo anterior lo que tienes que hacer es:
1.- Crea una consulta sobre la tabla música y añade sólo los cuatro campos que me comentas. Guarda esa consulta como CCampos
2.- En tu formulario "ficha-música", en vista diseño, sitúas en la cabecera del formulario (simplemente porque suele quedar más "elegante") un cuadro combinado. Cuando te salga el asistente lo cancelas.
3.- Sacas las propiedades de ese cuadro combinado y te vas a:
--- Pestaña Otras -> Nombre, y ahí le escribes cboCampo
--- Pestaña Datos -> Tipo de origen de la fila, y le seleccionas "Lista de campos"
--- Pestaña Datos -> Origen de la fila, y seleccionas la consulta CCampos
4.- Junto a este combo añades un cuadro de texto (puedes borrarle la etiqueta). Sacas sus propiedades y te vas a:
--- Pestaña Otras -> Nombre, y ahí le escribes txtBusca
5.- Finalmente, añades junto al textbox un botón de comando. Sacas sus propiedades y te vas a la pestaña Otras -> Nombre, y escribes cmdBusca.
6. Todavía en las propiedades del botón de comando, te vas a la pestaña eventos -> Al hacer click, y te sitúas en el espacio en blanco que hay a su derecha. Verás que hay un pequeño botón de puntos suspensivos. Si haces click sobre él te aparecerá una nueva ventana. En esa ventana seleccionas que quieres generar código.
7. Se te abrirá el editor de VB con dos líneas por defecto (Private Sub... y End Sub). En medio de estas líneas debes escribir lo siguiente:
...
Private Sub cmdBusca_Click()
'Definimos las variables
Dim vCamp as String, vText as String
Dim miFiltro as String
'Cogemos los valores seleccionados
vCamp = Nz(Me.cboCampo.Value,"")
vText = Nz(Me.txtBusca.Value,"")
'Si no hay valor en el combo o en el textbox sale del proceso
If vCamp = "" Or vText = "" Then Exit Sub
'Creamos el filtro
miFiltro = "[" & vCamp & "] LIKE '*" & vText & "*'"
'Aplicamos el filtro al formulario
me.Filter = miFiltro
'Activamos el filtro
me.FilterOn = True
End Sub
...
8.- Ahora creas un nuevo botón de comando, que te permitirá quitar los filtros. Al igual que en el caso anterior, en Propiedades -> Otras -> Nombre le escribes cmdQuitaFiltros, y en el evento "Al hacer click" le escribes este código:
...
Private Sub cmdQuitaFiltros_Click()
With Me
.cboCampo.Value = Null
.txtBusca.Value = Null
.FilterOn = False
End With
End Sub
...
Y eso es todo. La mecánica de funcionamiento es muy simple: seleccionas el campo -> Escribes el valor a buscar -> Pulsas el botón de búsqueda.
Cuando quieras ver de nuevo todos los datos pulsas el botón para quitar el filtro.
Ya me dirás qué tal.
Hola Neckkito
Muchísimas, muchísimas gracias.
La verdad es que tú sí sabes explicar las cosas. Gracias a tus explicaciones ya sé dónde poner un código, generar eventos etc. etc. y todo ha salido correcto.
Pero me he dado cuenta de dos cosas que habría que cambiar si fuera posible.
EL filtrado de datos que se hace en la búsqueda se hace por aproximación como dijimos y busca la palabra exacta en el campo en cuestión o que la contenga. Sin embargo busca ya no la palabra sino ese conjunto de grafías juntas es decir si por ejemplo busco "amar" como título debería encontrarme:

"amar"
"amar en otoño"
"quiero amar"
Esto sería la búsqueda deseada por la palabra exacta o que la contenga el campo. Sin embargo el filtrado no tiene en cuenta los espacios para delimitar la palabra "amar" entre una conjunto de caracteres y me daría además de los indicados otros resultados no deseados como:
"desamores"
"pleamar"
"amarrado"
El otro problema que le veo es que solo en el caso del campo "registro" que nunca va a contener valores duplicados la búsqueda debería ser en este caso exacta y no por aproximación así si busco "reg1":
debería encontrarme solo "reg1"
Sin embargo me encuentra "reg1", "reg11" "reg12" "reg13" "reg14" etc. y lo mismo pasaría con "reg2", etc.
Ésos son las dos cosas que habría que cambiar en el filtrado:
que busque en "titulo" , "cantante", "género" por palabra tanto exacta como que la contenga el campo (teniendo en cuenta los espacios entre palabras (para no dar como resultado al buscar "amar" : pleamar, amarrado etc.) y que solo en el caso del campo "registro" haga un filtrado por búsqueda exacta ya que los registros son únicos.
Muchísimas gracias por la ayuda y por tu paciencia al explicarme tan bien y didácticamente cómo hacerlo todo.
Me alegra que las explicaciones hayan sido clarificadoras.
Para hacer lo que pides se debe cambiar el código que te he pasado. Debes sustituirlo por este:
...
Private Sub cmdBusca_Click()
'Definimos las variables
Dim vCamp as String, vText as String
Dim miFiltro as String
'Cogemos los valores seleccionados
vCamp = Nz(Me.cboCampo.Value,"")
vText = Nz(Me.txtBusca.Value,"")
'Si no hay valor en el combo o en el textbox sale del proceso
If vCamp = "" Or vText = "" Then Exit Sub
Distinguimos si se ha elegido el campo [registro]
If vCamp = "registro" Then
'Creamos el filtro para una coincidencia exacta
miFiltro = "[registro]='" & vText & "'"
Else
'Si es cualquier otro campo creamos el filtro por aproximación
miFiltro = "[" & vCamp & "] LIKE '* " & vText & "*' OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '*" & vText & " *'"
End If
'Aplicamos el filtro al formulario
me.Filter = miFiltro
'Activamos el filtro
me.FilterOn = True
End Sub
...
Por los datos que proporcionas he supuesto que el campo [registro] era un campo de tipo Texto. Si no fuera así el código te daría error. Si no es tipo texto me comentas que tipo de valor es y le echamos un vistazo.
Ya me dirás.
Hola
Lo de buscar por "registro" ya funciona muy bien
pero en los demás criterios tanto al buscar en "titulo" o "cantante",o en "género" el código nuevo no da el resultado deseado ...  por ejemplo al hacer la búsqueda de "amor" me encuentra "amorío" y "desamor", "el desamor"
cuando debería encontrarme solo "amor", "amor enlatado" "el amor de María" y lo mismo en "cantante" y "genero".
El problema es que no busca en el campo "titulo" "cantante" "genero" los registros que sean "amor" o que contengan "amor" como palabra es decir espacio( ) amor ( )espacio. La clave es que debe buscar y devolver solo "amor" cuando:
1. Es exacta la búsqueda (a izquierda y derecha de "amor" no hay espacios ni letras unidas)

2. Cuando a derecha     e    izquierda de "amor" no haya letras unidas, indicándome por tanto, que es una palabra en sí misma y no que pertenece a un vocablo de más letras como "desamor" "clamor" etc. en esos casos no debería devolverlos el filtrado porque serían resultados no deseados. Es como si busco "bello" y además de encontrarme "bello" "lo bello" "lo bello y lo feo" me encontrara "cabello". No tendría mucho sentido.
De todas maneras si puedes prueba el código que me has pasado y verás que poniendo las siguientes palabras no da el resultado deseado:
"amor" ,"el amor de sara" ,"amor de sara" ,"el amor" ,"clamor","el clamor del rey" ,"clamores" "amores", "el clamor", "clamor de rey".
La búsqueda debería devolver solamente:
"amor" "el amor de sara" "amor de sara" "el amor"
solo en estos casos "amor" no tiene a derecha e izquierda letras unidas a él.

Disculpa si no me sé explicar mejor y si pudieras probarlo gracias de antemano
La verdad es que tu filtro me está... poniendo de los nervios. ¿No te podrías conformar con un filtro "de los de toda la vida"? (je, je... es broma!) ;)
Intenta cambiar, en el código, las líneas siguientes:
...
'Si es cualquier otro campo creamos el filtro por aproximación
miFiltro = "[" & vCamp & "] LIKE '* " & vText & "*' OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '*" & vText & " *'"
End If
...
Por estas
...
'Si es cualquier otro campo creamos el filtro por aproximación
miFiltro = "[" & vCamp & "] LIKE '* " & vText & " *'OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "*' OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '" & vText & " *'OR"
miFiltro = miFiltro & "[" & vCamp & "] LIKE '* " & vText & "' OR"
miFiltro = miFiltro & "[" & vCamp & "]= '" & vText & "'"
End If
...
A ver si así te funciona.
Ya me dirás (pero te advierto que ya no me quedan más cartuchos!)
siiiiiiiiiiii ahora me devuelve lo que esperaba!!!!
Siento molestar pero es que necesitaba conseguir este tipo de búsqueda.
Bueno sólo decirte que eres el mejor y por cierto he visitado tu web y me parece
fantástica sobre todo por lo bien explicado que está todo y la empatía que muestras al entender con cuantos cabezazos con access nos damos por no tener a alguien que nos ayude...
Gracias gracias gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas