Access. No distinguir acentos en un filtro

Os pedía ayuda una vez y me lo solucionasteis en un momento.

He hecho una base para registrar películas y con el tiempo ha ido creciendo. Además de una ficha de cada película, en su día añadí una ficha de actores y directores.

El problema es cuando tengo que entrar el “reparto” de una película. Hice un formulario con un subformulario para que en éste último me filtrara los registros que “contienen” el mismo nombre y apellido (en 1 solo campo). Pero como era de esperar, si el nombre del actor tiene un acento, no me lo filtra si cuando lo quiero entrar lo escribo sin acento.

La macro que uso para el filtro la obtuve de vuestra página, y es sencilla y funciona muy bien. La he puesto en las propiedades de formulario en el evento “Al activar registro”, y es la siguiente:

Private Sub Form_Current()

 ' Creamos la variable que contendrá el filtro

    Dim sFiltro As String

    ' (Campo NombreyApellidos) Asignamos el filtro a la variable

    sFiltro = " NombreyApellidos LIKE'*" & Me. NombreyApellidos & "*'"

    ' Asignamos la variable a la propiedad Filter del subformulario

    Me.ActoresDirectoresReducido.Form.Filter = sFiltro

    ' Le decimos al subformulario que active el filtro

    ' que previamente hemos asignado.

    Me.ActoresDirectoresReducio.Form.FilterOn = True

End Sub

Mis preguntas:

  1. Como puedo modificar este código para que no tenga en cuenta si escribo cualquiera de los tipos de acento que existen.
  2. Con los apóstrofes (por ejemplo O’Connor) me abre el módulo (creo) y da error ‘3075’ en tiempo de ejecución. Error de sintaxis (falta operador) en la expresión de consulta ‘NombreyApellidos LIKE’*o’Connor*”.

Sin más, os doy las gracias de antemano porque estoy seguro que me podréis ayudar.

2 Respuestas

Respuesta
2

Para quitar los acentos puedes usar una función como ésta (no recuerdo de dónde la saqué, creo que de la web del Búho), que debes copiar en un módlo de tu BD:

'--------------------------------------------------------------------------------------------
'Función para conocer quitar acentos de una cadena de texto
'--------------------------------------------------------------------------------------------
Public Function fncQuitarAcentos(ByVal strTexto As String) As String
    Const conAcentos = "ÁÀÂÄÃáàâäãÉÈÊËéèêëÍÌÎÏíìîïÓÒÔÖÕóòôöõÚÙÛÜúùûüÝýÿ"
    Const sinAcentos = "AAAAAaaaaaEEEEeeeeIIIIiiiiOOOOOoooooUUUUuuuuYyy"
    Dim i As Long
    Dim lngPos As Long
    Dim strCaracter As String * 1
    If Len(strTexto) = 0 Then
        fncQuitarAcentos = ""
        Exit Function
    End If
    For i = 1 To Len(strTexto)
        strCaracter = Mid(strTexto, i, 1)
        'comparamos el caracter con la cadena con acentos
        lngPos = InStr(1, conAcentos, strCaracter, vbBinaryCompare)
        'si se ha encontrado coincidencia ...
        If lngPos <> 0 Then
            'sustituímos el caracter con el que tiene la misma
            'posición en la cadena sin acentos (o sea la letra sin acentos)
            strCaracter = Mid(sinAcentos, lngPos, 1)
        End If
        '... y si no, pues seguimos como si nada
        fncQuitarAcentos = fncQuitarAcentos & strCaracter
    Next i
End Function

Y para evitar lo de los apóstrofes, en vez de comillas simples usa Chr(34).

Tu código, en definitiva quedaría así:

Private Sub Form_Current()
 ' Creamos la variable que contendrá el filtro
    Dim sFiltro As String
    ' (Campo NombreyApellidos) Asignamos el filtro a la variable
    sFiltro = " fncQuitarAcentos(NombreyApellidos) LIKE " & Chr(34) & "*" & fncQuitarAcentos(Me.NombreyApellidos) & "*" & Chr(34)
    ' Asignamos la variable a la propiedad Filter del subformulario
    Me.ActoresDirectoresReducido.Form.Filter = sFiltro
    ' Le decimos al subformulario que active el filtro
    ' que previamente hemos asignado.
    Me.ActoresDirectoresReducio.Form.FilterOn = True
