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.
Así pues, empezamos introduciendo un cuadro combinado para poder buscar por nombre.
Cuando nos salga el asistente lo configuramos de la siguiente manera:
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”.
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.
Vamos a añadir ahora otro cuadro combinado para seleccionar la edad. Cuando nos aparezca el
asistente lo configuramos así:
– 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 ...”
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...”
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
…
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.
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)
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:
Es decir, utilizando el operador LIKE y encerrando nuestro valor entre comillas simples (por ser
texto) y entre el carácter comodín asterisco (*).
Un saludo, y...
¡suerte!
6
Visítame en http://neckkito.siliconproject.com.ar