Filtro Múltiple En Cuadro Lista

Estoy filtrando un cuadro de lista por cuatro posibles campos (identificación fechas y motivo), el código que he armado me filtra bien las fechas y la identificación pero cuando le indico que también me filtre por un motivo ya no hace nada. Al momento de filtrar siempre me debe mostrar los registros de esa identificación y se debe poder continuar filtrando por los rangos de fecha o por un motivo.

El código que tengo es el siguiente:

Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "# AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "# AND Identificacion = '" & Me.txt_identificacion & "' OR Motivo_Accion='" & Me.txt_busca_motivo & "' "
Me.lts_nombramientos.Requery

Como siempre les agradezco de antemano por la ayuda que me dan cuando me quedo bloqueado

2 Respuestas

Respuesta
4

Con permiso de Jacinto (un saludo), voy a intentar explicarte cómo tienes que usar los operadores lógicos AND y OR para conseguir lo que quieres:

En primer lugar, tal como has puesto el WHERE en un primer momento, le estás diciendo que tiene que mostrar los registros que cumplan alguna de las dos condiciones siguientes:

1º/ Fecha_Inicio_Nombramiento tiene que ser mayor o igual que txt_busca_desde Y menor o igual que txt_busca_hasta Y Identificacion igual a txt_identificacion

2º/ Motivo_Accion igual a txt_busca_motivo

En segundo lugar, en el último WHERE que mencionas, los registros que devuelve son los que cumplen algunas de estas condiciones:

1º/ Fecha_Inicio_Nombramiento mayor o igual que txt_busca_desde Y  menor o igual que txt_busca_hasta

2º/ Identificacion igual a txt_identificacion

3º/ Motivo_Accion igual a txt_busca_motivo

Ahora bien, tú lo que quieres (según entiendo) es que te muestre los registros de una identificación y además, dentro de esos, los que cumplan la condición de fechas o motivo. En tal caso has de usar paréntesis para agrupar los criterios según tu necesidad, de la siguiente manera:

...WHERE Identificacion='" & Me.txt_identificacion & "' AND ((Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "# AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#) OR Motivo_Accion='" & Me.txt_busca_motivo & "')"

Un saludo.


¡Gracias!

Sveinbjorn El Rojo

Lo de los paréntesis ya lo había intentado pero con el orden anterior y no lo logre. Ahora lo puse como me indicas pero pasa lo siguiente:

  • Si la identificación A-1 entre las fechas del 01/05/2018 al 04/05/2018 tiene registrados los motivos A, B y A pero ahora quiero que me filtre solo el motivo B de ese mismo rango de fechas no lo hace.
  • Ahora si quiero filtrar los motivos A del rango anterior y si existen motivos A en otras fechas ya no se respetan las fechas del 01/05/2018 al 04/05/2018 y se muestra los registros de otras fechas.
  • Por otro lado si quiero que me filtre solo los motivos B sin ningún rango de fechas no muestra nada.

Usted y Jacito me han ayudado mucho y me da pena seguirlos molestando, algo estoy omitiendo que no lo estoy viendo, como lo mencione antes esos filtros los tengo separados en dos botones y si funcionan, pero no entiendo porque se me complico meter los dos filtros en un solo botón.

Gracias por tu valioso aporte

Vale, entonces el filtro lo has de construir así, en primera instancia:

...WHERE (Identificacion='" & Me.txt_identificacion & "' AND (Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "# AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#)) OR (Identificacion='" & Me.txt_identificacion & "' AND Motivo_Accion='" & Me.txt_busca_motivo & "')"

Además de lo anterior, quizás sería conveniente que construyeses el filtro solo teniendo en cuenta los cuadros de textos que se han rellenado, es decir, si en tu formulario solo rellenenas los cuadros de texto txtx_identificación y txt_busca_motivo, que tu filtro sea solo:

... WHERE Identificacion='" & Me.txt_identificacion & "' AND Motivo_Accion='" & Me.txt_busca_motivo & "'

Y así con el resto de posibilidades.

Para hacerlo puedes ver el ejemplo de Neckkito "Crear un filtro múltiple" que tiene en su web

¡Gracias!

Lo termine haciendo de esta manera y funciona como deseaba:

If IsNull(Me.txt_busca_desde And Me.txt_busca_hasta) Then
Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Motivo_Accion='" & Me.txt_busca_motivo.Value & "'AND Identificacion = '" & Me.txt_identificacion & "' order by Fecha_Inicio_Nombramiento"
Me.lts_nombramientos.Requery
Exit Sub
End If
If IsNull(Me.txt_busca_motivo) Then
Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "#  AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#" & " and " & "Identificacion = '" & Me.txt_identificacion & "'"
Me.lts_nombramientos.Requery
Exit Sub
End If
If Not IsNull((Me.txt_busca_desde) And (Me.txt_busca_hasta)) Then
Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "#  AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#" & " and " & "Identificacion = '" & Me.txt_identificacion & "' AND Motivo_Accion='" & Me.txt_busca_motivo.Value & "'"
Me.lts_nombramientos.Requery
Exit Sub
End If

Respuesta
2

Supongo que txt_Identificacion y Motivo son Texto:

Entonces después del último "mm/dd/yyyy") &" # >>Aquí le pones otra doble comilla de modo que te quedará >>

"#"  & " AND " & Identificacion = '" & Me.txt_identificacion & "'" & " OR " & "Motivo_Accion='" & Me.txt_busca_motivo & "'"

Lo que no acabo de ver es el último OR pero por algo lo habrás hecho. Saludos >> Jacinto

Gracias por tu pronta respuesta!

El "OR" se lo coloque porque quiero que se pueda filtrar por fechas, motivo o por ambos criterios, según lo que investigue entendí que con el "OR" lo podía lograr.

Le hice los cambios pero funciona solo si le cambio el OR por el AND y no es lo que necesito

Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "# AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#" & "AND Identificacion = '" & Me.txt_identificacion & "' OR Motivo_Accion='" & Me.txt_busca_motivo & "' "
Me.lts_nombramientos.Requery

Si lo he entendido bien, entonces ponle otro OR en lugar del AND después de la última Fecha

"#"  & " OR " & Identificacion = '" & Me.txt_identificacion & "'" & " OR " & "Motivo_Accion='" & Me.txt_busca_motivo & "'"

Un saludo >> Jacito

Disculpa pero me faltan unas comillas en mi código: Justo antes de Identificacion

#"  & " OR " & "Identificacion = '" & Me.txt_identificacion & "'" & " OR " & "Motivo_Accion='" & Me.txt_busca_motivo & "'"

Un saludo >> jacinto

Pues no me faltaban, es que por alguna razón no me las Escribe. Lointento de nuevo.

"#"  & " OR " & "Identificacion = '" & Me.txt_identificacion & "'" & " OR " & "Motivo_Accion='" & Me.txt_busca_motivo & "'"

Vamos a ver...

Hola

No quiere funcionar, solo filtra por las fechas y me muestra registros de otras identificaciones(empleados), el filtro de motivo no lo esta tomado en cuenta por alguna razón.

Bueno así tengo el código, no se si sara que copie algo mal:

Me.lts_nombramientos.RowSource = "SELECT * FROM tbl_Nombramientos" _
& " WHERE Fecha_Inicio_Nombramiento >= #" & Format(Me.[txt_busca_desde], "mm/dd/yyyy") & "# AND Fecha_Inicio_Nombramiento<=#" & Format(Me.[txt_busca_hasta], "mm/dd/yyyy") & "#" & " OR " & "Identificacion = '" & Me.txt_identificacion & "'" & " OR " & "Motivo_Accion='" & Me.txt_busca_motivo & "'"
Me.lts_nombramientos.Requery

Asegura que los controles tienen ese Nombre, que los Campos de la Tabla coinciden, y por último haz la prueba poniendo entre corchetes los [txt_identificacion] y [txt_busca_motivo]

Siempre que puedas evita espacios, guiones acento... o sea que mejor poner TxtBuscaMotivo que lo que tienes, y con eso no digo que esté mal, sino que a la hora de programar complica las cosas. Si aún así no te filtra me comentas. Un saludo >> Jacinto

¡Gracias! Creo que me rindo... lo hice en un access nuevo, revise bien todo los nombres de los campos y no funciona como lo necesito.

Es que si cambio el AND por OR el que esta antes de identificación al momento de filtrar se cargan registros de otros empleados y el motivo es como si no existiera.

Actualmente los filtros los tengo por separado, un botón que filtra las fechas de un empleado otro botón para ver los motivos de cada empleado, pero como la base datos ha crecido tanto fue que quería meter todo el código en un solo botón.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas