Está en la página 1de 65

PROGRAMA DE VISUAL BASIC 5.

CAPITULO I INTRODUCCION

I.1 El Paradigma de la Orientacin a Objetos

El tema de la orientacin a objetos no es nuevo. Sin embargo, en los ltimos aos ha tenido un impacto tan
grande en diferentes reas de la computacin que se hace obligatorio el manejo de los conceptos involucrados
para cualquier persona relacionada con esta disciplina. De la misma forma ha surgido una proliferacin de
definiciones e interpretaciones que conducen, primero a confusin, y luego a malas interpretaciones y abusos
de los trminos. En este primer captulo se presenta una breve resea de algunos acontecimientos que han
reforzado las bases de este paradigma a travs del tiempo, as como una exposicin de la mayor parte de los
trminos que giran alrededor de esta filosofa.

I.2 Perspectiva histrica

Cuando Fortran apareci en 1957 como una forma de automatizar la labor de aquellos que programaban en
lenguaje mquina y en ensamblador, hubo mucho escepticismo. Haba que probar que un proceso automtico
de traduccin poda competir con la eficiencia y el ingenio que aplicaban aquellos programadores para poder
ahorrar un microsegundo o una unidad de almacenamiento; y as fue.

Este primer paso es slo un ejemplo de la aplicacin de un concepto clave en cualquier desarrollo
computacional: abstraccin. Ese concepto se sigue aplicando y es posible rastrearlo a lo largo de la historia
de los lenguajes de programacin.

Los lenguajes de la primera generacin como Fortran I y Algol 58 estaban orientados a facilitar la
manipulacin de expresiones matemticas y liberar a los programadores de los incmodos detalles que
involucra (y ms en ese entonces) el lidiar con la mquina en forma directa. Aunque manejaban el concepto
de subprograma, este era aplicado ms que todo para reutilizacin. Adems, los programas eran relativamente
planos, en el sentido de que consistan de una serie de subprogramas que referenciaban datos globales. Es fcil
deducir que en programas de no necesariamente gran complejidad, empezarn a darse problemas serios si un
slo subprograma no funciona correctamente.

Para 1960, la popularizacin del transistor y la tecnologa de circuitos integrados hicieron posible que los
costos del computador disminuyeran y al mismo tiempo fuera posible aumentar su capacidad. Surgieron
entonces lenguajes como Cobol y Algol 60, enmarcados dentro de la segunda generacin. A diferencia de sus
antecesores, stos empezaron a dar mayor importancia al concepto de subprograma como un medio para
realizar funciones abstractas. Es decir, al afrontar un problema se idealizaba un conjunto de acciones macro
para solucionarlo, y estas a su vez seran atacadas como nuevos problemas, hasta llegar a completar la
solucin final. Lo anterior condujo al aidamiento de subprogramas, y al desarrollo de teoras referentes a
estructuras de control, y a alcance y visibilidad de variables. Es decir, se construyeron las bases de la
programacin estructurada, aplicando una abstraccin de los procedimientos requeridos.

Posteriormente, en la tercera generacin se incluy el concepto de mdulo, como una forma de satisfacer la
necesidad de manejar partes independientes de la solucin que eran atacadas por diferentes personas, dado que
los programas eran cada vez ms complejos y ms voluminosos.

Sin embargo, aunque ya se haba trabajado bastante en la abstraccin al nivel de mdulos y de


procedimientos, no se haba hecho mucho en lo que se refera a la abstraccin al nivel de datos. Aunque
lenguajes como Cobol daban mucha importancia a los datos dentro de las aplicaciones, exista una separacin

1
clara entre datos y procedimientos. La solucin era trazada con base en funciones, no en los datos mismos.

Incluso, al aplicar una metodologa clsica de anlisis y diseo estructurado, es posible tomar dos enfoques: 1)
realizar primero el estudio y la especificacin de las funciones requeridas y 2) luego formular el diagrama de
datos, o al contrario, iniciar primero con el diseo del diagrama de los datos que se requerirn y las relaciones
entre ellos, para luego deducir cules son los procesos necesarios que permitirn que los datos se mantengan
actualizados y evolucionen para brindar la informacin ltima que se desee en el sistema.

Segn Shankar, el punto es que la construccin de procedimientos funciona bien en la conceptualizacin de


funciones abstractas, pero no necesariamente en la conceptualizacin de datos abstractos, y dado que la
complejidad de los datos contribuye substancialmente a la complejidad del problema, la abstraccin de
procedimientos podra traer serios inconvenientes. Afirmaciones como la anterior llevaron al desarrollo de
mtodos de diseo basados en los datos, y a teoras referentes al concepto de tipo, que eventualmente se
reflejaron en lenguajes como Pascal.

Estas ideas se vieron plasmadas por primera vez en el lenguaje Simula, un lenguaje para programar
simulaciones en el computador en donde los objetos de una simulacin eran modelados en forma directa como
objetos de software. Simula es el antecesor de lenguajes como Smalltalk, Object Pascal, C++, Clos, y Ada,
que se puede decir que son de desarrollo reciente. Estos lenguajes son llamados orientados a objetos. En
ellos, un mdulo es una coleccin de objetos, que son cpsulas que contemplan tanto un comportamiento
(funcin) como un estado (datos), conformando una unidad donde los datos son el fundamento y estos pueden
realizar "por s mismos" un conjunto de acciones determinadas, tratando de simular el comportamiento de los
objetos del mundo real (se entrar en detalles ms adelante).

Las metodologas de anlisis y diseo orientadas a objetos tratan de establecer normas para definir esas
cpsulas y las relaciones con las dems de forma que se maximicen una serie de criterios deseables
previamente establecidos para lograr un producto de calidad.

I.3 Elementos de un modelo de objetos

Segn Booch, el modelo de objetos est basado en cuatro elementos principales:

Abstraccin

Encapsulamiento

Modularidad

Jerarqua

Es importante entender esos elementos antes de entrar al estudio de trminos ms especficos, pues son ellos
los que determinan las caractersticas comunes de cualquier aplicacin que se denomine "orientada a objetos".

I.1.1 Abstraccin

Existen muchas definiciones de este trmino que pueden ayudar a comprenderlo. Segn Hoare: "una
abstraccin surge del reconocimiento de similitudes entre diferentes objetos, situaciones, o procesos en el
mundo real, y de la decisin de concentrarse en esas similitudes e ignorar por un momento las diferencias".

Shaw define el concepto como "una descripcin simplificada de un sistema, que enfatiza algunos de los
detalles o propiedades del mismo, pero que tambin omite otros. Una buena abstraccin es una que enfatiza
detalles que son significativos al lector y que suprime otros detalles que son, por el momento, irrelevantes".

2
Berzins, Gray, y Naumann apuntan que "un concepto califica como abstraccin slo si puede ser descrito,
comprendido, y analizado independientemente del mecanismo que ser utilizado eventualmente para
realizarlo".

Booch concluye que "una abstraccin denota las caractersticas esenciales de un objeto que lo distinguen de
todas las otras clases de objetos, y entonces provee lmites conceptuales claramente definidos, relativos a la
perspectiva del observador".

Cada una de las definiciones anteriores coincide en el hecho de que una abstraccin es un medio que permite
un mejor manejo de la complejidad del problema, al permitir suprimir o posponer detalles irrelevantes en
cierto momento, y concentrarse ms bien, en detalles verdaderamente esenciales. El reconocer similitudes
entre diferentes objetos tambin permite simplificar el dominio en estudio pues hace posible enunciar
comportamientos o caractersticas generales que los describen, sin importar detalles que podran no ser
importantes.

Las abstracciones pueden ser de muchos tipos. Por ejemplo, pueden describir objetos que constituyen un
modelo til dentro del dominio del problema, u objetos que se conciben para agrupar acciones necesarias en la
solucin (objetos virtuales que son necesarios para controlar la interaccin de los objetos entre s).

Una abstraccin debe tener lmites conceptuales bien definidos que permitan la independencia funcional entre
unas y otras. As mismo, esos lmites debern esclarecer la forma en que la abstraccin ser utilizada para
resolver y modelar el problema en cuestin. Es decir, al abstraer un objeto, debe quedar claro cul es su
funcin y su relacin con los dems objetos.

Una abstraccin es algo que no necesariamente existe en el dominio real de la aplicacin pero que su
existencia resultara tan til para el analista que termina siendo representada e incorporada en la solucin
computacional al problema.

Adems, como apuntan Berzins y dems, debe ser independiente de la forma en que finalmente se lleve a
cabo. Por ejemplo, la abstraccin de una lista considera tanto las acciones que se permitirn realizar sobre ella,
as como ciertas variables que mantienen el estado de la misma, pero no especifica que una lista debe ser
realizada como un arreglo o mediante el uso de punteros. Esos son detalles que no vale la pena mencionar
mientras se est introduciendo el concepto, pero que s sern importantes en algn otro momento.

I.1.2 Encapsulamiento

Encapsulamiento es una palabra que tiende a confundirse con mucha frecuencia debido a que se le asocian
diferentes significados. Formalmente, encapsulamiento se refiere al fortalecimiento de las barreras de
abstraccin mencionadas anteriormente. Una abstraccin debe poderse manipular como una sola unidad
independiente que cumple con ciertas funciones. Cada abstraccin debe ser claramente distinguible de las
dems, as como la forma en que interactuarn entre ellas. Encapsular significa agrupar y manejar el grupo
resultante como tal, y no cada parte a su vez.

Sin embargo, un concepto que muchas veces se seala como equivalente es el de ocultamiento de la
informacin, el cual est ms relacionado con el control del acceso a las partes de una abstraccin. Es
decir, est relacionado con proteccin.

Al decidir encapsular ciertas funciones o atributos, estos sern utilizados por otros objetos para llevar a cabo
alguna tarea. Sin embargo, un objeto debe conocer de otro lo indispensable para que lo pueda utilizar, ni ms
ni menos. Si se conoce ms, entonces aumenta la cantidad de informacin que se maneja lo que incrementa la
complejidad, adems de que hace ms vulnerable el objeto que se utiliza, y es ms difcil garantizar su
integridad y su correcto funcionamiento. Por otro lado, si se esconden aspectos fundamentales, se estara

3
perdiendo el sentido de la abstraccin.

En particular, la implementacin de un objeto debe ser escondida dentro de la abstraccin y no debe ser
conocida por los objetos que lo utilicen (clientes). Segn Ingalls, "ninguna parte de un sistema complejo
debera depender de los detalles internos de otras partes".

La abstraccin es un concepto externo al objeto que determina la forma en que es visto por los dems. El
ocultamiento de la informacin es un concepto interno que determina qu cosas deben ser vistas por los
dems. Es decir, son conceptos complementarios.

I.1.3 Modularidad

Se ha dicho que la complejidad de un programa crece en forma exponencial con respecto a su tamao.
Analizando un poco ms las propiedades de una funcin exponencial es fcil deducir que si se tiene un
programa grande, su complejidad ser mucho mayor que la suma de la complejidad de varios programas ms
pequeos que cumplan el mismo objetivo. Si se pudiera tomar un programa grande y dividirlo en
subprogramas segn ciertos criterios, la complejidad resultante sera mucho menor. Sin embargo, no vale la
pena particionar programas pequeos, y en programas grandes, existe un nmero a partir del cual las ventajas
se tornan en lo contrario pues es tal la cantidad de mdulos que puede volverse inmanejable.

Segn Myers, "El acto de particionar un programa en componentes individuales puede reducir la
complejidad en algn grado...Aunque particionar un programa es til por esa razn, una razn ms poderosa
para particionar un programa es que crea un nmero de lmites bien definidos y documentados dentro del
programa. Estos lmites, o interfases, son invaluables en la comprensin del programa.".

Las abstracciones, como se mencion anteriormente, son encapsuladas y protegidas para manejarse como
una nica unidad lgica que se espera funciona correctamente. Esas abstracciones son agrupadas a su vez
para formar mdulos, que constituyen las unidades fsicas de particionamiento de los programas.

Se espera que cada mdulo pueda ser desarrollado con cierta independencia de los dems, y que incluso sea
compilado en forma separada. Con esto se busca lograr una mayor productividad al desarrollar software en
gran escala, en donde los mdulos son asignados a las personas que componen el equipo de trabajo y los
desarrollan en forma independiente y paralela. Cada mdulo debe estar bien definido, y su acoplamiento con
los dems debera ser el mnimo posible. Entre menos dependencias existan entre ellos, ms mantenible ser
la aplicacin final.

Lograr la modularizacin adecuada para un sistema no es un trabajo sencillo. Intuitivamente, se puede decir
que se deben agrupar las abstracciones de acuerdo a su grado de relacin lgica segn el criterio del
diseador, y un mdulo debe exponer slo aquellas partes indispensables que los dems necesitan conocer. En
ese sentido se dice que los mdulos deben ser altamente cohesivos y poco acoplados entre s.

Segn Britton y Parnas: "El objetivo general de la descomposicin en mdulos es la reduccin del costo del
software al permitir que los mdulos sean diseados y revisados independientemente... Cada estructura de un
mdulo debera ser lo suficientemente simple como para que sea comprendida por completo; debera ser
posible cambiar la implementacin de un mdulo sin tener conocimiento de la implementacin de otros
mdulos y sin afectar el comportamiento de los mismos...".

I.1.4 Jerarqua

Los mdulos y el encapsulamiento ayudan a manejar el conjunto de las abstracciones identificadas, sin
embargo, resulta muy til y al mismo tiempo natural, clasificar u organizar las abstracciones de acuerdo a su
naturaleza. El ser humano siempre tiende a clasificar los objetos que lo rodean, creando clasificaciones de

4
especies, de elementos qumicos, de materiales, etc. Esas clasificaciones forman jerarquas que permiten
concentrarse en subconjuntos de elementos lo que facilita el estudio de los elementos como un todo.

El ejemplo ms claro de jerarqua en el modelo de objetos es el concepto de herencia. Por ejemplo, los
elefantes, tigres, vacas, y caballos son todos mamferos de sangre caliente. Existe una clase de animales
denominados mamferos que comparten un conjunto determinado de caractersticas. Sin embargo, hay clases
de animales, como las aves, que son de sangre caliente pero no son mamferos. O sea, la clase de animales de
sangre caliente contempla tanto los mamferos como las aves. Todos los mamferos y todas las aves heredan
las caractersticas de los animales de sangre caliente, pero pertenecen a clases diferentes de animales.

Bsicamente, la herencia define una relacin entre las clases, donde una clase comparte la estructura y el
comportamiento definida en una o ms clases consideradas como superiores o superclases. La herencia
define entonces una jerarqua de abstracciones, en donde una subclase hereda de una superclase, y adems
puede agregar o redefinir elementos a la estructura o al comportamiento previo.

Como seala Cox: sin herencia cada clase sera una unidad independiente por s misma, desarrollada a
partir de la nada. Las clases podran no tener relacin la una con la otra an cuando fueran muy similares. La
herencia hace posible definir software nuevo de la misma manera en que se introduce un concepto a un
persona que lo desconoce, o sea, comparndolo con algo que ya existe y con lo que ya est familiarizado.

I.4 Conceptos bsicos

I.4.1 Objeto

El concepto de objeto puede ilustrarse a partir de muchos enfoques diferentes. Todos ellos parten de que un
objeto representa una abstraccin, pero la forma en que esta se caracteriza puede variar de un enfoque a otro.
Por ejemplo, Snyder seala que: la abstraccin representada por un objeto se caracteriza por un conjunto de
servicios que los clientes pueden solicitar. Un cliente puede ser una persona o un programa, y un servicio
puede ser una actividad que se realiza a partir de una solicitud del cliente. Define un objeto como cualquier
entidad que juega un rol visible al proveer servicios a clientes.

Es decir, basa el concepto de objeto en la relacin existente entre clientes y proveedores de servicios. La
naturaleza de un cliente o de un proveedor depende del sistema que se est analizando, pero lo importante es
idealizar los servicios que se necesitan para realizar una labor y construir una solucin basada en la
interaccin entre objetos que proveen servicios unos a los otros.

Aunque un objeto puede involucrar datos, un objeto no es solo eso. El propsito de los datos es representar
informacin asociada con la abstraccin que se realiz. Sin embargo, como se mencion anteriormente, la
abstraccin puede incluir un conjunto de actividades o servicios que se necesitan. Estos servicios, al ser
solicitados por un cliente, modifican los datos asociados a la abstraccin para cumplir con una necesidad o un
cambio que se de en el sistema.

Un objeto se ve entonces como una cpsula que contiene datos, y que adems provee una serie de servicios
que son utilizados por otros objetos para cumplir algn objetivo (ver figura 1). Los datos o variables que
constituyen un objeto se conocen como atributos o componentes (los cuales podra ser a su vez objetos).
Adems, el estado de un objeto est determinado por el contenido de cada una de las variables que se
asociarn al objeto. Cada uno de los servicios tambin se conoce como mtodo u operacin, y el conjunto de
los mtodos a los que puede responder el objeto se conoce como protocolo del objeto. *

Los clientes deben conocer los servicios que proveen otros objetos, pero no tienen porqu inmiscuirse con los
detalles de cmo se llevar a cabo su solicitud. En lo que respecta al cliente, l solo sabe que envi una
solicitud y que est llevndose a cabo. Adems, supone que el servicio opera tal y como est estipulado; es

5
decir, que funciona correctamente en el sentido de que hace lo que debe hacer.

El cliente debe conocer nicamente lo necesario del objeto que utilice, no ms, y no menos. Esas operaciones
secundarias tambin deberan ocultarse de alguna forma para que el cliente no pueda utilizarlas y ni siquiera
tenga que conocer acerca de su existencia.

Una solicitud de un cliente identifica una operacin. Esta operacin denota el servicio que se ofrece, y puede
tener parmetros asociados y resultados que retornar. Un parmetro o un valor retornado puede ser a su vez un
objeto. En este punto surge la inquietud de cmo identificar cada uno de los objetos que se manipulan. Cada
objeto debe poderse referenciar a travs de un valor que permita identificarlo en forma directa y confiable. No
debe ser necesario describir el objeto, sino solo especificar el valor que lo identifica.

"La identidad es aquella propiedad de un objeto que lo distingue de todos los otros objetos"

El mensaje es el mecanismo a travs del cual los objetos pueden cooperar entre s. Se dice que un mensaje es
la invocacin de un mtodo de un objeto. Cuando un objeto A necesita de otro objeto B para cumplir con una
operacin propia, le enva un mensaje que resultar en la ejecucin de las operaciones asociadas al mtodo, y
probablemente retornar algn resultado.

Esquema del concepto de objetos.

En general las asociaciones entre los objetos se manejan a travs de atributos. Es decir, uno de los atributos de
A podra ser el objeto B, o una referencia a l.

Otro concepto es el de comportamiento: "el comportamiento es cmo un objeto acta y reacciona, en


trminos de sus cambios de estado y envos de mensajes" . En otras palabras, el comportamiento de un objeto
se define completamente por sus acciones.

I.4.2 Clases y Herencia

Los objetos pueden ser clasificados segn la naturaleza de los servicios que brindan. La clasificacin hace
que los objetos que se manejan estn mejor organizados y sean ms fciles de entender y utilizar. Una clase es
una descripcin de un conjunto de objetos con caractersticas similares. A travs de la clasificacin se
asocian caractersticas comunes a todos los miembros de una clase. Todos los objetos de una clase presentan
la misma estructura y el mismo comportamiento. Adems, se dice que un objeto es una instancia de una
clase.

Idealmente, una clase es una implementacin de un TDA (Tipo de Dato Abstracto). Esto significa que los
detalles de implementacin de la clase deben ser privados, de ella. Los datos son accesados a travs de
mtodos (funciones de acceso), y tambin existen otras funciones para modificar la informacin
(procedimientos de transformacin).

6
Segn Korson: "Herencia es una relacin entre clases que permite la definicin e implementacin de una
clase con base en la definiciones e implementaciones de otras clases existentes... Herencia es el concepto ms
promisorio en la consecucin del objetivo de construir sistemas de software a partir de partes reutilizables,
en vez de codificar manualmente a partir de bosquejos".

Finalmente, cabe destacar que la estructura de clases se espera que sea fcilmente reutilizable cuando sea
necesario. Las clases pueden ser agrupadas para formar bibliotecas, y al desarrollar un nuevo sistema cada vez
se cuenta con una mayor cantidad de ellas. La idea es tomar ese conjunto de clases ya depuradas y construir a
partir de ellas nuevas soluciones, modificando la jerarqua de clases segn se requiera.

I.4.3 Polimorfismo

Polimorfismo, como la misma palabra lo indica, significa mltiples formas. Existen muchos tipos de
polimorfismo, pero en general una referencia polimrfica en un lenguaje orientado a objetos es una que atae
a instancias de ms de una clase a travs del tiempo. As, una funcin polimrfica es aquella que puede ser
aplicada uniformemente a cierta variedad de objetos. Por ejemplo, la misma funcin de suma puede utilizarse
para representar la aplicacin de esa operacin a nmeros enteros, nmeros reales, matrices de nmeros
enteros, secuencias de caracteres, polinomios representados como listas, etc. Tambin puede utilizarse el
mismo operador para sumar un nmero a un vector.

En lenguajes orientados a objetos es posible definir la misma operacin para diferentes clases. El operador "+"
se define para cada una de ellas y eso permite realizar esa operacin sobre elementos de diferentes clases, y
combinaciones de ellos. Esta caracterstica se conoce en algunos lenguajes como sobrecarga de operadores.

Recurdese que mediante herencia es posible redefinir funciones.

Finalmente, lo contrario al polimorfismo es el monomorfismo, que se encuentra en lenguajes fuertemente


tipificados y de binding esttico, como Ada.

I.5 Conceptos adicionales

Adems de los temas analizados hasta el momento, es importante mencionar otros, que aunque no son un
requisito para denominar a un producto "orientado a objetos" son puntos que estn constantemente en
discusin.

I.5.1 Concurrencia

Muchos de los objetos en el mundo real son independientes, en el sentido de que cada uno puede realizar
acciones sin necesidad de que exista un objeto superior que lo coordine. Si se tiene una aplicacin
meteorolgica en donde existen varios sensores de temperatura, cada uno de ellos podra hacer lecturas en
forma permanente y activar algn mecanismo de alarma si fuera necesario. Pero cada sensor es independiente
y no existe un control directo sobre ellos.

El problema surge al hacer un diseo orientado objetos. Se identifica la clase sensor, y se tienen varias
instancias de ella. Sin embargo, dependiendo de la plataforma de desarrollo que se posea, sern necesarios
cambios fuertes.

Si se tiene un lenguaje o un sistema operativo que no provee ningn mecanismo de multiprogramacin, o si se


tiene una arquitectura de hardware con un nico procesador, no es posible hacer una asociacin directa, como
se quisiera, entre los objetos del mundo real, y los objetos modelados en la aplicacin.

Probablemente sera necesario introducir un objeto que estuviera activando permanentemente cada uno de los

7
sensores para que realicen sus lecturas y hagan el reporte de alarma, o tal vez el nuevo objeto sea el que lo
haga. Ese objeto, que se podra denominar un despachador (dispatcher) de eventos, en realidad no existe en el
mundo real, pero como no es posible modelar los objetos en forma independiente, su existencia se justifica.

En el otro extremo, podra desarrollarse una arquitectura con varios procesadores donde en cada uno de ellos
existe un sensor. O bien, cada uno de ellos sera un hilo (thread) de ejecucin que aunque no sera simultneo,
puede compartir el tiempo de CPU con los dems bajo algn esquema de multiprogramacin. Incluso, podran
mantenerse varias mquinas, cada una con un sensor, y unidas a travs de una red.

Lim y Jhonson sealan que disear los aspectos de concurrencia en lenguajes orientados a objetos no es muy
diferente de hacer lo mismo con otros lenguajes (segn ellos, la concurrencia es ortogonal a la POO en los
niveles de abstraccin ms bajos). Orientado a objetos o no, existen los mismos problemas.

Es decir, siempre es necesario lidiar con los problemas de compartir recursos (deadlocks, exclusin mutua,
regiones crticas, starvation, sincronizacin de procesos, paso de mensajes, y otros). Sin embargo, todos estos
detalles pueden relegarse a los niveles de abstraccin bajos, y utilizar otras abstracciones que escondan esos
detalles para hacerlos transparentes a los programadores.

El objeto, visto como una abstraccin del mundo real, puede representarse como un thread de control
(abstraccin de proceso). Los objetos as representados son llamados objetos activos [Booch91].

I.5.2 Persistencia

Los objetos toman cierta cantidad de espacio, pero tambin de tiempo durante su existencia en la aplicacin.
Por ejemplo, las variables locales a un procedimiento existen mientras aquel se encuentre activo. Se crean en
el momento de la invocacin y al terminar el procedimiento son destruidas.

Las variables globales existen durante toda la ejecucin de la aplicacin y conservan su estado mientras esta
est activa. Sin embargo, qu sucede si se necesita que algunos objetos sobrevivan a la aplicacin que los
crea?. Si en el lenguaje no se proveen mecanismos adecuados para manejar este problema, pueden surgir una
serie de soluciones truculentas ideadas por los programadores, que tal vez no sean confiables, o necesiten
revelar detalles de implementacin propios del compilador, y de la forma en que conserva la informacin de
los objetos. En lenguajes orientados a objetos, esta informacin no presenta una estructura simple, por
aspectos que implica soportar herencia, polimorfismo y otras caractersticas de OO.

Segn Booch: "Persistencia es la propiedad de un objeto a travs de la cual su existencia trasciende el


tiempo (i.e. el objeto contina existiendo despus de que su creador cesa de existir) y/o el espacio (i.e. la
localizacin del objeto deja el espacio de direcciones en el que fue creado)" [Booch91].

La introduccin del concepto de persistencia conduce a las bases de datos orientadas a objetos. Muchas de
ellas siguen operando mediante los conceptos tradicionales de acceso a travs de ndices, modelo jerrquico,
relacional, o de redes, pero presentan una interfaz al programador que le permite visualizar los objetos como
tales. Las consultas se realizan a travs de operaciones sobre objetos que trascienden la existencia de un
programa individual.

El ofrecer persistencia es algo ms que guardar el estado de un objeto. Es necesario almacenar la informacin
que garantice que el estado del objeto ser interpretado de la misma forma por el programa, cuando vuelva a
ser ejecutado. Por lo tanto, la clase del objeto tambin deber trascender, lo cual no es fcil considerando que
un objeto puede cambiar de clase. El problema anterior sera visto como un problema que atenta contra la
integridad de la base de datos, conforme esta crece y se torna ms compleja.

I.5.3 Tipo

8
Segn Deutsch, un tipo es una caracterizacin precisa de las propiedades estructurales y de comportamiento
que comparten un conjunto de entidades. Para efectos prcticos, y en este texto, tipo y clase son conceptos
equivalentes, aunque en algunos contextos no lo sea.

Booch agrega: "Tipo es el refuerzo de la clase de un objeto, de forma que los objetos de diferentes tipos no
sean usados intercambiablemente, o a lo sumo, sean usados intercambiablemente bajo formas muy
restringidos".

Un lenguaje de programacin especfico puede ser fuertemente tipificado, dbilmente tipificado, o no


tipificado.

Lenguajes como Object Pascal son fuertemente tipificados. Para cada variable se debe especificar claramente
su tipo, as como para parmetros formales, y campos de clases. En tiempo de compilacin se realizan todas
las verificaciones de correctitud de tipos. En algunos casos puede ser necesario convertir o coersionar una
variable de un tipo a una de otro para que la expresin sea vlida para el compilador.

SmallTalk es un lenguaje no tipificado. Las variables se declaran sin tipo, y el significado de las operaciones
no se determina sino hasta durante el tiempo de ejecucin. Si se enva un mensaje no reconocido por un
objeto, se generara un error alusivo en tiempo de ejecucin.

Tesler seala un conjunto de ventajas de los lenguajes fuertemente tipificados [Tesler81]:

Sin chequeo de tipos, un programa puede convulsionar misteriosamente en tiempo de ejecucin.

En muchos sistemas, el ciclo edicincompilacindepuracin es tan tedioso que una deteccin temprana de
errores es indispensable.

Las declaraciones de tipos documentan los programas.

La mayora de los compiladores pueden generar cdigo ms eficiente si se declaran los tipos.

En general, los lenguajes no tipificados ofrecen mayor flexibilidad, pero los fuertemente tipificados brindan
seguridad.

CAPITULO II FUNDAMENTOS DE PROGRAMACION

2 TIPOS, DECLARACIONES Y ALCANCES DE LAS VARIABLES

2.1 Que son las variables

En cualquier programa necesitamos hacer clculos, usar informacin, procesarla y mostrarla. En la mayora de
los casos, necesitamos un lugar temporal en el cual guardar parte de esa informacin, incluso toda.

Es aqu donde entran en juego las variables, las que nos permite guardar datos en memoria, para que cuando
los necesitemos, podamos tomarlos, modificarlos y volverlos a guardar para usar mas tarde.

La memoria es el lugar donde el ordenador almacena de forma temporal los programas y parte de la
informacin que necesita o utiliza. Esas posiciones o lugares de la memoria donde los programas pueden
almacenar informacin son las variables.

Es una ubicacin de almacenamiento temporal con nombre que se encuentra en memoria, siendo capaz de
contener cierto tipo de datos que pueden modificarse durante la ejecucin del programa.

9
En VB los nombres de las variables deben limitarse a 255 caracteres, empezar con un carcter alfabtico y no
pueden obtener un punto

Utilizacin temporal de almacenamiento de datos dentro de un programa. Permiten asignar nombres cortos y
fcil de recordar. Son para manejar cualquier tipo de informacin.

2.1 Tipos de Variables

Dim: Al declarar una variable con esta palabra estamos diciendo que la variable sea local al mbito en que se
declara. Puede ser dentro de un procedimiento o dentro de un formulario, de esta forma no sera accesible
desde los dems procedimientos o formularios.

Ej: Dim suma

Public: Las variables declaradas sern publicas y podrn estar accesibles desde todos los formularios de la
aplicacin. Para conseguirlo tendremos que declararlas en un mdulo de cdigo, no en la seccin declarations
de cualquier formulario de los que conste la aplicacin.

Ej: Public suma

Static: Con esta forma de declarar variables conseguiremos que las variables locales no se creen y se
destruyan al entrar y salir de los procedimientos donde fueron declaradas sino que se mantenga su valor
durante todo el periodo de ejecucin de la aplicacin. De esta forma a entrar en algn procedimiento las
variables recuerdan el valor que tenan cuando se sali de l.

Ej: Static suma

TIPOS DE VARIABLES

TIPO COMENTARIO
BOOLEAN Slo admite 2 valores TRUE o FALSE
BYTE admite valores entre 0 y 255
INTEGER admite valores entre 32768 y 32767
LONG admite valores entre 2.147.483.648 y 2.147.483.647
SINGLE admite valores decimales con precisin simple
DOUBLE admite valores decimales de doble precisin
CURRENCY vlido para valores de tipo moneda
STRING cadenas de caracteres
Variant Admite cualquier tipo de datos
DATE fechas, permite operar con ellas

2.2 Declaracion de las variables

DIM: Es la abreviatura de Dimensin, esto reserva espacio en memoria para la variable cuando se ejecute el
programa y permitir a VB que tipo de datos deber guardar en dicha variable.

EJ : Dim nombre

Declaracin Implcita: Declarar variables sin uso del Dim. No obliga a organizar y listar las variables de
antemano.

10
Si se va a herramientas, opciones y en editor se elige Requerir Declaracin de Variables. Con esto VB genera
un mensaje de error siempre que encuentre una variable mal escrita o declarada.

Pero hay otra forma que slo es utilizable para 6 tipos. Esta forma de identificar a una variable nos permite
ahorrar tiempo a la hora de escribir cdigo, adems de tratar de hacer compatible las primeras formas de
asignar variables en Visual Basic (desde Visual Basic 1.0).

Estas formas son extensibles para las variables tipo Integer, Long, Single, Double, String y Currency.

Integer %

Long &

Single !

Double #

String $

Currency @

De esta forma, podemos escribir el siguiente cdigo:

Private Sub Command1_Click()

Sum% = 3 + 4

Num# = 32 / Sum%

Label1 = Num#

End Sub

En este ejemplo, puede utilizarse, pero es preciso tener un ligero conocimiento de este tipo de variables para
no confundir una variable de tipo Long por otra de tipo Integer por ejemplo.

2.3 Establecimiento del alcance de la variable

El alcance de las variables se refiere al rea del programa en las cuales es visible la variable. Hay cuatro
niveles diferentes de alcances:

Nivel de Procedimiento: Para declarar variables, ya sea implcitas o con el enunciado DIM, es en el nivel de
procedimiento. En VB, existen dos tipos de procedimientos: los procedimientos SUB y los FUCNTION. Las
variables declaradas en los procedimientos son locales para ese procedimiento. Siendo accesibles solamente
por los procedimientos en los cuales estn declaradas, las variables locales tienen la visibilidad mas baja y el
alcance mas estrecho. Las variables locales de un procedimiento son reinicializada cada vez que llama el
procedimiento.

Tambin se pueden declarar variables Estticas: es decir que las variables locales sean permanentes: EJ static
nombre.

Nivel de Formulario: Si se declara una variable a nivel de forma esta disponible en cada procedimiento en esta

11
forma.

Nivel de Modulo: Se crean mediante la seleccin de la opcin Agregar Modulo del men Proyecto de VB. Los
mdulos de cdigos se utilizan para conservar los subprocedimientos y funciones generales que no estn
relacionados con eventos, as como sus variables locales(publicas) y sus constantes. Variables Publicas: para
identificar una variable global, se declara con

la palabra Public. Ej:

Public nompreapellido As String

2.4 Matrices

Para declarar matrices debemos colocar entre parntesis el nmero de elementos de los que constar a
continuacin del nombre de la variable:

Dim medidas(9) as integer

De esta forma tenemos una matriz de 10 elementos identificados del 0 al 9

Podemos obligar a que el primer elemento de una matriz tenga el ndice con valor 1.

Esto se hace colocando la instruccin option base 1 en la seccin declarations de nuestro formulario.
Tambin podemos indicar los lmites inferior y superior de la matriz:

Dim medidas(5 to 14) as integer

Es una matriz de 10 elementos cuyos ndices van del 5 al 14. Las matrices multidimensionales se declaran de
la siguiente forma:

Dim medidas(1 to 10, 1 to 10) as integer

2.5 Tipos de Datos Definidos por el Usuario

El usuario puede definir los datos en VB en la seccin General de Declaraciones de un modulo de cdigo,
usando la palabra clave Type y End Type. Ej:

