Anda di halaman 1dari 6

CONSTRUIR UN FILTRO MÚLTIPLE1

Crear un filtro con un solo criterio es relativamente sencillo.


Sin embargo, en ocasiones necesitamos filtrar por más de
un campo, con lo cual la cosa se complica un poco.

A través de este ejemplo vamos a ver cómo podemos


construir un filtro múltiple, que afecte a diversos campos.
Además, el filtro nos permitirá dejar campos en blanco, con
lo que ese campo en concreto no actuará de filtro.
Aprovecharemos para ver cómo construimos el filtro en
función de si el valor a buscar está declarado como
numérico, texto o booleano (sí/no).

Aprovecharemos el ejemplo para ir explicando algunas cosas que quizá no sepamos, tanto de
controles como de código, para que os sea más fácil entender el comportamiento de Access y
el por qué a veces en algo que creemos que estamos haciendo bien Access parece no
responder correctamente.

Con esto ya podemos empezar a trabajar en nuestro filtro.

PREPARANDO NUESTRA TABLA


Para poder desarrollar el ejemplo vamos a construirnos una tabla, que llamaremos TDatos, con
la siguiente estructura:

Como vemos, tenemos datos de diferente tipología (texto, número y booleano).

PREPARANDO NUESTRO FORMULARIO


Sobre nuestra tabla TDatos vamos a crearnos un formulario, que llamaremos FDatos. Los
controles para poder realizar la búsqueda vamos a situarlos en el encabezado del formulario.

PARA SELECCIONAR EL NOMBRE

Así pues, empezamos introduciendo un cuadro combinado para poder buscar por nombre.
Cuando nos salga el asistente lo configuramos de la siguiente manera:

• Deseo que el cuadro combinado busque los valores en una tabla


• Seleccionamos la tabla TDatos
• Seleccionamos el campo [Nombre]
1 La BD de ejemplo os la podéis bajar aquí

1
Visítame en http://neckkito.siliconproject.com.ar
• Ordenamos según nuestro gusto
• Redimensionamos según nuestro gusto
• Recordar el valor para utilizarlo más adelante
• Como etiqueta podemos escribir, sin comillas,
“Nombre”.

Modifiquemos algunas cosas de nuestro combo.

Si no tenemos clave principal no habría problema, pero, en


este caso, sí tenemos clave principal. ¿Qué significa eso?
Que nuestro combo no nos guarda el valor del campo
[Nombre], aunque nos lo muestre, sino que lo que guarda
es el valor de la clave principal.
Es decir, que aunque nosotros, al desplegar el combo, sólo veamos el nombre en realidad el
combo tiene dos columnas: la columna 1, correspondiente a la clave principal, y la columna 2,
correspondiente al nombre.

Vamos a arreglar esto. Seleccionamos el combo y sacamos sus propiedades. Nos vamos a la
pestaña Datos → Columna dependiente, y ahí le cambiamos el valor 1 por el valor 2. De esta
manera le estamos diciendo que el valor que debe almacenar es el nombre.

Todavía en las propiedades vamos a cambiar el nombre del combo 2. Le ponemos de nombre
cboNombre.

PARA SELECCIONAR LA EDAD

Vamos a añadir ahora otro cuadro combinado para seleccionar la edad. Cuando nos aparezca el
asistente lo configuramos así:

• Deseo que el cuadro combinado busque los valores en una tabla


• Seleccionamos la tabla TDatos
• Seleccionamos el campo [Edad]
• Ordenamos según nuestro gusto
• Redimensionamos según nuestro gusto
• Recordar el valor para utilizarlo más adelante
• Como etiqueta podemos escribir, sin comillas, “Edad”.

De nuevo el combo nos va a guardar el valor de la clave principal. Vamos a modificar de


manera diferente el origen de la fila para conseguir dos cosas:

1.- Que nos guarde el valor [Edad]


2.- Que nos elimine de la lista las edades duplicadas.

Para ello realizaremos las siguientes operaciones:

– Sacamos las propiedades del combo y nos vamos a la pestaña Formato → Número de
columnas, y le cambiamos el valor a 1
– Dentro de esa misma pestaña nos fijamos en la propiedad “Ancho de columnas”.
Veremos que hay un valor a cero, un punto y coma, y un segundo valor. Eliminamos el
valor a cero junto con el punto y coma, de manera que nos quede sólo un valor como
ancho de columna.
– Nos vamos a la pestaña Datos → Origen de la fila. Si nos situamos sobre la SQL
veremos que nos aparece un pequeño botón de puntos suspensivos. Si hacemos click
2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →
Nombre. Ahí escribimos el nombre que queramos.

