Usar varios filtros en formulario access

Estoy intentado crear en un formulario continuo varios filtros para que me devuelva los valores que coinciden y por mas que lo intento no soy capaz, llevo varios días y me estoy volviendo loco ya lo intento hasta con dos de ellos nada mas y tampoco me sale jeje.

Adjunto una pequeña bd con un ejemplo por si alguien puede ayudarme, pero lo intentare explicar.

El formulario continuo esta basado en una consulta sobre varias tablas que básicamente tiene los siguientes datos: codigo, nombre, edad, poblacion, perfil, Oalejamineto(si/no).

He colocado varios cbo para filtrar valores pero solo quisiera que 1 fuese obligatorio nada más: Perfil (cboPerfil obligatorio), poblacion(cboPov opcional), edad(cboEdad este seria opcional pero quisiera que fuese <30 y >=45), orden alejamiento(vOrden que es un campo si/no y seria opcional). Es complicado la cosa y no se si se podrá hacer la verdad si alguien me puede orientar se lo agradecería.

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

1 Respuesta

Respuesta
1

Te devuelvo la BD a ver si es lo que buscas.

El error lo tienes en las comillas de la consulta, ya que cuando llega al formulario tiene que llevar comillas para funcionar correctamente.

Descarga BD Ejemplo

miFiltro = "perfil= """ & Me.cboPerfil & """ AND poblacion= """ & Me.cboPob & """"

¡Gracias! Si eso esta bien pero como puedo usar los otros cbo del formulario? Es decir que si selecciono algo funcionen 

Ok,

Si lo que quieres es que el filtro sea automático nada más cambiar uno de los selectores tienes que copiar el código del botón y pegarlo en el evento DESPUÉS DE ACTUALIZAR->[Procedimiento de evento]

Private Sub cboPerfil_AfterUpdate()    Dim miFiltro As String    If IsNull(Me.cboPerfil) Then        MsgBox "No ha seleccionado ningún Perfil", vbInformation, "AVISO"        Me.FilterOn = False    End If    'Si está en blanco el cuadro de busca, sales sin más    If Nz(Me.cboPerfil, "") = "" Then Exit Sub    miFiltro = "perfil= """ & Me.cboPerfil & """ AND poblacion= """ & Me.cboPob & """"    'Lo aplicas al formulario    Me.Filter = miFiltro    Me.FilterOn = TrueEnd Sub

Ahora al cambiar un selector se ejecutará el filtro (has de copiar el código para cada selector o crear una función y llamarla desde cada selector).

Lo siento no entiendo muy bien esto ultimo, ¿te refieres a que este código lo tengo que pegar en cada evento después de actualizar de cada cbo? ¿Y si por ejemplo solo quisiera elegir el perfil y que tuviera orden de alejamiento? O el perfil y que sea mayor de 45.

¿Y por ultimo en el cmd que código sería?

Gracias por ayudarme

Te dejo otro ejemplo, que supongo es lo que buscas.

BD Ejemplo varios filtros V3

Si es esto pero por ejemplo la edad en vez de traer los datos de la tabla y el campo edad en la consulta de totales buscaba que lo que lo se pudiera elegir en el como fuera de una lista de valores < 30; y  >=45 estos dos valores solamente.

y por ultimo lo de la orden de alejamiento sería así?

If Me.cboEdad <> "" Then
If miContador = 0 Then
miContador = 1
T4 = "Oalejamiento= " & Me.vOrden=true
Else
T4 = " AND Oalejamiento= " & Me.vOrden=True
End If
End If

Como dijo Jack antes de ponerse al trabajo, "vamos por partes"

1) Con respecto a lo de la edad te falta contemplar los valores entre 30 y 45 por lo que me pones; tendrían que ser tres valores:

  • <30
  • >=30 y <45
  • >=45

Como es un campo Integer, no hay problema en colocar estos valores.

Una manera sería poner el combo con:

2) Con respecto al orden, lo tienes correcto mirando por encima, solo veo un pequeño error que podría volverte loco: cambia cboEdad por vOrden

If Me.cboEdad <> "" Then

If Me.vOrden <> "" Then

Con el código que le pones mostraras los que tengan orden o todos. Se puede mejorar la función haciendo que filtre por tres tipos:

  • Los que tienen orden
  • Los que NO tienen orden
  • Todos

Pero eso ya te lo dejo para que practiques. :)

Te dejo un ejemplo con el tema de la edad.

Ejemplo varios filtros V4

No puedo descargar el ultimo ejemplo que me dejaste para ver lo de la edad

Ejemplo varios Filtros V4

Si pudieras ponerlo otra vez es que no hay link ni nada gracias

Trabajar a ciertas horas no es bueno... :)

Ejemplo varios Filtros V4

Sigo sin ver el enlace je je lo siento

Ejemplo varios Filtros V4

No lo sientas que no es culpa tuya... ;)

Hola buenas ahora al pinchar en el link me dice que no esta en el servidor, siento darte tanta guerra de verdad

Vale, el error es mio... no lo renombre correctamente... lo siento :(

Ejemplo varios Filtros V4

Ahora tendría que funcionar perfectamente.

Perfecto muchas gracias

Un placer.

¿Y ya por ultimo para contemplar las tres posibilidades en lo de la orden el código seria así?

If Me.vOrden <> "" Then
If miContador = 0 Then
miContador = 1
If Me.vOrden = 1 Then
T4 = "Oalejamiento= " & Me.vOrden=true
End If
If Me.vOrden = 2 Then
T4 = "Oalejamiento= " & Me.vOrden=false
End If
If Me.vOrden = 3 Then
T4 = "Oalejamiento= " & Me.vOrden=null
End If
Else
If Me.vOrden = 1 Then
T4 = " AND Oalejamiento= " & Me.vOrden=True
End If
If Me.vOrden = 2 Then
T4 = " AND Oalejamiento= " & Me.vOrden=False
End If
If Me.vOrden = 3 Then
T4 = " AND Oalejamiento= " & Me.vOrden=Null
End If
End If
End If

Yo quitaría la T4 en la elección de TODOS. Si quieres que salgan todos lo mejor es no filtrarlos.

If Me.vOrden = 3 Then
T4 = ""
End If

Un saludo.

Lo que pretendo es que es campo vOrden es un campo si/no y que si lo marco me elimine los que no la tengan 

¿Cuándo dices eliminar te refieres a filtrar?

Si el campo es Si/No (el del filtro) no podrás utilizar lo que me has puesto arriba, ya que tendrás solo dos valores.

Muy buenas al pasar el formulario que hemos preparado a mi bd no consigo que filtre con el código que me pusiste, no hace nada la adjunto por si le puedes echar un vistazo.

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

Además tengo un código en el botón de actualizar ordenes y no consigo que me funcione tampoco.

Un saludo y gracias por todo

Te podría devolver la solución, pero prefiero escribirla para que sepas por donde van los tiros.

1) En la tabla la edad la tienes como un campo de texto, debería ser un campo numérico, yo lo pondría ENTERO.

2) En el cuadro de selección has puesto como origen de la fila:

"Menor de 30";"Entre 30 y 45";"Mayor de 45"

Cuando tendría que ser:

1;"Menor de 30";2;"Entre 30 y 45";3;"Mayor de 45"

A partir de aquí configurar dos parámetros más:

1) Número de columnas: 2

2) Ancho de columnas: 0cm

Con estos dos parámetros ocultas el ID de los datos.

3) En el final de la función te falta: Me.FilterOn = True

Creo que eso era todo. ;)

Function filtrando()
Dim T1, T2, T3, miFiltro As String
Me.FilterOn = False

If Me.cboPerfil <> "" Then
If miContador = 0 Then
miContador = 1
T1 = "idAct= """ & Me.cboPerfil & """"
Else
T1 = " AND idAct= """ & Me.cboPerfil & """"
End If
End If
If Me.cboPob <> "" Then
If miContador = 0 Then
miContador = 1
T2 = "Pobl= """ & Me.cboPob & """"
Else
T2 = " AND Pobl= """ & Me.cboPob & """"
End If
End If
If Me.cboEdad <> "" Then
If miContador = 0 Then
miContador = 1
If Me.cboEdad = 1 Then
T3 = "edad<30 "
End If
If Me.cboEdad = 2 Then
T3 = "edad>=30 AND edad < 45 "
End If
If Me.cboEdad = 3 Then
T3 = "edad>=45 "
End If
Else
If Me.cboEdad = 1 Then
T3 = " AND edad<30 "
End If
If Me.cboEdad = 2 Then
T3 = " AND edad>=30 AND edad < 45 "
End If
If Me.cboEdad = 3 Then
T3 = " AND edad>=45 "
End If
End If
End If

miFiltro = T1 & T2 & T3
'Lo aplicas al formulario
Me.Filter = miFiltro
Me.FilterOn = True
End Function

He echo lo que me dijiste, cambiado el tipo a numero entero del campo edad, la lista de valores en el cuadro de la edad y numero de columnas y el codigo ha quedado como arriba.

Si eliges algo en perfil no hace nada y si lo haces en la edad o población da un error en tiempo de ejecución 3464.

no coinciden los tipos de datos en la expresión de criterios.

y el error lo da en esta linea

Me.FilterOn = True

Por encima parece todo bien, te paso el V5 a ver...

Ejemplo varios Filtros V4

La he descargado y esta igual que la que yo he modificado como me dijiste, en el cbo perfil no hace nada y en los otros da el mismo error que te comente.

Un saludo

El error de cboPerfil es que lo tenías puesto para que te recoja la segunda columna, la de la descripción cuando en la consulta que haces para el formulario esa columna es el ID osea un número... por eso lo tipos no coinciden.

Los errores de los demás no eran tales, ya que seguramente dejaste el dato de cboPerfil sin borrarlo y por lo tanto ese dato ya da el error todo el rato.

Ejemplo varios Filtros 6

Muchas gracias funciona correctamente, en el caso de vOrden he puesto este código y no me funciona:

If Me.vOrden <> "" Then
If miContador = 0 Then
miContador = 1
T4 = "Oalejamiento= " & Me.vOrden = True
Else
T4 = " AND Oalejamiento= " & Me.vOrden = True
End If
End If

El código que colocas está bien, te has acordado del evento "al cambiar" y poner el código:

Dim alfa As String
alfa = filtrando()

¿

?

Si si lo marco me sale un imputbox que pone introducca un valor del parámetro Falso

Me acabo de dar cuenta:

If Me.vOrden <> "" Then
     If miContador = 0 Then
          miContador = 1
          T4 = "Oalejamiento= " & Me.vOrden = True
     Else
          T4 = " AND Oalejamiento= " & Me.vOrden = True
     End If
End If

Los =True sobran.

Por otro lado en la tabla lo tienes como "Oalejamineto" y luego en el VBA Oalejamiento.

Estos pequeños detalles son los peores bugs.

Ya por que este más correcto, si le marcas al cuadro de filtro el TRIPLE ESTADO a SI tienes la opción de ver todos.

Te dejo la base de datos con los ajustes (he cambiado el nombre en la tabla que sea correcto).

Ejemplo varios Filtros 7

Antes de nada muchísimas gracias por tu ayuda.

Esta todo perfecto, funciona con los tres supuestos, de mano están todos, luego los que la tienen y por ultimo los que no. Si es cierto lo del nombre mal en la tabla me di cuenta al poner un código en mi bd completa para que actualizara el campo Oalejamiento cuando se acabara ya que tiene dos campos de fecha Desde y Hasta. Entonces al dar error y después de darle vueltas lo encontré je je aunque me costo pero me seguía dando error el formulario de filtrar.

Como lo podría realizar para que en vOrden en dez del campo check hubiero un marco con tres opciones y filtrarlo por hay es decir 1=la tiene; ¿2=No Tiene porque de mano ya salen todos porque esta basado en la consulta seria posible y código fácil? Porque si es complicarme más... lo digo porque cuando tienes filtrado por más campos llega un momento que te pierdes y no sabes donde estas porque ahora hay 5 registros que le metí dos más pero con 200 o más puede ser una locura.

Un saludo

Básicamente supongo por la explicación que quieres un control parecido al de edad... pero en vez de lista de selección con botones.

Ejemplo varios Filtros 8

Mira este ejemplo a ver, pero básicamente es lo mismo pero con tipos de control diferentes.

Si es esto en vez de botones que me sirve perfectamente era con un marco de opciones pero esto vale porque así no hay que cambiar el tipo de campo de Oalejamiento, ¿por lo que veo esta realizado con un marco de pciones y botones de altenancia es así?

Exacto, en el marco de opciones pon el tipo que desees y listo, el código para todos es igual.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas