Explicación como encadenar varios tipos de filtros access

Me gustaría saber si alguien me podría explicar la mecánica para poder aplicar varios filtros a la vez, me explico tengo un formulario continuo basado en una consulta de dos tablas, pues bien quiero filtrar esos resultados mediante varios combobox, unos serian datos de tipo texto, otro fecha, y lo que quiero es el planteamiento de como sería poder utilizarlos indistintamente (todos a la vez, uno si y otro no), para aprenderlo y tenerlo claro para no preguntarlo nunca más y luego como abrir el informe sobre los resultados obtenidos. Si lo hago con un filtro no tengo problema lo que no se es como acumular los filtros.

1 Respuesta

Respuesta
2

Los filtros los tienes que ir encadenando entre sí, sin olvidarte de poner la palabra AND entre ellos, y teniendo en cuenta la sintaxis concreta para cada tipo de valor (las comillas simples, almohadillas..).

Si lo vas encadenando todo en una variable (por ej. miFiltro) por medio de condicionales, para saber si aplicar un criterio o varios o todos, has de tener en cuenta si te sobran caracteres al inicio o al final del filtro (dependerá de cómo lo construyas) para que el filtro no te de error al aplicarlo al formulario.

En la web de Neckkito Nck tienes un ejemplo de filtros múltiples perfectamente explicado ( http://goo.gl/kRTIfP ), por lo que no te voy a poner aquí de nuevo el proceso. Analiza con calma el ejemplo y verás cómo lo entiendes.

Buenas noches he revisado tu sugerencia y sobre el ejemplo de neckkito y creo que no estoy haciendo bien la adaptación del código.

Tengo un formulario continuo basado en una consulta y en el dos campos independientes cboNombre y txtFecha y botón con el siguiente código:

Dim vNombre As String
Dim vFecha As Variant
Dim vLargo As Integer
Dim miFiltro As String
vNombre = Nz(Me.cboNombre.Value, "")
vFecha = Nz(Me.txtFecha.Value, "")
miFiltro = ""
If vNombre <> "" Then
miFiltro = "[Nombre]='" & vNombre & "'"
End If
If vFecha <> "" Then
miFiltro = miFiltro & " AND [Fecha]= # " & vEdad
End If

If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 2)
End If
Me.Filter = miFiltro
Me.FilterOn = True

He tenido que quitar And delante de Nombre ya que me daba error el código con ello como ponía el ejemplo, ahora mismo si solo filtro por nombre me funciona si lo hago por fecha no.

¿Y por ultimo como puedo poner un botón para que imprima un informe lo que esta en ese momento ya sean todos los registro o los que estén filtados?

Gracias por adelantado

Primer error: Quitar el "AND " del filtro para el nombre

Segundo error: La fecha tiene que ir encerrada entre almohadillas, y sólo veo la primera

Tercer error: No asignas valor a la variable vLargo, por lo que el If del final se lo salta siempre...

Repasa de nuevo el ejemplo de Neckkito Nck, fijándote bien en los comentarios al código, porque si te doy la solución, nunca aprenderás a hacerlo por ti mismo, y la próxima vez que quieras hacer un filtro múltiple, volverás a hacer la misma pregunta otra vez...

Lo otro sería tema de una pregunta nueva, por lo que sólo te daré una idea: abre el informe con el mismo filtro que tiene el formulario.

¡Gracias! Estoy en ello:

Dim vNombre As String
Dim vFecha As Variant
Dim vLargo As Integer
Dim miFiltro As String
'Cogemos los valores que hayamos seleccionado como filtro
vNombre = Nz(Me.cboNombre.Value, "")
vFecha = Nz(Me.txtFecha.Value, "")
'Inicilizamos el filtro
miFiltro = ""
'Creamos la primera parte del filtro
If vNombre <> "" Then
miFiltro = "AND [Nombre]='" & vNombre & "'"
End If
'Creamos la segunda parte del filtro
If vFecha <> "" Then
miFiltro = miFiltro & " AND [Fecha]= # " & vFecha & " # "
End If
vLargo = Len(miFiltro)
If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 2)
End If
'Aplicamos el filtro al formulario
Me.Filter = miFiltro
Me.FilterOn = True

Sigo con el error de la segunda almohadilla estoy buscando por hay en el manual de neckkito y no veo la forma ya las combine de todas las maneras posibles pero sigo en ello.

Un slaudo

Veo otros dos errores:

1º/ Las almohadillas no llevan espacio entre ellas y la fecha

