Crear dos variables de filtro dependientes

Necesito crear en mi formulario dos variables de filtro que vayan relacionadas. Tengo un formulario con todo tipo de datos y necesitaría poder hacer un filtro por persona (por ejemplo, si es cliente o proveedor) y por zona (por ejemplo por comunidad autónoma).

Mediante macros he podido crear las variables de filtro sin problemas, pero si filtro por persona y luego por comunidad, el primer filtro se me borra. Yo necesitaría que filtrara los dos a la vez, teniendo una variable a la que filtrar en cada caso.

¿Sería eso posible? (Soy principiante en todo esto, así que si fuera con código necesitaría una breve explicación de dónde debería poner el nombre de los cuadros combinados creados para el filtro, el formulario y las variables que van a filtrarse...)

1 respuesta

Respuesta
1

Te remito a un ejemplo explicado creado por Neckkito, que explica cómo hacer filtros múltiples. No creo que tengas problema para adaptarlo.

http://siliconproject.com.ar/neckkito/index.php/component/content/article/93-ejemplos-explicados/ejemplos-de-formularios/194-crear-un-filtro-multiple 

Saludos!


Visítanos: http://nksvaccessolutions.com/ 

Buenas, he estado probando esta opción pero no consigo que funcione..

A ver, el filtro quería que se me hiciera en base a dos cuadros combinados (los de búsqueda) que tienen los mismos valores que los cuadros combinados del formulario. Estos cuadros tienen 5 nombres en un caso, y 3 opciones (Bien, mal, normal) en otro.

Al hacer el filtro este no consigo que me filtre, sólo me deja un registro filtrado en el que no hay información.

Cuál sería la forma más sencilla de conseguir este filtro?

La forma es la del ejemplo indicado.

Puedes hacerlo de dos formas:

1º/ Filtrar solo al pulsar un botón, con lo que el código ha de analizar si solo hay un combo con datos y hacer un filtro sencillo, o si hay datos en los dos combos y hacer un filtro compuesto

2º/ Filtrar cada vez que cambie uno de los combos, con lo que tendrás que ver si el otro combo tiene o no valor para aplicar un filtro simple o compuesto.

Pero como te digo, la forma de crear los filtros y filtrar es la explicada en el ejemplo.

¡Gracias! 

Hola Sveinbjorn, perdona por la molestia otra vez.

Tras conseguir que el filtro funcionara, he tenido que cambiar la base de datos y la información que usaba de filtro ponerla en un subformulario.

Necesito que el formulario principal se filtre por el subformulario (con las mismas características que había explicado antes, sólo que en vez de estar en el mismo formulario, lo tengo con una relación con la id principal).

Creo que el mismo filtro puede servir (o espero que sirva!) pero no sé, mediante el código, escoger la variable dentro del subformulario, puesto que el filtro no está en el sino que pretendo ponerlo en el formulario (A ver si me explico... si pongo el filtro en el subformulario, me filtra dentro del registro en el que estoy buscando los casos del subformulario, pero yo quiero que me filtre los registros principales, los del formulario, en base a los distintos casos que podemos encontrar en el subformulario).

Creo que sólo necesito saber cómo "citar", o cómo decir que la variable "persona" del subformulario es la que voy a usar como filtro. Había estado buscando y usaba la fórmula  Forms![Formulario Principal]![Subformulario].Form![variable], pero cuando hago click en el botón de comando, se me are una ventana para que ponga el valor de la variable, por lo que entiendo que no me está leyendo esta fórmula o que no la estoy aplicando bien.
Te dejo el código que estoy usando a ver..
Dim filtroa As String
    Dim filtrob As String
    Dim vLargo As Integer
    Dim miFiltro As String
        'Cogemos los valores que hayamos seleccionado como filtro
    filtroa = Nz(Me.Cuadro_combinado283.Value, "")
    filtrob = Nz(Me.Cuadro_combinado285.Value, "")
        'Inicializamos el filtro
    miFiltro = ""
        'Creamos la primera parte del filtro
    If filtroa <> "" Then
        miFiltro = "AND Forms![Formulario Principal]![Subformulario].Form![variable a del subformulario]='" & filtroa & "'"
    End If
        'Creamos la segunda parte del filtro
    If filtrob <> "" Then
        miFiltro = miFiltro & " AND Forms![Formulario Principal]![Subformulario].Form![variable B del subformulario]='" & filtrob & "'"
    End If
        'Ahora cogemos la longitud del filtro
    vLargo = Len(miFiltro)
        'Recomponemos el filtro eliminando el primer 'AND '
    If vLargo > 0 Then
        miFiltro = Right(miFiltro, vLargo - 4)
    End If
        'Aplicamos el filtro al formulario
    Me.Filter = miFiltro
    Me.FilterOn = True

Dime si es correcto o qué debería hacer.

Muchas gracias por tu ayuda!

Hola! Gracias por la respuesta.

Ahora me han hecho realizar cambios en la base de datos y necesito el mismo filtro combinado, que ya me funcionaba bien, pero que desde el formulario principal filtre las opciones existentes en un subformulario, que es donde he tenido que poner la información esta ahora.

Es posible?

No es molestia.

Antes de echar a correr hay que saber andar y tú aún estás en fase de gateo, en lo que a VBA se refiere... XD Te convendría ojear algún manual para entender estos códigos, por ejemplo los que encontrarás en la web de Neckkito.

Imagino que habrás llegado a este enlace (o similar) para ver la sintaxis que se requiere para trabajar con subformularios, pero como aún "andas a gatas", te has liado más de lo que te ha ayudado.

Voy intentar enseñarte "a andar", aclarándote un par de conceptos básicos en los que creo que flojeas:

1º/ Cuando usas la palabra "Me", para referirte a un control (Me. Cuadro_combinado283) o a una propiedad (Me. Filter), ese "Me" es una forma resumida de hacer referencia al formulario en que programas el código (sería lo mismo que poner Forms("NombreFormulario"), Forms! NombreFormulario o similar).

Esto es importante tenerlo claro para saber colocar el código en un sitio u otro.

2º/ Los filtros, como sabrás, tienen dos partes (3 con el operador): la primera (a la izqda del operador) es por lo que quieres filtrar, y la segunda (a la derecha del operador), el valor o parte del mismo por el que quieres filtrar.

Cuando creas un filtro en un formulario (o informe), por ejemplo ([Nombre]='" & vNombre & "'"), la primera parte siempre hace referencia al nombre del campo de la tabla/consulta que proporciona los datos al formulario o informe, y la segunda al valor, que puede estar en una variables (como en el caso de vNombre), en un control del formulario o del subformulario, o escrito directamente en el propio código.

Si en la primera parte pones cualquier cosa que no sea el nombre de un campo válido de la tabla/consulta, te saldrá el "error" que comentas: te pedirá el parámetro y no te devolverá nada con sentido.

Con todo este rollo, lo que te pretendo transmitir es:

1º/ Es importante saber cómo construir los filtros.

2º/ Y aún más, es importante dónde coloques el código, sobre todo para saber cómo hacer referencia a los distintos objetos.

Por tanto, además de corregir la construcción de los filtros, tendrás que corregir:

=> Si el código que transcribes lo tienes en el formulario principal, y los cuadros combinados están en el subformulario, para asignar valor a las variables tendrás que hacer:

filtroa = Nz(Me.NombreSubformulario.Form.Cuadro_combinado283.Value, "")

La parte en negrita has de sustituirla por el nombre que tenga tu subformulario.

=> Si el código lo tienes en el subformulario, para aplicar el filtro al formulario principal no puedes usar Me.Filter=... y Me.FilterOn=True, pues así se lo aplicas al subformulario. Tienes que usar "Parent", para hacer referencia al form principal:

Me.Parent.Filter=...

Me.Parent.FilterOn=True

A ver si con estas indicaciones eres capaz de conseguirlo.

Saludos!


Visítanos: http://nksvaccessolutions.com/ 

Hola Svein,

Gracias por la rápida respuesta. Sé que aún gateo, jajaja, el problema es cuando en la empresa te piden esta base de datos con urgencia sin ser para nada experto en ello.. Realmente sólo me falta este filtro y habré acabado la base, que espero poder ir mejorando según vaya aprendiendo (He estado viendo la web de Neckkito y me ha ayudado en muchas cosas, y las que me faltan por aprender!) y también conociendo mejor el Access.

Ahora mismo, pero, tengo que presentar esta bdd muy pronto y casi que lo que busco es un parche que funcione a la solución definitiva jajaja.

A ver, sobre el filtro:

Creo que lo he pillado pero a la vez no lo he pillado:

- Los campos base, los cuadros donde hay la información que servirá de filtro, los tengo en el subformulario

- Los cuadros de filtro, los que he creado para decidir yo qué registros quiero filtrar, los tengo en el formulario principal, aunque podría ponerlos en el subformulario, esto no es ningún problema para mí

Lo que no consigo, lo haga desde el formulario o desde el subformulario, es que me encuentre el parámetro de los campos base. Por lo que he entendido, si el código lo pongo en el subformulario, poniendo solo Me.[variable] ya debería servir para que lo buscara, y luego el filtro con Me.Parent.Filter.

Por lo que me he fijado el formulario se filtra, aunque no me dé menos registros (porque no pongo parámetro en el cuadro emergente que me salta) sí que me sale como filtrado, por lo que creo que voy por buen camino.

Me falta sólo saber cómo escoger la variable que te decía como base, el campo variable a que se filtrará desde el cuadro combinado 285.

No sé si me he explicado, gracias por tu ayuda!

Sigo sin entenderte del todo lo que comentas de la parte del campo variable... y es difícil visualizar lo ue quieres a partir de las explicaciones que das.

Intuyo que lo que quieres es hacer un filtro en que ambas partes (campo donde filtrar y valor por el que filtrar) sean "variables", es decir, que tu en un desplegable (llamémoslo cboCampos) escojas el nombre del campo por el que filtrar, y en otro desplegable (o cuadro de texto) pongas el valor por el que filtrar.

Si es eso lo que pides, es muy fácil, y el filtro se construiría de esta forma (con las indicaciones de cómo llamar a los controles según dónde pongas el código):

    If filtroa <> "" Then
        miFiltro = "AND [" & Me.cboCampos & "]='" & filtroa & "'"
    End If

A ver si esto te termina de aclarar las dudas.

No exactamente.

A ver, intento explicarlo.. (me gustaría subir la bdd para que pudieras comprobar lo que explico pero no me lo permiten).

Mi bdd es de acciones realizadas o por realizar en la empresa. Yo tengo el campo responsable, donde salen en un cuadro combinado los nombres de los responsables de los proyectos, y un campo de situación, también cuadro combinado, donde se dice el estado del proyecto, si está realizado, por realizar o pendiente.

HE tenido que crear un subformulario porque para cada proyecto puede haber diferentes responsables que hayan tocado el caso.

A mí me gustaría que los responsables pudieran filtrar por su nombre y el estado del caso, para facilitar así el trabajo de gestión. Es por eso que quería poner el filtro y que no sabía donde ponerlo. Yo puedo crear los dos campos (de búsqueda por responsable y por estado del caso) tanto en el formulario principal como el subformulario, y poner el filtro en cualquiera de los dos lugares, eso me da igual. Lo único que necesito es que no me filtre dentro del subformulario lo que le pido sino en el propio formulario principal (que con el Parent creo que ya lo he conseguido).

No sé si ahora me he explicado mejor, creo que sí jajaja

Espero no ser el tío que más molestias te ha causado en este foro..

Muchas gracias por tu ayuda, de verdad.

Creo que ya entiendo lo que pides, y es un poco más complicado de lo que te expliqué en un primer momento (porque no te había entendido correctamente, jejeje)

Voy intentar prepararte un ejemplo a lo largo de esta mañana o primera hora de la tarde y te lo envío.

Si me quieres poner las cosas un poco más fáciles, crea una BD con una estructura similar a la que uses (no hace falta que tenga todas las tablas de la real, ni todos los campos, ni siquiera datos reales) y la subes.

Con tal que tenga un formulario con un subformulario, y las dos tablas de las que toman los datos, para mí es suficiente. Las tablas con que tengan un campo ID similar al real, y al menos los campos por los que se ha de filtrar también suficiente.

Aquí tienes el mini-ejemplo: http://www.filebig.net/files/PVucP3Sfnk 

Espero que más o menos sea cómo lo tienes estructurado, aunque cuento con que seas capaz de adaptarlo a tus necesidades. Los combos para filtrar y los botones los he puesto en el formulario principal, porque considero que es donde más sentido tiene que estén.

Fíjate también que uno de los campos del filtro (Estado) está en el formulario principal y el otro (Responsable) en el subformulario.

Ya me dirás.

Buenas, lo he intentado pero no me dejan ni subir una estructura mínima...

Más o menos es lo que te he explicado, imagina un formulario principal con un ID de caso, donde salen fechas, nombres, país, etc. Sólo hay un id por caso, así que no existen repetidos. Es por eso que, en el caso de los responsables y sus gestiones, hay que hacer un subformulario con otra tabla, relacionado por el ID de caso, ya que puede haber varios responsables.

La idea es la que te he dicho de un filtro por responsable y estado del caso para cada uno de ellos, podemos imaginar que aun no he creado ningún filtro, así que no me importa si lo creo en el formulario principal o en el subformulario, pero sí que me lo hacen crear, jajaja...

No sé si te ayudará pero he intentado subirlo de mil maneras y el sistema no me lo permite.

Gracias por la ayuda!

PD. Las tablas son 2: 1 con el ID de caso, y la información general de los casos, que no tiene duplicados, y otra con la información de cada caso según los responsables que lo gestionen, o sea, si lo lleva Pedro es un registro dentro del caso, Juan sería otro..

Las variables que uso y que quiero usar como filtro son cuadros combinados con una lista de valores como origen, siendo una el nombre del responsable y la otra el estado de la gestión del responsable.

¿Viste el ejemplo que te subí? Hay dos mensajes seguidos míos, y creo que el ejemplo se ajusta bastante a tu caso, aunque creo que en el tuyo el campo "Estado" está también en el subformulario, en cuyo caso la forma de construir el filtro para ese campo es idéntica a la del Responsable.

Vale, he visto que tú tienes una tabla por cada lista de los cuadros combinados y que relacionas la ID con las otras tablas. Eso es importante? Me refiero a que yo no lo tengo en una tabla sino en una lista de valores y quizá afecta..

Ahora mismo me da Error 12, no coinciden los tipos, y no sé a qué se refiere pero por lo que he visto lo que puede afectar es eso...

Sí, eso que comentas es importante, y además, hacerlo mediante tablas "auxiliares" es más correcto. Imagínate que tienes en tu cuadro combinado de responsables en el subformulario la siguiente lista de valores, como origen de datos de dicho cuadro combinado:

"Juan Perez";"Perico Delgado"; "Maria Pita".

Si se contrata a otro personal, que también puede ser responsable del proyecto, para añadirlo tendrás que abrir el formulario en vista diseño, sacar las propiedades del cuadro combinado y añadirlo:

"Juan Perez";"Perico Delgado"; "Maria Pita";"Filomena Segura".

Si solo tienes un cuadro combinado con los responsables, no es mucho chollo, pero ¿y si tienes 5? ¿O 20?. Necesitas cambiarlos en todos y cada uno.

Si lo haces por medio de una tabla auxiliar, con tal de añadir un nuevo registro a esa tabla, ya lo tienes automáticamente actualizado en todos.

Otra ventaja es que al almacenar en al tabla principal un valor numérico (el ID de la tabla auxiliar), optimizas el tamaño de la BD (un campo texto ocupa más que uno numérico)

Además, al trabajar con números es más sencillo escribir el código para hacer cosas como los filtros, pues no te tienes que preocupar de escribir comillas simples para pasar los valores de los cuadros combinados.

Esto último va en relación con el error que te da a ti: si tienes valores de texto, en los filtros tienes que tratarlos como textos, declarando las variables como string en vez de integer, usando "" en vez del -1 en Nz() y pasando los valores entre comillas (como hacías en el código original y en el ejemplo)...

Hola Svein! Tienes algún correo donde pueda enviarte la base?

Hay algo que no estoy haciendo bien y no sé lo que es, he conseguido hacerte una copia de la base que uso (quitando toda la información que no tiene que ver con mi problema) y para que así pudieras ver donde está el error, porque no consigo econtrarlo...

Puedes enviarlo (comprimido en zip o rar) a este correo: [email protected] o bien, subirlo a algún servidor en la nube (dropbox, filebig...) y compartir por aquí (o al mail) el enlace.

En el archivo que envías tienes dos cosas mal:

1º/ En la tabla "MEDIADORES CASOS", los tipos de datos para mediador y estado son incorrectos: tendrían que ser número porque ahora los relacionas con los ids numéricos de las tablas auxiliares. Para cambiarlo primero tendrás que eliminar las relaciones, luego los cambias a número, y creas de nuevo las relaciones.

2º/ En el código VBA, el nombre de la tabla lo tienes "mal" en la SQL, pues debería ir entre corchetes y sin la barra baja, es decir, así:

If miResponsable <> -1 Then miFiltro = miFiltro & " AND ID_contrato_alquiler In (SELECT ID_contrato_Alquiler FROM [MEDIADORES CASOS] WHERE nombre_mediador5=" & miResponsable & ")"

A mi con esos dos retoque me filtra perfectamente.

Saludos!


No te olvides de pasarte por: http://nksvaccessolutions.com/ En breve habrá novedades acceseras...

¡Gracias!  Ahora sí, perfecto!!!! Muchísimas gracias!!! No sé qué habría hecho sin ti! :D

Hola Sveinbjorn! un último detalle, pequeñito y ya acabo jajaja...

A ver, ahora me filtra perfecto, peeero si le pongo mediador 1 y resuelto, también me selecciona los casos en los que el mediador uno está en gestión y otro mediador lo tiene resuelto, como si filtrara a la vez pero no las dos condiciones juntas, no sé si me explico...

Qué me falta poner para que lo detecte unido?Para que filtre sólo los casos en los que el mediador seleccionado tiene los casos con el estado seleccionado?

Acabo de comprobar eso que dices en el archivo que me enviaste y a mi me filtra correctamente...

Prueba esto, a ver si te va mejor:

Private Sub Comando287_Click()
Dim miResponsable As Integer
Dim miEstado As Integer
Dim miFiltro As String
'Cojo sus valores
miResponsable = Nz(Me.Cuadro_combinado283, -1)
miEstado = Nz(Me.Cuadro_combinado285, -1)
'Los analizo para construir el filtro
If miEstado = -1 And miResponsable = -1 Then
    MsgBox "No has elegido ningún criterio para filtrar", vbInformation
    Exit Sub
ElseIf miEstado=-1 Then
     miFiltro = "ID_contrato_alquiler In (SELECT ID_contrato_Alquiler FROM [MEDIADORES CASOS] WHERE nombre_mediador5=" & miResponsable & ")"
ElseIf miResponsable=-1 Then
     miFiltro = "ID_contrato_alquiler In (SELECT ID_Contrato_alquiler FROM [MEDIADORES CASOS] WHERE Estado_acuerdo5=" & miEstado & ")"
Else
    miFiltro = "ID_contrato_alquiler In (SELECT ID_Contrato_alquiler FROM [MEDIADORES CASOS] WHERE Estado_acuerdo5=" & miEstado & " AND nombre_mediador5=" & miResponsable & ")"
End If
Me.Filter = miFiltro
Me.FilterOn = True
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas