Access: Filtrado por textbox en varias BD

De nuevo expertos. Como siempre, gracias de antemano por su tiempo. He aquí mi nueva inquietud. Siguiendo con mi formulario que filtra en un listbox lo escrito en un textbox, como podría hacerlo de manera avanzada, o sea, filtrar el listbox con varios textbox. Ya lo había conseguido en otro proyecto, pero ahora, la "búsqueda" debe ser realizada en otras bases de datos que tienen igual estructura. Las rutas de esas BD se encuentran en la tabla local "DireccionesBDDs". He probado con este código pero no hace nada, adaptado de otro proyecto y no he podido:

Private Sub cmd_buscar_Click()
DoCmd.SetWarnings False
Dim FiltroDocumento As String
Dim FiltroApellidos As String
Dim FiltroNombres As String
Dim FiltroDomicilio As String
Dim FiltroTelefono As String
Dim FiltroOtros_Datos As String
Dim FiltroTodos As String
Dim IntCaractFiltro As Integer
FiltroDocumento = Nz(Me.txt_documento.Value, "")
FiltroApellidos = Nz(Me.txt_apellidos.Value, "")
FiltroNombres = Nz(Me.txt_nombres.Value, "")
FiltroDomicilio = Nz(Me.txt_domicilio.Value, "")
FiltroTelefono = Nz(Me.txt_telefono.Value, "")
FiltroOtros_Datos = Nz(Me.txt_otros_datos.Value, "")
FiltroTotal = ""
    If FiltroDocumento <> "" Then
        FiltroTotal = "AND [Documento]='" & FiltroDocumento & "'"
    End If
    If FiltroApellidos <> "" Then
        FiltroTotal = FiltroTotal & "AND [Apellidos]='" & FiltroApellidos & "'"
    End If
    If FiltroNombres <> "" Then
        FiltroTotal = FiltroTotal & "AND [Nombres]='" & FiltroNombres & "'"
    End If
    If FiltroDomicilio <> "" Then
        FiltroTotal = FiltroTotal & "AND [Domicilio]='" & FiltroDomicilio & "'"
    End If
    If FiltroTelefono <> "" Then
        FiltroTotal = FiltroTotal & "AND [Telefono]='" & FiltroTelefono & "'"
    End If
    If FiltroOtros_Datos <> "" Then
        FiltroTotal = FiltroTotal & "AND [Otros_datos]='" & FiltroOtros_Datos & "'"
    End If
IntCaractFiltro = Len(FiltroTotal)
    If IntCaractFiltro > 0 Then
        FiltroTotal = Right(FiltroTotal, IntCaractFiltro - 4)
    End If
Set Datos = CurrentDb.OpenRecordset("DireccionesBDDs")
Do Until Datos.EOF
CurrentDb.Execute "insert into Aux(Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos) select Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos from Datos in '" & Datos!Ruta & "' where " & FiltroTotal
Datos.MoveNext
Loop
Lista2.RowSource = "select Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos from Aux where " & FiltroTotal
End Sub

1 respuesta

Respuesta
2

Lo primero: ¿En la tabla DireccionesBBDDs tienes la ruta completa, con nombre y extensión del archivo?

Lo segundo, si alguna carpeta o la BD tiene nombres con espacios, o caracteres "problemáticos" (como acentos, signos...) puedes probar a encerrar el nombre entre corchetes:

... From Datos in '[" & Datos!Ruta & "]' where...

Por otro lado, el filtro lo estás construyendo mal, porque tal como lo tienes, no encadenas cada parte del filtro con un espacio antes del "AND", lo que puede provocar que la consulta no deveulva valores y por eso no te inserte nada.

Hola de nuevo Sveinbjorn El Rojo. Gracias por tu tiempo.

Primero: Si, esta la ruta completa del archivo con nombre y extensión. Para filtrar cada campo anda muy bien.

Segundo: No sabia lo de los corchetes. He insertado tu código propuesto. No me ha resultado.

Tercero: No entendí a lo que te refieres, es solo poner un espacio antes del AND y listo?

Gracias como siempre por su tiempo Sveinbjorn El Rojo. Saludos

Sí, justo a eso me refiero. Verás, tu creas el filtro con este código (pongo solo los dos primeros):

FiltroTotal = ""
    If FiltroDocumento <> "" Then
        FiltroTotal = "AND [Documento]='" & FiltroDocumento & "'"
    End If
    If FiltroApellidos <> "" Then
        FiltroTotal = FiltroTotal & "AND [Apellidos]='" & FiltroApellidos & "'"
    End If

Lo que te crearía un filtro tal que así:

AND [Documento]='Documento3'AND [Apellidos]='Lopez'

Fíjate que antes del segundo AND no hay un espacio que lo separe de la comilla que sigue a domunento3 (y lo mismo con el resto de los elementos del filtro)

La solución para crear el filtro bien es tan simple como poner un espacio antes de cada AND (incluido el primero)

FiltroTotal = ""
    If FiltroDocumento <> "" Then
        FiltroTotal = " AND [Documento]='" & FiltroDocumento & "'"
    End If
    If FiltroApellidos <> "" Then
        FiltroTotal = FiltroTotal & " AND [Apellidos]='" & FiltroApellidos & "'"
    End If

y luego quitarle un caracter más en la parte final del código:

FiltroTotal = Right(FiltroTotal, IntCaractFiltro - 5)

A ver si eso resuelve tu problema.

Gracias Sveinbjorn El Rojo! Ha quedado muy bien. Pero una consulta más: lo que me has planteado por las rutas (espacios y caracteres "problemáticos"), me funciona sin los corchetes y las rutas tienen espacios en blancos. Que debería hacer? Pensando a futuro. Gracias de nuevo.

Ah!! Disculpas. Me he dado cuenta que no me suma los filtros. Y una cosa más estimado, donde debería agregar código para que busque una aproximación, no valores exactos.

DoCmd.SetWarnings False
Dim FiltroDocumento As String
Dim FiltroApellidos As String
Dim FiltroNombres As String
Dim FiltroDomicilio As String
Dim FiltroTelefono As String
Dim FiltroOtros_Datos As String
Dim FiltroTodos As String
Dim IntCaractFiltro As Integer
FiltroDocumento = Nz(Me.txt_documento.Value, "")
FiltroApellidos = Nz(Me.txt_apellidos.Value, "")
FiltroNombres = Nz(Me.txt_nombres.Value, "")
FiltroDomicilio = Nz(Me.txt_domicilio.Value, "")
FiltroTelefono = Nz(Me.txt_telefono.Value, "")
FiltroOtros_Datos = Nz(Me.txt_otros_datos.Value, "")
FiltroTotal = ""
    If FiltroDocumento <> "" Then
        FiltroTotal = " AND [Documento]='" & FiltroDocumento & "'"
    End If
    If FiltroApellidos <> "" Then
        FiltroTotal = FiltroTotal & " AND [Apellidos]='" & FiltroApellidos & "'"
    End If
    If FiltroNombres <> "" Then
        FiltroTotal = " AND [Nombres]='" & FiltroNombres & "'"
    End If
    If FiltroDomicilio <> "" Then
        FiltroTotal = FiltroTotal & " AND [Domicilio]='" & FiltroDomicilio & "'"
    End If
    If FiltroTelefono <> "" Then
        FiltroTotal = " AND [Telefono]='" & FiltroTelefono & "'"
    End If
    If FiltroOtros_Datos <> "" Then
        FiltroTotal = FiltroTotal & " AND [Otros_datos]='" & FiltroOtros_Datos & "'"
    End If
IntCaractFiltro = Len(FiltroTotal)
    If IntCaractFiltro > 0 Then
        FiltroTotal = Right(FiltroTotal, IntCaractFiltro - 5)
    End If
Set Datos = CurrentDb.OpenRecordset("DireccionesBDDs")
Do Until Datos.EOF
CurrentDb.Execute "insert into Aux(Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos) select Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos from Datos in '" & Datos!Ruta & "' where " & FiltroTotal
Datos.MoveNext
Loop
Lista2.RowSource = "select Fecha, Apellidos, Nombres, Documento, Domicilio, Telefono, Otros_Datos from Aux where " & FiltroTotal

Gracias de nuevo!!

Por lo de los corchetes no te preocupes si así te funciona, yo suelo usar otra sintaxis (poner la ruta y nombre de la BD antes del nombre de la tabla) y ahí si tengo que ponerle los corchetes. Pero como te digo, si te funciona sin ellos, no le des más vueltas.

Para buscar por aproximación tienes que cambiar los operadores "=" por el operador "LIKE" y añadirle el uso de caracteres comodín en función de cómo quieras buscar por aproximación.

Por ejemplo,

.- si quieres filtrar los apellidos que empiecen por ...: [Apellidos] LIKE '" & FiltroApellidos & "*'"

.-si quieres filtrar los apellidos que terminen por ...: [Apellidos] LIKE '*" & FiltroApellidos & "'"

.-si quieres filtrar los apellidos que contengan...: [Apellidos] LIKE '*" & FiltroApellidos & "*'"

¡Gracias genio! Ahora si anduvo de diez. Gracias por la clase. Estaba pensando en insertar el código donde no debía. Espectacular. Saludos y mil gracias por su tiempo!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas