Función para quitar acentos en access 2013

Tengo dos formularios en los que selecciono los datos a mostrar en función del valor que le ponga en un control de texto. Cada uno de ellos coge los datos de tablas distintas. No tienen nada que ver entre si.

A través de un código que introduzco en un control Botón, hago la selección de los datos a mostrar. En este código tengo una función que me sirve para que me busque el texto seleccionado sin tener en cuenta los posibles acentos que tenga el valor del registro. En la confección de la select, en la clausula Where pongo el siguiente código : "WHERE (((QuitarAcentos(PINS.NombrePin) Like Forms![Buscar_pins]!Texto_buscar)))"

Este método lo utilizo en ambos formularios, sin embargo en uno si que me selecciona los registros cuyo texto busco, independientemente de que tengan acentos o no, pero en el otro formulario no me devuelve ningún registro encontrado.

Los campos con los que comparo el texto buscado son de dos tablas distintas, pero son del mismo tipo, texto corto. En el formulario donde no me muestra ningún registro, si no le pongo la función QuitarAcentos, me encuentra los registros correctamente.

Por favor, ya he hecho todo lo que mi corto conocimiento me da y no soy capaz de saber porque ocurre esto.

1 Respuesta

Respuesta
2

Si en la misma base de datos en un formulario te funciona para buscar sin acentos y en otro no, el problema tiene que estar casi seguro en la parte del WHERE...

Comprueba que los nombres de los campos y tabla sean los que pones antes del LIKE, y los del formulario y cuadro de texto sean los de la parte derecha.

Otra cosa que puedes probar es usar caracteres comodín, que usualmente se usan con el operador LIKE:

... WHERE QuitarAcentos(PINS.NombrePin) LIKE "*" & [Buscar_pins]!Texto_buscar & "*"

(La linea anterior es de la vista SQL de una consulta, si la SQL la creas en VBA, ojo con las comillas dobles y simples, porque así escrita no te va a funcionar)

Con los datos que aportas, no tengo ninguna otra sugerencia que hacerte.

Un saludo.


bit.ly/NkSvAcademy   /    bit.ly/ForoNkSv 

Muchas gracias por tu respuesta.

Los asteriscos se los pongo antes de confeccionar la select, justo cuando acepto el texto a buscar:

Forms![buscar_pins]!Texto_buscar = "*" + Forms![buscar_pins]!Texto_buscar + "*"

Por favor, dime que necesitarías para que pudieras hacer un diagnostico más profundo.

Lo ideal sería poder ver una copia de la BD, con un par de datos inventados.

Como eso no siempre es posible, al menos tendría que saber el código entero que usas para cosntruir la SQL y filtrar (no me hace falta el de la función QuitarAcentos porque dices que sí funciona), y el nombre de la tabla y campo que intervienen en el filtro

Buenos dias,

estoy intentando enviarte el codigo de como confecciono la select, pero me esta dando error al enviar.

¿Te puedo enviar el texto por mail a alguna direccion?

Muchas gracias.

Envíalo a: [email protected]

Te contesto por esta web

No veo nada "raro " en la SQL, pero te voy a sugerir un par de cosas para que pruebes y me comentes:

1º/ Quita el control de errores (comenta o elimina la linea On Error GoTo Err_Buscar_Click) y mira a ver si te salta algún error y dónde, porque gestionar así como hace (con un Resume Exit_Buscar_Click) no siempre es la mejor forma de lidiar con errores (si se produce alguno, ni te avisa ni ejecuta el resto de código)

2º/ Olvidate de poner los asteriscos en el cuadro de texto buscar y hazlo en la SQL, y también saca de la SQL lo que viene del formulario:

busca = busca & "WHERE (((QuitarAcentos(PINS.Nombre) Like '*" & Me.Texto_buscar & "'*)) And ((PINS.Categoria) Like  '" & Me.CatBuscar & "') And ((PINS.Subcategoria) Like  '" & Me.Subcat & "')) "

3º/ Yo, si hiciera ese buscador, el filtro lo haría dependiendo de si CatBuscar y SubCat tienen valor o no, en vez de filtrarlos siempre con *:

busca = busca & "WHERE (((QuitarAcentos(PINS.Nombre) Like '*" & Me.Texto_buscar & "'*)) "

If Nz(Me.CatBuscar,"")<>"" Then

busca=busca & "And ((PINS.Categoria) Like  '" & Me.CatBuscar & "') "

End If

If Nz(Me.Subcat,"")<>"" Then

busca=busca & "And ((PINS.Subategoria) Like  '" & Me.Subcat & "') "

End If

Y no usaba los Ifs para ponerles los * a esos cuadros.

Me vas diciendo cómo funcionan esas sugerencias

Acabo de ver un par de fallos en mi respuesta:

busca = busca & "WHERE (((QuitarAcentos(PINS.Nombre) Like '*" & Me.Texto_buscar & "*')) "

El final de la linea es comilla doble-asterisco-comilla simple-paréntesis, y no como puse antes comilla doble-comillasimple-asterisco.

También el los otros dos IFs para categoría y subcategoría falta añadir los asteriscos al like:

.... Like  '*" & Me.CatBuscar & "*') "

A ver si ahora.

Te adjunto imagen de como se ha quedado ahora, y el error que sale.

El único error que veo es que falta un espacio antes del ORDER BY.

Si con eso no se soluciona, prueba a poner así la función:

QuitarAcentos(NombrePin)

Es decir, sin el nombre de la tabla

He corregido ese error y me sigue saliendo el mismo mensaje.

Es algo muy raro. Será uno de esos caprichos de Access.

No quiero hacerte perder más tiempo. Seguiré investigando a ver si encuentro algún motivo.

Voy a simplificar el select, quitándole cosas, a ver si consigo que funcione bien.

Muchísimas gracias por tu ayuda.

Un saludo.

Como tienes mi correo, si quieres envíame una copia de tu tu y lo miro. No hace falta que sea toda la BD, ni con todos los datos reales, con que tenga las 3 tablas que intervienen en el select con 4 o 5 registros inventados (tampoco es necesario que vengan completos, con que tengan los 3 campos que intervienen en el where es suficiente), el formulario de búsqueda y el módulo en que tengas la función, me llega para analizarlo.

Acabo de hacer la prueba con tu archivo y a mi la función QuitarAcentos() me funciona perfectamente en los dos formularios.

Lo que tienes que tener en cuenta es dónde la aplicas, si en la parte izquierda del WHERE, en la derecha o en ambas.

Me explico sobre este nombre de Pin: Santa Coloma de Cervelló

Caso 1:

Si pones en el código: WHERE ((QuitarAcentos(PINS.NombrePin) Like Forms![Buscar_pins]!Texto_buscar))

Y buscas en el cuadro de texto del formulario Cervello (sin acento) te lo va a encontrar, pero si escribes Cervelló (con acento), te dirá que no hay coincidencias.

En el primer supuesto, la comparación que hace es Cervello Como *Cervello*, y en el segundo Cervello como *Cervelló*, porque donde "quita" los acentos es en el valor de la tabla

Caso 2:

Si pones en el código: WHERE ((PINS.NombrePin Like QuitarAcentos(Forms![Buscar_pins]!Texto_buscar)))

Y buscas en el cuadro de texto del formulario Cervello (sin acento) te dirá que no se encuentra, pero si escribes Cervelló (con acento), tampoco lo encontrará.

En el primer supuesto, la comparación que hace es Cervelló Como *Cervello*, y en el segundo Cervelló como *Cervello*, porque donde "quita" los acentos es en el valor del cuadro del formulario

Caso 3 (que es el correcto):

Si pones en el código: WHERE ((QuitarAcentos(PINS.NombrePin) Like QuitarAcentos(Forms![Buscar_pins]!Texto_buscar)))

Da igual que en el cuadro de texto pongas cervello, cervelló, cérvello..., porque como va a quitar los acentos en los dos términos de la comparación siempre te encontrara la coincidencia.

Resumiendo: en los dos formularios has de poner la función en ambos lados de la comparación.

Sveinbjorn El Rojo, Muchas gracias por el tu ayuda.

Según lo comentas en tu mensaje, es lo más lógico que se puede hacer para que el resultado sea el esperado, pero, lamentándolo mucho, sigue sin funcionar (¿...?) . No lo entiendo !

En fin, me doy por vencido, pondré el texto a buscar con sus acentos. El mayor problema me viene al buscar textos en catalán, ya que emplean los dos tipos de acento (á, à).

Muy agradecido por la tensión que me has prestado.

Te subo el archivo con el formulario buscar pins funcionando correctamente (con la solución el caso 3): http://filebig.net/files/UyRQ9rjigC

La contraseña es el mail desde el que me lo enviaste.

Y si de esta no te funciona, lo dejamos definitivamente, jejeje

Muchas gracias.

Efectivamente funciona (eres un crack). Voy a fusilarla según me la has enviado y la pego en mi código. Así me aseguro, je je

Pues tema solucionado.

Vuelvo al tema para explicarte que, a pesar de que tu solución funcionaba correctamente, yo seguía teniendo problemas a la hora de ejecutarlo, pues me daba error 3071 de operación demasiado compleja…..

Después de hacer muchas pruebas y cambios del código incluso la corrección de la select, sin obtener resultados, se me ha ocurrido mirar la tabla por si pudiera tener algún dato erróneo, y he visto que había un registro que tenia algún campo vacío o nulo.

He eliminado ese registro y he vuelto a probar y esta vez, por fin, ha funcionado correctamente.

Lo pongo aquí por si a alguien le pudiera estar pasando algo similar.

De nuevo, muchas gracias por tu ayuda.

Y eso usando la función Nz() lo solucionas, sin tener que eliminar el registro

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas