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.
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.
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
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.
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
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 :(
Ahora tendría que funcionar perfectamente.
¿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
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.
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()
?
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).
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.
Mira este ejemplo a ver, pero básicamente es lo mismo pero con tipos de control diferentes.
- Compartir respuesta