2
Visítame en http://neckkito.siliconproject.com.ar
sobre él se nos abrirá la consulta subyacente. En esa consulta seleccionamos la
columna correspondiente al campo [Id] y, una vez seleccionada, pulsamos la tecla
“Supr”. Cerramos, guardando y actualizando los cambios.
– Finalmente, para que no nos aparezcan edades
duplicadas, nos vamos a la misma propiedad que
comentábamos en el punto anterior (“Origen de la
fila”). Veremos que la SQL empieza por SELECT. Lo
único que debemos hacer es añadir, tras el SELECT,
la palabra “DISTINCT”, de manera que la SQL
empezaría por “SELECT DISTINCT ...”

De nombre le ponemos cboEdad

PARA SELECCIONAR EL ESTADO CIVIL


Vamos a insertar un checkbox (casilla de verificación) para poder determinar el filtro sobre el
estado civil.

Como título de etiqueta para ese check podemos escribir “Casado?”

Como nombre para el propio checkbox podemos asignarle el siguiente: chkCasado

Y aquí ya no hay más secreto. Eso es todo.

PARA SELECCIONAR EL CONTINENTE


Añadimos finalmente otro cuadro combinado para poder elegir el continente. Cuando nos salga
el asistente lo configuramos así:

• Deseo que el cuadro combinado busque los valores en una tabla


• Seleccionamos la tabla TDatos
• Seleccionamos el campo [Continente]
• Ordenamos según nuestro gusto
• Redimensionamos según nuestro gusto
• Recordar el valor para utilizarlo más adelante
• Como etiqueta podemos escribir, sin comillas, “Continente”.

A ese combo le ponemos de nombre cboContinente.

Ya sabemos cómo modificar el combo para que sólo nos aparezca un campo, y cómo modificar
la SQL para evitar la aparición de duplicados. De todas maneras lo vuelvo a comentar por si las
moscas:

– Sacamos las propiedades del combo y nos vamos a la pestaña Formato → Número de
columnas, y le cambiamos el valor a 1
– Dentro de esa misma pestaña nos fijamos en la propiedad “Ancho de columnas”.
Veremos que hay un valor a cero, un punto y coma, y un segundo valor. Eliminamos el
valor a cero junto con el punto y coma, de manera que nos quede sólo un valor como
ancho de columna.
– Nos vamos a la pestaña Datos → Origen de la fila. Si nos situamos sobre la SQL
veremos que nos aparece un pequeño botón de puntos suspensivos. Si hacemos click
sobre él se nos abrirá la consulta subyacente. En esa consulta seleccionamos la
columna correspondiente al campo [Id] y, una vez seleccionada, pulsamos la tecla
“Supr”. Cerramos, guardando y actualizando los cambios.
– Finalmente, para que no nos aparezcan edades duplicadas, nos vamos a la misma

3
Visítame en http://neckkito.siliconproject.com.ar
propiedad que comentábamos en el punto anterior (“Origen de la fila”). Veremos que la
SQL empieza por SELECT. Lo único que debemos hacer es añadir, tras el SELECT, la
palabra “DISTINCT”, de manera que la SQL empezaría por “SELECT
DISTINCT...”

PARA EJECUTAR EL FILTRO

Para ejecutar el filtro vamos a insertar un botón de comando, al


que pondremos de nombre cmdFiltro.

En el siguiente epígrafe veremos cómo configurar nuestro filtro.

Finalmente, a mí el formulario me ha quedado de la siguiente manera:

PROGRAMANDO NUESTRO BOTÓN DE COMANDO


El filtro que vamos a ver se podría realizar de una manera más “directa”. Sin embargo, yo voy
a pasar todos los valores por variables para que podáis entender mejor cada uno de los pasos.

Pues vamos, en el evento “Al hacer click” de nuestro botón cmdFiltro, a generar el siguiente
código3:


Private Sub cmdFiltro_Click()
'Neckkito -- 13/01/13
'Declaramos las variables
Dim vNombre As String
Dim vEdad As Variant
Dim vCasado As Variant
Dim vContinente As String
Dim vLargo As Integer
Dim miFiltro As String
'Cogemos los valores que hayamos seleccionado como filtro
vNombre = Nz(Me.cboNombre.Value, "")

3 Para generar código debemos sacar las propiedades del control → Pestaña Eventos, y nos situamos en la parte “blanca” a la
derecha del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos
aparecerá una ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

4
Visítame en http://neckkito.siliconproject.com.ar
vEdad = Nz(Me.cboEdad.Value, "")
vCasado = Nz(Me.chkCasado.Value, "")
vContinente = Nz(Me.cboContinente.Value, "")
'Inicilizamos el filtro
miFiltro = ""
'Creamos la primera parte del filtro
If vNombre <> "" Then
miFiltro = "AND [Nombre]='" & vNombre & "'"
End If
'Creamos la segunda parte del filtro
If vEdad <> "" Then
miFiltro = miFiltro & " AND [Edad]=" & vEdad
End If
'Creamos la tercera parte del filtro
If vCasado <> "" Then
miFiltro = miFiltro & " AND [Casado]=" & vCasado
End If
'Creamos la cuarta parte del filtro
If vContinente <> "" Then
miFiltro = miFiltro & " AND [Continente]='" & vContinente & "'"
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
End Sub

Un par de comentarios sobre el código:

 Fijaos que, al coger los valores, utilizamos la función NZ. Esto nos previene de que, en el
caso de que no haya valor en los controles, se nos devuelva el valor “cadena vacía”
(representado por dobles comillas dobles (“”)), valor que a su vez nos indicará si debemos
modificar la variable miFiltro o no.

 Como desconocemos qué controles vamos a utilizar como filtro empezamos todos los filtros
con “AND”, de manera que sea el que sea el filtro que se forme sea “AND <Condiciones>...”

 Para obtener la longitud del filtro resultante utilizamos la función LEN. Esa obtención de la
longitud de la cadena representada por miFiltro es el paso previo para, en primer lugar, poder
discriminar si realmente se han seleccionado valores para filtrar (eso lo determina la línea < If
vLargo > 0 Then>, y en segundo lugar, para poder utilizar la función RIGHT, a través de la cual
eliminamos el primer “AND” de miFiltro, para que la expresión de cadena del filtro tenga
sentido a la hora de ejecutar el filtro.

 La estructura del código es sencilla. Empezamos diciendo que miFiltro es “” (es decir, que
no hay filtro). Las siguientes sentencias IF lo que hacen es discriminar: si hay valor en el
control pues debo modificar el contenido de miFiltro; si no hay valor pues no lo modifico.

 Aunque he añadido un booleano la verdad es que

5
Visítame en http://neckkito.siliconproject.com.ar
trabajar con este tipo de valores es un poco engorroso. Es
decir, que cuando abrimos el formulario por primera vez ese
valor no es ni verdadero ni falso, pero desde el momento
que lo marcamos ya es verdadero, y si lo desmarcamos ya
es falso, pero no podemos “recuperar” su valor neutro,
salvo que cerremos el formulario y lo volvamos a abrir. Es
decir, que una vez marcado/desmarcado siempre nos estará
haciendo de filtro. Por eso yo os recomendaría no utilizar
booleanos o, si lo necesitamos, no utilizar check, sino un
cuadro combinado, por ejemplo, con los valores “Sí”, “No”,
“Sin filtro”. Os dejo esto simplemente planteado para que lo
tengáis en cuenta, sin entrar en más detalles.

 Fijaos finalmente que el filtro es diferente según hablemos de un valor tipo texto o
numérico. Si el valor es tipo texto debemos encerrar el valor a filtrar entre comillas simples
(miFiltro = "AND [Nombre]='" & vNombre & "'"), mientras que si el valor es numérico el filtro
es “directo” (miFiltro = miFiltro & " AND [Edad]=" & vEdad)

PARA FINALIZAR EL EJEMPLO


Bueno... Pues esto es todo. Si habéis entendido la mecánica podréis construir vuestro filtro
tanto sobre 2 campos como sobre 10, o tanto utilizando combos como utilizando cuadros de
texto.

Como curiosidad os diré que si quisiéramos utilizar un filtro por aproximación, por ejemplo, si
sobre el campo nombre quisiéramos filtrar por todos los nombres que contengan las letras
“anton”, deberíamos configurar el filtro de la siguiente manera:

miFiltro = “AND [Nombre] LIKE '*” & vNombre & “*'”

Es decir, utilizando el operador LIKE y encerrando nuestro valor entre comillas simples (por ser
texto) y entre el carácter comodín asterisco (*).

Espero que os haya sido útil

Un saludo, y...

¡suerte!

ADAPTACIÓN DEL EJEMPLO


Kike, con la ayuda de Sveinbjorn, me ha permitido compartir con vosotros esta adaptación del
ejemplo. Se ha añadido un filtro para fechas, un botón para borrar los filtros y otro botón para
sacar los resultados a través de un informe. Así que, gracias Kike (y, de rebote, gracias
Sveinbjorn).
Por cierto, no he podido resistir la tentación de añadir un truquillo: simular un hipervínculo en
un control etiqueta... je, je...
Os podéis bajar la BD de esta adaptación aquí

6
Visítame en http://neckkito.siliconproject.com.ar

Anda mungkin juga menyukai