Type tipoempleado ` Crear tipo definido por el usuario.

ID As Long

Nombre As String *15

Salario As Currency

End Type

2.6 Por que son Indispensables las Variables

El poder y la flexibilidad aadidos a sus programas de computadoras por un uso juicioso y bien informado de
variables estn ms all de cualquier discusin y no pude sobre estimarse. De hecho, cualesquiera programas,
a excepcin d los ms triviales harn un uso cuidadoso de una amplia diversidad de variables, abarcando todo

12
el expectro de tipos disponibles. Los tipos de datos personalizados son tiles en los programas de Bases de
Datos, donde ayuda a considerar varios elementos diferentes de datos como una sola entidad, tal como un
registro de un empleado por ejemplo, o una factura de un cliente.

Por lo general el establecimiento de variables del tipo y alcance adecuado asegurara el uso ms eficiente de la
memoria en sus programas.

2.7 Declaracin de Constantes

Como su palabra lo dice es Informacin que no vara hace ms fcil la comprensin del cdigo y permite
modificar un valor en un solo lugar no ocupa espacio extra, Ejemplo:

Const Mnimo = 1, Mximo = 10

3 ENTRADAS Y SALIDAS SENCILLAS CON MSGBOX() E INPUTBOX()

3.1 Que son Inputbox(), Msgbox()

InputBox() Despliega un Mensaje en un cuadro de dialogo, espera que el usuario introduzca el texto o
seleccione un botn y luego devuelve el contenido del cuadro de texto. Sintaxis:

ValRe = InputBox(Mensaje, titulo, Posx, Posy, ArchAyuda, Context)

` Devuelve Variant

RetVal$ = InputBox$(Mensaje, titulo, Posx, Posy, ArchAyuda, Context)

` Devuelve una Cadena.

Mensaje: consiste de ms de una lnea, asegrese de incluir un retorno del carro chr(13) y un avance
de lnea, chr(10) entre cada lnea. Puede usar la constante pre definida Vbcrlf para lograr el mismo
efecto.

Titulo: Es una cadena que se despliega en la barra de titulo el cuadro de dialogo. Si se omite no
aparecer nada.

Posx, Posy: Expresiones numricas que especifican el tamao de la caja. Si se omite aparecer en el
centro.

ArchAyuda, Context: Se usan para proporcionar ayuda sensible al contexto.

MsgBox() y MsgBox Despliega un mensaje en un cuadro de dialogo y espera que el usuario seleccione un
botn. Sintaxis:

ValRe% = MsgBox(Mensaje, tipo, titulo, ArchAyuda, Context)

Mensaje: Es una expresin de cadena que se despliega como el mensaje en un cuadro de dialogo.

Titulo: Expresin de cadena que aparece en la barra de titulo del cuadro.

Tipo: Expresin numrica que es la suma de valores que especifican la cantidad y el tipo de botones
por desplegar.

13
Valor Botn Constante
0 Ok(Aceptar) VbOKOnly
1 Ok(Cancelar) VbOKCancel
2 Abortar, Reiterar e Ignorar VbAbortRetryIgnore
3 Si, No y Cancelar VbYesNoCancel
4 Si o No VbYesNo
5 Reiterar y Cancelar VbRetryCancel
16 Icono Parada Critica VbCritical
32 Signo de Interrogacin VbQuestion
48 Signo de Exclamacin VbExclamation
64 Icono de Informacin VbInformation

3.2 Por qu usar InputBox() y MsgBox()

Proporcionan una manera de manejar tareas sencillas de Entrada y Salida. Son muy tiles para manejar tareas
tales como el despliegue de mensajes de error y de ayuda, as como los cuadros de Acerca De que se
presentan en los Sistemas.

Crear un formulario con tres botones, un botn dir Captura de Nombre, el otro Mostrar Nombre y el
ultimo Salir.

Digitar el Siguiente Cdigo en las declaraciones generales de la forma:

Private Nombre As String

Private Const TituloInput = Demostracin de InputBox

Private Const TituloNombre = Valor Actual del Nombre

En el Botn Captura de Nombre Digitar el siguiente Cdigo:

Dim Peticin As String

Peticin = Teclee su Nombre:

Nombre = InputBox$(Peticion, Tituloinput)

If Nombre = Then

MsgBox No escribio Nada, vbCritical, Error

End If

En el Botn Mostrar Nombre Digitar el siguiente Cdigo:

Dim men As String

Dim Tipo As integer, valRe As Integer

Tipo = vbYesNoCancel + vbQuestion

14
ValRe = MsgBox(Digito & Nombre, Tipo, TituloNombre)

If ValRe = VbYes Then

Men = Ha presionado Si

ElseIf valRe = vbNo Then

Men = Ha presionado No

ElseIf valre = vbCancel Then

Men = Ha Precionado Cancelar

End If

MsgBox Men, vbInformation, Procedimiento MsgBox

4 ESTRUCTURAS DE DECISIONES: RAMIFICACIONES Y CICLOS

4.1 Que son las estructuras de Decisiones?

Estas estructura caen en dos amplias categoras: Ramificaciones y Ciclos. Los dispositivos como If..Then y
Select Case hacen que el programa contine en una direccin cuando se encuentra una condicin particular,
sin mirar nunca atrs.

Las construcciones en ciclos como Do.. Loop y While..Wend, se usan para repetir un cierto bloque limitado
de instrucciones hasta que las condiciones especificadas son True(cierta) o False(Falsa).

4.2 Sentencia If Then Else

La primera es la sentencia If Then Else que no debe tener secretos puesto que es muy similar en todos los
lenguajes. La estructura general es la siguiente:

If condicin then

bloque de sentencias

Else

bloque de sentencias

End If

Se pueden colocar todas las sentencias de cdigo que queramos en cada uno de los bloques de sentencias,
siempre que cada sentencia vaya en una lnea distinta. Si los bloques de sentencias estn formados por una
sola instruccin podemos utilizar la versin reducida que ocupa una sola lnea:

If condicin then sentencia else sentencia

Ejemplo:

15
If isnumeric(numero) then la variable numero es numrica else no es numerica.

Tambin podemos anidar varias sentencias If then Else cuando una de las 2 opciones iniciales contiene a su
vez 2 bifurcaciones dependiendo del estado de otra condicin:

if dato<10 then

la variable dato contiene un solo dgito

Else

If dato<100 then

la variable dato contiene 2 dgitos

Else

la variable dato contiene ms de 2 dgitos

end If

End If

En el ejemplo anterior se quiere saber si la variable dato contiene uno, dos o ms dgitos. Para calcularlo no es
suficiente con una sola sentencia If Then Else, por tanto se recurre a anidar 2 sentencias de este tipo. La
segunda sentencia If se ejecutar si la condicin de la primera sentencia If no se cumple, es decir, si
dato>=10. Una vez que se ha llegado a este punto sabemos que la variable dato contiene 2 o ms dgitos,
mediante una nueva sentencia If sabremos exactamente el nmero de dgitos de la variable dato.

Este ltimo ejemplo podra haberse escrito de otra forma utilizando la clusula ElseIf:

If dato<10 then

la variable dato contiene un dgito

ElseIf dato<100 then

la variable dato contiene dos digitos

Else

la variable dato contiene ms de 2 digitos

End If

Esta segunda opcin es perfectamente vlida cuando queremos evaluar varias condiciones, aunque tiene ms
limitaciones que la estructura anterior ya que enlaza directamente el Else con el If siguiente, sin dejarnos
introducir sentencias entre medias que algunas veces podramos necesitar.

Podemos introducir tantas lneas ElseIF como queramos siempre antes del ltimo Else, si es que lo
necesitamos.

16
Para mltiples decisiones en los que dependiendo del valor de una variable queremos que se realice una
accin distinta, parecido a los mens de los programas de MS DOS, no conviene utilizar la estructura IF
Then, sino que el cdigo queda ms claro y resulta ms fcil de modificar utilizando la sentencia Select

Algunas veces se puede condensar la construccin If..Then..Else..Endif dentro de una lnea de cdigo. Esto
se logra con la funcin IIF(Si inmediato). Ej:

Color = IIF(elcolor < 15, elcolor, 1)

4.3 Sentencia Select CASE

Esta sentencia permite realizar operaciones diferentes dependiendo del valor de una variable:

Estructura General:

Select Case dato

Case valor1

bloque de sentencias

case valor2

bloque de sentencias

Case valor3

bloque de sentencias

case else

bloque de sentencias, se ejecutan si no se cumple ninguno de los valores anteriores

End Select

En esta construccin, dependiendo del valor de la variable dato se ejecutar un bloque de sentencias diferente.
Los valores que podemos colocar en lugar de valor1, valor2, valor3 no slo se limitan a valores constantes
como nmeros y cadenas de texto, sino que podemos comparar con un nmero como podemos ver en el
siguiente ejemplo:

Select Case NotaFinal

Case Is < 5

Suspendido

Case 5 to 6.99

Aprobado

Case 7 to 8.99

17
Notable

Case Else

Sobresaliente

End Select

Como se puede observar si utilizamos los operadores lgicos como >, <, =, <=, >= debemos anteponer el
operador Is. Si lo que hacemos es comparar con un intervalo de valores colocaremos el operador to entre los
limites del intervalo. Tambin podemos realizar comparaciones con un conjunto de valores separados por
comas:

Case 1, 3, 5. El numero es impar. Para terminar con el tema de las sentencias de seleccin vamos a ver un
ejemplo completo en el que probaremos el uso de este tipo de instrucciones. Se trata del tpico ejemplo de
resolucin de una ecuacin de 2 grado. Sabemos que la estructura de una ecuacin de este tipo es la
siguiente:

ax2+ bx + c = 0

La frmula que resuelve el valor de x es:

Esta frmula tiene 2 soluciones, una o ninguna dependiendo del contenido de la raz, de modo que esa es la
comparacin que realizaremos:

Trabajaremos con variables de tipo double que permiten decimales con la mayor precisin:

Tambin podra haberse utilizado la estructura If then Else, aunque de esta forma no hay que repetir tantas
veces la condicin a evaluar. El cdigo anterior es slo una muestra de como llegar a la solucin de un
problema utilizando sentencias de Visual Basic, no hemos entrado todava en como introducir este codigo en
el entorno de desarrollo de VB para crear una aplicacin. Eso lo veremos en el captulo siguiente, donde
hablaremos de controles que son los elementos necesarios para construir el interfaz de usuario y poder asociar
el cdigo necesario para realizar nuestras aplicaciones

4.4 Sentencia de Control While Wend

Ejecuta repetidamente una o mas instrucciones mientras una condicin dada es cierta.

Sintaxis:

While condicin

[ instrucciones]

Wend

4.5 Sentencia de Control Do Until

proporciona una forma mas estructurada y flexible para ejecutar ciclos. Esta repite un bloque de codigo
mientras una condicion es True o a partir de que la condicion sea True.

Sintaxis:

18
Do Unitil cliente.EOF

Print cliente(nombre)

Cliente.movenext

Loop

Exit Do transfiere el control a la instruccin que sigue inmediatamente al ciclo.

4.6 Sentencia de Control For Next

Esta sentencia repite un grupo de instrucciones, un numero especificado de veces. Sintaxis:

For contador = 1 To 10

Print cliente(nombre)

Cliente.Movenext

Next contador

Se puede especificar tambin el intervalo Step, la cantidad que cambiar el contador cada vez que se ejecuta el
ciclo. Si no se especifica, el incremento toma un valor por omisin de 1. Ej:

For porcentaje = 0 To 100 Step 5

Print porcentaje & %

Next porcentaje

Exit For se usa frecuentemente con la evaluacin de algunas condicionantes If..Then y transfiere el control a
la instruccin que se encuentra a continuacin de Next.

4.7 Por que Tomar Decisione?

Los lenguajes de computacin al igual que la vida real deben ser capaces de realizar diferentes juegos de
acciones, algunas veces repetidas, indicadas por circunstancias internas o externas. Por ejemplo, en un sistema
de administracin de personal, si un empleado ha estado en la compaa por espacio de una ao, este
empleado obtiene un aumento. Si el empleado entra en la edad de la jubilacin, hay que jubilarlo.

5 MODULOS Y PROCEDIMIENTOS

5.1 Que son los Modulos de Codigos?

Son los que contiene cdigos pblicos, declaraciones, procedimientos Sub y Functions, que pueden
compartirse entre todos los mdulos de un proyecto.

5.2 Que es un Procedimiento General?

Le dice a su aplicacin como realizar una tarea especifica. Una ves que usted ha definido el procedimiento,
este debe ser explicitamente llamado por su aplicacin.

19
5.3 Que es un Procedimiento de Evento?

Permanece inactivo hasta que se llama para responder a los eventos causados por el usuario.

5.4 Que es un Procedimiento Sub?

Cualquier procedimiento es una secuencia nombrada de instrucciones que ejecutan como una unidad.

El procedimiento Sub es una unidad de cdigo que realiza una tarea especifica dentro de un programa, pero
que no devuelve un valor explcito.

Un procedimiento sub comienza con una instruccin Sub y termina con una instruccin End Sub.

Esto no significa que el procedimiento Sub sea el nico, existen una serie de procedimientos que VB trae
incluido ej:

Sub DiskCleanup()

Kill *.Dat

Kill *.txt

Beep

Msgbox La unidad esta Limpia, vbinformation,

Procedimiento completo

End Sub

Para mandarlo a llamar solamente se escribe el nombre del procedimiento sin necesidad de usar los parntesis
DiskCleanup.

Tambin existen procedimientos a los que se le pasan argumentos:

Sub multiplicar(primero As integer, segundo As integer)

Resultado = primero * segundo

End Sub

Para mandarlo a llamar seria de la siguiente forma:

Dim i As Integer, y As Integer

I=3

Y=4

Multiplicar i, y

5.5 Que es un Procedimiento de Funcion?

20
Es un procedimiento que realiza una tarea especifica dentro de un programa y devuelve un valor. Una funcin
se define en un modulo que inicia con la instruccin Function y termina con la instruccin End Function.

Funciones Utiles en VB

Funcin Descripcin Ejemplo Valor


Len() Devuelve la longitud de una cadena Ilen = Len(Hola) Ilen = 4
Chr() Devuelve el carcter del cdigo Schar = chr(65) Schar = A
Asc() Devuelve el cdigo del carcter Icod = Asc(A) Lcod = 65
Ucase() Convierte a mayscula Sup = Ucase(hola) Sup = HOLA
Lcase() Convierte a minscula Slow = Lcase(HOLA) Slow =(hola)

Para convertir un titulo de una manera mas presentable tal como muestra el ejemplo anterior: el mundo es una
ostra en El Mundo Es Una Ostra se escribe el siguiente codigo:

Function titulo(introcadena As String) As String

Dim fueracadena As String

Dim espacio As Integer

Introcadena = Trim(Lcase(introcadena)) +

Espacio = instr(introcadena, )

While espacio > 0

Fueracadena = fueracadena + Ucase(Mid(introcadena, 1, 1)) +

Mid(introcadena, 2, espacio 1)

Introcadena = Ltrim(Mid(introcadena, espacio +1))

Espacio = instr(introcadena, )

Wend

Titulo = fueracadena

End function

5.6 Por que Trabajar con Funciones y Procedimientos?

Permiten crear rutinas personalizadas por los programadores para satisfacer las necesidades de su aplicacin
particular y evitar la inconveniente e innecesaria repeticin del cdigo. Se puede aumentar el poder y la
versatilidad de los procedimientos incluyendo cualquiera de las instrucciones y funciones integrados de VB,
as como las rutinas previamente definidas por usted.

El uso de las funciones y procedimientos puede ayudar a dividir una aplicacin compleja en unidades de
cdigo mas manejables. Si escribe sus propios procedimientos y funciones a nivel formulario, puede
compartir cdigo entre los controles de un formulario. Si aade sus propios procedimientos a un modulo

21
estndar, puede compartir su cdigo entre todos los formularios de su aplicacin.

6 INTRODUCCION A LOS CONTROLES, METODOS, PROPIEDADES Y FORMULARIOS

Una vez que ya hemos visto algunas de las sentencias bsicas: declaracin de variables, sentencias de
seleccin, que son muy parecidos a las sentencias utilizadas en MSDOS. Vamos a empezar a programar en
windows y veremos en que se diferencia de la programacin clsica en MS DOS, para vamos a introducir el
uso de los controles.

Pero Qu son los controles?

Realmente son objetos que disponen de sus propias propiedades y mtodos, y cuya utilidad es la de
facilitarnos el desarrollo de nuestras aplicaciones. En cualquier aplicacin con la que trabajamos estamos
rodeados de controles. Quien no ha visto en multitud de programas los botones ACEPTAR y CANCELAR,
un cuadro para introducir texto, una lista con datos, por mencionar algunos. Pues todos ellos son controles y
no tendremos que preocuparnos por crearlos para nuestras aplicaciones sino que ya vienen con el paquete de
VB, lo nico que tendremos que hacer es modificar sus propiedades: tamao, color, entre otros. Para
incorporarlos en nuestras aplicaciones y asociarles el cdigo necesario para que se comporten como
esperamos al ejecutar la aplicacin.

Antes de empezar a conocer los controles bsicos veamos cuales son sus caractersticas generales:

Propiedades: Todos los controles disponen de una serie de propiedades las cuales podemos cambiar al
incluirlos en nuestras aplicaciones. Ejemplos de propiedades son el color, el tipo de letra, el nombre, el texto,
entre otros. La sintaxis para asignar una propiedad de un objeto es:

Objeto.Propiedad = Valor

Metodos: Son procedimientos asociados a los controles, es decir, rutinas ya establecidas que podemos invocar
desde nuestras aplicaciones para que se realice alguna operacin sobre el control. Por ejemplo el control
ListView (la lista de archivos que aparece en el explorador de windows) dispone del mtodo order que te
ordena los datos aparecidos en la lista. Son procedimientos conectados o integrados, un bloque de cdigo que
puede llamarse para impartir alguna accin a un objeto particular. Los metodos pueden requerir informacion
adicional en forma de argumento. Su sintaxis es la siguiente:

Objeto.Metodo Arg1, Arg2... Argn

`ej: pictierra.Move 0,0

Eventos: Son acciones que pueden ser motivadas por el propio usuario o por el mismo sistema operativo.
Ejemplos pueden ser el movimiento del ratn o hacer click sobre su botn. En Visual Basic digamos que se
utiliza la programacin orientada a eventos, lo cual es una de las diferencias ms importantes respecto a la
programacin lineal de MS DOS. No necesitamos detectar cuando se ha producido un evento determinado,
Windows lo detecta automticamente. Los eventos ya estn definidos, son bastantes y cada control cuenta con
los suyos propios, aunque son muy parecidos. Lo nico que tendremos que hacer es asociar el cdigo
necesario al evento que necesitemos tratar.

Para mostrar la ventana donde aparecen los controles que Visual Basic carga por defecto nada ms arrancar la
aplicacin tendremos que marcar en Ver del men principal y activar la opcin Cuadro de Herramientas.
Obtendremos una ventana como esta en la pantalla

Realmente existen muchos ms controles, aunque estos son los ms utilizados y por eso aparecen por defecto.

22
Para tener acceso a los dems controles tanto de Visual Basic como los controles que incorporan otras
aplicaciones marcaremos en proyecto y luego la opcin componentes del men principal.

Moviendo el ratn por encima de cualquier control aparecer una pista indicndonos el control de que se trata.

6.1 Por que Trabajar con Propiedades y Metodos?

Las tcnicas objetopropiedadmetodo hacen que el desarrollo de las aplicaciones sea ms fcil,
proporcionando herramientas que se adaptan mas de cerca de la manera en que las personas piensan acerca del
mundo.

7 BOTONES DE COMANDOS, CUADRO DE TEXTOS Y ETIQUETAS

7.1 TextBox

Mediante este control podremos realizar tanto la entrada como la salida de datos en nuestras aplicaciones. No
hace falta que indiquemos las coordenadas de la situacin del formulario en pantalla, simplemente tendremos
que marcar sobre el control de la caja de herramientas y dibujarlo con el tamao que queramos en nuestro
formulario.

Se puede almacenar el contenido actual de este control en una variable, ej:

Dim viejotext, nuevotexto As String

Nuevotexto = Texto Nuevo

Viejotexto = introtexto.text Lee el texto Actual

introtexto.text = nuevotexto Pone el nuevo texto

PROPIEDADES

Text: Aqu indicamos el texto que aparecer en el control. Podemos asignarle cualquier texto en tiempo de
diseo o ejecucin. Tambin podemos tomar el texto que haya introducido el usuario para tratarlo durante la
ejecucin.

Name: Esta propiedad la tienen todos los controles, el nombre que viene por defecto en este caso Text1 y es
el nombre con el que se conocer el control cuando lo utilicemos en el cdigo. En un mismo formulario no
puede haber 2 controles con el mismo nombre. Conviene poner un nombre que represente la funcin que tiene
el control en la aplicacin para que el cdigo quede ms claro. Ejemplo, si en el textbox vamos a introducir la
direccin de una persona podemos asignarle a esta propiedad el valor Direccin.

MultiLine: Permite que introduzcamos varias lneas de texto en el control en lugar de slo una.

Alignment: Alineacin que tendr el texto dentro del control: izquierda, centro o derecha. Para que funcione
la propiedad MultiLine debe estar con el valor true.

Locked: Si esta con valor true bloquea el control, es decir, el usuario no puede introducir ni modificar el texto
que contenga. Nos puede servir para utilizar el control como salida de datos sin que el usuario pueda
modificarlos por error.

BorderStyle: Determina el tipo de borde.

23
PasswordChar: Oculta un texto con un carcter simple.

Tag: Almacena informacin adicional(cualquier expresin de

cadena), ej: almacenar la contrasea de su sistema.

Otras propiedades que son comunes a la mayora de los controles:

Backcolor: color de fondo.

Forecolor: color de letra.

Font: tipo y tamao de letra.

Para personalizar las combinaciones de la barra de desplazamiento en un cuadro de texto, se puede establecer
la propiedad ScrollBars en Horizontal, Vertical, Both o None.

Cuando la propiedad MultiLine esta en True se puede usar la propiedad Alignment para ajustar el texto.

EVENTOS

Los eventos son acciones que se pueden realizar en cualquier control: click, doble click, movimiento del
ratn. A estos eventos se les puede asociar cdigo para que se ejecute al producir el evento.

MouseMove: al mover el raton por encima del control.

Mousedown: al pulsar cualquier boton del raton

Change: al cambiar el contenido del control

Click: al hacer click con el botn izquierdo del ratn sobre el control

Doubleclick: al hacer doble click con el con el botn izquierdo del ratn

sobre el control.

Getfocus: este evento se activa cuando el control recibe el enfoque, es

decir, cuando se activa el control en tiempo de ejecucin para

introducir datos en l o realizar alguna operacin.

Lostfocus: Es el contrario del anterior evento, se activa cuando el control

pierde el enfoque, es decir, se pasa a otro control para seguir

introduciendo datos.

EJEMPLO

Vamos a probar el uso del control TextBox mediante un pequeo ejemplo en el que teniendo un nico control
de este tipo en un formulario, lo programaremos de forma que al pasar el ratn sobre el control (evento

24
mousemove) aparecer en el formulario el texto que contenga.

Observamos que al situar el control en el formulario aparece por defecto el texto Text1. Para que no aparezca
ese texto al ejecutar la aplicacin, debemos cambiar la propiedad Text. Lo que queremos hacer es que cada
vez que movamos el ratn por el control aparezca su contenido en el formulario. Entonces lo que habr que
hacer abrir la ventana de cdigo, seleccionando el control. Este proceso nos llevar al cuadro de la imagen
siguiente.

Lo que tendremos que hacer es seleccionar el evento que necesitemos de la seccin Proc, en nuestro caso
mousemove y a continuacin teclear el cdigo correspondiente: La instruccin print visualiza un texto en el
formulario y si le ponemos text1.text le decimos que nos muestre la propiedad Text del control Text1 que ese
ser el nombre que tendr el control por defecto si no lo hemos cambiado en la propiedad name.

Al ejecutar esta pequea aplicacin pulsando F5 observaremos como aparece en el formulario lo que hayamos
tecleado en el control cada vez que movemos el raton sobre el Textbox

Podemos modificar el programa para que responda a cualquier otro evento sin ms que seleccionarlo en la
seccin Proc e introduciendo el cdigo que sea necesario.

7.2 Label

Este control es tambin uno de los ms utilizados, aunque su utilidad queda restringida a la visualizacin de
datos en el mismo, no permitiendo la introduccin de datos por parte del usuario.

La forma de utilizarlo es similar a la del control anterior, dibujar el control en el formulario con el tamao que
queramos y asignarle un texto en tiempo de diseo o de ejecucin esta vez sin utilizar la propiedad text puesto
que no la incorpora, sino utilizando la propiedad caption.

Este control sirve para mostrar mensajes en nuestro formulario que orienten al usuario sobre la utilidad de los
dems controles que tengamos en la aplicacin o para indicarnos acciones que podemos realizar. En el
ejemplo anterior donde apareca un textbox en el formulario, hubiera quedado mejor con un mensaje
aclaratorio contenido en un control label

Si se desea que se despliegue adecuadamente varias lneas de diversas longitudes, puede establecer las
propiedades Autosize y WordWrap en True.

PROPIEDADES

Caption: Es el texto que contendr el control.

Alignment: Alineacin del texto contenido en el control, no necesita que

est activada ninguna otra propiedad.

BorderStyle: Si queremos que aparezca un borde alrededor del control

activaremos esta propiedad.

Para este control no se suelen utilizar los eventos ya que su contenido suele cambiar poco a lo largo de la
ejecucin de la aplicacin. De todas formas los eventos son casi los mismos del control textbox excepto que

25
no dispone de los eventos GetFocus y LostFocus ya que a este control no se le puede dar el enfoque.

7.3 CommandButton

Se usa un control de botn de comando para iniciar, interrumpir o terminar un proceso en particular.

Este control es el tpico botn que aparece en todas las aplicaciones y que al hacer click sobre l nos permite
realizar alguna operacin concreta, normalmente Aceptar o Cancelar. Aunque segn el cdigo que le
asociemos podremos realizar las operaciones que queramos. En el ejemplo anterior podemos aadir un control
de este tipo para salir de la aplicacin sin tener que pulsar sobre la equis de la esquina superior derecha.

Pero slo con introducir un control de este tipo con el texto salir que se introduce a travs de la propiedad
caption no basta. Habr que asociarle un cdigo que nos permita salir de la aplicacin en el evento adecuado.
Y el evento por excelencia de este control es click. As pues accederemos al cdigo del control y la sentencia
nos permitir salir de la aplicacin es End, simplemente tecleamos esa palabra en el evento click y comprobar
que realmente finalizaremos nuestra aplicacin al pulsar sobre dicho botn.

PROPIEDADES

Caption: Aqu pondremos el letrero que queremos que aparezca en el botn:

aceptar, cancelar, salir, entre otros.

Enabled: Esta es una nueva propiedad, cuando su valor es true el botn

funciona normalmente, cuando su valor es false el botn se

encuentra desactivado, no responde a los eventos producidos sobre

l y el texto aparece en un gris claro advirtindonos de su estado.

Podemos utilizar esta propiedad para activar o desactivar un botn

dependiendo del estado de otros controles. Por ejemplo, en un botn

Aceptar, no activarlo hasta que se haya introducido una cantidad en

un control textbox, ya que ese botn nos calcular el IVA de la

cantidad.

Appearance: Selecciona 3D o apariencia plana.

Cancel: Permite la seleccin con Esc True, False

Default: Permite la seleccin con enter True, False.

EVENTOS

Click: Es el evento tipico de este control y el que ms se utiliza.

MouseMove: Como sabemos detecta el movimiento del ratn sobre el

26
control. Puede servir para que aparezca un mensaje en un

control Label que nos aporte informacin sobre la utilidad del

control ampliando el texto que hayamos colocado como

caption del commandbutton.

7.4 Porque usar los cuadros de textos, Botones de comandos y etiquetas?

Cuando los datos de campos se ven a travs de un formulario, esto son usualmente almacenados(o
relacionados) en varios controles TextBox, los que a su vez se identifican por etiquetas. Es probable que el
mismo formulario tenga algunos botones para navegar a travs de los registros de base de datos.

8 BOTONES DE OPCIONES, CASILLAS DE VERIFICACION Y MARCOS

8.1 Que son los botones de Opcin?

Es el que despliega una opcin que puede encenderse a pagarse, con la propiedad Value del botn puesta en
True o False, segn el caso.

Para agrupar los controles OptionButton en un marco o cuadro de dibujo, trace el marco o cuadro de dibujo
primero y luego trace los controles OptionButton adentro. Esto se hace para asegurarse que sean mutuamente
excluyentes y crear una jerarqua de contenedores validas. Si traza los controles fuera del marco y los arrastra
adentro, los copia dentro del marco o traza el marco alrededor de los controles existentes, no producir los
resultados deseados.

8.2 OptionButton

Este control nos permite elegir una opcin entre varias de las que se nos plantean. Cada opcin ser un control
optionbutton diferente. Facilita la introduccin de datos por parte del usuario:

De todas las opciones que se nos ofrece, en este caso los 4 colores, slo podremos activar una. Si activamos
cualquier otra opcin, se desactivar automticamente la ltima que tenamos activada

El marco que est alrededor de los 4 controles optionbutton se trata del control Frame, es opcional, aunque
es conveniente colocarlo siempre que hagamos uso de las opciones. No slo por motivos de presentacin sino
porque de esta manera podremos establecer grupos de controles optionbutton independientes en los que en
cada grupo slo pueda haber una opcin activada a la vez. Tambin, al mover el marco se movern los
controles incluidos en l facilitndonos las modificaciones.

Del control Frame la nica propiedad que nos interesar es caption, que es el texto que aparecer en el
encabezado, en el ejemplo anterior: colores.

PROPIEDADES DE OPTIONBUTTON

Caption: El texto que aparecer al lado del control: Rojo, verde...

Value: Es el valor que tendr el control: True si se encuentra activado y

27
False si no lo est. Para comprobar que opcin ha activado el

usuario comprobaremos el estado de esta propiedad.

Alignment: Alineacin del texto respecto al control: Left Justify: el control

aparece a la izquierda del texto. Es el ejemplo anterior.Right Justify:

el control aparece a la derecha del texto.

Los eventos del control son los mismos que en anteriores controles, aunque no se suele asociar cdigo a los
eventos de este tipo de controles, sino nicamente conocer el valor que tienen: true o false.

APLICACION DE EJEMPLO

Para practicar con los controles que hemos visto vamos a realizar una pequea aplicacin que consistir en
realizar con 2 nmeros que introduzcamos, una operacin que seleccionemos y mostrar el resultado.

El formulario donde estarn todos los controles es el siguiente:

La propiedad Caption de cada uno de los controles es la que se muestra en el formulario.

He modificado la propiedad Name de cada control para que al utilizarlos desde el cdigo sepamos cual es el
control con el que trabajamos:

Los controles TextBox tienen los nombres: Num1, Num2 y Resul.


Los controles Optionbutton tienen cada uno de ellos el mismo nombre que su caption
Los controles CommandButton tienen los nombres: Calcular, Limpiar y Salir.
A los controles Label y al Frame no have falta cambiarles el nombre.

Lo que habr que hacer ahora es asociar cdigo a cada uno de los botones que es de donde se van a realizar las
operaciones:

Para el botn Calcular que es el que nos mostrar el resultado segn la operacin seleccionada, se
puede utilizar la instruccin If Then Else que se vio anteriormente.

El botn Limpiar Datos nos va a servir para borrar de una forma rpida los datos introducidos por el usuario y
el resultado preparando los controles para introducir nuevos datos. El cdigo que tendremos que introducir es
muy simple:

El botn Salir nicamente contendr la sentencia End

8.3 Que son las casillas de verificacin?

Un CheckBox muestra una marca cuando esta seleccionado, y la marca desaparece cuando se borra el cuadro.
Este control se usa para dar al usuario las opciones True/False , Si/No y Activado/Desactivado.

Se puede desplegar texto junto a las casillas de verificacion, estableciendo la propiedad Caption. Use la
propiedad Value para determinar el estado del control:

1 = Marcado

28
0 = Sin marcar

2 = No disponible(desactivado, aparece atenuado).

Ej:

Select Case chksound

Case 0

Msg = No Seleccionado

Case 1

Msg = Seleccionado

Case 2

Msg = No Disponible

End Select

MsgBox Msg

8.4 Que son los Marcos?

Proporciona una forma atractiva de agrupar controles relacionados. Se puede usar un marco para subdividir un
formulario en otros.

Primero se traza el control Frame y luego los controles dentro del Frame.

8.5 Por que los botones de opcin y los cuadros de texto?

Frecuentemente es necesario disear cuadros de dialogos que presentan al usuario una diversidad de opciones,
algunas de las cuales pueden estar desplegadas como un grupo mutuamente excluyente, mientras que otras
estan clasificadas en una forma que permiten tener efecto a la vez a una o mas opciones.

Una comprensin completa de la relacin entre los marcos, botones de opciones y casillas de verificacin, as
como de sus propiedades y eventos asociados, aumentar en gran medida su habilidad para disear
formularios y cuadros de dilogos de Windows visual y funcionalmente concisos.

9 CUADROS DE LISTA Y CUADROS COMBINADOS

9.1 Que son los cuadros de lista?

Los cuadros ListBox despliegan una lista de elementos en la que el usuario puede seleccionar uno o ms de
estos. Si el numero de elementos excede el numero que puede desplegarse a la vista, una barra de
desplazamiento se anexa automticamente al control ListBox. Los eventos Clic o Ddclic del cuadro de lista se
utilizan habitualmente para procesar la seleccin.

Una propiedad Listcount de una lista devuelve el numero de elementos de la lista, mientras que la propiedad
ListIndex se una para seguir la pista del elemento actualmente seleccionado.

29
La propiedad MultiSelect devuelve(en tiempo de ejecucin) o establece(en tiempo de diseo) un valor que
indica si un usuario puede o no hacer una seleccin mltiple, y como usted hacerse tal seleccin. Para
seleccionar mas de un elemento de una lista, la propiedad MultiSelect del control ListBox puede ponerse en 1
o 2.

Descripcin y Ajuste de MultiSelect

Ajustar Descripcin
No se permite la seleccin mltiple(ajuste por
0
omisin)
Seleccin mltiple sencilla. un clic del ratn u
1 opresin de la barra espaciadora seleccionada o quita
la seleccin de un elemento de lista.
Seleccin mltiple extendida. Oprimiendo maysculas
y haciendo clic con el ratn u oprimiendo maysculas
2 y una de las teclas de flechas, extendiendo la seleccin
del elemento seleccionado anteriormente al elemento
actual.

9.2 Que son los cuadros combinados?

La diferencia entre cuadros combinados (ComboBoxes) y cuadros de lista(ListBox) es que un control


ComboBox combina las caractersticas de un control Textbox y un control Listbox. Si el usuario no desea
seleccionar alguna de las opciones ofrecidas, puede teclear informacin en la parte del cuadro de texto del
control.