End Sub

Un saludo


Hola de nuevo.

Muchísimas gracias por tu respuesta.

La pregunta parecerá muy tonta. pero no se casi nada de VB y el primer código que me has mandado no se donde debo ponerlo...

Por probar, he creado un módulo "Modulo1" y lo he pegado sin más. Luego he modificado el código que ya tenía, substituyendo la linea que contiene "fncQuitarAcentos..."....pero nada, un apellido "Pérez" con acento en el formulario y sin acento en el subform no me lo filtra.

Imagino que lo del Modulo1 no debe estar bien.... pero ni idea.

Se te ocurre que puedo hacer? Gracias de nuevo

En principio lo has hecho todo correctamente. Lo único que veo "raro" es que pongas el código en el evento "al activar registro", pero como desconozco tu BD, no puedo precisar si es lo más conveniente o no.

Te he preparado un mini-ejemplo, parecido a lo que tu tienes, para que veas cómo funciona el código (en mi caso en el evento "después de actualizar" de un cuadro de texto para poner el término a buscar): http://filebig.net/files/SA26nnbKm9

Hola de nuevo

Estaba obcecado y después de intentarlo varias veces, me está medio funcionando.

Lo de los acentos me va perfectamente salvo por una cosa.

Además del campo "NombreyApellido" tengo otros 2 campos "Nombre" y otro "Apellido" en los cuales a través de una macro muy sencilla copio el nombre y por otro lado el apellido. Lo tengo así porque amenudo no obtengo ningún coincidencia en el campo "NombreyApellido" y lo busco por separado.

El problema viene cuando uno de estos 2 últimos campos no contiene ningún valor. Me aparece el siguiente error:

Error '94' en tiempo de ejecución. Uso no válido de Null

El otro problema lo tengo con los apostrofes. Me sigue apareciendo el "Error '3075' en tiempo de ejecución. Error de sintaxis (falta operador) en la expresión de consulta "NombreyApellido LIKE'*Danny O'Connor*"

Y la verdad es que no se como continuar. Estoy atascado

Muchas gracias de nuevo por tu ayuda

Por cierto, me he mirado el ejemplo que me enviaste.. pero no pillo el funcionamiento

Para el tema de los nulos, usa la función Nz() para darle algún valor (por ejemplo una cadena vacía [""]), por ejemplo:

FncQuitarAcentos(Nz(NombreyApellidos,""))

Lo otro parece que te falta un espacio después del LIKE y antes de la comilla simple. Fíjate en cómo lo tienes en el código, has de dejar un espacio entre el LIKE y las comillas dobles (mira mi código)

Ok

Ahora funciona perfectamente.

Conocía la función Nz, pero de ahí a saber dónde y cómo ponerlo, hay un mundo.

En cuanto a los apostrofes, creo que lo dejaré para más adelante....

Te agradezco enormemente tu ayuda, tanto por el resultado como por la rapidez.

Tengo otra consulta relacionada con los hipervínculos, pero primero intentaré averiguar por mi mismo lo que pueda.

Lo dicho... MUCHAS GRACIAS !!!

De nada. Pues cuando lo necesites, pues encontrarme por aquí (menos) o en el foro Dudas Access: http://nksvaccessolutions.com/Foro/

Respuesta
1

Tengo una duda sorbe tus respuestas... Yo para los filtros o buscadores uso la instrucción Select *; y con esta esta instrucción en vba no me lee la opción de eliminar filtros, no sé cómo debería hacerlo..
Mi código es sencillo:
Private Sub Texto104_AfterUpdate()
Form.RecordSource = "select * from Seguimiento_Clientes where fncquitaracentos(Cliente1) Like '*" & fncQuitarAcentos([Texto104]) & "*' or fncquitaracentos(Cliente2) like '*" & fncQuitarAcentos([Texto104]) & "*'"
End Sub
Cada campo cliente, se entiende que incluye nombre y apellidos.

Sin el fncquitaracentos va perfectamente; entiendo que al ser una instrucción select que va entre comillas, no me lee el fncquitaracentos como una función más y por eso no la ejecuta y me da error...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas