You are on page 1of 15

CURSO DE VB

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

La BD donde estn los ejemplos de este captulo os la podis bajar aqu.

Vistame en http://siliconproject.com.ar/neckkito/

Y LA ESTRELLA INVITADA... DOCMD!


CONVERSACIN ODA AL PASAR...
Cdigo VBA: Hola! Qu eres?
Formulario: Un formulario
CVBA: Vaya! No te haba reconocido. As, eres un Forms!
F: Forms!? Pues me parece bien. Me gusta esa
descripcin.
CVBA: Y por cierto, cmo te llamas?
F: Ah! Mi nombre es miFormulario
CVBA: Bonito nombre... Te llamar, pues, Forms!miFormulario
F: Me gusta ese nombre, pero si no voy equivocado vivimos en el mismo edificio
CVBA: Vivimos en el mismo edificio? Entonces somos vecinos!
F: S. Por eso creo que Forms!miFormulario es un poco formal, no crees?
CVBA: Tienes razn: como somos vecinos te voy a llamar... Me

LLAMAR A LOS FORMULARIOS E INFORMES EN CDIGO


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.
Si el cdigo se halla en el mdulo asociado al formulario (son vecinos, siguiendo el smil)
podemos referirnos al formulario llamndolo simplemente ME. Si queremos hacer referencia a
otro formulario distinto debemos llamarle por su nombre completo; es decir, Forms!
nombreFormulario.
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.

CREANDO UNA MINI-BD PARA IR JUGANDO CON EL CDIGO


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:

Vistame en http://siliconproject.com.ar/neckkito/

[Id] Autonumrico (clave principal)


[Nombre] Texto
[Edad] Nmero (entero, con cero decimales)
Metamos, a mano, algunos pocos registros en la tabla, a
nuestro gusto.

Creamos un formulario, al que ponemos de nombre


FDatos, basado en nuestra tabla TDatos.

Creamos un formulario en blanco, al que llamaremos


FMenu

Creamos una consulta de seleccin sobre TDatos (como queramos) y la llamamos


CDatos.

Creamos un informe sobre la tabla TDatos y lo llamamos RDatos.

Ya tenemos los principales objetos de Access creados. Ya podemos empezar a destripar el


DoCmd

DOCMD... PARA ABRIR ALGO


La sintaxis bsica para abrir un objeto a travs de cdigo es la siguiente:
DoCmd.OpenXXX nombreObjeto
Donde

XXX va a ser:
Form
Query
Report

Y, ms all de este ejemplo, podemos abrir:

Table

DataAccessPage

Diagram

Function

Module

StoredProcedure

View
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
Cogemos el primer botn (cmdAbreFDatos) y en el evento Al hacer click generamos el
siguiente cdigo:

Private Sub cmdAbreFDatos_Click()


DoCmd.OpenForm "FDatos"
3

Vistame en http://siliconproject.com.ar/neckkito/

End Sub

Como vemos si hacemos click sobre l (en vista formulario)


se nos abre el formulario en cuestin. Fcil, no?
Como habris supuesto, el cdigo de cmdAbreTDatos sera:

Private Sub cmdAbreTDatos_Click()


DoCmd.OpenTable "TDatos"
End Sub

El cdigo de cmdAbreCDatos es:

Private Sub cmdAbreCDatos_Click()


DoCmd.OpenQuery "CDatos"
End Sub

Y, finalmente, el cdigo para cmdAbreRDatos es:

Private Sub cmdAbreRDatos_Click()


DoCmd.OpenReport "RDatos"
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.

DOCMD... PARA CERRAR ALGO


Ya sabemos cmo abrir elementos de Access... Vamos a ver cmo cerrarlos.
La sintaxis es:
DoCmd.Close acXXX, NombreObjeto
Vamos a aadir tres botones de comando en nuestro formulario FMenu y los vamos a llamar:

cmdCierraFDatos
cmdCierraTDatos
cmdCierraCDatos

El cdigo que vamos a aplicar al primero va a ser el siguiente:

Private Sub cmdCierraFDatos_Click()


DoCmd.Close acForm, "FDatos"
End Sub

Si ahora realizamos el siguiente proceso veremos lo bien que nos funciona: abrimos, a travs
4

Vistame en http://siliconproject.com.ar/neckkito/

de nuestro botn de comando, el formulario FDatos Seleccionamos nuestro formulario


FMenu Cerramos FDatos con nuestro botn.
Os propongo que programis los otros dos botones antes de
mirar el cdigo que os indico a continuacin. Creo que os va
a resultar muy fcil.
Para cerrar la tabla:

Private Sub cmdCierraTDatos_Click()


DoCmd.Close acTable, "TDatos"
End Sub

Para cerrar la consulta:

Private Sub cmdCierraCDatos_Click()


DoCmd.Close acQuery, "CDatos"
End Sub

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:

Private Sub cmdAbreFDatos_Click()


DoCmd.OpenForm "FDatos"
Me.SetFocus
End Sub

Como vemos, debemos preguntarnos: en qu mdulo de objeto estamos? Pues estamos en el


mdulo asociado a FMenu. Por ello, para decir: sitame el enfoque en FMenu podemos
emplear la palabra reservada ME. Y nos basta con utilizar un punto separador para indicar que:
NombreFormuario.Accin
Y de ah que escribamos: Me.SetFocus
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.
Y si modificamos el anterior cdigo de la siguiente manera veremos cmo se hace lo anterior:

Private Sub cmdAbreFDatos_Click()

Vistame en http://siliconproject.com.ar/neckkito/

DoCmd.OpenForm "FDatos"
Me.SetFocus
MsgBox "Ahora el foco pasar a FDatos", vbInformation, "SALTITO"
Forms!FDatos.SetFocus
End Sub

Creo que con este ltimo ejemplo ha quedado claro cmo


funciona la cosa, y cmo debemos utilizar el ME (que, en
nuestro ejemplo, sera equivalente a Forms!FMenu).
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:

Private Sub cmdCerrar_Click()


DoCmd.Close acForm, Me.Name
End Sub

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.

DOCMD PARA SALIR... Y BYE-BYE


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:

Private Sub cmdSalir_Click()


DoCmd.Quit
End Sub

Como vemos, el cdigo es muy simple. Basta utilizar la estructura DoCmd.Quit


Vamos a complicar un poco la cosa, recordando nuestras enseanzas de captulos anteriores.
Nos atrevemos a programar un botn (al que llamaremos cmdSalirPidiendo) que nos solicitara
confirmacin para salir? Os animo a pensar cmo sera el cdigo para ese botn (hay varias
maneras de hacerlo), antes de mirar el cdigo que os propongo a continuacin:

Private Sub cmdSalirPidiendo_Click()


Dim resp As Integer
resp = MsgBox("Realmente quiere salir?", vbQuestion + vbYesNo, "CONFIRMACIN")
6

Vistame en http://siliconproject.com.ar/neckkito/

If resp = vbNo Then


Exit Sub
End If
DoCmd.Quit
End Sub

Fcil, verdad?

PROFUNDIZANDO: DOCMD CON FORMULARIOS


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:

Private Sub cmdAbreFDatos_Click()


DoCmd.OpenForm "FDatos"
End Sub

A partir de ese cdigo vamos a ver un par de variaciones sobre el tema.

UN PASEO POR... LOS REGISTROS


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.
Sistema 1: vamos al nuevo registro sin emular accin de macro
Vamos a decirle al cdigo que:
1.- Nos abra el formulario
2.- Nos vaya a un nuevo registro
Para eso debemos utilizar el siguiente cdigo:

Private Sub cmdAbreFDatosNuevoRegistroStma1_Click()


DoCmd.OpenForm "FDatos"
DoCmd.GoToRecord acDataForm, "FDatos", acNewRec
End Sub

La primera lnea de cdigo la tenemos controlada. Sin comentarios.


La segunda lnea de cdigo nos dice lo siguiente:
DoCmd.VeAlRegistro (es un formulario), (se llama FDatos), aRegistroNuevo

Vistame en http://siliconproject.com.ar/neckkito/

Si nos fijamos en los argumentos del mtodo DoCmd.GoToRecord vemos que:

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).

Y con este sistema no slo sabemos ir a un registro nuevo,


sino que podemos sustituir acNewRec por otras constantes,
de manera que:
acFirst Nos lleva al primer registro
acGoTo Nos lleva al registro que le indiquemos
acLast Nos lleva al ltimo registro
acNext Nos lleva al registro siguiente
acPrevious Nos lleva al registro anterior

Sistema 2: vamos al nuevo registro emulando una macro


Aunque lo iremos viendo, podemos emular la accin de una macro a travs de
Docmd.RunCommand
Apliqumoslo pues a nuestro supuesto. El cdigo del botn debera ser:

Private Sub cmdAbreFDatosNuevoRegistroStma2_Click()


DoCmd.OpenForm "FDatos"
DoCmd.RunCommand acCmdRecordsGoToNew
End Sub

Como podemos ver nuestra segunda lnea de cdigo opera a travs de una constante de vb de
Access, que es acCmdRecordsGoToNew
Igual que en el caso anterior, podemos utilizar las siguientes constantes:
acCmdRecordsGoToFirst para ir al primer registro
acCmdRecordsGoToLast para ir al ltimo registro
acCmdRecordsGoToNext para ir al registro siguiente
acCmdRecordsGoToPrevious para ir al registro anterior
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
Recordad que podemos crear uno y hacer copy-paste
Para programar cmdPrimero vamos a asignarle este simple cdigo:
8

Vistame en http://siliconproject.com.ar/neckkito/


Private Sub cmdPrimero_Click()
DoCmd.RunCommand acCmdRecordsGoToFirst
End Sub

Y para programar cmdAnterior el cdigo sera:

Private Sub cmdAnterior_Click()


DoCmd.RunCommand acCmdRecordsGoToPrevious
End Sub

Lo dicho: os dejo para vosotros la programacin de los dos restantes


Ojo. An no hemos entrado en el tema de control de errores. Por ello, si estamos en el
primero, por ejemplo, y queremos ir al registro anterior obtendremos un error de cdigo.
Tened un poquito de paciencia y pronto veremos cmo resolver este inconveniente.

CMO DESEA EL FORMULARIO? POCO HECHO, AL PUNTO O MUY


HECHO?
Si complicamos la estructura del DoCmd.OpenForm veremos que se nos permite la adicin de
varios argumentos:
DoCmd.OpenForm nombreForm, [tipo de vista], [filtro], [condicin], [modo de datos], [modo
de ventana], [openArgs]
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:
TIPO DE VISTA

CONSTANTE DE VB DE ACCESS

Vista diseo

acDesign

Vista hoja de datos

acFormDS

Vista de grfico dinmico

acFormPivotChart

Vista de tabla dinmica

acFormPivotTable

Vista presentacin

acLayout

Vista formulario

acNormal

Vista preliminar

acPreview

Pues con todo lo anterior ya podemos decirle al cdigo qu tipo de vista deseamos cuando
abramos el formulario.
En FMenu vamos a crear un botn de comando (que yo he llamado cmdAbreFDatosHojaDatos)
que nos abrir FDatos en vista Hoja de datos. El cdigo que debemos asignarle es el siguiente:

Private Sub cmdAbreFDatosHojaDatos_Click()


DoCmd.OpenForm "FDatos", acFormDS
End Sub
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?

UTILICEMOS UN FILTRO SENCILLO


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.
Para ello el cdigo que debemos generar al botn cmdAbreFDatosFiltroSencillo es el siguiente:

Private Sub cmdAbreFDatosFiltroSencillo_Click()


DoCmd.OpenForm "FDatos", , , "[Edad]=" & 55
End Sub

Fijaos en un par de cosas:

Hemos situado las comas en su sitio correspondiente, aunque no hayamos especificado


ningn argumento.

Hemos indicado que la condicin (el campo [Edad]) sea igual a. Todo lo anterior lo
hemos puesto entre comillas.

Para unir condicin y valor de la condicin hemos utilizado el ampersand (&) y a


continuacin el valor buscado.
Hubiramos podido escribir, directamente, lo siguiente:
DoCmd.OpenForm "FDatos", , , "[Edad]=55
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...)

Y COMPLIQUEMOS UN POCO EL FILTRO


Podemos unir condiciones en nuestro filtro a travs de la palabra reservada AND.
Supongamos que queremos filtrar por un rango de edades, con un valor inferior y un valor
superior. Y ese rango nos lo dar el propio usuario. No voy a utilizar, para este cdigo, el
detectar el botn cancelar, porque eso ya lo sabrais aplicar vosotros (y eso me permitir
cambiar el tipo de variable).
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.
Pues en nuestro nuevo botn cmdAbreFDatosFiltroComplejo vamos a escribir el siguiente
cdigo:

Private Sub cmdAbreFDatosFiltroComplejo_Click()


Dim vEdadInf As Integer, vEdadSup As Integer
Dim miFiltro As String
vEdadInf = InputBox("Introduzca la edad inferior", "EDAD INFERIOR")
vEdadSup = InputBox("Introduzca la edad superior", "EDAD SUPERIOR")
miFiltro = "[Edad]>=" & vEdadInf & " AND [Edad]<=" & vEdadSup
DoCmd.OpenForm "FDatos", acFormDS, , miFiltro
End Sub

Como podemos observar, hemos:

Definido el filtro a travs de una variable de tipo String.

miFiltro es en realidad una cadena de texto, slo que los valores inferior y superior
vienen dados por las edades que introduzca el usuario.

Ojo con los espacios, pues tambin cuentan. Como veis, hay un espacio antes de AND.
Supongamos que las edades sean 1 y 3. Si no hubiramos puesto ese espacio la cadena de
texto sera: [Edad]>=1AND [Edad]<=3. Y el cdigo hubiera entendido que el valor inferior es
1AND, adems de encontrarse con una expresin que no entiende porque no se dara
cuenta de que hay dos condiciones (falta el AND que las une). Cuidadn con los espacios!
11

Vistame en http://siliconproject.com.ar/neckkito/


En la condicin basta que pongamos el nombre del filtro que hemos creado, que en este
caso es miFiltro.

UNA PUNTUALIZACIN SOBRE LOS FILTROS


Como habis visto, si trabajamos con nmeros, el filtro es,
digamos, directo.
Sin embargo, segn el tipo de dato deberemos adaptar el
filtro al tipo de dato.
Qu significa eso?
Significa que:
TIPO DE DATO

FILTRO

Numrico

Directo

Booleano

Directo

String

Entre comillas simples (')

Fecha

Entre almohadillas (#)

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:
DoCmd.OpenForm "FDatos", acFormDS, , [Nombre] = 'Neckkito'
Es decir, el filtro seria 'Neckkito'
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):
DoCmd.OpenForm "FDatos", acFormDS, , [Nombre] =

'

& vMiNombre &

'

DoCmd.OpenForm "FDatos", acFormDS, , [Nombre] = ' & vMiNombre & '


Lo vemos?
Y si fuera, hipotticamente, una fecha, escribiramos:
DoCmd.OpenForm "FDatos", acFormDS, , [Fecha]=# & vMiFecha & #

Y SIGAMOS EXPLORANDO MANIPULACIONES


Sabemos (o deberamos saber) que un formulario tiene propiedades. Mediante cdigo
podemos manipular esas propiedades. Vamos a ver algunas.
Vamos a abrir nuestro formulario FDatos en modo Hoja de Datos, pero slo para consultar los
12

Vistame en http://siliconproject.com.ar/neckkito/

registros. Ello implica que no queremos ni que se puedan aadir registros, ni editar registros ni
eliminar registros. Todas estas acciones tienen una propiedad asignada y, por tanto, son
manipulables a travs de cdigo.
Vamos a crear un botn de comando en FMenu que nos
permitir abrir FDatos con estas caractersticas. El cdigo a
utilizar seria:

Private Sub cmdAbreFDatosConsulta_Click()


DoCmd.OpenForm "FDatos", acFormDS
Forms!FDatos.AllowAdditions = False
Forms!FDatos.AllowEdits = False
Forms!FDatos.AllowDeletions = False
End Sub

Como

podemos ver, utilizamos:


AllowAdditions = False para evitar aadir nuevos registros
AllowEdits = False para evitar ediciones de registros
AllowDeletions = False para evitar borrado de registros

Lgicamente, si quisiramos activar alguna de estas caractersticas deberamos cambiar FALSE


por TRUE.
Y aprovechemos para repasar conceptos... No se os ocurre una manera ms eficiente de
escribir el anterior cdigo? No? Pues podramos haber escrito el cdigo anterior de la
siguiente manera:

Private Sub cmdAbreFDatosConsulta_Click()


DoCmd.OpenForm "FDatos", acFormDS
With Forms!FDatos
.AllowAdditions = False
.AllowEdits = False
.AllowDeletions = False
End With
End Sub

Nos acordamos ahora? ;)


Vamos a utilizar otro mtodo para abrirlo como slo lectura. Para ello el cdigo que podramos
utilizar sera el siguiente:

Private Sub cmdAbreFDatosSoloLectura_Click()


DoCmd.OpenForm "FDatos", acFormDS, , , acFormReadOnly
End Sub

Es decir, el ltimo argumento nos permite seleccionar el tipo de apertura para los datos de ese
formulario.
Como puntualizacin a lo anterior si queremos abrir el formulario en modo slo lectura
hubiramos podido utilizar tambin este otro cdigo:

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

Una vez visto lo anterior ya podemos entender la mecnica de


manipulacin de propiedades del formulario. Veamos algunos
ejemplos ms.
Imaginemos que queremos que nuestro formulario se abra en modo modal. Cmo sera el
cdigo? Pues as:

Private Sub cmdAbreFDatosModal_Click()


DoCmd.OpenForm "FDatos"
Forms!FDatos.Modal = True
End Sub

Y si queremos que al abrir el formulario el ciclo de registros sea Todos los registros o
Registro activo? Pues a manipular propiedades:

Private Sub cmdAbreFDatosCicloTodos_Click()


'Debemos saber que "Todos los registros" conlleva el valor 0, y que
'el "Registro activo" conlleva el valor 1
DoCmd.OpenForm "FDatos"
Forms!FDatos.Cycle = 0
End Sub

Private Sub cmdAbreFDatosCicloRegistroActivo_Click()


'Debemos saber que "Todos los registros" conlleva el valor 0, y que
'el "Registro activo" conlleva el valor 1
DoCmd.OpenForm "FDatos"
Forms!FDatos.Cycle = 1
End Sub

UN LTIMO EJEMPLO ALGO MS COMPLEJO


Vamos a acabar este captulo haciendo algo un poco ms complejo de lo que hemos visto
hasta ahora.
Imaginemos que queremos abrir FDatos en modo emergente y modal. Qu problema
tenemos? Que la propiedad emergente slo es manipulable en vista Diseo. Y qu hacemos
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 el cdigo:

que hacer, desde nuestro botn de comando en FMenu, es conseguir


1.
Abra FDatos2 en vista diseo, pero a la vez que nos
lo oculte para que el usuario no se d cuenta de que lo
estamos manipulando.
2.
Cambiarle la propiedad para que sea emergente.
3.
Cerrarlo, guardando los cambios
4.
Abrirlo de nuevo, y establecer su propiedad como
modal

Vamos a ver cmo podemos hacer eso. El cdigo sera el siguiente:

Private Sub cmdAbreFDatos2EmergenteYModal_Click()


DoCmd.OpenForm "FDatos2", acDesign, , , , acHidden
Forms!FDatos2.PopUp = True
DoCmd.Close acForm, "FDatos2", acSaveYes
DoCmd.OpenForm "FDatos2"
Forms!FDatos2.Modal = True
End Sub

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/

You might also like