Un cuadro combinado tiene tres estilos diferentes, determinados por sus valores en la propiedad Style. Esta
propiedad devuelve o establece un valor indicando el tipo de control ComboBox y el comportamiento en el
cuadro de lista. Los valores de la propiedad Style del comboBox resumen a continuacin:

Descripcin y Ajuste de MultiSelect

Ajustar Descripcin
DropDown Combo. Incluye una lista desplegable y
0
un cuadro de texto.
Simple combo. Incluye un cuadro de texto y una lista
1 fija. El tamao de un simple Combobox incluye las
partes de edicin y las parte de la lista.
DropDown List. Este estilo no es realmente un
comboBox del todo. Este permite solamente la
2
seleccin de la lista desplegable, cuando la parte del
TextBox no esta disponible al usuario.

9.3 Propiedades y Mtodos Comunes de lista

Estas se resumen en le siguiente cuadro

Propiedad Descripcin Ejemplo de Uso


ListCount Numero de elementos de una lista Item = milista.listCount 1
ListIndex Milista.Listindex = 3

30
Indice numrico del elemento
actual
Con el ndice devuelve el elemento
List Quintoelemento =milista.List(5)
de lista
True, si el elemento esta
Selected If milista.Selected(3), Then
seleccionado
Serted Lista autoordenada si esta en True Milista.sorted = True

Mtodo Descripcin Ejemplo


Addeitem Aade la cadena de elemento Milista.Additem = Hola Mundo
Elimina todos los elementos de la
Clear Milista.clear
lista
RemoveItem Elimina un solo elemento de la lista Milista.RemoveItem 5

Es importante en la manera en que trabajan los mtodos Additem y Removeitem. Ambos requieren un solo
argumento, pero Additem espera una expresin de cadena, mientras que Removeitem requiere un ndice
numrico.

9.4 Por que usar cuadros de lista y cuadros combinados?

Como programador de Windows descubrir una diversidad de usos para los cuadros de lista y para los cuadros
combinados. Casi siempre existe la necesidad de desplegar informacin en un formato de lista, del cual le
usuario debe hacer una eleccin, o algunas veces, debe permitirle teclear su propia nueva informacin textual.
Los controles Listbox y Combobox ofrecen una amplia variedad de propiedades de lista y mtodos que
pueden usarse para simplificar en gran medida el proceso de aadir funcionalidad a sus programas.

CAPITULO III FORMULARIOS, CONTROLES Y MENU

Los formularios son tratados como controles con sus propiedades, eventos y mtodos. Aunque digamos que se
trata de un control especial que utilizamos para contener los controles ms usuales con los que construiremos
nuestras aplicaciones: textbox, label, commandbutton, etc.

En este captulo vamos a ver las propiedades y eventos ms importantes de los formularios, como trabajar con
mltiples formularios y como se establece la comunicacin entre ellos.

3.1 Qu es un Formulario de Arranque?

Es el primer formulario que se despliega en la Aplicacin por lo general es el primer formulario que se crea en
el Ambiente de desarrollo. No necesariamente una Aplicacin tiene que arrancar con el primer formulario del
Proyecto ya que esto se puede modificar.

Pasos para especificar un Formulario de Arranque:

Del Men de Proyecto escoger la opcin propiedades del Proyecto.


Hacer Click en la pestaa de Objeto inicial y seleccionar el Formulario de arranque que desea.

3.2 Qu es un Control Personalizado y Objetos Insertables?

Un Control personalizado es un archivo con una extensin .vbx u .ocx que cuando se aade a un Proyecto
extiende la caja de herramientas de Visual Basic, pueden aadirse dentro de la opcin de Men Proyecto en la
opcin Componentes .

31
Un Objeto Insertable es un tipo de control Personalizado que es un Objeto y una Aplicacin servidora OLE,
como una hoja de trabajo en Excell o un Documento de Word, esto lo puede accesar dentro de la opcin
Proyecto, Componentes en la pestaa Objetos Insertables.

3.3 Por Qu usar los Procedimientos de Arranque y los Controles Personalizados?

La ventaja de usar los Controles Personalizados es obvia puesto que no es necesario Programar algo que ya
esta hecho.

3.5 Cmo se utilizan los Formularios?

En Visual Basic el uso de Formularios es una Actividad realmente flexible. Puede hacer que todos los
Formularios de un programa sean visibles de forma simultanea o podr cargar y descargar formularios a
medida que el Programa los valla necesitando.

Un formulario que tenga que ser utilizado cuando se muestre por pantalla se denomina formulario modal (el
Formulario acaparara la atencin del Programa hasta que el usuario pulse Aceptar, Cancelar o sea eliminado
por otros medios).

Un formulario que el usuario puede seleccionar o ignorar en pantalla recibe el nombre de Formulario No
Modal. La mayora de aplicaciones desarrolladas por Microsoft utilizan formularios no Modales para mostrar
Informacin, ya que proporcionan ms flexibilidad de empleo del usuario.

3.6 Propiedades de los Formularios.

Las propiedades ms comunes de los formularios y que son similares al resto de los controles son las
siguientes:

Name: Nombre del formulario, necesario para llamar al formulario desde el cdigo.

Caption: Texto que aparece en el ttulo del formulario

Backcolor: Color de fondo del formulario.

Forecolor: color del texto del formulario.

Otras propiedades que son propias de los formularios y que es importante conocerlas para realizar una buena
presentacin en nuestras aplicaciones son las siguientes:

WindowState: Nos permite indicar el modo en el que aparecer el formulario cuando sea llamado. Tiene tres
posibles valores:

0 Normal

1 Minimizado.

2 Maximizado.

MinButton y MaxButton: Son dos propiedades que admiten nicamente los valores True o False. Permiten
que queden habilitados los botones minimizar y maximizar, respectivamente de un formulario. Nos sirven
para controlar que el usuario no pueda cambiar el tamao en que presentemos un formulario en pantalla. Si
slo desactivamos una de las propiedades, el botn correspondiente aparecer desactivado, pero si

32
desactivamos las dos propiedades, no aparecer ninguno de los 2 botones, nicamente lo har el botn con la
"x" de cerrar.

ShowInTaskbar: Mediante esta propiedad podremos controlar que determinado formulario aparezca o no en
la barra de tareas de Windows. En una aplicacin con mltiples formularios, si para cada uno de los que
aparezca en pantalla, nos aparece tambin en la barra de tareas, al final la barra estar llena de aplicaciones.
Podemos hacer que determinados formularios no aparezcan en ella colocando esta propiedad a False.

Icon: Nos permite modificar el icono que aparece a la izquierda de la barra del ttulo de cualquier formulario,
que es donde aparece el men de control, para personalizarlo en nuestra aplicacin

El icono que aparece por defecto en todos los formularios se puede cambiar por otro ms simptico.

ControlBox: Controla la aparicin del men de control. Esta propiedad por defecto est activada, aunque si
la ponemos a False, no slo hacemos desaparecer el icono que simboliza al men de control, sino que
desaparecen tambin los botones de minimizar, maximizar y cerrar. Unicamente aparece la barra de titulo con
el caption

Si adems de colocar ControlBox a False, colocamos MinButton y MaxButton a False y dejamos vaca la
propiedad Caption, es decir sin nada en el ttulo, nos aparecer un formulario sin barra de titulo, es decir,
nicamente un rectngulo gris que s podremos cambiar de tamao apuntando sobre el borde.

BorderStyle: Esta propiedad es la que ms opciones tiene y la que ms posibilidades ofrece para cambiar el
aspecto de nuestros formularios. El cambiar el valor de esta propiedad afecta tambin a las propiedades
MinButton, MaxButton y ShowInTaskbar que cambian automticamente segn la opcin que hayamos
seleccionado. En la siguiente tabla aparece una explicacin de cada una de sus opciones y de que valor
adoptan otras propiedades del formulario

Opciones de
Utilidad MinButton MaxButton ShowInTaskbar
BorderStyle
No aparecen bordes ni barra de titulo. No
podemos modificar su tamao de ninguna
0 None False False False
forma. Sirve para pantallas de presentacin al
principio de nuestra aplicacin
No se puede cambiar su tamao. Ni siquiera
se puede maximizar haciendo doble click
1 Fixed
sobre la barra del ttulo, algo que s se puede False False True
Single
hacer desactivando los botones MinButton y
MaxButton en un formulario normal
Formulario por defecto de VB. Contiene
2 Sizable
todos los botones de la barra del ttulo, se
(aparece por True True True
puede cambiar su tamao actuando sobre el
defecto)
borde y aparece en la barra de tareas.
3 Fixed No se puede cambiar su tamao y no aparece
False False False
Dialog en la barra de tareas
Aparece con la barra de titulo ms pequea,
4 Fixed es el que utiliza VB para mostrar la caja de
False False False
ToolWindow herramientas. No aparece el icono del men
de control ni aparece en la barra de tareas.
5 Sizable Igual que el anterior pero s permite
False False False
ToolWindow modificar su tamao actuando sobre el borde.

33
3.7 Utilizacin de Mltiples Formularios

Para utilizar varios formularios en nuestra aplicacin tendremos que aadir cada uno de ellos mediante la
opcin de men Insert / Form o pulsando sobre el botn.

3.7.1 Mtodo Show.

Para llamar a un formulario desde el cdigo se utiliza el mtodo Show. Si el formulario 2 tiene en la
propiedad Name form2, para llamarlo desde otro formulario se escribe:

Form2.Show

Si no se pone ningn argumento se asume que el formulario aparece en modo no modal, es decir, se permitir
que se active cualquier otro formulario sin cerrar el formulario 2. La otra modalidad que existe es modal, lo
que significa que no se permite el enfoque hacia ningn otro formulario hasta que no se cierre el actual. Este
ltimo modo puede servir para cuadros de dilogo que soliciten ciertos parmetros para que la aplicacin siga
funcionando: una contrasea.

Los argumentos del mtodo Show son:

0 VbModeless No modal
1 VbModal Modal

Ejemplo:

Form2.Show vbModal

3.7.2 Sentencia Load.

La sentencia Load seguida del nombre de un formulario provoca que se cargue el formulario en memoria pero
sin visualizarse, ya que la propiedad Visible se coloca a False.

Ejemplo

Load Form2

Realmente el mtodo Show realiza la carga del formulario en memoria, si no estaba cargado antes, y coloca la
propiedad Visible del formulario a True. Durante este proceso se provoca la activacin de los eventos Load y
Activate del formulario en ese orden. En dichos eventos se puede colocar el cdigo necesario que haga que el
formulario se inicie siempre con los valores deseados.

Si el formulario ya estaba cargado en memoria, mediante una sentencia Load o porque se haya ocultado con el
mtodo Hide, al llamarlo con el mtodo Show, nicamente se realizar la modificacin de la propiedad
Visible a True, y no se volver a efectuar el proceso de carga del formulario a memoria. Por tanto el
formulario aparecer con los mismos datos que tena cuando se ocult. Ahora el nico evento que se activar
es el Activate que se activa cada vez que un formulario recibe el enfoque o pasa a ser el formulario activo.

3.7.3 Sentencia Unload.

Permite descargar un formulario de la memoria. Se introduce junto al nombre del formulario que se va a
descargar:

34
Unload Form2

Si se esta dentro del mismo formulario para descargarlo no hace falta colocar el nombre sino nicamente:

Unload me

En una aplicacin con varios formularios se debe usar esta sentencia para los mtodos que se terminan de
utilizar, de esta forma se libera espacio en memoria para que los otros formularios puedan aprovecharla mejor.

La sentencia unload provoca la activacin de los eventos:

Deactivate: Al contrario que el evento Activate, este se activa cada vez que un formulario pierde el enfoque.
Tambin se activa este evento al utilizar el mtodo Hide.

Unload: Este evento recibe el parmetro Cancel, y al modificar su valor se puede hacer que se suspenda
(cancele) el proceso de descarga de un formulario. Mediante 2 lneas de cdigo se puede hacer una pregunta al
usuario cada vez que se cierra un formulario para que confirme la operacin:

Este cdigo provocar que cada vez que se cierre el formulario de cualquier forma, (no slo mediante la
sentencia Unload sino tambin haciendo click sobre la "x", el men de control o con ALT + F4) aparezca un
mensaje que pregunta si realmente se desea salir:

Query_Unload: Este evento se produce realmente antes que el evento Unload.

En este evento adems de recoger el parmetro Cancel, tambin proporciona el parmetro UnloadMode que
segn el valor que tenga se podr saber desde donde se produce la posible descarga del formulario. Los
valores que puede tener son los siguientes:

0 vbFormControlMenu: Significa que el cierre del formulario se ha producido:

Pulsando sobre la "x"

Mediante la opcin cerrar del Men de Control.

Pulsando ALT + F4.

Cerrando el formulario desde la Barra de Tareas.

1 vbFormCode: Indica que se ha cerrado el formulario utilizando la sentencia Unload.

2 vbAppWindows: Se cierra el formulario porque se apaga el sistema desde Inicio / Apagar Sistema.

3 vbAppTaskManager: Desde el administrador de tareas de windows (CTRL + ALT + DEL) se cierra la


aplicacin que contiene el formulario

4 vbFormMDIForm: Se produce cuando se cierra un formulario hijo porque se est cerrando el formulario
MDI que lo contiene.

Mediante unas lneas de cdigo se va a probar las posibilidades de este evento. Segn desde donde se cierre el
formulario del que consta la aplicacin aparecer un mensaje distinto que pide confirmacin en el proceso de
descarga.

35
Nota: Para el correcto funcionamiento de este ejemplo se debe compilar la aplicacin mediante File / Make
EXE File... y ejecutar la aplicacin desde fuera del entorno de trabajo de VB. Esto es as para que se pueda
cerrar la aplicacin apagando el sistema y desde el administrador de tareas.

El cdigo asociado al evento Query_Unload es el siguiente:

Desde un formulario se puede tener acceso a los controles y propiedades de otro formulario.

En lugar de realizar el paso de parmetros cuando se llama a otro formulario que queremos que aparezca con
unos determinados valores iniciales, lo que se hace es acceder a los controles del otro formulario y despus
mostrarlo mediante el mtodo Show.

Para acceder a los controles de otro formulario se sigue la siguiente sintaxis:

Formulario!Control.Propiedad = valor

Se debe colocar una admiracin "!" entre el formulario y el control y un punto entre el control y la propiedad

Ejemplo:

Form2!Label1.Caption = "Nmero de Clientes"

Al acceder a las propiedades de otro formulario automticamente se carga ste en memoria, si no lo estaba ya
antes. Una vez que se hayan modificado sus propiedades los visualizaremos con el mtodo Show.

No se puede acceder a las variables declaradas en otro formulario, de modo que si se quiere trabajar con
variables generales, las cuales sean accesibles desde cualquier formulario de la aplicacin, se tendrn que
declararlas como Pblicas desde un mdulo de cdigo

Para insertar un mdulo en un proyecto de Visual Basic se tendr que marcar en Proyecto y dentro de la
opcin proyecto Agregar Modulo o pulsar sobre el botn de la barra de herramientas. Aparecer una
ventana en la que nicamente se podrn colocar las variables y procedimientos o funciones que se deseen
pblicas para toda la aplicacin.

En el siguiente ejemplo se declara la variable Gen_var de tipo Integer que ser accesible desde cualquier
formulario de la aplicacin:

4. CREACION DE MENUS.

El Editor de Men es una Aplicacin de diseo de mens que se incluye en Visual Basic. El Editor Men
consiste en un cuadro de texto que consta de:

Caption: Se teclea el nombre del Men o del comando que aparecer en la Barra de Men. Para permitir el
acceso por teclado al elemento de Men se inserta un Ampersand (&) antes de una letra. Tambin puede crear
una barra separadora tecleando un guin ().

Name: Se usa para teclear el nombre del Control para el elemento del Men. Es un identificador que se usa
solamente para accesar el elemento del men en cdigo y no aparecer en un Men.

Index: Se usa para asignar un valor numrico que determina la posicin del elemento del menu dentro de un
arreglo de control.

36
Shortcut: Presenta una lista desde la que puede seleccionar una tecla de atajo para el elemento del men.

HelpContextId: Se usa para asignar un valor numrico para el Id de contexto. Este valor se usa para
encontrar el tema de ayuda apropiado en al archivo de ayuda identificado por la propiedad HelpFile.

Checked: Es una casilla de verificacin que se selecciona si desea que aparezca una marca de verificacin a
la izquierda.

Enable: Es una casilla de verificacin que se selecciona si desea que el elemento del men aparezca en el
men.

4.2 Hacer Clic con los botones para realizar acciones

Hay muchas formas de elegir un botn de comando en tiempo de ejecucin:

Usar un Mouse para hacer clic en el botn


Mover el enfoque al botn presionando la tecla TAB y luego presionar ENTER
Presionar una tecla de acceso a un botn de comando(ALT + la tecla subrayada)
Establecer la propiedad Value del botn de comando en True en el cdigo:

Command2.Value = True

Invocar al evento Clic del botn de comando en el cdigo:

Cmcerrar_Clic

Si el botn de comando es el botn de comando predeterminado para el formulario, al presionar


ENTER se elige el botn aunque cambie el enfoque a un control diferente de un botn de comando.
Para especificar un botn de comando en tiempo de diseo establezca la propiedad Default del botn
a True.
Si el botn de comando es el botn cancelar predeterminado para el formulario, al presionar ESC se
elige el botn aunque cambie el enfoque a otro control. Para especificar un botn Cancelar por
defecto en tiempo de diseo ponga la propiedad Cancel en True.

4.3 Controles para Introducir y Mostrar Textos

Los controles son Label y Text. Para cambiar el tamao de una etiqueta y ajustarla al tamao de su contenido
se hace lo siguiente:

Los ttulos de etiquetas de una sola lnea se pueden especificar en tiempo de diseo en la ventana
propiedades. Pero para hacerlo en tiempo de ejecucin es necesario utilizar dos propiedades:
AutoSize y WordWrap. El AutoSize determina si se debe cambiar el tamao de un control para
ajustarlo a su contenido. Si esta establecida en True, etiqueta crece horizontalmente. La WordWrap
hace que la etiqueta crezca verticalmente para ajustarse al contenido.

CAPITULO 5 BASE DE DATOS

Durante el curso vamos a trabajar con bases de datos de Access, no porque sean las mejores, que no lo son,
sino porque son las bases de datos ms extendidas. Adems el propio Visual Basic viene con un fichero de
base de datos Biblio.mdb con el que podremos hacer pruebas.

Para iniciar se ensear como realizar una pequea aplicacin que muestre en un formulario una tabla de una

37
base de datos. A partir de este ejemplo que se ir comentando efusivamente se conocer la base para realizar
las aplicaciones y se ir ampliando para conocer todas las posibilidades que existen en el manejo de bases de
datos.

Inicialmente se har el ejemplo de 2 formas distintas:

Empleando los controles que facilitan la labor con bases de datos


Mediante cdigo, es decir "a pelo" utilizando un ListBox para mostrar el resultado.

5.1 CONTROLES DE BASES DE DATOS

Sin una sola lnea de cdigo se puede visualizar cualquier tabla de una base de datos con todos sus registros.

Data: este control viene en la caja de herramientas (toolbox) nada ms cargar Visual Basic. Es un control
muy potente, el ms importante para bases de datos. Nos permite abrir una base de datos y manipular su
contenido: situarnos en un registro concreto de una tabla, eliminar, aadir o modificar registros, etc.

Datacontrol: es un tipo de control propio de VB pensando especialmente para el acceso a bases de datos. El
sistema de programacin de acceso a bases de datos de VB tiene dos tipos de herramientas diseados para este
fin:

1 DAO(Data Acces Objets) son objetos no visibles para acceder a bases de datos, es decir, no implementan
ninguna interfaz para el ususario. Entre ellos podemos destacar Database, Table, Dynaset y QueryDef. Dao
permite el acceso a las bases de datos desde programacion exclusivamente. Esto quiere decir que si se desea
dotar a una aplicacin de la potencia de un Dynaset, se deber implementar la intefaz del usuario, incluyendo
los botones y controles oportunos para realizar los diferentes procesos.

2 DataControl: poseen de por si una interfaz con una apariencia fisica concreta, sobre la cual el usuario
puede pulsar con el raton y desencadenar acciones directamente sin que dichas acciones hayan sido
implementadas por el porgramador. La finalidad basica del DataControl es acelerar las fases de desarrollo de
mantenimiento de archivos.

DataBaseName: le indicamos donde est situado el archivo que contiene la base de datos, en este caso
Biblio.mdb que estar en el mismo directorio de Visual basic. Recordemos que el concepto relacional de base
de datos es diferente a lo que se entiende como base de datos. Dentro de una base de datos se puede tener una
o varias tablas, lo cual quiere decir que una tabla de datos no es lo mismo que un archivo de datos o una tabla.

Cada archivo de datos representa una tabla que puede tener varios indices para acelerar el acceso a los
registros que contiene.

Conect: contiene un alfanumrico que especifica el tipo de formato de la base de datos a la que nos queremos
conectar. El DataControl posee una lista de alfanumericos correctos para compararlos con el que le
especificamos.

RecordSource: aparecern las tablas de las que consta la base de datos para que elijamos con cual queremos
trabajar. Ms adelante veremos que podemos indicar mediante una sentencia SELECT campos de distintas
tablas que cumplan ciertas condiciones. Esta propiedad tiene esencialmente dos funciones como se menciono
anteriormente:

Para especificar la tabla de la cual queremos recuperar los datos.


Para especificar una sentencia SELECT que obtenga datos concretos de una o varias tablas, ejemplo :

38
Data1.RecorSource = Clientes

Este ejemplo establece que la fuente de datos para nuestro DataControl llamado Data1 va a ser la tabla
clientes.

Los DataControl presentan los datos mediante controles vinculados a ellos. Se puede hacer que un
DataControl muestre automaticamente sus datos en una serie de cajas de edicion de texto. Es lo que en el
manual de VB se denomina DataBoundControl.

DataSource: indicamos el control Data con el que estar conectado este control que si se ha cambiado el
nombre debe ser Data1. Es el nico dato que necesita este control, de esta forma visualizar la tabla que
hayamos indicado en la propiedad Recordsource del Data.

Al ejecutar la aplicacin, el formulario tendr un aspecto como este:

Como se puede observar junto con los datos aparece la cabecera que nos indica a que campo corresponde cada
columna.

Tambin nos podemos desplazar por todos los registros de los que consta la tabla de 2 formas: utilizando la
barra de desplazamiento del control DBgrid o con las flechas del control Data, las cuales nos permiten
desplazarnos al primer registro, registro anterior, registro posterior y ltimo registro respectivamente.

Por ahora las nicas operaciones que podremos hacer con este formulario son las de desplazarnos a travs de
la tabla que indiquemos (no tiene por que ser necesariamente la tabla Autores o Authors, hay muchas ms
tablas en el archivo de base de datos Biblio.mdb), aunque para no haber introducido una sola lnea de cdigo
ya es bastante.

DBgrid: Si el control no se encuentra inicialmente disponible en la toolbox, tendremos que buscarlo en la


opcin: Proyecto Componentes (si ests utilizando la versin inglesa), aparecer como 1 opcin de las
muchas que existen Apex Data Bound Control, actvala y acepta. Este control permite visualizar un conjunto
de registros, cabeceras incluidas, que haya sido indicado en un control Data.

Habr que situar los 2 controles en el formulario y modificar las siguientes propiedades:

Control Data:

Ms adelante veremos las modificaciones que habr que hacer para poder realizar otras operaciones ms tiles
sobre los datos: aadir, eliminar, modificar, buscar, o que al hacer click sobre un autor nos aparezcan los
libros que ha escrito en otro control DBgrid o en otro formulario, por ejemplo.

5.2 PROGRAMACION DE DATACONTROLS

5.2.1 Funciones de Movimientos

los DataControl al igual que el resto de los objetos RecordSet muestran solo un registro a la vez,
permitiendo posicionarse en diferentes registros. Para tal fin se dispone de tres funciones bsicas de
movimiento que equivalen a los cuatro botones del DataControl:

Data1.Recordset.MoveFirst

Data1.Recordset.MovePrevious

39
Data1.Recordset.MoveNext

Data1.Recordset.MoveLast

Ejemplo de lo anterior es son las siguientes intrucciones:

Sub Button1_Click ()

Data1.Recordset.MoveNext

If Data1.Recordset.EOF Then

Data1.Recordset.MoveLast

End if

End Sub

Sub Button1_Click ()

Data1.Recordset.MovePrevious

If Data1.Recordset.BOF Then

Data1.Recordset.MoveFirst

End if

End Sub

En objetivo de utilizar este tipo de funciones es para que el usuario no vea el DataControl y para
implementar una serie de mecanismos de seguridad que permitan al usuario avanzar o retroceder en funcin
de variables de programas.

De este modo si especificamos dentro del Evento Load del Form la instruccin Data1.Visible = False, se
ocultara el DataControl, de manera que solo el programa podr manejarlo y el usuario deber interacturar
con el DataControl exclusivamente a travs de los botones y controles que se hayan dispuestos a tal efecto.

5.2.2 Obtener el valor de un campo

Esto se hace a travs de la coleccin Fields, a travs de Recordset(campo) o a travs del smbolo ! el cual
acta como separador sintctico entre registro y campo. Son expresiones validas las siguientes:

Data1.Recordset(Apellido)

Data1.Recordset!Apellido

Data1.Recordset.Fields(2).value

Pero puede surgir la posibilidad de asignar a una variable alfanumrica el valor Null, entonces para tratar tal
posibilidad y evitar un error en tal caso se debe realizar lo siguiente:

40
If Isnuli(Data1.Recordset.fields(2).value) Then

A$ =

Else

A$ = Data1.Recordset.fields(2).value

End if

5.3 Tipos de Recordset

Recordemos que un recordset es un conjunto de registros que asignamos a una variable para poder tratarlos y
hacer operaciones con los registros que la componen.

Para asignar un conjunto de registros a un recordset utilizbamos la siguiente sentencia:

set autores = mibase.openrecordset("authors", dbOpenTable)

En este caso hemos utilizado la constante dbOpenTable, con lo que le estamos diciendo que asigne al
recordset autores todos los campos de la tabla authors, que deber ser una tabla incluida en la base de datos
mibase.

Las dems constantes que podemos introducir son dbOpenDynaset y dbOpenSnapShot y las caractersticas
de todas ellas son las siguientes:

dbOpenTable: Slo permite que se asigne a un recordset el contenido completo de una tabla con todos sus
campos y registros. Podemos realizar operaciones de lectura, modificacin y escritura sobre los registros. Es
el mtodo ms rpido para realizar modificaciones en una nica tabla.

dbOpenDynaset: Permite que se incluyan varios campos de varias tablas, tambin permite que se asignen los
registros que cumplan ciertas condiciones y no necesariamente todos los que componen las tablas como
ocurra con el mtodo anterior. Para indicar los campos y registros que queramos se utiliza la sentencia
SELECT del lenguaje SQL encerrada entre comillas en lugar de introducir nicamente el nombre de una
tabla:

"SELECT nombre, apellidos, departamento FROM profesores, departamentos WHERE


codprof=coddep AND coddep=3 ORDER BY nombre"

Esta sentencia SELECT obtiene el nombre, los apellidos y el departamento de todos los profesores que
pertenezcan al departamento 3 ordenados alfabticamente por el nombre.

El mtodo dbOpenDynaset permite que se realicen operaciones de lectura, modificacin y escritura aunque
es ms lento que el modo dbOpenTable.

dbOpenSnapShot: Este modo de abrir recordsets es parecido a dbOpenDynaset, con la diferencia de que la
nica operacin permitida sobre sus registros es la de lectura, no permitiendo operaciones de modificacin ni
escritura. Por tanto este modo es ms rpido que el anterior y lo utilizaremos cuando slo nos interese realizar
una vista o consulta de un conjunto de tablas. Para asignar el conjunto de registros al recordset utilizaremos
tambin una sentencia SELECT.

* Un objeto Recordset representa los registros de una tabla base o los registros que se generan al ejecutar una

41
consulta.

Comentarios

Utilice los objetos Recordset para manipular datos en una base de datos al nivel de registro. Cuando utiliza
objetos de acceso de datos, interacta con los datos prcticamente utilizando objetos Recordset. Todos los
objetos Recordset se construyen utilizando registros (filas) y campos (columnas). Existen tres tipos de objetos
Recordset:

Recordset de tipo Table: una representacin en cdigo de una tabla base que puede utilizarse para
aadir, cambiar o eliminar registros desde una nica tabla de base de datos (slo espacios de trabajo
Microsoft Jet).

Recordset de tipo Dynaset: el resultado de una consulta cuyos registros pueden actualizarse. Un
objeto Recordset de tipo Dynaset es un conjunto dinmico de registros que puede utilizarse para
aadir, cambiar o eliminar registros desde una tabla o tablas subyacentes de una base de datos. Un
objeto Recordset de tipo Dynaset puede contener campos de una o ms tablas de una base de datos.
Este tipo corresponde a un cursor de tipo keyset ODBC.
Recordset de tipo Snapshot: una copia esttica de un conjunto de registros que puede utilizar para
encontrar datos o generar informes. Un objeto Recordset de tipo Snapshot puede contener campos de
una o ms tablas de una base de datos pero no se puede actualizar. Este tipo corresponde a un cursor
de tipo static ODBC.

Recordset de tipo Forwardonly: idntico a un tipo Snapshot excepto que no se proporciona


ningn cursor. Slo puede avanzar en los registros. Esto mejora el rendimiento en situaciones donde
slo necesita hacer una pasada sencilla en el conjunto de resultado. Este tipo corresponde a un cursor
de tipo forwardonly ODBC.

Recordset de tipo Dynamic: un conjunto de resultado de una consulta de una o ms tablas base en
las que puede agregar, cambiar o eliminar registros de una consulta que devuelve filas. Adems,
tambin aparecen en el objeto Recordset los registros que agregan, eliminan o modifican otros
usuarios en la tablas base. Este tipo corresponde a un cursor de tipo dynamic ODBC (slo espacios de
trabajo ODBCDirect).

Puede elegir el tipo de objeto Recordset que quiere crear usando el argumento tipo del mtodo
OpenRecordset.

En un espacio de trabajo Microsoft Jet, si no especifica un tipo, DAO intenta crear el tipo de objeto Recordset
con la mayor funcionalidad disponible, comenzando con tabla. Si no est disponible este tipo, DAO intenta un
Dynaset, despus un Snapshot y por ltimo un objeto Recordset de tipo Forwardonly.

En un espacio de trabajo ODBCDirect, si no especifica un tipo, DAO intenta crear el tipo de objeto Recordset
con la respuesta de consulta ms rpida, comenzando con Forwardonly. Si no est disponible este tipo,
DAO intenta un Snapshot, despus un Dynaset y por ltimo un objeto Recordset de tipo Dynamic.

Cuando se crea un objeto Recordset utilizando un objeto TableDef no adjunto, se crean objetos Recordset de
tipo Table. Slo pueden crearse Recordset de tipo Dynaset o Snapshot con tablas adjuntas o tablas de bases
de datos externas ODBC.

Cuando abre el objeto se agrega automticamente un nuevo objeto Recordset a la coleccin Recordsets y se
elimina automticamente cuando lo cierra.

42
Nota Si utiliza variables para representar un objeto Recordset y el objeto Database que contiene el conjunto
de registros, compruebe que las variables tengan el mismo alcance o duracin. Por ejemplo, si establece una
variable global que representa un objeto Recordset, debe asegurarse de que la variable que represente la base
de datos que contiene el conjunto de registros tambin sea global o se encuentra en un procedimiento Sub o
Function con la palabra clave Static.

IMPORTANTE!!! Su aplicacin puede crear tantas variables objeto Recordset como se necesiten. Un objeto
Recordset puede hacer referencia a una o ms tablas o consultas y los campos sin conflictos.

Los Recordset de tipo Dynaset y Snapshot se almacenan en la memoria local. Si no hay suficiente espacio
en la memoria local para almacenar los datos, el motor de base de datos Microsoft Jet guarda los datos
adicionales en el disco TEMP. Si este espacio est agotado, se producir un error.

IMPORTANTE!!! La coleccin predeterminada de un objeto Recordset es la coleccin Fields y la


propiedad predeterminada de un objeto Field es la propiedad Value. El cdigo puede simplificarse utilizando
estos valores predeterminados.

Cuando se crea un objeto Recordset, el registro activo se coloca como primer registro si existen varios
registros. Si no hay registros, el valor de la propiedad RecordCount ser 0 y los valores de la propiedad BOF y
EOF sern True.

IMPORTANTE!!! Puede utilizar los mtodos MoveNext, MovePrevious, MoveFirst y MoveLast para volver
a establecer el registro activo. Los objetos Recordset de tipo Forwardonly slo admiten el mtodo
MoveNext. Cuando se utilizan los mtodos Move para moverse entre los registros (o "andar" a travs del
objeto Recordset), puede utilizar las propiedades BOF y EOF para comprobar el inicio o el fin del objeto
Recordset.

Con los objetos Recordset de tipo Dynaset y Snapshot en un espacio de trabajo Microsoft Jet, tambin puede
utilizar los mtodos Find, como FindFirst, para localizar un registro especfico basado en un criterio. Si no se
encuentra el registro, la propiedad NoMatch se establece a True. Para objetos Recordset de tipo Table, puede
buscar registros utilizando el mtodo Seek.

La propiedad Type indica el tipo de objeto Recordset creado y la propiedad Updatable indica si puede cambiar
los registros del objeto.

La informacin acerca de la estructura de la tabla base, como los nombres y los tipos de datos de cada objeto
Field y cualquier objeto Index, se almacena en un objeto TableDef.

Para hacer referencia a un objeto Recordset en una coleccin por su nmero de orden o por el valor de la
propiedad Name, utilice cualquiera de los formatos de sintaxis siguientes:

Recordsets(0)

Recordsets("nombre")

Recordsets![nombre]

Nota Puede abrir un objeto Recordset del mismo origen de datos o base de datos ms de una vez creando
nombres duplicados en la coleccin Recordsets. Debe asignar objetos Recordset a variables de objeto y hacer
referencia a ellos por el nombre de variable.

EJEMPLO DE USO DEL RECORDSET

43
Este ejemplo demuestra los objetos Recordset y la coleccin Recordsets abriendo cuatro tipos diferentes de
Recordsets, enumerando la coleccin Recordsets de la Database actual y enumerando la coleccin Properties
de cada Recordset.

Sub RecordsetX()

Dim dbsNeptuno As Database

Dim rstTable As Recordset

Dim rstDynaset As Recordset

Dim rstSnapshot As Recordset

Dim rstForwardOnly As Recordset

Dim rstBucle As Recordset

Dim prpBucle As Property

Set dbsNeptuno = OpenDatabase("Neptuno.mdb")

With dbsNeptuno

' Abre cada tipo de objeto Recordset.

Set rstTable = .OpenRecordset("Categoras", _

dbOpenTable)

