Sie sind auf Seite 1von 27

Uso de modulos de clase para crear

tus propios objetos


Traduccin libre realizada por: Sal Rojas (saul_rr77@htomail.com) septiembre, 2014.
Nota del traductor:
El siguiente material fue extrado de la direccin web: http://www.dimgt.com.au/cl_Simple.html donde se encuentra la versin original en ingls. Me he tomado el
atrevimiento de hacer sta traduccin libre debido al aparentemente escaso material
circulante en espaol acerca del uso de mdulos de clases en Access. La programacin con
objetos en Access parece ser un asunto an no explotado en todo su potencial. En base a mi
propia experiencia puedo decir que sta tcnica de programacin requiere de cierto esfuerzo,
sobre todo al comienzo, para dominarla con algo de soltura, pero como bien lo afirma el autor
en los prrafos siguientes, bien vale la pena el esfuerzo; por qu? Porque el cdigo es ms
organizado, ms acorde a la realidad, ms fcil de leer y corregir, ms poderoso y quizs otros
ms que ustedes, apreciados lectores, vislumbraran durante su aprendizaje.
Quiero aclarar que la presente traduccin fue realizada, no por un traductor tcnico
profesional, sino por un entusiasta de la programacin en MS Access con algunos rudimentos
de la lengua Inglesa. Por lo tanto, cualquier error de traduccin es de mi entera
responsabilidad. No obstante, siempre est la versin original en ingls la cual pueden
consultar si as lo desean. Quiero adems aprovechar stas lneas para expresar una vez ms
mi perenne agradecimiento a Neckkito (Miquel), a quien considero mi primer y mejor maestro
de programacin, por haberme abierto los ojos al mundo oculto tras la combinacin de teclas
Alt + F11. Por cierto, en el Tutorial de VBA de su autora el cual pueden hallar en su pgina
web: http://siliconproject.com.ar/neckkito especficamente en la entrega N 18, hay una
excelente introduccin al tema de las Clases. Les recomiendo encarecidamente su lectura y
puesta en prctica (fin de la nota).

Si usas VBA para hacer tus programas de Microsoft Access ms inteligentes y especialmente si
usas formularios Desvinculados, casi con seguridad te dars cuenta de que la conveniencia
de los mdulos de clase bien vale la pena el esfuerzo inicial.
Los siguientes tips son una sencilla introduccin al uso de mdulos de clase y constituyen una
iniciacin a tu propia programacin orientada a objetos.
El tutorial asume que ests razonablemente familiarizado con el uso de VBA en aplicaciones de
Access.
Parte 1: Un sencillo ejemplo

Introduccin

En este primer ejemplo, vamos a crear un mdulo de clase muy bsico al cual llamaremos
clsSimple. Le agregaremos algunas propiedades que podremos establecer y cambiar usando
cdigo VBA normal.
Tambin mostraremos como usar el comando Stop en las pruebas de cdigo para seguir
vivos en la memoria.
Instrucciones:
1.
2.
3.
4.

Abrir el editor de VBA (Ctrl + F11)


En el explorador de proyectos hacer: clic derecho -> insertar -> mdulo de clase.
En la venta de propiedades en la propiedad (Name) escribir: clsSimple.
Guardar el mdulo (Ctrl + S) haciendo clic en aceptar con el nombre propuesto
(clsSimple)
5. Escribir en el mdulo el siguiente cdigo

6. Ahora, creemos un poco de cdigo de prueba; en el explorador de proyectos,


insertemos un mdulo estndar que guardaremos con el nombre de pruebaSimple
7. Escribir en el mdulo pruebaSimple el siguiente cdigo:

8. Abrir la ventana inmediato (Ctrl + G)

9. Escribir fncpruebaSimple y pulsar la tecla Enter


Esto har que se muestren los valores de las propiedades que hemos establecido en nuestro
programa. El sistema debera resaltar la palabra Stop en amarillo. La ventana inmediato
debera mostrar resultados como el siguiente:

De acuerdo, no es nada asombroso, pero es un comienzo. Hagamos algunas observaciones de


lo visto hasta ahora:

Notemos cmo Access nos ofrece una lista de la cual elegir despus que hemos escrito
la palabra oSim seguida del punto
Incluso cuando declaramos el tipo de dato con: Dim oSim as, Access ya saba de la
existencia de nuestra clase.