2º/ No estás eliminando los caracteres correctos antes del filtro. Compruebalo con un MsgBox miFiltro antes de aplicarlo.

Buenas Noches creo que las almohadillas ya no son el problema:

Dim vNombre As String
Dim vFecha As Date
Dim vLargo As Integer
Dim miFiltro As String
'Cogemos los valores que hayamos seleccionado como filtro
vNombre = Nz(Me.cboNombre.Value, "")
vFecha = Nz(Me.txtFecha.Value, "")
'Inicilizamos el filtro
miFiltro = ""
'Creamos la primera parte del filtro
If vNombre <> "" Then
miFiltro = "AND[Nombre]='" & vNombre & "'"
End If
'Creamos la segunda parte del filtro
If vFecha = 0 Then
miFiltro = miFiltro & " AND [Fecha]=#" & vFecha & "#"
End If
vLargo = Len(miFiltro)
If vLargo > 0 Then
miFiltro = Right(miFiltro, vLargo - 2)
End If
'Aplicamos el filtro al formulario
Me.Filter = miFiltro
Me.FilterOn = True

He declarado la variable vFecha como Date y ahora no me funciona es más me borra hasta registros.

Mañana será otro día creo que ya no estoy lucido de tanto probar.

Un saludo

Te voy seguir haciendo pensar:

1º/ Si declaras vFecha como date, ¿qué tipo de valor le tienes que pasar?

2º/ Fíjate bien en los espacios, concretamente en el filtro de vNombre

3º/ ¿Para qué sirve la linea siguiente a "If vLargo > 0 Then"?

Lo que dices de que te borre registros no tiene ningún sentido, a menos que tengas algún otro código o macro que lo haga.

Llevo buena parte de la tarde pensando con esto de verdad lo prometo, he estado repasando el capitulo 8 del tutorial de Neckkito para saber mas de las funciones right, left que se utilizan para extraer caracteres dentro de una cadena y la función len que nos da la longitud de una cadena, pero no consigo de entenderlo en este código de verdad.

1º/ debería pasarle un dato fecha. Si no es muy bueno declararla así prefiero saberlo para el futuro.

2º/ He repasado lo de los espacios de este filtro y lo tengo igual que en el original de Neckkito.

3º/ Esta es la otra parte donde estoy muy perdido ya que nunca he utilizado esto la verdad pero como te dije he estado revisando el capitulo 8 y lo que interpreto es que si la variable vLargo es mayor que 0, ejecute la parte de mi filtro estrayendo dos caracteres por la derecha de miFiltro y vLargo no?.

he realido el msgbox sobre mifiltro como me decías y me da esto:

en este caso el campo fecha estaba vacío y al dar aceptar esto:

El codigo que tengo ahora mismo es este:

Private Sub cmdFiltrar_Click()
    Dim vNombre As String
    Dim vFecha As Date
    Dim vLargo As Integer
    Dim miFiltro As String
        'Cogemos los valores que hayamos seleccionado como filtro
    vNombre = Nz(Me.cboNombre.Value, "")
    vFecha = Nz(Me.txtFecha.Value, 0)
        'Inicilizamos el filtro
    miFiltro = ""
        'Creamos la primera parte del filtro
    If vNombre <> "" Then
        miFiltro = "AND [Nombre]='" & vNombre & "'"
    End If
        'Creamos la segunda parte del filtro
    If vFecha = 0 Then
        miFiltro = miFiltro & " AND [Fecha]=#" & vFecha & "#"
    End If
    vLargo = Len(miFiltro)
    If vLargo > 0 Then
        miFiltro = Right(miFiltro, vLargo - 2)
    End If
      MsgBox miFiltro
        'Aplicamos el filtro al formulario
    Me.Filter = miFiltro
    Me.FilterOn = True
End Sub

Estoy con el profesor prueba como bien me dijo su día Neckkito y es verdad otras cosas a base de cabezoneria las saco pero esto me esta costando errores porque lo de la variable nombre la he escrito mil veces entera y me sigue saliendo esa D que no le veo el error.

Un saludo

El problema es que no entiendes lo que estás haciendo, en concreto el tercer error:

La función right coge los x caracteres por la derecha de una cadena de texto que le indicas en el segundo parámetro, lo que significa que:

miFiltro = Right(miFiltro, vLargo - 2)

Te va a asignar a miFiltro la cadena de texto resultante de coger vLargo-2 caracteres de la cadena miFiltro original, o lo que es lo mismo, le va a quitar los dos primeros caracteres por la izquierda.