Set rstDynaset = .OpenRecordset("Empleados", _

dbOpenDynaset)

Set rstSnapshot = .OpenRecordset("Compaas de envos", _

dbOpenSnapshot)

Set rstForwardOnly = .OpenRecordset _

("Empleados", dbOpenForwardOnly)

Debug.Print "Recordsets en la coleccin " & _

" Recordsets de dbsNeptuno"

' Enumera la coleccin Recordsets.

For Each rstBucle In .Recordsets

With rstBucle

44
Debug.Print " " & .Name

' Enumera la coleccin Properties de cada

' objeto Recordset. Bloquea cualquier

' propiedad cuyo valor no es vlido

' en este contexto.

For Each prpBucle In .Properties

On Error Resume Next

If prpBucle <> "" Then Debug.Print _

" " & prpBucle.Name & _

" = " & prpBucle

On Error GoTo 0

Next prpBucle

End With

Next rstBucle

rstTable.Close

rstDynaset.Close

rstSnapshot.Close

rstForwardOnly.Close

.Close

End With

End Sub

Recordset (Objeto)

Recordset (Objeto)

El objeto Recordset contiene los siguientes colecciones, mtodos y propiedades:

Leyenda:

Fields (predeterminada)

45
Una coleccin Fields contiene todos los objetos Field almacenados de un objeto Index, QueryDef, Recordset,
Relation o TableDef.

Comentarios

Las colecciones Fields de objetos Index, QueryDef, Relation y TableDef contienen las especificaciones de los
campos a los que representan estos objetos. La coleccin Fields de un objeto Recordset representa los objetos
Field en una fila de datos, o en un registro. Los objetos Field de un objeto Recordset se utilizan para leer y
establecer valores para los campos del registro activo del objeto Recordset.

Para hacer referencia a un objeto Field en una coleccin por su nmero de orden o por su valor de propiedad
Name, utilice los formatos de sintaxis siguientes:

Fields(0)

Fields("nombre")

Fields![nombre]

Con los mismos formatos de sintaxis, tambin puede hacer referencia a la propiedad Value de un objeto Field
que crea y agrega a una coleccin Fields. El contexto de la referencia de campo determinar si hace referencia
a un objeto Field o a la propiedad Value del objeto Field.

Properties

Una coleccin Properties contiene todos los objetos Property de una instancia determinada de un objeto.

Comentarios

Todos los objetos de acceso de datos contienen una coleccin Properties, que tiene algunos objetos Property.
Estos objetos Property (que a veces se denominan propiedades) caracterizan de forma exclusiva a esa
instancia del objeto.

Adems de las propiedades incorporadas, algunos objetos permiten crear y aadir propiedades definidas por el
usuario. Para aadir una propiedad definida por el usuario a una instancia existente de un objeto, es necesario
definir previamente sus caractersticas con el mtodo CreateProperty y a continuacin aadirla a la coleccin
con el mtodo Append. Hacer referencia a un objeto Property definido por el usuario que no se ha agregado a
la coleccin Properties producir un error, como agregar un objeto Property definido por el usuario a una
coleccin Properties que contiene un objeto Property con el mismo nombre.

Puede utilizar el mtodo Delete para eliminar propiedades definidas por el usuario de la coleccin Properties,
pero no puede eliminar las propiedades incorporadas.

Nota Una propiedad definida por el usuario (objeto Property) slo est asociada a la instancia especfica del
objeto. La propiedad no se define para todas las instancias de objetos del tipo seleccionado.

Se puede utilizar la coleccin Properties de un objeto para enumerar las propiedades incorporadas y definidas
por el usuario del objeto. No es necesario que conozca de antemano exactamente qu propiedades existen o
cules son sus caractersticas (propiedades Name y Type) para manipularlas. Sin embargo, si intenta leer una
propiedad de slo escritura, como la propiedad Password de un objeto Workspace) o intenta leer o escribir una
propiedad en un contexto adecuado, como el valor de la propiedad Value de un objeto Field en la coleccin
Fields de un objeto TableDef, se produce un error.

46
Para hacer referencia a un objeto Property incorporado en una coleccin por su nmero de orden o por el valor
de la propiedad Name, utilice cualquiera de los formatos de sintaxis siguientes:

objeto.Properties(0)

objeto.Properties("nombre")

objeto.Properties![nombre]

Para una propiedad incorporada, tambin puede utilizar esta sintaxis:

objeto.nombre

Nota Para una propiedad definido por el usuario, debe utilizar la sintaxis objeto

.Properties("nombre") completa.

Con los mismos formatos de sintaxis, tambin puede hacer referencia a la propiedad Value de un objeto
Property. El contexto de la referencia determinar si hace referencia al objeto Property por si mismo o a la
propiedad Value del objeto Property.

RECORDSET (MTODOS)

Crea un nuevo registro para un objeto Recordset de tipo Table o Dynaset.

Sintaxis

recordset.AddNew

El marcador de posicin del recordset es una variable de objeto que representa un objeto Recordset que se
puede actualizar al que puede agregar un registro nuevo.

Comentarios

Utilice el mtodo AddNew para crear y agregar un nuevo registro en el objeto Recordset llamado por el
recordset. Este mtodo establece los campos a los valores predeterminados y si no se especifican valores
predeterminados, establece los campos a Null (los valores predeterminados especificados pare el Recordset
tipo Table).

Despus de modificar el nuevo registro, utilice el mtodo Update para guardar los cambios y agregar el
registro al Recordset. No se producirn cambios en la base de datos hasta que no se utilice el mtodo Update.

Precaucin Si ejecuta un AddNew y a continuacin realiza una operacin que desplace otro registro sin usar
Update, los cambios se perdern sin previo aviso. Adems, si cierra el Recordset o finaliza el procedimiento
que declara el Recordset o su objeto Database, el nuevo registro y los cambios realizados se descartarn sin
previo aviso.

Nota Cuando utilice AddNew en un espacio de trabajo Microsoft Jet y el motor de base de datos tenga que
crear una nueva pgina para almacenar el registro activo, el bloqueo de pginas ser pesimista. Si el nuevo
registro cabe en una pgina existente, el bloqueo de pginas ser optimista.

Si no se ha desplazado hasta el ltimo registro de su Recordset, los registros agregados a las tablas

47
subyacentes pueden incluirse, si se colocan ms all del registro activo. Sin embargo, si agrega un registro a
un Recordset, el registro ser visible en el Recordset y se incluir en la tabla subyacente donde estar visible
para todos los nuevos objetos Recordset.

La posicin del nuevo registro depende del tipo de Recordset:

En un objeto Recordset tipo Dynaset, los registros se insertan al final del conjunto del Recordset,
independientemente de las reglas de clasificacin u orden que estuvieran en vigor cuando se abri el
Recordset.

En un objeto Recordset tipo Table en el que su propiedad Index se haya establecido, los registros se insertan
en el lugar adecuado dentro del orden definido. Si no se ha establecido la propiedad Index, los nuevos
registros se insertarn al final del Recordset.

El registro que estaba activo antes de utilizar AddNew permanece activo. Si desea convertir el nuevo registro
en el registro activo, puede establecer la propiedad Bookmark con marcador identificado por el valor de la
propiedad LastModified.

Nota Para agregar, modificar o eliminar un registro, debe haber slo un ndice nico en el registro en el origen
de datos base. Si no, se producir un error "Permiso denegado " en el mtodo AddNew, Delete o Edit que se
llama en un espacio de trabajo Microsoft Jet o se producir un error "Argumento no vlido " en el mtodo
Update que se llama en un espacio de trabajo ODBCDirect.

Ejemplo de ADDNEW

Este ejemplo utiliza el mtodo AddNew para crear un registro nuevo con el nombre especificado. Se necesita
la funcin AgregarNombre para ejecutar este procedimiento.

Sub AddNewX()

Dim dbsNeptuno As Database

Dim rstEmpleados As Recordset

Dim strNombre As String

Dim strApellidos As String

Set dbsNeptuno = OpenDatabase("Neptuno.mdb")

Set rstEmpleados = _

dbsNeptuno.OpenRecordset("Empleados", dbOpenDynaset)

' Obtiene datos del usuario.

strNombre = Trim(InputBox( _

"Introduzca el nombre:"))

strApellidos = Trim(InputBox( _

48
"Introduzca los apellidos:"))

' Slo se ejecuta si el usuario escribe algo

' en los dos campos.

If strNombre <> "" and strApellidos <> "" Then

' Llama a la funcin que agrega el registro.

AgregarNombre rstEmpleados, strNombre, strApellidos

' Muestra los datos agregados ms recientemente.

With rstEmpleados

Debug.Print "Registro nuevo: " & !Nombre & _

" " & !Apellidos

' Elimina el registro nuevo porque esto es un ejemplo.

.Delete

End With

Else

Debug.Print _

"Debe escribir una cadena para el nombre y los apellidos!"

End If

rstEmpleados.Close

dbsNeptuno.Close

End Sub

Function AgregarNombre(rstTemp As Recordset, _

strNomrbe As String, strApellidos As String)

' Agrega un registro nuevo al Recordset utilizando

' datos transferidos del procedimiento que llama.

' El registro nuevo pasa a ser el registro actual.

With rstTemp

49
.AddNew

!Nombre = strNomrbe

!Apellidos = strApellidos

.Update

.Bookmark = .LastModified

End With

End Function

Delete

Objetos Recordset: elimina el registro activo de un objeto Recordset de tipo Dynaset o Table. Para espacios
de trabajo ODBCDirect, el tipo de controlador determina si los objetos Recordset se pueden actualizar y, por
tanto, admiten el mtodo Delete.

Colecciones: elimina un objeto persistente almacenado de una coleccin.

Sintaxis

recordset.Delete

coleccin.Delete nombreobjeto

La sintaxis del mtodo Delete utiliza los siguientes argumentos.

Argumentos Descripcin

recordset Una variable de objeto que identifica un objeto Recordset de tipo Dynaset o Table abierto, que
contiene el registro que desea eliminar.

coleccin Una variable de objeto que representa una coleccin de la que se elimina nombreobjeto.

nombreobjeto Un tipo de datos String que es el valor de la propiedad Name de un objeto existente en una
coleccin.

Comentarios

Puede utilizar el mtodo Delete para eliminar un registro activo de un objeto Recordset o un miembro de una
coleccin, como una tabla almacenada de una base de datos, un campo almacenado de una tabla y un ndice
de una tabla.

Recordsets

Un objeto Recordset debe contener un registro activo antes de que utilice el mtodo Delete; en caso contrario
se produce un error en tiempo de ejecucin.

En objetos Recordset, Delete elimina el registro activo y lo hace inaccesible. Aunque no pueda modificarlo o

50
utilizarlo, el registro eliminado permanecer activo. Sin embargo, una vez que se desplace a otro registro no
podr volver a convertir en activo el registro eliminado. Las referencias subsiguientes a un registro eliminado
en un Recordset no son vlidas y producen un error.

Puede recuperar un registro utilizando transacciones y el mtodo Rollback.

Si la tabla base es la tabla principal en una relacin de eliminacin de cascada, al eliminar el registro activo
tambin se eliminarn uno o ms registros de una tabla externa.

Nota Para agregar, modificar o eliminar un registro, debe tener un ndice nico en el registro en el origen de
datos de base. Si no es as, se producir un error "Permiso denegado" en la llamada al mtodo AddNew,
Delete o Edit en un espacio de trabajo Microsoft Jet, o se producir un error "Argumento no vlido" el la
llamada al mtodo Update en un espacio de trabajo ODBCDirect.

Colecciones

Puede utilizar el mtodo Delete para eliminar un objeto persistente. Sin embargo, si la coleccin es una
coleccin Databases, Recordsets o Workspaces (cada una de las cuales se almacena slo en memoria), los
objetos abiertos o activos se eliminarn cerrando ese objeto mediante el mtodo Close.

La eliminacin de objetos almacenados ocurre inmediatamente, pero debe utilizar el mtodo Refresh en
cualquier otra coleccin que se pueda ver afectada por cambios en la estructura de la base de datos.

Cuando elimine un objeto TableDef de una coleccin TableDefs, se eliminar la definicin de la tabla y los
datos de la misma.

EJEMPLO DE DELETE

ste ejemplo utiliza el mtodo Delete para quitar un registro especificado de un objeto Recordset

. Se necesita el procedimiento EliminarRegistro para ejecutar este procedimiento

Sub DeleteX()

Dim dbsNeptuno As Database

Dim rstEmpleados As Recordset

Dim lngID As Long

Set dbsNeptuno = OpenDatabase("Neptuno.mdb")

Set rstEmpleados = _

dbsNeptuno.OpenRecordset("Empleados")

' Agrega un registro temporal que se va a eliminar.

With rstEmpleados

.Index = "ClavePrincipal"

51
.AddNew

!Nombre = "Daniel"

!Apellidos = "Lpez Duque"

.Update

.Bookmark = .LastModified

lngID = !IdEmpleado

End With

' Elimina el registro de empleado con el Nmero de

' Id especificado.

EliminarRegistro rstEmpleados, lngID

rstEmpleados.Close

dbsNeptuno.Close

End Sub

Sub EliminarRegistro(rstTemp As Recordset, _

lngSeek As Long)

With rstTemp

.Seek "=", lngSeek

If .NoMatch Then

MsgBox "No existe el empleado #" & lngSeek & "en el archivo!"

Else

.Delete

MsgBox "Registro del empleado #" & lngSeek & _

"eliminado!"

End If

End With

End Sub

52
Update

Guarda el contenido del bfer de copia en un objeto Recordset de tipo Dynaset o Table especificado.

Sintaxis

recordset.Update (tipo, obligar )

La sintaxis del mtodo Update tiene las siguientes partes.

Parte Descripcin

recordset Una variable de objeto que representa un objeto Recordset abierto que se puede actualizar.

tipo Opcional. Una constante que indica el tipo de actualizacin, como se especifica en Valores (slo espacios
de trabajo ODBCDirect).

obligar Opcional. Un valor de tipo Boolean que indica si se pueden o no obligar los cambios en la base de
datos, sin tener en cuenta si los datos base se han cambiado por otro usuario desde la llamada al mtodo
AddNew, Delete o Edit. Si es True, los cambios se fuerzan y los cambios hechos por otros usuarios se
sobrescriben. Si es False (predeterminado), los cambios hechos por otros usuarios mientras la actualizacin
est pendiente provocarn que falle la actualizacin para aquellos cambios conflictivos. No se produce ningn
error, pero las propiedades BatchCollisionCount y BatchCollisions indicarn el nmero de conflictos y las
filas afectadas por los mismos, respectivamente (slo espacios de trabajo ODBCDirect).

Valores

Puede utilizar los siguientes valores en el argumento tipo. Puede utilizar los valores no predeterminados slo
cuando est activada la actualizacin por lotes.

Constante Descripcin

dbUpdateRegular Predeterminado. Los cambios pendientes no pasan a la memoria cach y se graban en el


disco inmediatamente.

dbUpdateBatch Todos se graban en disco los cambios pendientes en la memoria cach de actualizacin.

dbUpdateCurrentRecord Slo se graban en disco los cambios pendientes del registro activo.

Comentarios

Utilice Update para guardar el registro activo y los cambios que haya efectuado en l.

Precaucin Los cambios realizados en el registro activo se perdern si:

Utiliza el mtodo Edit o AddNew y a continuacin, pasa a otro registro sin actualizarlo previamente
mediante Update.

Utiliza Edit o AddNew y, a continuacin, vuelve a usar Edit o AddNew sin utilizar previamente Update.

Establece la propiedad Bookmark para otro registro.

53
Cierra el conjunto de registros a los que hace referencia recordset sin utilizar primero Update.

Cancela la operacin Edit utilizando el mtodo CancelUpdate.

Para modificar un registro, utilice el mtodo Edit para copiar el contenido del registro activo al bfer de copia.
Si no utiliza Edit en primer lugar, se producir un error cuando utilice Update o intente cambiar el valor de un
campo.

En un espacio de trabajo ODBCDirect, puede realizar actualizaciones por lotes, proporcionadas por la
biblioteca de cursores compatible con actualizaciones por lotes y si el objeto Recordset se abri con la opcin
de bloqueo optimista.

En un espacio de trabajo Microsoft Jet, cuando el objeto Recordset de la propiedad LockEdits establecida
como True (bloqueo pesimista) en un entorno multiusuario, el registro permanecer bloqueado desde el
momento en que se utiliza Edit hasta que se ejecuta el mtodo Update o se cancele la edicin. Si la
configuracin de la propiedad LockEdits es False (bloqueo optimista), el registro se bloquea y se compara con
el registro previamente modificado justo antes de se actualizado en la base de datos. Si ha cambiado el
registro desde que utiliz el mtodo Edit, la operacin Update falla. El bloqueo optimista se utiliza siempre en
Microsoft Jet conectado a ODBC y ISAM instalable. Para que la operacin Update contine con los cambios,
utilice de nuevo el mtodo Update. Para volver al registro, tal como lo cambi el otro usuario, actualice el
registro activo usando los mtodos Move 0.

Nota Para agregar, modificar o eliminar un registro, debe haber un ndice nico en el registro del origen de
datos base. Se obtiene no lo hay, se producir un error "Permiso denegado" en la llamada al mtodo AddNew,
Delete o Edit en un espacio de trabajo Microsoft Jet, se producir un error "Argumento no vlido" en la
llamada al mtodo Update en un espacio de trabajo ODBCDirect.

EJEMPLO DEL METODO EDIT Y EL UPDATE

Este ejemplo demuestra el mtodo Update en unin con el mtodo Edit.