Si usamos el men Ver -> Examinador de objetos o simplemente pulsamos F2,


podremos buscar clsSimple y ver los miembros de sta clase listados igual que todas
las clases que ya vienen con Access

De vuelta a las instrucciones


10. El comando Stop en nuestro procedimiento ha detenido el programa dejando que
nuestro objeto contine vivo en memoria. Podemos usar la ventana inmediato para
hacer cambios en las propiedades del objeto. Por ejemplo, escribamos estos
comandos en la ventana inmediato:

Al pulsar la tecla Enter nos debera mostrar el nmero 99, que es nuevo valor de la propiedad
oSim.Valor, la cual acabamos de cambiar.
11. Para finalizar el programa, presionemos F5 : Ejecutar -> Continuar.

Qu hemos aprendido?
Este muy sencillo ejemplo nos ha mostrado cmo crear el objeto personalizado clsSimple con
las propiedades Idpedido, NombreCliente, y Valor; establecimos valores para dichas
propiedades y luego hicimos algunas cosas con ellas- aunque slo fuera mostrarlas en pantalla.
La creacin de una propiedad es algo tan sencillo como crear una variable pblica en el
mdulo de clase
Tambin vimos como configurar nuestro cdigo de prueba de manera de dejar nuestro objeto
vivo en la ventana inmediato y poder hacer pruebas y otras travesuras con l.
Ms
Como prctica adicional, abramos la ventana inmediato de nuevo (Ctrl + G) y escribamos los
siguientes comandos:

Acabamos de crear el objeto os en el aire, por as decirlo. El comando que realiz sta
accin fue: set os = new clsSimple.
Al presionar la tecla Enter despus de cada instruccin, observamos cmo se muestran (en los
sitios donde se observa el subrayado en la imagen) los valores contenidos en las propiedades
del objeto, as podemos ver en tiempo real cules son los valores por defecto de dichas
propiedades y cuales valores toman segn las manipulemos.
Debido a que el objeto no est declarado dentro de un mdulo real, no disponemos de la lista
de autocompletado sta vez, sin embargo, an podemos asignar y recuperar sus propiedades
Preguntas para investigar
1. Cules son los valores por defecto de las propiedades de nuestros nuevos objetos
cuando se crean por primera vez?
2. Qu pasa si olvidas un nombre y escribes, digamos, os.Val en vez de os.Valor?
3. Toma en cuenta Access la diferencia entre maysculas y minsculas si escribes
os.valor, os.VALOR u OS.valor?

Parte 2. Propiedades Slo Lectura


Introduccin
En nuestro primer ejemplo clsSimple, todas las propiedades IdPedido, etc. podran ser
alteradas por un programa VBA porque fueron declaradas como Public. Si queremos que
algunas de nuestras propiedades sean de slo lectura, necesitamos hacer o declarar las
variables como Private y usar la instruccin Property get

Instrucciones
1. Creemos una nueva clase llamada clsReadOnly
2. Escribamos el siguiente cdigo:

3. En la ventana inmediato, intentemos ingresar los siguientes comandos:

Esta vez an podemos obtener el valor de la propiedad del objeto, pero no podemos
establecer se valor usando una instruccin tal como oro.IdPedido = 99.
En realidad, ste ejemplo en particular no sirve de mucho, pero en posteriores lecciones
veremos cmo ste cdigo puede ser usado de manera muy efectiva para proteger
propiedades importantes tales como IdPedido de cambios accidentales.
Lo opuesto a la instruccin Property get es la instruccin Property let. Si consultamos la ayuda
respecto a ste tema, podramos encontrar ejemplos como ste:

De hecho, no hay diferencia entre esto y declarar una variable como Public, tal como lo
hicimos en nuestro primer ejemplo. De ste modo, slo tomara ms cdigo. Sin embargo. Hay
cosas muy tiles que hacer con la instruccin Property Let, tal como limitar los valores que la
propiedad pueda tomar.

Una nota acerca de la convencin de nombres


El prefijo cls usado para nombrar los mdulos de clase en la ventana de mdulos es
otra convencin. Podemos dar a nuestras clases el nombre que queramos, pero
realmente ayuda si somos organizados desde el principio. Al tener todos los nombres
de nuestros mdulos de clase empezando por cls los diferenciaremos de los mdulos
estndar
Las instancias de objetos definidos en cdigo VBA empiezan con o minscula tal
como oSim. Repetimos, hay numerosas convenciones para esto. Es cuestin de gustos
personales