Ahora bien ¿por qué motivo tu le pones que te quite sólo dos caracteres al principio (por la izda) cuando tu cadena de filtro la empiezas por "AND ", que son 4 caracteres (sí, hay que contar el espacio), es para mí todo un misterio?... Sobre todo, cuando en la explicación de código, dice, al hablar de la función Len(): "... y en segundo lugar, para poder utilizar la función RIGHT, a través de la cual eliminamos el primer “AND ” de miFiltro, para que la expresión de cadena del filtro tenga sentido a la hora de ejecutar el filtro."

VFecha Neckkito la declara como variant, porque 0 es una fecha (30/12/1899 0:00:00), y aunque lo dudo, pudiera ser que fuera un valor por el que quisieras filtrar, y al pasarle una cadena vacía ya sabe que no hay una fecha para filtrar por ese campo.

Espero que ahora comprendas el código y lo que estás haciendo mal, y ya puedas construir tus filtros múltiples sin ayuda.

Corregido el error de esa línea de código y comprendido al final, he declarado vFecha como variant:

If vFecha = "" Then
miFiltro = miFiltro & " AND [Fecha]=#" & vFecha & "#"
End If

Pero si filtro por fecha no hace nada msgbox vacío y no hace nada tampoco da ningún error de ningún tipo.

Pon el código completo como lo tienes ahora

Private Sub cmdFiltrar_Click()
    Dim vNombre As String
    Dim vFecha As Variant
    Dim vLargo As Integer
    Dim miFiltro As String
        'Cogemos los valores que hayamos seleccionado como filtro
    vNombre = Nz(Me.cboNombre.Value, "")
    vFecha = Nz(Me.txtFecha.Value, "")
        'Inicilizamos el filtro
    miFiltro = ""
        'Creamos la primera parte del filtro
    If vNombre <> "" Then
        miFiltro = "AND [Nombre]='" & vNombre & "'"
    End If
        'Creamos la segunda parte del filtro
    If vFecha = "" Then
        miFiltro = miFiltro & " AND [Fecha]=#" & vFecha & "#"
    End If
    vLargo = Len(miFiltro)
    If vLargo > 0 Then
        miFiltro = Right(miFiltro, vLargo - 4)
    End If
      MsgBox miFiltro
        'Aplicamos el filtro al formulario
    Me.Filter = miFiltro
    Me.FilterOn = True
End Sub

El codigo esta asi en el texbox del formuario estaba como formato fecha corta, y nada lo deje sin formato y tampoco.

Normal que no te salga nada, porque la parte del filtro de fecha la creas SOLO cuando vFecha=""

Correcto así es y ya lo he modificado ya pero aun así meto un valor en el que hay registros y no funciona solo con este 08/08/2015, los demás no los devuelve y los hay.

http://www.filebig.net/files/KKvCERErHr 

El ejemplo del form para que lo veas lo que digo influirá el tipo de fecha el formato americano no se la verdad las fechas me lían mucho todavía, ¿y por cierto el filtro para el informe con lo que este filtadro que es todo el código?

Un saludo

Pues no sé el por que de ese error con el formato de las fechas, nunca me había pasado tener que formatearla usando filtros por VBA. ¿Tendrás configurado tu sistema con formato americano o algo así? Además, me sale un tipo de formato fecha super raro (fecha mediana con este formato: 08-ago.-15)

De todas formas, el problema se resuelve dándole formato americano a la fecha:

miFiltro = miFiltro & " AND [Fecha]=#" & Format(vFecha,"mm/dd/yyyy") & "#"

Al abrir el informe, igual que los formularios, le puedes pasar un filtro:

DoCmd. OpenReport "Nombre", Vista,, Filtro

Por lo que únicamente tienes que pasarle el mismo filtro que tenga el formulario (antes de que preguntes, lo tienes en Me. Filter)

Buenos días no se si sera la opción más correcta pero he conseguido que me imprima el informe con los valores filtrados:

DoCmd.OpenReport "InfGastosFiltrados", acPreview, Me.Filter, miFiltro

Lo que he tenido que hacer es declarar la variable miFiltro a nivel de formulario, me costo un buen rato pero me funciona, cual es la opción para que no te active el campo nuevo, es decir un registro vacío.

Si hay otra forma mejor o mas ordenada me gustaría que me indicaras de nuevo ya que quiero aprender correctamente.

 Un saludo

DoCmd. OpenReport "InfGastosFiltrados", acPreview,, Me. Filter

Y no te es necesario declarar ninguna variable a mayores.

Creo que ya podemos dar por finalizado el tema, ¿no?

No te olvides de valorar XD

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas