lunes, 27 de mayo de 2013

INTERCALACIÓN AI EN ACCESS (NO DISTINGUIR ACENTOS)


Por defecto, el motor sql de Access distingue siempre el uso de acentos en las comparaciones de cadena : "acción" <> "accion". Por el contrario obvia el uso de mayúsculas y minúsculas : "Acción" = "acción". Sobre esto último, ya hablé en este artículo : Distinguir mayúsculas y minúsculas. Hablemos ahora de los acentos, cuestión de vital importancia a la hora de realizar búsquedas sobre texto.
Para evitar que una búsqueda tenga en cuenta los acentos, es habitual crear una función en vba. Dichas funciones pueden seguir dos estrategias : 
- Modificar el valor pasado al parámetro de búsqueda. Un magnífico ejemplo de esta estrategia es la función Buscaacent de Chea.
- Modificar los valores del campo donde se busca, quitando todos los acentos del mismo, y también realizar la misma operación en el parámetro de búsqueda. 

Creo que la mejor opción es la primera, pues la función se ejecutará una sola vez, mientras que en el segundo caso, la función deberá actuar sobre el campo escogido en todos los registros del conjunto de datos, además de sobre el valor de búsqueda. Es decir, si tenemos una tabla de Clientes con 10.000 registros, la función se ejecutará 10.000 veces. A pesar de esto propongo una solución basada en la segunda posibilidad, pero utilizando la función StrConv que viene con el módulo Strings de la librería VBA.  Esta solución será útil si no queremos depender de tener un módulo con la función personalizada, o si deseamos utilizar la propiedad filter de los recordsets Ado, ya que Filter es mucho más restrictiva en el uso de comodines para el operador Like que el entorno Sql de Access.

StrConv adapta una cadena según el tipo de conversión escogida en el segundo parámetro de la función, y según el LocaleID definido en la tercera. A priori esto no da mucho 'juego' en cuanto a los acentos, pero resulta que si usamos idiomas que emplean un alfabeto distinto del nuestro, la mayoría obvian los acentos de las vocales. Uno de los que he probado y que eliminan correctamente los acentos es el Coreano, cuyo LCid es 1042.

Un ejemplo :

Select StrConv("aâàáäeëèéiïíîöôoòúuüûñ", 2, 1042)

devuelve :

aaaaaeeeeiiiioooouuuun

... y sí, a la 'ñ' le ha quitado el acento. Si no hacemos de esto una cuestión de honor, StrConv bien puede emplearse para obviar los acentos.

Así pues, para realizar una búsqueda obviando los acentos, deberiamos hacer algo parecido a esto (he empleado la tabla Clientes de Neptuno.mdb) :

Select NombreCompañía, NombreContacto
From Clientes
Where StrConv(NombreContacto, 2, 1042) Like '*hernandez*'

... y el resultado :


Nombre de compañíaNombre del contacto
HILARIÓN-AbastosCarlos Hernández

Ramon Poch. Terrassa a 27/05/2013