Parte 3. Haciendo que nuestra clase haga algo


Introduccin
Hasta ahora hemos visto cmo crear un objeto con propiedades; ahora vamos a hacer
que el objeto haga algo.
Nuevamente, usaremos un ejemplo sencillo para mostrar los elementos bsicos.
Instrucciones
1. Hagamos una copia de nuestro primer mdulo de clase: en el explorador de
proyectos hacer clic derecho en clsSimple -> Copiar -> Pegar. Llamaremos al
nuevo mdulo clsSimpleMetodo
2. Hagamos doble clic en clsSimpleMetodo y editemos el cdigo como se ve a
continuacin:

3. Guardemos los cambios y editemos el mdulo pruebaSimple e insertemos un


nuevo procedimiento con el nombre de PruebaImpuesto.
4. Editemos el cdigo:

5. Guardemos los cambios y en la ventana inmediato escribamos el nombre del


procedimiento: pruebaImpuesto.

Qu hemos aprendido:

La adicin de cdigo en la funcin pblica Impuesto de nuestro objeto, ha


creado un mtodo que calcula exactamente el 10 por ciento de cualquiera que
sea el valor de la propiedad Valor en un momento dado.
De nuevo, difcilmente podra servir ste ejemplo para probar las capacidades
de nuestra computadora, pero se podra complicar todo lo que queramos.
Que significa esto:
Incluso con ste sencillo ejemplo el programador usuario del objeto
clsSimpleMetodo no necesita saber los detalles de cmo el Impuesto se calcula.
l slo usa la expresin o.Sim en su cdigo.
Adems, desde el punto de vista de un nivel ms alto de mantenimiento de
programas, si queremos cambiar la tasa de impuesto a, digamos, 12 %, slo
tenemos que alterar un nmero en el cdigo en clsSimpleMetodo, y luego
quienquiera que haya usado la expresin oSim.Impuesto donde sea en el
programa, obtendr la respuesta correcta automticamente.
Probablemente estemos pensando que, hasta ahora, todo esto no difiere
mucho del uso de funciones pblicas en un mdulo estndar de cdigo, aparte
de la lista de autocompletado. En posteriores ejemplos veremos porqu el uso
de clases es mucho ms poderoso.
Un caso ms complicado
Si las leyes impositivas se vuelven ms complicadas de manera que, por
ejemplo, el impuesto ser de 10% si el valor es de 100 o menos y de 12 % en
los dems casos, podemos cambiar el cdigo de nuestro mdulo
clsSimpleMetodo de la manera siguiente:

Lo cual debera producir el resultado siguiente en la ventana inmediato:

Pregunta:
Qu crees que significa la palabra Me en la expresin Me.Valor?
Parte 4. Conectando don la base de datos
Cmo conectamos los mdulos de clases con las tablas de nuestra base de
datos? Armemos un ejemplo elemental donde leamos los datos de clientes de
una tabla usando un objeto cliente.
Instrucciones
1. Creemos una nueva tabla llamada tblClientes con los siguientes campos:
Nombre del campo
IdCliente
NombreCliente
Direccion
Telefono
TasaDescuento

Tipo de datos
Auto numrico
Texto
Texto
Texto
Nmero

Terminos

Nmero

Ajustes
Clave Primaria

Doble,
formato
porcentaje
Entero

TasaDescuento es el descuento estndar que podramos dar a cada cliente en


particular y Terminos es el nmero de das de crdito que le damos.
2. Ingresemos algunos datos inventados para crear un par de registros.
Asegurmonos de no dejar ningn campo vaco por el momento:
Tabla tblClientes: Datos de ejemplo
IdCliente
1

NombreCliente
Pedro

Direccion
Calle 123

Susana

Calle
cualquiera

Telefono
(02) 1234
1234
(02) 2345
5666

TasaDescuento
2.5

Terminos
30

60

3. Creemos un nuevo mdulo de clase llamado clsCliente y escribamos en l


el siguiente cdigo:

10

4. En la ventana inmediato, escribamos los siguientes comandos (hemos


colocado comillas simples delante de las respuestas esperadas):

Qu se ha logrado con esto?


Estos comandos nos han permitido realizar varias tareas:

Creamos un nuevo objeto oCli de la clase clsClientes en memoria con el


comando set oCli = new clsCliente
Cargamos, uno por uno, los datos de los dos primeros registros de la tabla
tblClientes de la base de datos en el objeto (y pudo habernos dicho si fue o no
exitoso el procedimiento). Para ello utilizamos el comando : ?oCli.Cargar()

11

Mostramos en pantalla los valores del objeto, usando comando como ste:
oCli.NombreCliente.

Qu significado tiene todo lo anterior:

Un simple comando o.Cli.Cargar(n) ir y cargar todos los campos de un


registro especifico en la tabla tblClientes usando el ID del cliente en memoria.
Esto se puede hacer tanto en la ventana inmediato como a lo largo de nuestro
cdigo ordinario.
Todo el cdigo de manipulacin de la base de datos est en el mdulo de clase
Nos podemos referir a cada propiedad de nuestro objeto con la sintaxis
oCli.propiedad. Podemos usar esas propiedades en nuestro cdigo normal igual
que cualquier otra variable.
Es cierto que tenemos que escribir ms cdigo al principio cuando creamos el
mdulo de clase pero esto quedo ms que retribuido en la simplicidad del
cdigo de nuestra aplicacin principal.

En la prxima parte veremos cmo guardar los datos de nuestro objeto en la base de
datos.
Algunas observaciones:

El uso de una constante privada en el mdulo de clase para referirnos al nombre de


la tabla de la base de datos: Private Const scTabla as string = tblClientes, facilita el
cambio de nombre de la tabla o la realizacin de una copia del mdulo para ser
usada en otro objeto. Tambin previene equivocaciones al referirnos a la tabla en
cualquier lugar de nuestro cdigo.
El uso de la opcin dbOpenForwardOnly agiliza el acceso a los datos de la tabla.:
Set rs = CurrentDb.Openrecordset (sQry,dbOpenForwardOnly)
Hemos definido la funcin Cargar as Boolean para devolver True si fue exitosa o
False si fall

Public Function Cargar (Id as Long) as Boolean


Cargar = False
Haz el trabajove a salida si fallas o en caso de error
Cargar = True
Salida:
Exit Function

Hemos declarado la propiedad IdCliente para prevenir cambios accidentales.

12

Mi criterio personal para nombrar los Campos Autonumricos es usar la


palabra completa IdCliente o IdFactura, por ejemplo, en vez de usar slo ID.
Esto simplifica mucho la creacin de consultas cuando tienes que unir tablas. Si
deseo copiar el cdigo de un modulo de clase para crear una nueva, slo tengo
que hacer una edicin global para cambiar la palabra Cliente a, digamos,
Factura.
Parte 4. Guardando en la base de datos

Introduccin:
Esta leccin explica cmo usar los mdulos de clase para capturar datos de un
formulario esttico o desvinculado y guardarlos en una tabla de la base de datos.
El ejemplo muestra cmo manipular un sencillo objeto Pedido mediante la
creacin de un nuevo mdulo de clase llamado clsPedido, una tabla tblPedidos
en la base de datos un un formulario frmCrearPedido el cual usar el objeto para
guardar un nuevo registro en la base de datos.
Instrucciones:
1. Creemos una nueva tabla llamada tblPedidos con los siguiente campos:

2. Creemos una relacin uno a muchos entre el campo IdCliente de la tabla


tblClientes y el campo IdCliente de la tabla tblPedidos. Exijamos integridad
referencial.

13

3. Creemos un modulo de clase llamado clsPedido e ingresemos el siguiente


cdigo:

14

4. Creemos un formulario llamado frmCrearPedido, el cual no estar basado en


ninguna tabla. Agreguemos los siguientes controles:

15

Nombre del control


cboCliente

Tipo
Cuadro Combinado

Propiedades
Origen en la tabla
tblClientes.IdCliente

txtItem

Cuadro de texto

Txtcantidad

Cuadro de texto

txtPrecioUnitario

Cuadro de texto

Txtvalor

Cuadro de texto

Visible: No; origen de


datos: =
[txtCantidad]*[txtPrecioU
nitario]

btnCerrar

Botn de comando

(Ver abajo)

btnOk

Botn de comando

(Ver abajo)

5. Aada el siguiente cdigo al formulario:

16

17

6. Abramos el formulario e ingresemos algunos datos de ejemplo:

18

7. Hagamos clic en el botn OK. Un nuevo registro debera crearse en la tabla de


la base de datos.
Qu hemos hecho:

Nuevamente, esto parece mucho esfuerzo para lograr tan poco. Hemos
dejado que el usuario llene algunos campos en un formulario y luego hemos
guardado los datos en un registro en la base de datos
Sin embargo, este ejemplo pone de relieve los elementos clave de la
tcnica. Cuando trabajemos con objetos complejos y queramos mantener a
los usuarios lejos de la base de datos hasta el ltimo minuto, ah es cuando
estas tcnicas entran en accin.

La clave de este ejemplo es el objeto oPedido creado en la seccin de


declaraciones del mdulo del formulario.

El formulario no est vinculado a la tabla tblPedidos y no podr hacer dao


alguno hasta el momento apropiado, no importa qu haga el usuario.

Cuando llega el momento de hacer el dao, el cdigo tras el formulario,


recoge los valores que sern asignados a las propiedades del objeto y luego
usa el mtodo Crear del objeto para crear una nueva entrada en la tabla.

Observemos cmo hemos hecho uso del punto en expresiones del tipo
Me.NombreControl para referirnos a los valores de los controles en el

19

formulario. Sabemos que la documentacin nos recomienda usar el signo


de exclamacin (!), pero esta forma no slo es una sintaxis perfectamente
vlida sino que sino que nos arrojara un error inmediato en caso de existir
al tratar de compilar nuestro cdigo, cosa que la sintaxis
Me!NombreControl no har. Sera bueno hacer una edicin global en todos
los mdulos de formularios para remplazar Me! con Me..

El dao" real es hecho por un simple comando: oPedido.Crear. Lo que sea


que haga dicho comando no es de la incumbencia del programador
usuario de la clase al crear el formulario, siempre y cuando el haya
configurado todas las propiedades correctamente

Fijmonos cmo el cdigo hace uso del valor de retorno del mtodo Crear
para ver si la tarea se llev a cabo con xito o no:

Y no slo eso. El objeto ya tiene su nuevo Id almacenado en la propiedad


oPedido.IdPedido.

Si queremos ser ms Sofisticados, podemos envolver el mtodo en una


transaccin:

Parte 5 (y final). Editando y borrando objetos

Introduccin
El Siguiente ejemplo nos ensea cmo extender nuestra clase clsPedido con mtodos
que nos permitan editar y borrar registros en la base de datos.

20

Instrucciones:
1. Creemos un nuevo mdulo de clase llamado clsPedido1 con el siguiente cdigo:

21

22

23

2. Experimentemos con este nuevo objeto en la ventana inmediato como se ve a


continuacin:

24

Si queremos experimentar todo esto ms bien en un fragmento de cdigo, no


debemos olvidar la sustitucin de ? por Debug.Print. (Pero si hemos llegado hasta
aqu ya deberamos saberlo).
Observaciones acerca del cdigo:

Esta vez hemos hecho uso de la funcin Nz al leer los los datos de la base de
datos con el mtodo Cargar.
Me.Item = Nz(.fields(Item),0)

Esto maneja el problema (con el que quiz ya nos hemos topado), de pretender asignar
un valor nulo de nuestra base de datos a alguna propiedad de nuestro objeto

25

El mtodo Actualizar que utiliza una consulta para filtrar los registros, tambin
dispone de un mecanismo de verificacin mediante el uso de la propiedad
RecordCount del Recordset si un registro en particular no es encontrado.

Si usamos un procedimiento privado en un mdulo de clase tal como


GuardarRegistro, ste puede ser usado dentro del mdulo de clase como
cualquier otro procedimiento local, pero no puede ser usado externamente.
Intentemos esto :

Al pulsar Enter emerge un error como ste:

La declaracin del mdulo como Private significa exactamente eso: lo que sea que
haga el procedimiento, pertenece al mbito privado del mdulo y no puede ser
usado de manera accidental por un intruso.

El mtodo borrar simplemente usa una consulta SQL de eliminacin.


Observemos el uso del parmetro dbFailOnError con el cual nos aseguramos
de que cualquier error sea capturado.

26

Aun cuando ste cdigo podra lucir un poco complicado, una vez se ha escrito
por primera vez, podra ser fcilmente copiado en otros objetos y ser cambiado
con una sencilla edicin global.
FIN

27

Das könnte Ihnen auch gefallen