Sub UpdateX()

Dim dbsNeptuno As Database

Dim rstEmpleados As Recordset

Dim strAntiguoNombre As String

Dim strAntiguosApellidos As String

Dim strMensaje As String

Set dbsNeptuno = OpenDatabase("Neptuno.mdb")

Set rstEmpleados = _

dbsNeptuno.OpenRecordset("Empleados")

With rstEmpleados

.Edit

54
' Almacena los datos originales.

strAntiguoNombre = !Nombre

strAntiguosApellidos = !Apellidos

' Cambia los datos en el bfer de modificacin.

!Nombre = "Mara"

!Apellidos = "lvarez"

' Muestra el contenido del bfer y obtiene una entrada del usuario.

strMensaje = "Modificacin en progreso:" & vbCr & _

" Datos originales = " & strAntiguoNombre & " " & _

strAntiguosApellidos & vbCr & " Datos en el bfer = " & _

!Nombre & " " & !Apellidos & vbCr & vbCr & _

"Utilizar Update para reemplazar los datos originales con " & _

"los datos del bfer en el Recordset?"

If MsgBox(strMensaje, vbYesNo) = vbYes Then

.Update

Else

.CancelUpdate

End If

' Muestra los datos resultantes.

MsgBox "Datos en el Recordset = " & !Nombre & " " & _

!Apellidos

' Restaura los datos originales porque esto es un ejemplo.

If Not (strAntiguoNombre = !Nombre And _

strAntiguosApellidos = !Apellidos) Then

.Edit

!Nombre = strAntiguoNombre

55
!Apellidos = strAntiguosApellidos

.Update

End If

.Close

End With

dbsNeptuno.Close

End Sub

Este ejemplo demuestra el mtodo Update en unin con el mtodo AddNew.

5.4 VISUALIZAR DATOS DE UNA TABLA MEDIANTE CODIGO

Como contrapartida a obtener datos sin una sola lnea de cdigo, vamos a ver ahora como trabajar con bases
de datos sin la ayuda de controles especializados, es decir, mediante cdigo nicamente.

Y qu sentido puede tener el complicarnos la vida de esta manera. Si tengo unos controles que me lo hacen
todo, Para qu voy a hacer las cosas sin ayudarme de ellos? Pues se puede decir que mediante el cdigo
podemos manejar la informacin con una mayor flexibilidad, podemos superar los lmites que siempre tienen
los controles y personalizar mejor nuestras aplicaciones. Aunque siempre es recomendable llegar a un
compromiso entre el uso del cdigo y de los controles de bases de datos.

Vamos a visualizar el contenido tambin de la tabla autores de la base Biblio.mdb mediante cdigo aunque
ayudndonos del control ListBox para visualizar los registros.

Los pasos a seguir son los siguientes:

Creamos un formulario, situndonos en la seccin Form y el evento Load ya que vamos a hacer que aparezcan
los resultados nada ms cargar la aplicacin.

Definimos las variables:

Dim mibase as Database

Dim autores as Recordset

La primera lnea declara una variable que contendr la base de datos completa y la variable autores contendr
la tabla que vayamos a mostrar, aunque el tipo de datos recordset puede contener tambin campos de diversas
tablas y no slo de una como ya veremos.

Asignamos valores a las variables:

set mibase=Workspaces(0).Opendatabase(App.path & "\biblio.mdb")

set autores=mibase.openrecordset("authors", dbOpenTable)

Este tipo de variables se inicializan con Set puesto que realmente se trata de objetos que disponen de sus

56
propiedades y sus mtodos.

Al objeto mibase se le asigna la base de datos Biblio.mdb y al poner App.path le estamos diciendo que la
busque en el mismo directorio donde se encuentra la aplicacin, cuando almacene la aplicacin debe hacerlo
en el directorio que ofrece Visual Basic por defecto ya que es el mismo del archivo Biblio.mdb.(En este Caso,
en otros usted puede definir la ruta)

Al colocar Workspaces(0) le decimos que trabajamos en el rea de trabajo por defecto y con el mtodo
Opendatabase abrimos una base de datos existente, tambin podamos haber utilizado otros mtodos como
CreateDataBase con lo que habramos creado una base de datos con un determinado nombre.

Respecto al objeto autores le estamos asignando los registros de la tabla Authors, que es un nombre de tabla
que debe estar en la base de datos mibase. dbOpenTable es una constante que indica que los registros son de
una nica tabla determinada, las otras opciones son dbOpenDynaset y dbOpenSnapShot que nos permiten
abrir campos de varias tablas para modificarlos o slo para lectura repectivamente, aunque ya los veremos en
profundidad posteriormente.

La sentencia autores.movefirst nos sita en el primer registro del recordset. Si queremos asignar a un textbox
el contenido de un campo del recordset haremos lo siguiente:

text1.text=autores!author

Si el nombre del campo es compuesto utilizaremos

text1.text=autores("year born")

Lo que necesitamos para presentar todos los registros de autores es un bucle que nos recorra el recordset y
por cada iteracin aadiremos al control ListBox los campos que nos interese.

Y cmo sabemos las veces que debemos recorrer el bucle, es decir, como sabemos los registros que tiene el
recordset?. Lo que haremos por ahora es comprobar si hemos llegado al final del recordset mediante la
propiedad EOF (End Of File), su funcionamiento es similar al de los ficheros de texto. Si comprobamos esta
propiedad y hacemos autores.movenext cuando ya no hay ms registros causaremos un error en tiempo de
ejecucin. El listado de la rutina que va aadiendo los registros a un listbox es la siguiente (acurdese de
incluir en el formulario un control ListBox que no lo he dicho antes):

Se ha declarado la variable cadena para contener los 3 campos que aparecern en el listbox utilizando el
mtodo AddItem.

Tambin se ha utilizado la propiedad no vista hasta ahora Recordcount que nos sirve para comprobar que el
recordset autores tiene al menos un registro, ya que si nos colocamos en el primer registro con movefirst sin
que haya ningn registro provocaremos un error en tiempo de ejecucin. Debemos tratar de realizar nuestros
programas de una forma robusta, eliminando todos los posibles errores que puedan aparecer.

En el bucle While nos vamos situando cada vez en el registro posterior y aadindolo a la lista. Cuando
llegamos al final de la tabla autores.EOF saldremos del bucle.

Este sera el resultado final, cada campo aparece a la misma distancia por que hemos separado cada campo
mediante chr(9), una tabulacin

5.5 MODIFICAR UN REGISTRO O FILA DE LA TABLA

57
sub Actualizar_click ()

Data1.recordset.Update

End sub

5.6 BORRAR UN REGISTRO O FILA

Esta forma utiliza el metodo Delete con la seguridad de que no se llegara al final del archivo.

Sub Borrar_Click ()

On Error Resume Next

Data1.Recordset.Delete

Data1.Recordset.MoveNext

If Data1.Recordset.EOF Then

Data1.Recordset.Movefirst

End if

End sub

5.7 AADIR UN NUEVO REGISTRO

Para aadir un nuevo registro se debe coordinar dos acciones: ADDNEW y UPDATE.

El mtodo AddNew realiza los mismo que en Fox pro hace APPEND BLANK

Sub Nuevo_click ()

Data1.recordset.addnew ` Crear un espacio en blanco

Text1.setfocus ` Posicionarse en el primer campo dentro de un

text

End sub

Sub Grabar_click ()

Data1.Recordset.Update ` Grabar el dato

End sub

5.8 BOOKMARKS

En bases relacionales no existe el concepto de numero de registros. En otras bases de datos anteriores al

58
concepto relacional, existan variables como RECNO que permitan volver a posicionarse en un registro dado.

Para emular ese comportamiento desde VB se dispone de Bookmarks. Los Bookmarks son tiles en casos
tales como el que se describe a continuacin:

Se necesita realizar una bsqueda mediante FindFirst y no encontramos el registro que cumpla con el criterio
de bsqueda. Seria bueno que al finalizar la bsqueda se posicionara en el registro del cual se parti antes de
lanzar la bsqueda. Esto se consigue guardando dentro de un Bookmark la posicin del registro antes de
lanzar el FindFirst:

Sub Buscar_Click ()

Dim comillas as String

Dim fuente as string

Dim criterio as String

Dim marca as String

Comillas = Chr$(34)

Marca = Data1.Recordset.Bookmark

Fuente = Inputbox(Apellido de Busqueda?, Busqueda:)

If fuente = Then exit sub

Criterio = Apellido = & comillas & fuente & & comillas

Data1.recordset.Findfirst criterio

If Data1.recordset.Nomatch Then

MsgBox(No se encontro el registro)

Data1.recordset.Bookmark = marca

End if

End sub

5.9 EVENTOS VALIDATE, REPOSITION Y ERROR

Los eventos Validate y Reposition propios del DataControl sirven para manejar los problemas ms tpicos
de interaccin con el usuario para la entrada de datos y para su modificacin.

Tomemos con ejemplo la base de datos Biblio.Mdb

En esta Forma(Imaginemos que es una forma) Existen dos tipos de campos, uno de tipo numrico y otro
alfanumrico. Que sucede si el usuario intenta colocar un contenido alfanumrico en el campo numrico.
Bueno pasara lo siguiente:

59
Lo que ha sucedido es que antes de grabar VB ha verificado el tipo de los campos de debe grabar para ver si
corresponde con la informacin introducida por el usuario. Por tal razn es necesario controlar este tipo de
mensajes.

Se explicara esto con un ejemplo. Supongamos que se va a introducir un nuevo registro:

Sub command1_click ()

Data1.Recordset.Addnew

End sub

Para evitar el tipo de mensaje anterior utilizaremos el evento Validate del DataControl:

Sub Data1_Validate (Action As integer, save as Integer)

If IsNumeric(Text1.Text) = 0 Then

K% = MsgBox(El del Campo debe ser Numerico, _

16,Error)

save = False

end if

end sub

Mediante el parametro Save indicaremos si el registro debe grabarse o no. Ademas se le puede restringir los
numero en un rango determinado(1 a 1000 en este caso):

Sub Data1_Validate (Action As integer, save as Integer)

If IsNumeric(Text1.Text) = 0 Then

K% = MsgBox(El del Campo debe ser Numerico, _

16,Error)

save = False

exit sub

end if

v = val(text1.text)

if v > 1000 or v , 1 Then

mensaje$ =El numero debe estar entre 1 y 1000

k% = MsgBox(mensaje$, 16,Error:)

60
save = False

end if

end sub

El valor de la variable Action es el que identifica cual ha sido la Accion del usuario que ha causado el disparo
del evento Validate. Segn el valor de Validate podemos tener los siguientes motivos de dispar:

Valor Accion tomada por el usuario


0 Puesta a cero para cancelar la accion
1 Posicionarse al inicio de la tabla
2 Posicionarse en el registro anterior
3 Posicionarse en el registro siguiente
4 Posicionarse en el ultimo registro
5 Aadir un nuevo registro
6 Modificar un registro Existente(Actualizar)
7 Borrar un registro Existente
8 Buscar un Registro
9 Bookmark
10 Cerrar la tabla

Otra posibilidad del evento Validate es la verificacin de que los datos modificados han sido grabados. El
conjunto de normas CUA(Commont User Acces) alas cuales se adhiere Windows(y las aplicaciones para
Windows que se precien) especifican que las aplicaciones deben evitar la perdida accidental de datos, y una
vez detectada la modificacin de los datos, ante cualquier accin evasiva por parte del usuario, deber
preguntar si los datos modificados debe guardarse o descartarse. Para tal razn se modificara la rutina anterior
para agregarle lo que se acaba de discutir:

Sub Data1_Validate (Action As integer, save as Integer)

If IsNumeric(Text1.Text) = 0 Then

K% = MsgBox(El del Campo debe ser Numerico, _

16,Error)

save = False

exit sub

end if

v = val(text1.text)

if v > 1000 or v , 1 Then

mensaje$ =El numero debe estar entre 1 y 1000

k% = MsgBox(mensaje$, 16,Error:)

61
save = False

end if

Especificacion CUA

If save = True Then

` No vamos a sacar el mensaje al aadir registro

if acction <> 5 then ` No es Addnew

mensaje$ =Los datos han sido modificados + chr(13)

mensaje$ = mensaje$ + Desea Grabarlos?

k% = MsgBox(mensaje, 4,Atencion:

if k% = 7 Then `Si es que no

save = false

Data1.updatecontrols

End if

End if

End if

end sub

El evento Validate se produce si desde el programa realizamos un Data1.Recordset.Update, en cambio, no


ocurre si lo que realizamos es un Data1Updaterecord

El evento Error

Aunque controlemos muy bien el tipo de datos que vamos a grabar en la base de datos es muy posible que
topemos con problemas debido a las normas de diseo de la base de datos.

Por ejemplo el tema de las claves duplicadas puede generar errores si el usuario intenta dar de alta una clave
que ya existe. Tradicionalmente, en muchos lenguajes de programacin se utilizan algoritmos de bsqueda
previa para evitar el choque de dos claves principales idnticas.

En VB podemos utilizar un manejador de errores a posterioris. En evento Error atrapa los errores de este
estilo que puede producirse con el Datacontrol. El siguiente ejemplo se emplea para las claves duplicadas:

Sub Data1_Error(DataErr as integer, response as integer)

62
Const NOACTUALIZA =3164

Const CLAVEDUPLI =3022

Const QUITARMENSAJEVB = 0

Select Case DataErr

Case NOACTUALIZA

Mensaje$ = No se puede actualizar el registro

Case CLAVEDUPLI

Mensaje$ = La clave ya existe

Case Else

Mensaje$ = Se ha producido un error

End select

K% = Msgbox(mensaje$,16, Error:)

Response = QUITARMENSAJEVB

Data1.Updatecontrols

End sub

DataErr: Proporciona el numero del error que se ha producido.

Response: Sirve para especificar que tipo de reaccin queremos en nuestro programa. Si le suministramos un
cero no se mostrara el mensaje de error, aunque se atrape el error. Si le suministramos 1, el mensaje de error
se mostrara tras la rutina de mensaje de error.

El evento Reposition

En este evento se produce justo en la accion y el momento contrario. Al realizar una operacin de lectura, en
el preciso momento en que seleccionamos un registro diferente, los datos del registro se leen del disco y antes
de que pase a los controles se dispara el evento Reposition. Este evento se genera cada vez que se reposiciona
el puntero de lectura de la tabla en un registro diferente.

Este evento puede servir para dos cosas:

Puede informar de cuando se produce un cambio de registro, con lo que se puede inicializar de nuevo
nuestro control y menus de aplicacin.
Puede ayudar para ocultar datos antes de que aparezcan en los controles.

Veamos esto tomando como ejemplo la base de datos Biblio.mdb y en ella la tabla autores. Supongamos que
los autores cuyo numero es inferior a 10 no tienen libros a la venta por lo que no vale la pena ponerlo en
pantalla:

63
Sub Data1_Reposition ()

If Data1.Recordset.Fields(ID_AUTOR) .value < 10 Then

Data1.Recordset.MoveNext

If Data1.Recordset.EOF Then

Data1.Recordset.MoveFirst

End if

End if

End sub

Otro caso en que son utiles estos eventos esta detallado en el siguiente ejemplo:

Imaginemos que tenemos un boton de dar de alta registros en nuestra aplicacin. Junto a el se coloca otro
boton para borrar registros. Al dar de alta un registro deberemos volver a activar el estado del boton para
permitir que el usuario tome la decision de borrar el nuevo registro que tiene ante si.

Para volver a validar el boton de borrar, bastara con coloar el siguiente codigo dentro del evento de Reposition
de neusto DataControl:

Sub Data1_Reposition ()

Botonborrar.visible = True

Botonborrar.Enable = True

End sub

Existe otra situacion mas en la que los eventos Reposition y Error pueden resultarnos utilies. Cuando un
DataControl esta vinculado a un TextBox y la tabla ete vacia al hacer clic sobre cualquier de las flechas de
movimiento del DataControl obtenemos el siguiente error:

No Current Record

Este error puede darse tambien cunado se introduce texto en un Textbox y se ejecuta Addnew o edit con la
tabla vacia. Por otro lado, el error resulta imposible de atrapar con la sentencia ON ERROR al producirse
repetitivamente el mismo error.

El programa no sabe que la tabla esta vaica hasta que se produce la actualizacion automatica. Dicha
actualizacion automatica se produce cuando se hace clic en la flecha cdle control o cuando se introduce texto
y se fuerza un Addnew o un edit.

Cuando la tabla no esta vacia, la actualizacion automatica tal como la realiza el Datacontrol resulta de gran
interes, pero cuando esta vacia cuasa un erro de No Current Record. El error radica en que el Recordset
subyacente no contiene ningun registro.

Debe ejecutarse Addnew para crear un registro en curso antes de cualquier otra accion que pueda provocar

64
una actualizacion automatica. El momento ideal para ejecutar el Addnew es antes de permitir al usuario que
haga cic sobre el Datacontrol o que entre texto en un TextBox vinculado con dicho Datacontrol.

Por ejemplo, ponga la propiedad Enable de la caja de edicion de texto en False al principio del programa.
Tras ello, oblique a que el usuario pulse un boton del Form que ejecute el metodo Addnew antes de validar el
DataControl y sus cajas de edicion de texto correspondiente.

Al cambiar de registro, detectando dicho cambio con el evento Reposition, ya puede volver a vaildar los
controles y los botones necesarios par el normal funcionamiento de la aplicacin. Este comportamiento viene
determinado por el diseo del propio Datacontrol.

Data, C.J

Nombre

Numero de Autor

Type Mismatch

65

También podría gustarte