Академический Документы
Профессиональный Документы
Культура Документы
CAPTULO 71
ndice de contenido
APLICANDO FILTROS......................................................................................................................2
UNAS PALABRAS INICIALES....................................................................................................2
LA PREPARACIN DEL EJEMPLO DE ESTE CAPTULO.......................................................2
EL PRIMER FILTRO......................................................................................................................2
LA FUNCIN NZ......................................................................................................................4
SEGUIMOS CON NUESTRO FILTRO.....................................................................................5
FILTRO POR CONSULTA.............................................................................................................6
FILTROS COMPUESTOS..............................................................................................................7
INCISO: ESE COMBO CON VALORES REPETIDOS............................................................8
SIGAMOS...................................................................................................................................8
FILTRO PARAMETRIZADO.........................................................................................................9
UN POCO MS SOBRE FILTROS COMPUESTOS..................................................................11
FILTRO EN EL PROPIO FORMULARIO...................................................................................13
A TRAVS DE UN FILTERON...........................................................................................13
UTILIZACIN DEL LIKE..............................................................................................14
A TRAVS DE UN CLON DEL RECORDSET DEL FORMULARIO...............................15
NUESTRO CLON NO ENCUENTRA EL VALOR............................................................16
MS ALL DE LOS FILTROS: CONTROLES Y LA PROPIEDAD ROWSOURCE...............16
TIPOS DE ROWSOURCE.......................................................................................................17
DATOS LISTA DE VALORES.........................................................................................17
DATOS TABLA/CONSULTA..........................................................................................18
MODIFICAR EL ORIGEN SI EL TIPO DE DATOS ES DE TABLA O CONSULTA...20
DATOS LISTA DE CAMPOS..........................................................................................21
LOS INFORMES Y LA PROPIEDAD RECORDSOURCE........................................................22
LO MISMO, PERO CON UN FORMULARIO.......................................................................23
UNAS PALABRAS FINALES......................................................................................................24
Vistame en http://siliconproject.com.ar/neckkito/
APLICANDO FILTROS
UNAS PALABRAS INICIALES
La idea principal de este captulo es proporcionaros
diferentes herramientas para realizar un filtro en formulario.
Veremos desde filtros simples hasta filtros ms complejos;
filtros en distintos formularios y filtros en el propio
formulario.
Como ya os he avanzado, la idea es proporcionaros ideas de cmo podemos realizar filtros,
habr algunos incisos donde veremos cmo construir un filtro para obtener los datos que
queremos que no sern estrictamente programacin pura y dura en VBA.
Y, como la construccin de estructuras de filtro es muy parecida a la construccin de
rowsources y de recordsources, aprovecharemos para echar un vistazo a estas dos
propiedades.
Y despus... a aplicar el que ms os guste!
[Edad] Numrico
[FechaAlta] Fecha/Hora
Directamente, sobre la tabla, aadiremos algunos registros,
prcticamente lo que veamos en los siguientes epgrafes.
para
poder
desarrollar
2.- Creamos un nuevo formulario, que llamaremos FClientes2, basado sobre la tabla
TClientes2.
3.- Creamos un informe, basado en la tabla TClientes2, al que llamaremos RClientes2.
Algunos de los ejemplos los podremos aplicar tanto a formularios como informes.
As pues, manos a la obra.
EL PRIMER FILTRO
En nuestro formulario FMenu vamos a insertar un cuadro combinado. Cuando nos salga el
asistente lo configuraremos de la siguiente manera:
Vistame en http://siliconproject.com.ar/neckkito/
Buscamos los valores en una tabla
Si, en lugar de querer abrir el formulario, quisiramos abrir un informe filtrado, la mecnica es
prcticamente la misma. Suponiendo que tuviramos un botn de comando llamado
cmdInformeFiltrado el cdigo que deberamos asignar a ese botn sera:
Vistame en http://siliconproject.com.ar/neckkito/
LA FUNCIN NZ
Vemos que en el cdigo anterior hemos utilizado una nueva
funcin, que es Nz. La estructura de esta funcin es:
Nz (Valor, valor_si_nulo)
Si recordamos cuando hablbamos de definir el tipo de
variable comentbamos que es importante determinar qu
tipo de variable va a se la variable que vamos a utilizar.
En este caso puede darse el caso de que tras elegir un valor en el combo nos arrepintamos y
no seleccionemos ningn valor en el combo. En este caso el valor devuelto por el combo ser
NULL.
Si, para cubrirnos las espaldas, definimos la variable como Variant, no estaremos optimizando
recursos, pues Access (y lo digo de esta manera para entendernos) deber realizar tres
operaciones:
Una: saber que existe una variable, pero sin saber de qu tipo exactamente es
Dos: una vez sabe el tipo, cargar las caractersticas inherentes a este tipo de variable.
Tres: si la variable cambia de tipo, cargar de nuevo las caractersticas del nuevo tipo
La programacin inicial, si hubiramos seguido este criterio, debera haber sido la siguiente:
Aunque a veces no queda otro remedio que utilizar esta estructura, y por tema de optimizacin
de recursos que comentbamos, es mejor ya decir qu tipo de variable va a ser. Y cmo
soslayamos este problema? Pues a travs de la funcin NZ.
Lo que dice esta funcin es: devulveme el valor del combo (Me.cboBuscaCliente.Value).
Pero, si su valor es NULL, me devuelves un cero. Y por ello hemos escrito:
vCli = Nz(Me.cboBuscaCliente.Value, 0)
Como podemos ver, si obtenemos un NULL, nos devuelve un Integer, que en este caso es cero.
Debemos ir con cuidado con esto. Por ejemplo, si definimos la variable vCli como String en
caso de obtener un valor NULL debera devolvernos un valor tambin String. Por ejemplo, una
cadena vaca. As, en este supuesto, lo que deberamos haber escrito sera:
Dim vCli As String
vCli = Nz(Me.cboBuscaCliente.Value, )
If vCli = Then...
Moraleja: el valor que debe devolver NZ en caso de nulo debe ser del mismo tipo con el que
hemos definido la variable.
Vistame en http://siliconproject.com.ar/neckkito/
Propiedades
Pestaa
Datos
dependiente: 2
Columna
La variable vCli ahora nos recoge el valor de la columna 1. Extraados? Pues debis
tener en cuenta que, cuando hacemos referencia, en VBA, a las columnas de un combo, la
numeracin empieza por cero. Es decir, que si lo plasmamos en una especie de esquema
obtendramos que:
Campo del combo
[Id]
Columna 1
Column(0)
[NomCli]
Columna 2
Column(1)
Como ahora recogemos el nombre del cliente, nuestro vCli ha de ser de tipo String
Como es de tipo String, la funcin NZ debe devolver un String en caso de que el valor
sea vaco. Recordad lo visto en el epgrafe donde explicbamos esta funcin.
El filtro en la lnea del DoCmd.OpenForm debe ir entre comillas simples por ser,
precisamente, un String.
Y para esos hombres de poca fe que no lo ven claro, si queremos constatar sin ningn
gnero de dudas qu valor est cogiendo la variable vCli podemos modificar ligeramente
nuestros cdigos, aadiendo una sola lnea, para que el propio Access nos lo diga. As,
tendremos que:
.- Para nuestro cmdBuscarCli:
Vistame en http://siliconproject.com.ar/neckkito/
Vistame en http://siliconproject.com.ar/neckkito/
La primera lnea de cdigo, evidentemente, es de control, para evitar que se ejecute el cdigo
si no hay valor seleccionado en el combo. La segunda abre nuestro formulario en vista Slo
lectura.
Un filtro ms al saco ;)
FILTROS COMPUESTOS
Para poder explicar este punto vamos a necesitar crear una
nueva tabla (a lo rpido) con valores adecuados. As, lo
que vamos a hacer es:
1.- Creamos una tabla, que llamaremos Tventas, con los siguientes campos:
2.- Rellenamos nuestra tabla con datos. Los que yo he introducido han sido los siguientes:
3.- Finalmente, creamos un formulario sobre la tabla TVentas, que llamaremos FVentas.
4.- En nuestro FMenu creamos un cuadro de texto, al que pondremos de nombre txtZona. En
su etiqueta escribimos Introduzca zona (N,S,E,O)
Vamos a aprovechar este ejemplo para practicar un poco el Select Case de una manera muy
simple.
5.- Creamos un cuadro combinado, que llamaremos cboVend, y lo configuraremos a travs del
asistente, dicindole que de la tabla TVentas queremos el valor del campo [Vend]
Como podris ver Access automticamente, en el origen de la fila, nos ha incluido la clave
Vistame en http://siliconproject.com.ar/neckkito/
SIGAMOS....
6.- Con los cambios que hemos realizado en el origen de la fila del combo hemos alterado ese
combo. Para reanimarlo vamos a hacer lo siguiente: sacamos sus propiedades y:
Vistame en http://siliconproject.com.ar/neckkito/
Para controlar en una sola lnea de cdigo (If vZona = "" Or vVend = "" Then Exit Sub)
si se han introducido valores hemos utilizado un operador lgico: OR. De ah que con esa lnea
matemos dos pjaros de un tiro, si no nos interesa un mayor nivel de control.
Hemos utilizado el Select Case de manera que tambin nos mata dos pjaros de un
tiro. Es decir, realiza una primera funcin de conversin (transforma las iniciales de las zonas
en sus nombres completos), pero tambin realiza una segunda funcin de control, a travs del
CASE ELSE, que detecta si el usuario introduce un valor no permitido.
Construimos el filtro por partes. Lgicamente se podra haber construido el filtro en una
sola lnea, pero yo no lo he hecho as por varios motivos:
Porque si utilizamos una sola lnea el cdigo puede llegar a ser difcil de leer, o
como mnimo incmodo, si la lnea nos sale de la pantalla y debemos desplazarnos con
la barra de desplazamiento horizontal.
Finalmente, vemos que si tenemos el filtro almacenado en una variable en la lnea del
DoCmd.OpenForm, en el espacio reservado al argumento para el filtro, simplemente
escribimos directamente esa variable.
En el cdigo he abierto el formulario como slo lectura, pero evidentemente vosotros ya sabis
cmo abrirlo para editarlo, por ejemplo.
FILTRO PARAMETRIZADO
Puede ser que en algn momento necesitemos un parmetro que deba ser rellenado por el
usuario. Como ya sabemos (o si no lo sabemos lo aprenderemos ahora) un parmetro viene
configurado por la siguiente secuencia de caracteres:
Corchete de apertura-Comillas dobles-Mensaje-Comillas dobles-Corchete de cierre
Si hemos seguido los valores de la BD de ejemplo veremos que hay un registro que nos dice
que el vendedor Hulk, en la zona Norte, en Bilbao, ha vendido por 3.000 euros. Vamos a
aadir un nuevo registro en TVentas de manera que:
Hulk, en la zona Norte, en Andorra, ha vendido por 1.500 euros
E imaginemos que queremos saber en qu ciudades ha vendido Hulk por encima de los 2.000
euros.
Una manera de hacerlo sera introducir un InputBox, pedir la informacin del importe de venta
9
Vistame en http://siliconproject.com.ar/neckkito/
lmite al usuario y aadir ese valor al filtro. Como en teora esto ya lo deberamos saber hacer
(os animo a que lo probis, a ver si os sale, pero despus de leer el resto de este punto por un
detalle que explicar ms adelante).
Otra manera sera construirnos y utilizar un parmetro.
Para ello vamos a seguir el siguiente proceso:
Como vemos en la primera lnea marcada en negrita, hemos aadido una tercera lnea para la
construccin del filtro y hemos construido un parmetro para que al usuario le salga una casilla
con la pregunta del milln.
Fijaos tambin que:
Los filtros con variables tipo String los hemos encerrado entre comillas simples.
10
Vistame en http://siliconproject.com.ar/neckkito/
En el filtro del parmetro, que representa un valor
de tipo Currency (y lo mismo para variables de tipo
numrico), no hemos encerrado el valor entre comillas, sino
que lo hemos aadido directamente. Debis tenerlo en
cuenta por lo que os propona de utilizar un InputBox y
aplicar sobre la variable que recoja el valor introducido el
filtro
Vistame en http://siliconproject.com.ar/neckkito/
12
Vistame en http://siliconproject.com.ar/neckkito/
Else
Bueno... creo que tendris un buen rato para analizar este cdigo. Como siempre, la idea es
que cojis la mecnica para que podis aplicarla en vuestras BD's... si el dolor de cabeza os lo
permite! Je, je...
Bromas aparte, el cdigo est comentado, por lo que no aadir ms lea a este punto. Slo
recalcar, si me permits, que la variable vImport coge su valor a travs de la funcin NZ, que
en caso de no tener valor devuelve -1. Recordad que como hemos definido vImport como
Currency el valor si nulo debe ser compatible con este tipo de datos.
A TRAVS DE UN FILTERON
Ahora vamos a ver cmo utilizar un filtro en el propio formulario. Vamos a preparar el terreno:
1.- Copiamos nuestro formulario FVentas y lo pegamos como FVentas2.
2.- Para ver mejor los efectos vamos a cambiar la vista predeterminada de FVentas2. Sacamos
sus propiedades y nos vamos a la pestaa Formato Vista predeterminada Formularios
continuos.
3.- En la cabecera del formulario aadimos un cuadro de texto, que llamaremos txtFiltro. Ah
escribiremos el nombre del vendedor sobre el que queremos ver los registros.
4.- Aadimos tambin un botn de comando, que llamaremos cmdEjecutaFiltro.
Muy bien. Vamos a ver cmo programamos nuestro botn. El cdigo sera el siguiente.
Vistame en http://siliconproject.com.ar/neckkito/
Me.Filter = miFiltro
'Activamos el filtro
Me.FilterOn = True
End Sub
Vamos a ver cmo aplicarlo a nuestra BD: en un nuevo botn de comando (cmdLike), en
FVentas2, generamos el siguiente cdigo:
Como vemos, hemos creado un filtro que, a travs de los asteriscos como caracteres comodn,
nos busca a comienzo, en medio y a final del valor. Jugando con esos comodines podemos
indicarle que:
14
Vistame en http://siliconproject.com.ar/neckkito/
El asunto est en que un recordset permite una flexibilidad amplsima a la hora de ser
manipulado, de ah que nos sirvamos del mismo. Debemos considerar, adems que:
Este sistema nos hace las veces de filtro porque estamos operando sobre un valor
nico; esto es, el campo clave.
Si el valor no fuera nico (es decir, se pudiera repetir) lo que hara este cdigo es
15
Vistame en http://siliconproject.com.ar/neckkito/
Si tenemos algn problema con el funcionamiento del cdigo debemos comprobar que tengamos registrada la referencia Microsoft
DAO 3.6 Object Library
16
Vistame en http://siliconproject.com.ar/neckkito/
TIPOS DE ROWSOURCE
Podemos encontrarnos con tres tipos de origen de la fila:
Vistame en http://siliconproject.com.ar/neckkito/
Veamos:
.- El evento Not in list tiene dos argumentos: NewData y
Response. NewData recoge el valor introducido (y que no est en
la lista). Response espera que el usuario le indique qu debe hacer
con el nuevo valor. Al producirse el evento debemos asignar un
valor a estos dos elementos en funcin de lo que decidamos.
.- Para saber qu quiere hacer el usuario creamos la variable resp, que recoge dicha
contestacin a travs del botn que pulse el usuario en un MsgBox.
.- Si el usuario responde que no debemos indicarle al cdigo que Response coge el valor de
una constante de VB, que es acDataErrContinue, para que inmediatamente le digamos que no
haga nada y que salga del proceso.
.- Si el usuario responde que S debemos decirle que Response coger el valor, a travs de una
constante, que es acDataErrAdded.
.- A continuacin manejamos el Rowsource con una secuencia que, como vemos en el cdigo,
es lgica:
.- Cogemos el RowSource actual
.- Lo modificamos, aadindole el nuevo valor (que, no olvidemos, est recogido ya
directamente por el argumento del evento NewData)
.- Asignamos el nuevo RowSource modificado a nuestro combo.
Debemos tener en cuenta que estas adiciones de valores se realizan en tiempo de ejecucin;
es decir, se aaden slo en la sesin de trabajo. Si cerramos el formulario y lo volvemos a abrir
los valores del RowSource volvern a ser los originales (de lunes a mircoles).
Evidentemente podramos programar el evento Despus de actualizar, por ejemplo, para
ejecutar las acciones que necesitemos con el valor introducido. Por ejemplo, para ver los
resultados, programamos el siguiente cdigo:
Y si queremos que estas adiciones sean permanentes? En ese caso los valores debern estar
guardados en una tabla...
DATOS TABLA/CONSULTA
1.- Vamos a crear una tabla, que llamaremos TDias, con dos campos:
[Festivo] de tipo S/No, con el valor por defecto cero (0) o False
18
Vistame en http://siliconproject.com.ar/neckkito/
En ella introducimos tres registros con nuestros tres das: Lunes, Martes y Mircoles.
2.- En FControles aadimos un nuevo combo, que
llamaremos cboTDias. Cuando nos salga el asistente le
decimos que queremos, de la tabla TDias, el campo [Dia]
3.- Sacamos las propiedades del combo y en la pestaa
Datos Limitar a la lista, le decimos que S.
Vamos a ver cmo podemos aadir das que no estn en la
lista. Para ello utilizaremos una SQL de datos anexados 3,
fcil de entender aunque, a simple vista, parezca difcil de
construir.
As pues, en la pestaa Eventos Al no estar en la lista, le generamos el siguiente cdigo:
Vamos a fijarnos en la parte final del cdigo, cuando el usuario pulsa el botn S:
.- Pasamos el valor de NewData a una variable: diaNuevo
.- Creamos la SQL de datos anexados. Como necesitamos que diaNuevo nos aparezca entre
comillas necesitamos aadir las cuatro comillas delante y detrs de la variable.
.- Si no desactivramos los Warnings nos saldra eso de Va a anexar 1 fila a.... Como sera
muy molesto recibir cada vez dicho mensaje lo desactivamos.
3
Cuando veamos el captulo dedicado al Recordset veremos cmo incluir valores a travs de un recordset
19
Vistame en http://siliconproject.com.ar/neckkito/
.- Ejecutamos la SQL
Ahora lo que vamos a hacer es introducir en nuestro formulario un marco de opciones, con dos
opciones (que llamaremos mrcFestivos): la opcin 1, que sern los das festivos, y la opcin 2,
que sern los das no festivos. Por si alguien no tiene claro cmo se hace eso lo explico paso a
paso:
1.- Con FControles en vista diseo, aadimos un marco de opciones. Nos saldr el asistente. Lo
configuramos de la siguiente manera:
Vistame en http://siliconproject.com.ar/neckkito/
Vaya, vaya... vuelve a aparecer nuestro amigo el filtro, en este caso no para filtrar los datos
que mostrar un formulario sino ahora para filtrar los datos que mostrar un combo.
El cdigo est comentado, y con todo lo que hemos aprendido hasta ahora no deberamos
tener ningn problema para entenderlo (y aplicarlo a nuestras BD's... je, je...).
DATOS LISTA DE CAMPOS
Finalmente vamos a ver la ltima opcin, que es una lista de campos. Para ello, vamos a
practicar lo anterior de la siguiente manera:
1.- En FControles creamos un cuadro combinado, que llamaremos cboCampos. Cancelamos el
asistente.
2.- Creamos un cuadro de lista, que llamaremos lstDatos. Cancelamos el asistente.
3.- Sacamos las propiedades de cboCampos y nos vamos a la pestaa Datos Tipo de origen
de la fila. Seleccionamos la opcin Lista de campos.
4.- Ahora, si nos situamos en la propiedad Origen de la fila, nos saldr una lista con las
tablas y consultas que tengamos en nuestra BD. Nosotros seleccionamos, por ejemplo, la tabla
TVentas.
5.- Si situamos FControles en vista Formulario y desplegamos ese combo veremos que nos
muestra los campos de la tabla TVentas.
Una idea sera prepararnos una consulta con los campos que nos pudieran interesar, sin
mostrar campos que no nos sirven para nada. Para no hacer tan largo el ejemplo lo
dejaremos as como est, directamente de la tabla TVentas.
Vamos a ver qu podemos hacer con eso.
6.- De nuestro cboCampos, en el evento Despus de actualizar, generamos el siguiente
evento:
Vistame en http://siliconproject.com.ar/neckkito/
Me.lstDatos.RowSource = ""
Else
'Si hay valor en el combo el cuadro de lista nos mostrar los
'valores del campo seleccionado
miRowSce = "SELECT TVentas." & vCampo & " FROM
TVentas"
'Aplicamos el rowsource al cuadro de lista
Me.lstDatos.RowSource = miRowSce
End If
'Refrescamos el cuadro de lista
Me.lstDatos.Requery
End Sub
Creo que, a estas alturas, no hace falta explicar el cdigo anterior. Como vemos, la mecnica,
si se trata de un cuadro de lista, es prcticamente igual a como hemos tratado los combos. De
hecho, este ejemplo combina ambos tipos de controles.
22
Vistame en http://siliconproject.com.ar/neckkito/
El cdigo est comentado paso a paso y poco queda por comentar, exceptuando que, os
recuerdo, as como hemos construido un recordsource con todos los campos tambin
podramos haber aplicado filtros para personalizar an ms el informe (con un marco de
opciones, quizs?).
Vistame en http://siliconproject.com.ar/neckkito/
24
Vistame en http://siliconproject.com.ar/neckkito/