Filtrar por varios cuadros de opciones

Lo primero buenas tardes y agradecido de poder consultar en un foro al que, aunque no tengo conocimientos para poder realizar aportaciones, si que lo sigo y consulto muy a menudo.

La pregunta que tengo es la siguiente:

Tengo varios cuadros de opciones a fin de poder filtrar Ruedas.

Las filtros son (cada uno es un cuadro de opciones): Usada, Libre, Recauchutada, Montada. Cada filtro tiene tres opciones: Todas, Si y No

El problema es que intento pasar los parámetros del filtro a un subformulario en el que aparecen todas las ruedas y no obtengo el resultado esperado.

Consigo pasar los parámetros pero el filtro no funciona correctamente.

Seguidamente paso el código de uno de los cuadros de opciones (son todos iguales) para que se pueda ver y comprobar si tengo algún error:

En el evento "¨Después de actualizar" tengo el siguiente código:

If Me.RuedasLibres = 1 Then
rl = "RuedaLibre='Si' OR RuedaLibre='No'"

End If
If Me.RuedasLibres = 2 Then
rl = "RuedaLibre='Si'"
End If
If Me.RuedasLibres = 3 Then
rl = "RuedaLibre='N'or RuedaLibre='No'"
End If
AplicaFiltroRueda

El código de AplicaFiltroRueda es el siguiente:

Me.RuedasSub.Form.Filter = rl & " and " & rm & " and " & rr & " and " & ru
Me.RuedasSub.Form.FilterOn = True

Form_RuedasSub.Requery

A fin de que se pueda ver como queda el filtro que paso al formulario es:

Respuesta
1

José Luis, en la imagen no se distingue, o al menos yo no lo veo, cuando le dices que aplique el filtro. Por otro lado, parece que "marcas" las cuatro casillas por lo que si Rueda Libre, Rueda usada,... son grupos de opciones tendrán un nombre. Vamos a suponer que se llaman RuedaLibre, RuedaUsada, etc.

En algún evento, por ejemplo al hacer clic de un botón, podrías poner

me.ruedassub.form.recordsource="select * from nombre de la tabla origen where Usada=" & me.ruedausada & " and libre=" & me.ruedalibre & " and montada= " & me.ruedamontada & " and recauchutada=" & me.recauchutada & ""

Es decir que el origen de registros del subformulario sean aquellos registros de la tabla origen de el subformulario en que el campo Usada sea igual al que figura marcado en el grupo de opciones en ese momento en el formulario y que su campo libre sea igual al que figura en el grupo de opciones RuedaLibre,...

Muchas gracias Julián:

Voy a probar con el comando recordsource a ver si me funciona, como ves yo estaba intentándolo con el comando formFilter y no me iba.

Gracias de nuevo, ya te comentaré.

Jose Luis, si en la tabla guardas los valores como SI, No,.. no te valdrá ya que la instrucción lo que tiene en cuenta es que el grupo de opciones tiene valor numérico. Personalmente, lo que haría sería dejar en la tabla dichos valores numéricos, y por tanto en el subformulario. Ya le darás la "apariencia bonita" en el propio subformulario con, por ejemplo, un cuadro combinado.

Si quieres, repito, si quieres, mándame un mensaje ( sólo el mensaje) a [email protected] y te mando un ejemplo de como lo puedes hacer.

Si lo haces, en el asunto del mensaje pon tu alias Jose Luis, ya que si no sé quien me escribe ni los abro.

Buenas tarde Julián:

Lo primero agradecer tu respuesta tan rápida. Enfin, vamos al tema.

En la respuesta que me das, tu haces el filtro sobre el origen de datos, y dices que sobre la tabla. 1ª Pregunta: ¿Ese filtro se le podría pasar a una "consulta" siendo esta el origen de los datos del formulario?

2ª Pregunta: No consigo que me filtre pasando la opción "Todos", es decir que me incluya el "si" y el "no". Me explico, cuando el usuario pulsa la opción "Todos", el parámetro que yo paso al filtro es: "RuedaMontada="S" and RuedaMontada="N"". No consigo que me acepte este filtro.

Se te ocurre alguna solución.

Gracias de nuevo y disculpa mi ignorancia

José Luis, para no tener que rellenar yo una tabla con muchos campos y muchos registros, que es lo que más se odia, si no tienes inconveniente y los datos no son confidenciales, haz una base sólo con la tabla origen del subformulario y me la mandas a [email protected]

Creo que sería lo mejor

2 respuestas más de otros expertos

Respuesta

Creo que podrías simplificar las opciones (y el código en su conjunto).

Lo primero: la opción uno carece de sentido y simplemente no la utilizaría.

Todos = (si + no), si no se utiliza ese campo, el resultado será el mismo, el código más simple.

Las opciones serán: un cero (0) por defecto, un uno para el SI, un dos para el NO (si no se marca ninguna opción devuelve cero)

Vamos a crear el filtro y después se le asigna al recorset (descarto la opción uno) de todos ellos.

Dim XFiltro as String

If Me.Ruedaslibres <> 0 Then XFiltro=  "RuedaLibre= " & IIF(Me.RuedasLibres =1, 'Si', 'No")

-En el segundo paso y siguientes, hay que verificar si hay contenido en XFiltro paa añadir el AND.

IF Me.RuedaMonta <> 0 And Xfiltro <> "" Then XFiltro = XFiltro & " And "

If Me.RuedaMonta <> 0 Then XFiltro= XFiltro &  " RuedaMonta= " & IIF(Me.RuedaMonta =1, 'Si', 'No")

IF Me.Recauchutada<> 0 And Xfiltro <> "" Then XFiltro = XFiltro & " And "

If Me.Recauchutada<> 0 Then XFiltro= XFiltro &  " RuedaRe???= " & IIF(Me.Recauchutada=1, 'Si', 'No")

IF Me.Usada <> 0 And Xfiltro <> "" Then XFiltro = XFiltro & " And "

If Me.usada<> 0 Then XFiltro= XFiltro &  " RuedaRe???= " & IIF(Me.usada =1, 'Si', 'No")

Me.RuedasSub.Form.Filter = XFiltro
Me.RuedasSub.Form.FilterOn = True

Verifica la sintaxis, está escrito sobre la marcha en el foro.

Gracias Enrique:

Probaré con la sintaxis que indicas para el filtro, aunque no acabo de verlo.

Gracias de nuevo, muy amable.

Analizando la segunda opción (uytiliza la misma lógica que la primera y las siguientes):

IF Me.RuedaMonta <> 0 And Xfiltro <> "" Then XFiltro = XFiltro & " And "

If Me.RuedaMonta <> 0 Then XFiltro= XFiltro &  " RuedaMonta= " & IIF(Me.RuedaMonta =1, "'Si'", "'No'")

Si en el cuadro de opciones Me. RuedaMonta no se marca ni el SI ni el NO (ver respuesta anterior), devolvería un cero, (0) como no se cumple 'Me. RuedaMonta <> 0' saltara a la siguiente que también seria ignorada, esto es: no se utilizaría esa condición en el filtro.

Si es diferente de cero (sea un Si o un No) se aplicara la condición por lo que se verifica si el filtro ya contiene una condición (XFiltro <> ""), de tenerla añade el AND:

XFiltro = XFiltro & " And "

AL ser diferente  de cero se le añade al filtro el comparando: 

XFiltro= XFiltro & " RuedaMonta= "

Con el IIF un SI cuando el valor es 1 y un NO cuando no es ni un cero ni un uno (es un dos):

La sintaxis correcta del IIF seria esta:

 IIF(Me.RuedaMonta =1, "'Si'", "'No'")

Al finalizar esa sentencia con un cero en RuedasLibres y un dos en RuedasMonta, en XFIltro tendríamos:

XFiltro = " RuedaMonta= 'No'"

Con un 1 en la siguiente

XFiltro = " RuedaMonta= 'No' And RuedaRe???= 'SI'"

Con un 2 en la cuarta y ultima:

XFiltro = " RuedaMonta= 'No' And RuedaRe???=  'SI' And Usada = 'NO'"

Rectifica la sintaxis (y la última línea mal escrita por utilizar Copy&Paste y no adaptarla)

En definitiva: a la rueda (no le incumbe si es o no libre), no las montara + ha de ser recauchutada + sin uso previo.

Respuesta

José si quiere profundizar sobre filtros avanzados lo invito a ver mi video en YouTube.

(208) Búsquedas y Filtros avanzados en Access - YouTube

Esta explicación cubre técnicas profesionales sobre filtros, puede adaptar parte para su proyecto, ahora, si no lo entiende puede enviarme su base de datos a [email protected] y reviso que se puede adaptar.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas