Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
1
Vistame en http://siliconproject.com.ar/neckkito/
APLICANDO FILTROS
En este captulo veremos diversas maneras de crear un filtro, y lo complicaremos un poco para
ver cmo podemos combinar varios elementos que nos hagan de filtro.
Para practicar con diversas opciones modificaremos ligeramente nuestras tablas. Lo que
haremos ser:
1.- Copiar-pegar (estructura y datos) nuestra tabla TClientes, guardndola como TClientes2. A
esta ltima tabla le aadiremos dos campos ms, que sern:
[Edad] Numrico
[FechaAlta] Fecha/Hora
2.- Creamos un nuevo formulario, que llamaremos FClientes2, basado sobre la tabla
TClientes2.
Algunos de los ejemplos los podremos aplicar tanto a formularios como informes.
EL PRIMER FILTRO
En nuestro formulario FMenu vamos a insertar un cuadro combinado. Cuando nos salga el
asistente lo configuraremos de la siguiente manera:
2
Vistame en http://siliconproject.com.ar/neckkito/
Buscamos los valores en una tabla
Elegimos la tabla TClientes2
Aadimos los campos [IdCli] y [NomCli]
Ordenamos, por ejemplo, ascendente sobre [NomCli]
Ocultamos la clave principal
Le ponemos como nombre de etiqueta Buscar
cliente
Si ahora nos vamos a la pestaa Datos Columna dependiente veremos que el valor que
aparece ah es 1. Eso nos est indicando que el valor que guarda el combo, tras haber
seleccionado un cliente, es el identificador del cliente. Nosotros no vamos a cambiar ese valor,
pero tened en cuenta que si quisiramos que lo que guardara fuera el nombre del cliente
deberamos cambiar ese valor a 2 (valor de la segunda columna).
Dicho lo anterior vamos a ver cmo filtrar nuestro formulario FClientes2 tras seleccionar un
cliente. Para ello, creamos un botn de comando (cmdBuscarCli) y en el evento Al hacer click
generamos el siguiente cdigo:
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:
3
Vistame en http://siliconproject.com.ar/neckkito/
LA FUNCIN NZ
Nz (Valor, valor_si_nulo)
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:
Moraleja: el valor que debe devolver NZ en caso de nulo debe ser del mismo tipo con el que
hemos definido la variable.
4
Vistame en http://siliconproject.com.ar/neckkito/
SEGUIMOS CON NUESTRO FILTRO
Ok. Vemos que nuestro filtro funciona perfectamente (o
debera!). Imaginemos que por el motivo que sea no
queremos que el valor escogido sea el identificador del
cliente, sino su nombre.
Sin embargo, nosotros vamos a utilizar otra opcin, que es reutilizar nuestro combo sin tocar
sus propiedades. Para ello:
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:
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:
5
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdBuscarCli_Click()
Dim vCli As Integer
vCli = Nz(Me.cboBuscaCliente.Value, 0)
If vCli = 0 Then Exit Sub
DoCmd.OpenForm "FClientes2", , , "[IdCli]=" & vCli
DoCmd.Close acForm, Me.Name
MsgBox "Se ha encontrado el cliente: " & vCli
End Sub
2.- Al grid de la consulta aadimos todos los campos (arrastrando el asterisco). A continuacin
arrastramos el campo [IdCli] al grid, desmarcamos el check de Mostrar y en la lnea de
criterios escribimos lo siguiente:
=[Forms]![FMenu].[cboBuscaCliente].[Value]
Como vemos, el filtro en este caso est situado en la propia consulta. Ni que decir tiene que
podramos parametrizar la consulta, o aadirle campos calculados. As, este sistema adquiere
un poquito ms de sentido (si necesitis refrescar el tema de las consultas podis visitar
este link y seleccionar los enlaces de los artculos de consultas).
6
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
7
Vistame en http://siliconproject.com.ar/neckkito/
principal de la tabla, aunque no se la hayamos seleccionado. En este caso utilizaremos el
propio nombre del vendedor. A continuacin veremos cmo arreglar este asuntillo.
1.- Sacamos las propiedades del combo y nos vamos a la pestaa Datos Origen de la fila.
2.- Si nos situamos en el espacio en blanco que hay a su derecha . Veremos que nos aparece
un pequeo botn de puntos suspensivos. Hacemos click sobre l.
3.- Nos aparecer la consulta origen de los datos. Vamos a operar sobre dicha consulta, de la
siguiente manera:
Con lo anterior conseguimos que los valores repetidos aparezcan como nicos.
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:
Pestaa Datos Columna dependiente: 1
Pestaa Formato Nmero de columnas: 1
Pestaa Formato Ancho de columnas: eliminamos el 0cm; y dejamos el segundo
valor (en la BD de ejemplo: 2,542cm)
8
Vistame en http://siliconproject.com.ar/neckkito/
correcto", vbExclamation, "NO CORRECTO"
Exit Sub
End Select
'Construimos el filtro
miFiltro = "[Zona]='" & vZona & "'"
miFiltro = miFiltro & " AND [Vend]='" & vVend & "'"
'Cerramos FMenu
DoCmd.Close acForm, Me.Name
'Abrimos FVentas filtrado
DoCmd.OpenForm "FVentas", , , miFiltro,
acFormReadOnly
End Sub
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:
Por motivos didcticos
Para que podis ver como vamos reutilizando la misma variable.
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:
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:
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
lmite al usuario y aadir ese valor al filtro. Como en teora esto ya lo deberamos saber hacer
9
Vistame en http://siliconproject.com.ar/neckkito/
(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).
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.
10
Vistame en http://siliconproject.com.ar/neckkito/
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
Estamos uniendo los filtros a travs de AND. Tened
en cuenta que no hay problema, si nos interesa, en utilizar
el OR, o una combinacin de los dos operadores lgicos.
Os he marcado la ltima lnea como recordatorio de
algo que ya sabemos: podemos manipular la vista del
formulario desde el cdigo. En este caso lo hemos abierto
en vista hoja de datos (acFormDS).
En el punto anterior hemos visto como era necesario rellenar el campo zona y el campo
vendedor para que actuara el cdigo. Ahora vamos a ver cmo podemos crear filtros si
rellenamos todos los campos, slo algunos o los dejamos en blanco.
S que esto es un poco lioso, pero con el cdigo lo veremos ms claro (espero!). Pondr
muchos comentarios en el cdigo para que podis entender el proceso:
Vmonos pues...
'El primer filtro es fcil. Si no hay valor en ninguno de los controles abrimos el formulario
sin filtrar
If vZona = "" And vVend = "" And vImport = -1 Then
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FVentas", acFormDS, , , acFormReadOnly
11
Vistame en http://siliconproject.com.ar/neckkito/
Exit Sub
End If
'Inicializamos el filtro
miFiltro = ""
12
Vistame en http://siliconproject.com.ar/neckkito/
'No hay valor en zona
miFiltro = miFiltro & "[ImpVta]>=" & txtImport
End If
End If
End If
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:
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.
Muy bien. Vamos a ver cmo programamos nuestro botn. El cdigo sera el siguiente.
13
Vistame en http://siliconproject.com.ar/neckkito/
'Activamos el filtro
Me.FilterOn = True
End Sub
Fcil, verdad?
El LIKE nos permite buscar partes en los valores de los registros, y nos muestra las
coincidencias. Debemos combinarlo con caracteres comodn, de manera que utilizaremos:
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/
Queremos que coincida el inicio del valor: LIKE xxx*
Queremos que coincida el final del valor: LIKE *xxx
1.- Vamos a copiar nuestro formulario FClientes2 y lo vamos a pegar como FClientes3
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
llevarnos al primer registro coincidente (a travs del FindFirst)
15
Vistame en http://siliconproject.com.ar/neckkito/
Como hemos operado a travs de un combo con
todos los valores a buscar posibles, y que adems no
permite ediciones ni adiciones de valores, el anterior cdigo
nos funcionar de perlas. Pero, qu pasara si no
existiera el valor buscado?
Nos centraremos en los cuadros combinados, aunque los cuadros de lista son prcticamente
iguales.
2 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
1.- En FControles creamos un cuadro combinado, al que pondremos por nombre cboValores.
Cuando nos salga el asistente lo cancelamos.
2.- Sacamos las propiedades de ese combo y nos vamos a la pestaa Datos Tipo de origen
de la fila. Ah seleccionamos Lista de valores
3.- En la misma pestaa Origen de la fila, podremos escribir los valores que queremos que
muestre el combo. Esos valores deben ir separados por punto y coma (;). Por ejemplo,
escribimos ah: Lunes; Martes; Mircoles.
4.- Si ahora ponemos nuestro formulario en vista formulario veremos que nuestro combo nos
muestra los valores que hemos introducido.
5.- Si volvemos a la vista diseo, comprobamos que las propiedades Limitar a la lista est
fijada en S.
Vamos a ver cmo podemos ir ampliando, a travs de cdigo, nuestra lista de valores. Para ello
nos vamos a la Pestaa Eventos Al no estar en la lista, y generamos el siguiente cdigo:
17
Vistame en http://siliconproject.com.ar/neckkito/
'Aadimos el nuevo elemento
miRowSce = miRowSce & ";" & NewData
'Aplicamos el nuevo rowsource al combo
Me.cboValores.RowSource = miRowSce
End If
End Sub
Veamos:
.- 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).
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:
[Dia] de tipo texto. No ponemos ninguna clave principal.
[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.
Vamos a fijarnos en la parte final del cdigo, cuando el usuario pulsa el botn S:
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
.- Volvemos a activar los Warnings. Es importante volverlos
a activar porque la desactivacin no slo afecta al cdigo
que estamos programando, sino a todos los cdigos. Si se
produjera pues algo raro en nuestra BD no nos saldran
los mensajes de advertencia, con lo que perderamos
informacin (muy importante a veces) para saber qu est
pasando.
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:
3.- En sus propiedades nos vamos a la pestaa Eventos Despus de actualizar, y generamos
el siguiente cdigo:
20
Vistame en http://siliconproject.com.ar/neckkito/
miRowSce = miRowSce & " WHERE [Festivo]=TRUE"
Else
'Configuramos el filtro para filtrar por no festivos
miRowSce = miRowSce & " WHERE [Festivo]=FALSE"
End If
With Me.cboTDias
'Asignamos el nuevo rowsource a nuestro combo
cbo TDias
.RowSource = miRowSce
'Refrescamos el combo
.Requery
End With
End Sub
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...).
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.
21
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.
1.- Copiamos nuestra tabla TVentas (estructura y datos) y la pegamos con el nombre de
TVentasHistorico.
Bueno... pues al crear ese informe sobre TVentas lo que estamos haciendo, aunque no lo
sepamos, es indicar al informe que su Recordsource es TVentas.
La respuesta a esta vital pregunta tendr que esperar, puesto que os voy a decir para qu
hemos hecho todo lo anterior. Imaginemos que tenemos una tabla que nos recoge las ventas
actuales (TVentas) y las ventas de aos pasados las vamos guardando en otra tabla
(TVentasHistorico). De vez en cuando necesitamos sacar un informe de ventas histrico. La
pregunta del milln es: necesitamos crear dos informes?
Y la respuesta es... no. Por qu? Porque s podemos actuar sobre el recordsource del informe,
aunque deba configurarse en vista diseo. Con esto contestamos a nuestra primera pregunta
de dos prrafos ms arriba.
2.- Junto a ese botn insertaremos una casilla de verificacin, que llamaremos chkHist.
3.- Sacamos las propiedades de chkHist y nos vamos a la pestaa Datos Valor
predeterminado, y le escribimos FALSE
22
Vistame en http://siliconproject.com.ar/neckkito/
4.- Ahora a nuestro botn de comando le generamos el siguiente cdigo:
Private Sub cmdAbreRVentas_Click()
Dim vOpc As Boolean
Dim miRcdSce As String
'Miramos el valor del botn de opcin
vOpc = Me.chkHist.Value
'Construimos la parte comn del recordsource
miRcdSce = "SELECT * FROM"
'Actuamos segn est marcado o no el botn de opcin
If vOpc = True Then
'Construimos la parte especfica del recordsource
miRcdSce = miRcdSce & " TVentasHistorico"
Else
miRcdSce = miRcdSce & " TVentas"
End If
'Abrimos el informe en vista diseo y oculto
DoCmd.OpenReport "RVentas", acViewDesign, , , acHidden
'Cambiamos su recordsource
Reports!RVentas.RecordSource = miRcdSce
'Cerramos el informe guardando los cambios (sin pedrselo al usuario)
DoCmd.Close acReport, "RVentas", acSaveYes
'Abrimos el informe en vista preliminar
DoCmd.OpenReport "RVentas", acViewPreview
End Sub
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?).
23
Vistame en http://siliconproject.com.ar/neckkito/
'Abrimos el formulario en vista diseo y oculto
DoCmd.OpenForm "FVentas2", acViewDesign, , , acHidden
'Cambiamos su recordsource
Forms!FVentas2.RecordSource = miRcdSce
'Cerramos el formulario guardando los cambios (sin
pedrselo al usuario)
DoCmd.Close acForm, "FVentas2", acSaveYes
'Cerramos FMenu
DoCmd.Close acForm, Me.Name
'Abrimos el formuario en vista slo lectura
DoCmd.OpenForm "FVentas2", , , , acFormReadOnly
End Sub
Suerte!
24
Vistame en http://siliconproject.com.ar/neckkito/