Professional Documents
Culture Documents
CAPTULO 51
ndice de contenido
Y LA ESTRELLA INVITADA... DOCMD!.......................................................................................2
CONVERSACIN ODA AL PASAR............................................................................................2
LLAMAR A LOS FORMULARIOS E INFORMES EN CDIGO...............................................2
CREANDO UNA MINI-BD PARA IR JUGANDO CON EL CDIGO....................................2
DOCMD... PARA ABRIR ALGO................................................................................................3
DOCMD... PARA CERRAR ALGO............................................................................................4
DOCMD PARA SALIR... Y BYE-BYE......................................................................................6
PROFUNDIZANDO: DOCMD CON FORMULARIOS...............................................................7
UN PASEO POR... LOS REGISTROS.......................................................................................7
CMO DESEA EL FORMULARIO? POCO HECHO, AL PUNTO O MUY HECHO?......9
UTILICEMOS UN FILTRO SENCILLO.................................................................................10
Y COMPLIQUEMOS UN POCO EL FILTRO........................................................................11
UNA PUNTUALIZACIN SOBRE LOS FILTROS..........................................................12
Y SIGAMOS EXPLORANDO MANIPULACIONES............................................................12
UN LTIMO EJEMPLO ALGO MS COMPLEJO...............................................................14
PARA FINALIZAR...................................................................................................................15
1
Vistame en http://siliconproject.com.ar/neckkito/
Y LA ESTRELLA INVITADA... DOCMD!
Recordamos que en un captulo anterior vimos que existan unos mdulos de objeto? Es decir,
y para este caso en particular, cuando creamos cdigo asociado a un formulario se creaba un
mdulo asociado a ese formulario. Y lo mismo podemos decir para los informes.
La conversacin anterior (teora pura y dura, como habris podido comprobar... je, je...)
refleja el hecho de cmo debemos llamar, desde el cdigo, a los formularios. Y eso depende de
dnde est el cdigo.
De la misma manera operamos con los informes: si el cdigo est en el mdulo asociado al
informe podemos llamarle ME; si, por el contrario, lo queremos llamar desde otro mdulo (ya
sea de objeto o estndar) debemos referirnos a l por su nombre largo: Reports!
NombreInforme.
Evidentemente podemos sustituir el ME por el nombre largo, pero eso equivale a tener que
escribir mucho... y no podemos cansarnos tanto, verdad? ;)
Es importante tener esto en cuenta porque a partir de ahora vamos a aplicar al pie de la letra
lo explicado en las lneas anteriores. As que nadie se debe despistar y tener bien claro que ME
indica que se llama al objeto del mdulo asociado al propio objeto.
Vamos a crear una mini-BD muy simple para ver las bondades del mtodo DoCmd para
manipular objetos. As pues, vamos a crear una BD y vamos a:
Aadir una tabla, a la que llamaremos TDatos, con los siguientes campos:
2
Vistame en http://siliconproject.com.ar/neckkito/
[Id] Autonumrico (clave principal)
[Nombre] Texto
[Edad] Nmero (entero, con cero decimales)
DoCmd.OpenXXX nombreObjeto
Vamos a practicar un poco con nuestra BD. Nos situamos en el formulario FMenu, en vista
diseo, e introducimos cuatro botones de comando, y los llamamos as:
cmdAbreFDatos
cmdAbreTDatos
cmdAbreCDatos
cmdAbreRDatos
3
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdAbreTDatos_Click()
DoCmd.OpenTable "TDatos"
End Sub
Ojo! Este simple cdigo nos abre el informe envindolo directamente a la impresora. Ms
adelante veremos cmo podemos manipular la apertura de informes.
La sintaxis es:
Vamos a aadir tres botones de comando en nuestro formulario FMenu y los vamos a llamar:
cmdCierraFDatos
cmdCierraTDatos
cmdCierraCDatos
Si ahora realizamos el siguiente proceso veremos lo bien que nos funciona: abrimos, a travs
de nuestro botn de comando, el formulario FDatos Seleccionamos nuestro formulario
4
Vistame en http://siliconproject.com.ar/neckkito/
FMenu Cerramos FDatos con nuestro botn.
Esto podra ser algo incmodo, verdad? Me refiero a tener que ir a seleccionar el formulario
FMenu una vez abierto FDatos para poder cerrarlo con nuestro botn.
Vamos a ver cmo podemos situar el enfoque en el formulario que queramos. La idea es abrir
FDatos pero mantenerlo en segundo plano. Para ello utilizaremos el mtodo SETFOCUS.
Si cogemos el cdigo que tenamos asignado a cmdAbreFDatos podemos realizar una pequea
modificacin, de manera que el cdigo nos quede as:
Si ahora probamos nuestro botn veremos que s se nos abre FDatos, pero quedndonos en
segundo plano.
Vamos un poquito ms all. Ahora queremos operar sobre FDatos. De nuevo nos preguntamos:
en qu mdulo de objeto estamos? Como nos hallamos en el mdulo asociado a FMenu no
podemos utilizar ME para referirnos a FDatos, por lo que no nos quedar ms remedio que
referirnos a l por su nombre largo.
5
Vistame en http://siliconproject.com.ar/neckkito/
Me.SetFocus
MsgBox "Ahora el foco pasar a FDatos", vbInformation, "SALTITO"
Forms!FDatos.SetFocus
End Sub
Y si queremos cerrar el formulario desde el propio formulario? Vamos a abrir FDatos en vista
diseo y vamos a aadirle en el encabezado un botn de comando, al que llamaremos
cmdCerrar. A ese botn le generamos el siguiente cdigo:
Como podemos ver, hemos utilizado la estructura que ya conocamos, pero hemos aadido el
Me.Name para indicar que cierre el formulario de nombre X, donde X es el nombre del
formulario donde est el cdigo. Por qu lo hacemos as, y no hemos utilizado la estructura
DoCmd.Close acForm FDatos (que tambin nos hubiera funcionado)? Pues las ventajas son
las siguiente:
No debemos recordar en qu formulario estamos operando (para los ms perezosos ;)
Si queremos reutilizar el cdigo en otros formularios, nos sirve un copy-paste.
Si copiamos-pegamos el propio formulario para reutilizarlo, nuestro cdigo funcionar
perfectamente.
Finalmente, y para acabar esta primera presentacin del DoCmd, vamos a ver cmo salir de la
aplicacin. En nuestro formulario FMenu creamos un botn de comando, al que llamaremos
cmdSalir, y le generamos este cdigo:
6
Vistame en http://siliconproject.com.ar/neckkito/
Exit Sub
End If
DoCmd.Quit
End Sub
Fcil, verdad?
Vamos a ver un poco como podemos manejar un poco ms a fondo la apertura de formularios
con DoCmd.
Si nos fijamos en nuestro botn cmdAbreFDatos original veamos que el cdigo asignado era el
siguiente:
Como vemos, si pulsamos el botn, el cdigo nos abre FDatos y nos lleva al primer registro. Y
si queremos ir a un registro nuevo? Vamos a ver de qu maneras podemos realizar lo anterior.
Yo ir creando botones nuevos para cada ejemplo. Vosotros o bien podis crear dichos botones
nuevos y asignarles el cdigo correspondiente o bien vais modificando el cdigo en el botn
que ya tenis creado... a gusto del consumidor.
7
Vistame en http://siliconproject.com.ar/neckkito/
Para indicar qu tipo de objeto es utilizamos la constante de vb de Access acDataForm
El nombre del formulario lo indicamos entre comillas
Para indicar a qu registro queremos ir utilizamos la constante de vb de
Access acNewRec
Es muy importante separar los argumentos con
comas. Si nos olvidamos una coma le estaremos diciendo
otra cosa al cdigo (y no nos funcionar, lgicamente).
Docmd.RunCommand
Como podemos ver nuestra segunda lnea de cdigo opera a travs de una constante de vb de
Access, que es acCmdRecordsGoToNew
Vamos a practicar un poco lo que hemos aprendido. Yo slo har el ejemplo aqu para dos
botones (aunque en la BD de ejemplo estn todos programados). Os dejo el resto de
programacin para que vosotros practiquis en vuestra BD de pruebas.
Situamos FDatos en vista diseo y aadimos cuatro botones (les podemos poner las imgenes
de las flechitas para identificarlos). Yo los llamar:
cmdPrimero
cmdAnterior
cmdSiguiente
cmdltimo
8
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdPrimero_Click()
DoCmd.RunCommand acCmdRecordsGoToFirst
End Sub
Vamos a meternos con el tipo de vista del formulario. Como ya sabemos (o deberamos
saber) un formulario admite varias vistas, que son las siguientes:
Pues con todo lo anterior ya podemos decirle al cdigo qu tipo de vista deseamos cuando
abramos el formulario.
9
Vistame en http://siliconproject.com.ar/neckkito/
Y ahora crearemos otro botn, al que llamaremos cmdAbreFDatosGrafDin, y le generaremos el
siguiente cdigo:
Private Sub cmdAbreFDatosGrafDin_Click()
DoCmd.OpenForm "FDatos", acFormPivotChart
End Sub
Qu tal lo llevamos?
Hemos creado en la tabla TDatos un campo llamado [Edad]. Supongamos que uno de los
valores que hemos introducido es el de alguien que tiene una edad de 55 aos.
Vamos a crear primero un filtro directo, muy sencillo, para que se entienda la mecnica.
Despus lo complicaremos un poco (pero slo un poco, eh?).
Creamos en FMenu un botn que nos permitir abrir FDatos con slo el registro que estamos
buscando, que es aquel en el cual la edad es de 55 aos.
Pero lo que me interesa es que veis la unin de la condicin con el valor que nos va a hacer
de filtro, para entender mejor el siguiente ejemplo.
El anterior ejemplo es algo esttico, que salvo para algn caso puntual no es demasiado
til. Lo que vamos a realizar ahora (ya lo vimos en una leccin anterior) es solicitar la
colaboracin del usuario. Vamos a filtrar un rango de registros para que sean inferiores a la
edad que el usuario quiera. En el botn cmdAbreFDatosFiltroUsuario que habremos creado
generamos el siguiente cdigo:
10
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdAbreFDatosFiltroUsuario_Click()
Dim vEdad As Variant
vEdad = InputBox("Introduzca la edad mxima a filtrar",
"FILTRO EDAD", 0)
'Detectamos si se pulsa cancelar
If StrPtr(vEdad) = 0 Then Exit Sub
'Aplicamos el filtro, abriendo FDatos en modo Hoja de
Datos
DoCmd.OpenForm "FDatos", acFormDS, , "[Edad]<=" &
vEdad
End Sub
Nos acordamos el InputBox? Con este cdigo el valor que introduce el usuario queda
guardado en la variable vEdad, y aplicamos la condicin en la lnea que abre el formulario a
travs de "[Edad]<=" & vEdad
Aunque sea evidente, podramos haber puesto el operador lgico que hubiramosquerido
(mayor que, mayor o igual que, menor que, igual a...)
Vamos a aprovechar el cdigo para ver cmo podemos definir el filtro de manera separada, lo
que nos permitir escribir un cdigo ms claro a efectos de lectura.
11
Vistame en http://siliconproject.com.ar/neckkito/
caso es miFiltro.
Qu significa eso?
Significa que:
Supongamos que queremos filtrar por el campo [Nombre]. Ese campo es de tipo Texto
(String). Cmo debera ser nuestro cdigo?
Si hiciramos el filtro simple, y suponiendo que queremos filtrar por Neckkito (si existiera ese
nombre en TDatos), nuestro cdigo debera quedar as:
Si operamos a travs de variable debemos indicar que existen esas comillas simples. Para ello
escribiramos lo siguiente (la primera lnea est muy espaciada para que podis distinguir bien
las diferentes comillas; la segunda es como quedara normal):
Lo vemos?
Vamos a abrir nuestro formulario FDatos en modo Hoja de Datos, pero slo para consultar los
registros. Ello implica que no queremos ni que se puedan aadir registros, ni editar registros ni
12
Vistame en http://siliconproject.com.ar/neckkito/
eliminar registros. Todas estas acciones tienen una propiedad asignada y, por tanto, son
manipulables a travs de cdigo.
Private Sub cmdAbreFDatosConsulta_Click()
DoCmd.OpenForm "FDatos", acFormDS
Forms!FDatos.AllowAdditions = False
Forms!FDatos.AllowEdits = False
Forms!FDatos.AllowDeletions = False
End Sub
Vamos a utilizar otro mtodo para abrirlo como slo lectura. Para ello el cdigo que podramos
utilizar sera el siguiente:
Es decir, el ltimo argumento nos permite seleccionar el tipo de apertura para los datos de ese
formulario.
13
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdAbreFDatosConsultaSimple_Click()
'Para abrir como snapshot debemos saber que esa
constante es igual a 2
DoCmd.OpenForm "FDatos", acFormDS
Forms!FDatos.RecordsetType = 2
End Sub
Imaginemos que queremos que nuestro formulario se abra en modo modal. Cmo sera el
cdigo? Pues as:
Y si queremos que al abrir el formulario el ciclo de registros sea Todos los registros o
Registro activo? Pues a manipular propiedades:
Vamos a acabar este captulo haciendo algo un poco ms complejo de lo que hemos visto
hasta ahora.
14
Vistame en http://siliconproject.com.ar/neckkito/
Vamos a copiar FDatos y lo pegaremos con el nombre de FDatos2. Ya lo hemos hecho?
Lo que tenemos que hacer, desde nuestro botn de comando en FMenu, es conseguir
que el cdigo:
Si nos fijamos:
En la lnea del DoCmd.OpenForm le hemos dicho, primero, que nos lo abra en vista
diseo (acDesign) y, segundo, que nos lo abra oculto (acHidden)
En la segunda lnea de cdigo establecemos su propiedad como emergente (PopUp
TRUE)
En la tercera lnea de cdigo cerramos el formulario, aadindole la constante
acSaveYes, que lo que hace evidentemente es guardarnos los cambios de manera directa (sin
pedirnos confirmacin).
Y el resto de cdigo ya lo conocis
PARA FINALIZAR...
Con todo lo visto en este captulo tenemos, creo, unas bases importantes para saber cmo
abrir/cerrar objetos de Access y manipular, en concreto los formularios. Insisto en que si
queremos profundizar (deberamos, de hecho) en los diferentes aspectos que hemos tocado
en esta explicacin sera conveniente utilizar la ayuda de Access, que para eso est.
Por ejemplo, si en nuestro VBE escribimos DoCmd.OpenForm y situamos el cursor sobre esas
palabritas mgicas, y a continuacin pulsamos F1, obtendremos algunas explicaciones que os
pueden ayudar a entender algunas cosas mejor, e incluso descubriris cosas nuevas (porque,
lgicamente, yo no puedo explicarlo todo todo ;)
Espero, de todas maneras, haberos podido dar una ayudita para entender estos primeros
momentos con nuestro amiguete DoCmd.
Suerte!
15
Vistame en http://siliconproject.com.ar/neckkito/