You are on page 1of 70

Desarrollo de Sistemas con Visual Basic 6.

0
Introducción
Este curso provee al estudiante las habilidades técnicas requeridas para
desarrollar sistemas con Visual Basic 6.0.

Al terminar el Curso
Al final del curso, el estudiante tendrá las habilidades para describir los
diferentes elementos que integran un buen desarrollo de sistemas; describir los
conceptos de la programación en Visual Basic; acceso a bases de datos usando
Activex Data Object (ADO); crear ventanas de altas/bajas/cambios usando
diferentes motores de bases de datos con una sola conexión; implementar
sistemas en modalidad SDI, MDI y mezcla; hacer gráficas hacia Excel usando
OLE Automation; elaborar reportes con Data Report y Crystal Report; manejar
código de barras (generación y lectura); manejar imágenes en base de datos;
manejar Recordset con Crystal Report;; así como manejar la concurrencia de
Visual Basic con SQL Server.

Contenido del Curso

Módulo 1: Introducción a Visual Basic


Controles
Objetos
Propiedades
Menús
Archivos de Visual Basic

Módulo 2: Programación
Eventos Vs Procedimientos
Funciones Vs Procedimientos
Alcance del Código
Uso del Object Browser
Tipos de Dato
Alcance de las variables

Módulo 3: Validación de Entrada de Datos


Uso de Propiedades para Restringir Entrada de Datos
Usar el Evento KeyPress para modificar lo Tecleado
Uso del KeyUp y KeyDown para atrapar ASCII no válidos
Atrapar Códigos de Tecla a Nivel Forma

I.S.C. Alejandro Guzmán Zazueta 1


a_zazuetag@hotmail.com
Módulo 4: Acceso a Base de Datos
Uso de Activex Data Object ADO
Método Open Connection
Método OpenResultSet
Método Execute

Módulo 5: Controles que se Llenan con Información de la Base de


Datos
ComboBox
ListView

Módulo 6: Errores
Verificación de Errores
Atrapar Errores

Módulo 7:Generación de Reportes


Data Report
Crystal Report

Módulo 8: Código de Barras


Cómo generar el código de carras Interleaved 2 de 5 (cadena numérica)
Cómo leer el código de barras Interleaved 2 de 5 (cadena numérica)

Módulo 9: Manejo de Imágenes


Almacenamiento de imágenes con ADO 2.5
Recuperación de imágenes con ADO 2.5

Módulo 10: Automatización OLE con Excel

Modulo 11: Presentación a los Sistemas


Active Skin
Microsoft Agent

I.S.C. Alejandro Guzmán Zazueta 2


a_zazuetag@hotmail.com
Módulo 1: Introducción a Visual Basic
Colocando Controles Sobre una Forma

El Toolbox despliega los posibles controles.


Haga click en un control y dibújelo sobre la forma.

Usted puede adicionar controles al Toolbox.

Se sigue el estándar de nombrado de controles.

La caja de herramientas contiene los controles de Visual Basic. Si la caja


de herramientas está cerrada, usted puede abrirla seleccionando Toolbox
de la opción View en el menú o en el ToolBar en el icono que tiene un
martillo y una llave.

¾ Adicionar un control a la caja de herramientas

1. Desde la opción Project del menú, seleccione Components. Visual


Basic despliega una lista de controles disponibles. Seleccione
Microsoft Windows Common Control 6.0, al agregar este control se
adicionan al Tollbox el ListView, ImageList, Toolbar etc. estos
controles son de mucha utilidad para el desarrollo.

I.S.C. Alejandro Guzmán Zazueta 3


a_zazuetag@hotmail.com
Los Controles y las Formas son Objetos

ƒ Los controles del Toolbox son clases

• Una clase es una plantilla para un objeto.


• Usted puede crear un objeto cuando dibuja un control en la forma

ƒ Los objetos tienen propiedades y métodos

• Propiedades
Características de un objeto (color “Color”, tamaño “Size”,titulo “Caption”)
Form1.Caption = “Forma de Entrada de Datos”

• Métodos
Lo que hace un objeto. Son los procedimientos con los que actúa el objeto.
Form1.Show

Un objeto es una combinación de código y datos que es tratado como una


unidad. Un objeto puede ser una parte de una aplicación, un control o una forma.
Una aplicación completa puede ser un objeto.

Cada objeto en Visual Basic es definido por una Clase. La clase define el tipo de
objeto. Los controles en el Toolbox representan clases. Cuando se coloca un
control sobre una forma usted puede crear un objeto de la clase controles.

Todos los objetos tienen Propiedades y Métodos:


ƒ Las propiedades son valores que se le pueden dar a un objeto con la
finalidad de determinar su apariencia y comportamiento.

ƒ Los métodos son procedimientos que provee un objeto. Por ejemplo, la forma
provee el método Show que causa que la forma se despliegue en el monitor.

El beneficio de trabajar con objetos es que los objetos proveen de código que no
tenemos que escribir. Usted simplemente activa las propiedades e invoca a los
métodos de los objetos, y el objeto ejecuta varias funciones.

I.S.C. Alejandro Guzmán Zazueta 4


a_zazuetag@hotmail.com
Activando Propiedades

ƒ Activando propiedades a tiempo de diseño.


• Desplegadas en la ventana de Propiedades F4.
• Accionando el click-derecho del mouse sobre un objeto y
seleccionando la opción Properties.

ƒ Activando propiedades a tiempo de ejecución:


Text1.text = “Abraham”

ƒ Obteniendo el valor de una propiedad a tiempo de ejecución:


Dim sNombre as String
SNombre = Text1.Text

Activando propiedades a tiempo de diseño

Use la ventana de propiedades para modificar las propiedades de un


control.

Haga click con el mouse y marque varios controles de una forma al


mismo tiempo. Las propiedades desplegadas en la ventana de
propiedades son las que son comunes a todos los controles
seleccionados. Cualquier cambio que usted haga aplicará a todos los
controles seleccionados.

Activando propiedades a tiempo de ejecución


Usted puede usar el siguiente código para activar propiedades a tiempo de
ejecución:
Text2.Font.Bold = True ‘Activa el texto en Negritas
Text2.Text = “Hola Mundo” ‘Activa el valor del Texto

Si se omite el nombre de la propiedad, usted puede activar el valor al control.


Cada control tiene una propiedad por default. la propiedad por default para el
TextBox es Text, para el Label es la propiedad Caption:
Text2 = “Activa la propiedad Text del textBox”
Label1 = “Activa la propiedad Caption de la Etiqueta”

I.S.C. Alejandro Guzmán Zazueta 5


a_zazuetag@hotmail.com
Usando el Toolbar

Ejecuta F5
Abrir Proyecto Pega Propiedades F4

Adicionar Forma Cortar Deshacer Parar Buscador Objetos F2

Adicionar Proyecto Salvar Proyecto Buscar Pos. Ventana


Romper
Editor Menú Copiar Repetir Explorador Caja Herramientas
Proyecto

El Toolbar provee rápido acceso a los comandos más frecuentemente usados


en el ambiente de programación. Haga click sobre un botón del toolbar y este
ejecutará la acción representada para éste.

I.S.C. Alejandro Guzmán Zazueta 6


a_zazuetag@hotmail.com
Formas MDI

Un formulario MDI (interfaz de múltiples documentos) es una ventana que actúa


como fondo de una aplicación y es el contenedor de formas que tienen su
propiedad MDIChild establecida en True.

Para crear un objeto MDIForm, elija Agregar formulario (forma) MDI en el menú
Proyecto.

Una aplicación sólo puede tener un objeto MDIForm, pero varias formas
secundarias MDI. Si una forma secundaria MDI tiene menús, la barra de menús
de la forma secundaria reemplazará automáticamente a la barra de menús del
objeto MDIForm cuando la forma secundaria MDI esté activa. Una forma
secundaria MDI minimizado se mostrará como un icono en el MDIForm.

Un objeto MDIForm no puede ser modal.

Los formularios secundarios MDI se diseñan de forma independiente del


MDIForm, pero siempre están contenidos en el MDIForm en tiempo de
ejecución.

Ventana Hija

Una forma hija es una forma común y corriente con la propiedad MDIChild =
true.

I.S.C. Alejandro Guzmán Zazueta 7


a_zazuetag@hotmail.com
Adicionando un Menú

Para adicionar un menú a la forma, haga click en el icono Editor de Menú en el


Toolbar a tiempo de Diseño.

Opciones del cuadro de diálogo

Caption. Le permite escribir el nombre del comando o del menú que desea que
aparezca en la barra de menús o en un menú.

Si desea crear una barra separadora en el menú, escriba un único guión (-) en el
cuadro Caption.
Para dar al usuario acceso a través del teclado a un elemento del menú, escriba
el signo & delante de una letra. En tiempo de ejecución, esta letra aparecerá
subrayada (el signo & no será visible) y el usuario tendrá acceso al menú o al
comando si presiona las teclas ALT y la correspondiente a la letra subrayada. Si
necesita que aparezca en el menú el signo &, deberá escribir dos signos &
consecutivos.

Name. Le permite escribir un nombre de control para el elemento del menú. El


nombre de control es un identificador que sólo se utiliza para tener acceso al
elemento del menú en el código, no aparece en ningún menú. Por ejemplo:
MnuCatalogos
MnuCDivisiones
MnuCEspecialidades
MnuCSalir
MnuContratistas

I.S.C. Alejandro Guzmán Zazueta 8


a_zazuetag@hotmail.com
Index. Le permite asignar un valor numérico que determina la posición del
control en una matriz de controles. Esta posición no tiene ninguna relación con la
ubicación del control en la pantalla.

Shortcut. Le permite seleccionar una tecla de método abreviado para cada


comando.

HelpContextID. Le permite asignar un valor numérico único para el Id. de


contexto.

Checked. Le permite hacer que aparezca inicialmente una marca de


verificación a la izquierda de un elemento del menú. Se utiliza normalmente para
indicar si una opción de alternar está activada o no.

Enabled. Le permite seleccionar si el elemento del menú debe responder a


eventos. Desactive esta opción si desea que el elemento del menú no esté
disponible y aparezca atenuado.
Visible Le permite hacer que un elemento aparezca en el menú.

WindowList. Determina si el control del menú contiene una lista de formularios


secundarios MDI abiertos en una aplicación MDI.

I.S.C. Alejandro Guzmán Zazueta 9


a_zazuetag@hotmail.com
Usando Control CoolBar

El control CoolBar (Comctl332.ocx) permite crear barras de herramientas


configurables por el usuario similares a las de Microsoft Internet Explorer. El
control CoolBar es un control contenedor, capaz de contener otros controles
secundarios. Consta de una o más zonas dimensionables conocidas como
bandas. Cada banda puede albergar un único control secundario.

Para hacer uso de este control deberá agregar el control “Microsoft Windows
Common Controls-3 6.0” en la opción del menú Proyecto y Componentes.

A continuación se indica la secuencia de pasos para crear una barra de


herramientas con el CoolBar:

1. Seleccione el control CoolBar de la caja de herramientas y arrástrelo sobre la


parte superior de la ventana (en forma de rectángulo). La ventana queda
como a continuación se muestra:

como se observa el CoolBar se crea con tres paneles, para este ejercicio
usaremos solo dos.

2. Enseguida saque las propiedades del CoolBar haciendo click derecho sobre
este y en la carpeta de Bandas quite una banda, de manera que solo queden
dos.

3. A continuación agregaremos dos ToolBar, uno sobre cada Banda y


modificaremos las propiedades de las bandas (haciendo click derecho sobre
el CoolBar) para asignarlos en la lista de Child sobre la carpeta de Bandas,
como a continuación se muestra:

I.S.C. Alejandro Guzmán Zazueta 10


a_zazuetag@hotmail.com
cada panel deberá tener asignado su propio Toolbar.

4. Agregue ahora los botones con sus respectivas imágenes a cada Toolbar
haciendo uso del control ImageList.

5. En la propiedad MinWidth podrá colocar el ancho mínimo que le permitirá al


panel, cuando el CoolBar haga un Scroll.

6. En las propiedades del CoolBar, en la carpeta de General podrá asignarle


una imagen al fondo del CoolBar a través de la propiedad Picture.

I.S.C. Alejandro Guzmán Zazueta 11


a_zazuetag@hotmail.com
Archivos más usados en un Proyecto

Archivos de Formas (.Frm y .Frx)


Contenedor para controles y código

Archivos de Clases (.Cls)


Contenedor de código. Plantilla para crear un
objeto a tiempo de ejecución.

Módulos Estándar (.Bas)


Contenedor de código.

Archivo de Recursos (.Res)


Contiene Bitmaps, Iconos, Mensajes.

Los archivos que se usan durante el desarrollo de aplicaciones de Visual Basic


se llaman Project. El Proyecto está creado con los siguientes tipos de archivos:

Archivos de Formas
Cada archivo de formas incluye una descripción de los objetos de la forma y el
código relacionado. Si una forma contiene gráficos, la información de éstos la
salva en un archivo del mismo nombre de la forma pero con extensión .FRX.

Módulos Estándar
Un módulo estándar en Visual Basic contiene solo código. Cualquier forma
puede hacer uso del código contenido en el módulo BAS. La característica de
este código es que se comparte por toda la aplicación. Generalmente son
funciones y procedimientos de propósito general.

Módulos de Clases
Un módulo de clases es una plantilla, a través de la cual se pueden crear objetos
a tiempo de ejecución.

Archivo de Recursos
Cada proyecto puede contener solo un archivo de recursos. Este archivo
contiene Bitmaps, Iconos, Mensajes, y otros datos usados en la aplicación. Este
archivo de recursos hace que los proyectos sean más ligeros. Adicionalmente el
archivo de recursos se puede usar para crear sistemas que presenten los
mensajes en varios idiomas.

I.S.C. Alejandro Guzmán Zazueta 12


a_zazuetag@hotmail.com
Módulo 2: Programación
Eventos vs Procedimientos
• Evento
Se ejecutan de manera automática cuando ocurre
una acción.

Haciendo doble Click en el control abre la ventana de


código.

Para cada control muestran los eventos disponibles


en un combo que se encuentra arriba a la derecha,
en la ventana de código.

• Procedimientos Generales
Se requiere que se invoquen para poder ser
ejecutados.
Pueden ser funciones o procedimientos Sub.

Eventos
Cada control tiene un conjunto de eventos que se pueden usar. Visual Basic
automáticamente invoca a los procedimientos de eventos en respuesta al
teclado, mouse, o acción del sistema.

Procedimientos Generales
Un procedimiento general no es ejecutado si no es invocado. Usted puede crear
un nuevo procedimiento tecleando el encabezado SUB, seguido del nombre del
procedimiento, sobre una línea en blanco en la ventana de código.
Cuando usted invoca un procedimiento, Visual Basic busca el procedimiento en
la forma actual. Si el nombre del procedimiento no es encontrado, Visual Basic
busca el procedimiento en todos los módulos.

Parámetros Byref (Parámetros por Referencia) el valor de este parámetro puede


ser modificado en el procedimiento.

ByVal (Parámetros por Valor) el parámetro no sufre cambios cuando regresa.

Optional (Parámetros Opcionales) indica que el parámetro es opcional, es decir,


que se puede omitir, debe ser el último de la lista de parámetros.

I.S.C. Alejandro Guzmán Zazueta 13


a_zazuetag@hotmail.com
Funciones vs Procedimientos

• Procedimientos Sub
• Este no retorna ningún valor.

Private Sub ActNombre (Nombre As String)

• Invocación

ActNombre ”Mi Nombre”

• Procedimientos Function
• Este retorna un valor

Private Function CalcVentas(s as String) As Integer

• Invocación

I = CalcVentas(s:=”Windows 98”)

Procedimientos Sub
Los procedimientos Sub no retornan ningún valor. Usted invoca un
procedimiento Sub especificando el nombre del procedimiento y enseguida la
lista de parámetros.

Procedimientos Function
Los procedimientos Function regresan un valor. El siguiente procedimiento
recibe un número y regresa el número al cuadrado.

Function Cuadrado(I As Integer) as Integer


Cuadrado = I * I
End Function

Si requiere el valor que regresa la función deberá incluir los parámetros entre
paréntesis.

J = Cuadrado(5)

Si usted omite el paréntesis, el valor que regresa la función es ignorado.

Cuadrado 5

I.S.C. Alejandro Guzmán Zazueta 14


a_zazuetag@hotmail.com
Alcance del Código

• Procedimientos de una Forma (Generales o Eventos)


• Private = Pueden ser invocado solo por la Forma
(Locales).

• Public = El procedimiento es un método de la forma.


Pueden ser llamados desde cualquier parte de la
aplicación (Globales).
FrmPrueba.GetDate

• Procedimientos en un Módulo Estandar


• Private = Pueden ser usados solo en el módulo

• Public = Pueden ser llamados desde cualquier parte


de la aplicación.

Los procedimientos pueden ser declarados como Private o Public

Procedimientos Private pueden ser solo llamados por cualquier


procedimiento que se encuentre en el mismo lugar, sea forma, módulo o
clase.

Los procedimientos Public para una forma vienen siendo sus métodos. El
procedimiento puede ser invocado desde cualquier parte de la aplicación,
especificando el nombre de la Forma y el nombre del procedimiento.
Los procedimientos Public en un módulo están disponibles en toda la
aplicación y pueden ser invocados especificando solo el nombre del
procedimiento.

El siguiente ejemplo declara un procedimiento Public


Public Sub miProcedimiento()
...
End Sub

Si su procedimiento está declarado dentro de una forma, usted lo deberá invocar


así: FrmPrueba.miProcedimiento

Si usted declara el procedimiento en un módulo estándar, usted debe invocar el


procedimiento así:
miProcedimiento
Como se observa ya no requiere el nombre del objeto que lo contiene.

I.S.C. Alejandro Guzmán Zazueta 15


a_zazuetag@hotmail.com
Uso del Explorador de Objetos (Object Browser), para ver Procedimientos

El Object Browser (acceso directo con F2) es una ventana en la que se pueden
ver todos los procedimientos que se encuentran en su aplicación, de igual
manera se pueden ver todos los objetos que proveen otras aplicaciones.

Tipos de Datos
Tipos de Datos en Visual Basic
I.S.C. Alejandro Guzmán Zazueta 16
a_zazuetag@hotmail.com • Use el tipo de dato apropiado para cada situación
• Variant es el tipo de dato por default.
Tipos de Datos en Visual Basic
El tipo de dato de una variable determina el tipo de información que la variable
puede almacenar y un rango de posibles valores.
Si usted no provee el tipo de dato cuando declara una variable, la variable
automáticamente obtiene el tipo Variant. El tipo de dato Variant puede
almacenar valores nulos, numéricos, fecha/tiempo, cadena de caracteres. Sin
embargo, los tipos de dato Variant requieren más memoria que los otros tipos de
dato. Si usted desea crear aplicaciones rápidas no use variables de tipo Variant.

Tipo de Datos:

Variables de tipo entero (Integer), entero largo (long).

Las variables tipo Integer se almacenan como números de 16 bits (2


bytes) con valores que van de -32.768 a 32.767

Las variables tipo Long (entero largo) se almacenan como números con
signo de 32 bits (4 bytes) con un valor comprendido entre –2,147,483,648
a 2,147,483,647.

Variables de tipo precisión simple (single), precisión doble (double)

I.S.C. Alejandro Guzmán Zazueta 17


a_zazuetag@hotmail.com
Las variables tipo Single (coma flotante y precisión simple) se almacenan
como números de punto flotante de 32 bits (4 bytes) con valores que van
de –3.402823E38 a –1.401298E-45 para valores negativos y de
1.401298E-45 a 3.402823E38 para valores positivos.

Las variables tipo Double (coma flotante y precisión doble) se almacenan


como números de punto flotante de 64 bits (8 bytes) con valores de
1.79769313486232E308 a –4.94065645841247E-324 para valores
negativos y de 4.94065645841247E-324 a 1.79769313486232E308 para
valores positivos.

Variables Alfanuméricas (String)

Este tipo de variables pueden almacenar tanto números como letras.

Variables tipo Boolean

Las variables tipo Boolean se almacenan como números de 16 bits (2


bytes), pero sólo pueden ser True o False.

Cuando se convierten a tipo Boolean otros tipos numéricos, 0 se convierte


en False, y el resto de los valores se convierten en True. Cuando los
valores tipo Boolean se convierten a otros tipos de datos numéricos,
False se convierta en 0 y True se convierte en -1.

Alcance de las Variables


Variables declaradas dentro de un Procedimiento
• Son
I.S.C. Alejandro Guzmán Zazueta
locales al procedimiento; no pueden ser públicas. 18
a_zazuetag@hotmail.comDim iPrueba as Integer

Variables declaradas en la sección de General Declarations de la forma


El alcance de las variables se refiere a las áreas del programa en las cuales es
visible la variable. Hay cuatro niveles diferentes de alcance, correspondientes a
los cuatro lugares diferentes donde usted puede declarar variables: nivel
procedimiento, variables estáticas dentro de los procedimientos, nivel forma y
nivel módulo estándar.

El primer lugar para declarar variables, con el enunciado Dim, es en el nivel de


procedimiento. En Visual Basic existen dos clases de procedimientos: los
procedimientos Sub y los procedimientos Function (aprenderá de ellos más
adelante). Las variables declaradas en los procedimientos son locales para ese
procedimiento. Siendo accesibles solamente por los procedimientos en los que
están declaradas, las variables locales tienen la visibilidad más baja y el alcance
más estrecho.

Una cosa importante por recordar sobre las variables es que no sobreviven al
procedimiento en el cual están definidas. Cuando un procedimiento termina,
todas sus variables locales se remueven de la memoria, lo cual es bueno desde
el punto de vista de conservación de recursos. Sin embargo, esto significa que
las variables locales de un procedimiento son reinicializadas cada vez que se
llama el procedimiento. En otras palabras, usted no debe esperar que una
variable local conserve su valor entre llamadas al procedimiento.

Módulo 3: Validación de Entrada de Datos


I.S.C. Alejandro Guzmán Zazueta 19
a_zazuetag@hotmail.com
Usando Propiedades para Restringir Entrada de Datos

.Maxlength = 10

.Locked = True

.PasswordChar

.Default = True
.Cancel = True

Propiedad MaxLength
La propiedad MaxLength determina la máxima longitud de texto permitido en un
TextBox. El sistema emite una señal bip cuando el usuario trata de teclear más
de la longitud permitida.

Propiedad PasswordChar
La propiedad PasswordChar determina el caracter que va a ser desplegado
cuando el usuario teclee un texto en el TextBox. Cualquier caracter puede ser
usado, la mayoría de las aplicaciones basadas en Windows usan el asterisco (*).
Esta propiedad no afecta la propiedad Text; la propiedad Text contiene
exactamente lo que el usuario tecleó.

Propiedad Locked
La propiedad Locked determina si el usuario puede modificar los datos dentro de
un TextBox. Si la propiedad Locked es verdadera, el usuario solo podrá ver los
datos dentro del TextBox.

Propiedad Default
Si la propiedad Default de un CommandButton es verdadera, el evento Click
para este botón es ejecutado cuando el usuario presiona la tecla de Enter. Solo
un CommandButton en la forma puede tener activada esta propiedad.

Propiedad Cancel
Si la propiedad Cancel de un CommandButton es verdadera, el evento Click
para este botón es ejecutado cuando el usuario presiona la tecla de ESC. Solo
un CommandButton en la forma puede tener activada esta propiedad.

Usando el Evento KeyPress para modificar lo Tecleado

I.S.C. Alejandro Guzmán Zazueta 20


a_zazuetag@hotmail.com
Private Sub Text1_KeyPress(KeyAscii As Integer)
KeyAscii = Asc(UCase(Chr(KeyAscii)))
End Sub

ƒ El evento KeyPress ocurre cuando el usuario teclea un


caracter ASCII.

ƒ El KeyAscii = 8 si el usuario presiona la tecla de


BackSpace.

El evento KeyPress se dispara siempre que el usuario teclee un caracter ASCII


estándar. Esto no incluye caracteres especiales, teclas de función, flechas o
tecla Del. Para responder a estas teclas se usan los eventos KeyDown y
KeyUp. Respondiendo al evento KeyPress usted puede restringir los caracteres
o transformar estos cuando se teclean.

El siguiente ejemplo restringe a que un TextBox solo reciba números.

Private Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer)


If KeyAscii = 13 Then ‘ Salta de una caja de textos a otra, siendo arreglo se TextBox
If Index = 1 Then
Text1(0).SetFocus
Else
Text1(Index + 1).SetFocus
End If
Else
'Valida si es un Entero en la caja de texto Text1(0)
If Index = 0 Then Numero KeyAscii, Text1(Index), Entero
'Valida si es un real en la caja de texto Text1(1)
If Index = 1 Then Numero KeyAscii, Text1(Index), Real
End If
End Sub

Como se observa el ejemplo anterior hace uso de un procedimiento de nombre


Numero para validar los números reales o enteros, a continuación se muestra el
código:

I.S.C. Alejandro Guzmán Zazueta 21


a_zazuetag@hotmail.com
' Procedimiento que valida si un numero es real o entero
Public Sub Numero(KeyAsc As Integer, texto As Object, Tipo As TipoNumero)
Dim car As String * 1
car = Chr(KeyAsc)
If Tipo = Entero Then
If (car >= "0" And car <= "9") Or KeyAsc = vbKeyBack Or car = "-" Then
If car = "-" And Len(texto) >= 1 And Mid(texto, 1, 1) = "-" Then
KeyAsc = 0
Beep
End If
Else
KeyAsc = 0
Beep
End If
End If
If Tipo = Real Then
If (car >= "0" And car <= "9") Or car = "." Or car = "-" Or KeyAsc = vbKeyBack Then
If car = "." Then
If InStr(1, texto, ".") > 0 Then
KeyAsc = 0
Beep
End If
End If
If car = "-" And Len(texto) >= 1 And Mid(texto, 1, 1) = "-" Then
KeyAsc = 0
Beep
End If
Else
KeyAsc = 0
Beep
End If
End If
End Sub

I.S.C. Alejandro Guzmán Zazueta 22


a_zazuetag@hotmail.com
Usando KeyUp y KeyDown para atrapar ASCII no válidos

Los eventos KeyUp y KeyDown son disparados cuando hay actividad en el


teclado. Cada KeyUp o KeyDown proveen un código único para cada tecla del
teclado.

El siguiente ejemplo usa el evento KeyDown para checar la tecla F1.

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)


If KeyCode = vbKeyF1 Then
MsgBox "Usted presionó F1 del TextBox"
End If
End Sub

Para ver una lista de todas las constantes de Visual Basic, abra el Object
Browser y seleccione de la lista de librerías VBRUN, entonces seleccione
Globals de la lista Classes/modules.

I.S.C. Alejandro Guzmán Zazueta 23


a_zazuetag@hotmail.com
Atrapando Códigos de Tecla a Nivel Forma

Si la forma tiene la propiedad KeyPreview en verdadero


ƒ La forma recibe los eventos de códigos de tecla antes que los
controles.

Propiedad KeyPreview
La forma tiene la propiedad KeyPreview la cual determina si la forma recibe los
eventos del teclado antes que los controles. Si la propiedad KeyPreview es
verdadera, la forma recibe el evento del teclado antes que los controles de ésta.
Si la propiedad KeyPreview de la forma es falsa, la forma no recibe los eventos
del teclado.

El siguiente ejemplo despliega un mensaje cuando el usuario presiona la función


F2.

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)


If KeyCode = vbKeyF1 Then
MsgBox "Usted presiona F1 de la Forma"
End If
End Sub

Cuando la propiedad KeyPreview de la forma se activa en True, la forma


reconoce los eventos del teclado antes que los controles de ésta, pero los
eventos actúan también en los controles.

I.S.C. Alejandro Guzmán Zazueta 24


a_zazuetag@hotmail.com
Habilitando el Botón de Aceptar

Activar la propiedad de la forma KeyPreview en True


ƒ Use For ... Each para recorrer todos los controles de la forma.

Su programa podría proveer condiciones visuales sobre los comandos que


están disponibles. Por ejemplo, si usted requiere que el usuario llene todos los
campos antes de seleccionar el botón de aceptar, usted solo debería habilitar el
botón de aceptar hasta que el usuario haya tecleado información en todos los
campos.

El siguiente ejemplo muestra un ciclo sobre la colección de Controles para


validar cada control. La colección de controles es una colección predefinida por
Visual Basic y contiene todos los controles que se encuentran en la forma.

Private Sub Form_KeyUp(KeyCode as Integer, Shift as Integer)


Dim ControlAct as Control
For Each ControlAct in Controls
If TypeOf ControlAct is TextBox Then
If ControlAct = “” Then
Command1.Enabled = False
Exit Sub
End If
End If
Next
Command1.Enabled = true
End Sub

I.S.C. Alejandro Guzmán Zazueta 25


a_zazuetag@hotmail.com
Usando el control DateTimePicker
Para que este control aparezca en la caja de herramientas deberá agregarlo en
los componentes del proyecto “Microsoft Windows Common Controls–2 6.0”
Utilice el control DateTimePicker para proporcionar un campo de fecha con
formato que facilite la selección de la fecha. Además, los usuarios pueden
seleccionar una fecha a partir de una interfaz de calendario desplegable similar a
la de un control MonthView.
En el modo Calendario desplegable (predeterminado) se muestra al usuario un calendario
desplegable en el que puede seleccionar una fecha.

El evento Chage puede usarse para validar cuando el usuario haya efectuado un
cambio a la fecha, en coordinación con la propiedad Value para acceder al valor.

I.S.C. Alejandro Guzmán Zazueta 26


a_zazuetag@hotmail.com
Microsoft Tabbed

Para disponer de este control en el entorno Visual Basic, agréguelo en la opción


del menú Proyecto – Componentes y seleccione el control “Microsoft Tabbed
Dialog Control 6.0”
El control Microsoft Tabbed Dialog proporciona un método sencillo para
presentar varios cuadros de diálogo o pantallas de información en un único
formulario utilizando la misma interfaz que aparece en numerosas aplicaciones
comerciales para Microsoft Windows.
El control Tabbed Dialog ofrece un grupo de fichas, cada una de las cuales
actúa como un contenedor para otros controles. Sólo hay una ficha activa al
mismo tiempo, que muestra los controles que contiene y oculta los de las fichas
restantes.

Definir el número de fichas y filas del cuadro de diálogo

I.S.C. Alejandro Guzmán Zazueta 27


a_zazuetag@hotmail.com
Para definir el número de fichas y filas del cuadro de diálogo, establezca las
propiedades Tab y TabsPerRow. Por ejemplo, si desea crear un cuadro de
diálogo que contenga doce fichas, establezca en ‘12’ la opción Número de
fichas y en ‘4’ la opción TabsPerRow. De este modo creará un cuadro de
diálogo con tres filas de cuatro fichas cada una. De forma predeterminada, el
número de fichas es 3.
Cuando se ha establecido el número de fichas y de filas, cada ficha se indexa
para poder seleccionarlas individualmente. Por ejemplo, puede seleccionar
fichas individuales en la opción Ficha actual para cambiar la propiedad
TabCaption. La indexación de las fichas comienza por cero (0).

A través de la propiedad Tab del SSTab puede saber en que Tab se encuentra
por ejemplo:
Private Sub SSTab1_Click(PreviousTab As Integer)
MsgBox SSTab1.Tab
End Sub

Activar y desactivar fichas en tiempo de ejecución


Según la funcionalidad de la aplicación o de un cuadro de diálogo específico que
ha creado, puede que desee desactivar algunas fichas en situaciones
determinadas. Para ello puede usar la propiedad TabEnabled, que permite
activar y desactivar fichas individuales. Cuando una ficha está desactivada, el
texto que contiene aparece atenuado y el usuario no puede seleccionarla. Por
ejemplo:

SSTab1.TabEnabled(2) = False

La propiedad TabEnabled especifica el número de ficha y, después, la desactiva


estableciendo su valor en False.
Nota Puede usar la propiedad Enabled para activar o desactivar todo el control
Tabbed Dialog.

I.S.C. Alejandro Guzmán Zazueta 28


a_zazuetag@hotmail.com
Usando el Control Animation
Para que este control aparezca en la caja de herramientas deberá agregarlo en
los componentes del proyecto “Microsoft Windows Common Controls–2 6.0”
El control Animation le permite crear botones que presenten animaciones, como
archivos .avi. El control sólo puede reproducir archivos AVI que no tengan
sonido. Además, el control Animation sólo puede reproducir archivos .avi sin
comprimir
Si intenta cargar un archivo .avi que incluya sonido o con un formato no
compatible con el control, se producirá el error 35752.
Un ejemplo de este control es la barra de progreso de copia de archivos de
Windows 95, que utiliza un control Animation. Las hojas de papel "vuelan" de
una carpeta a otra mientras se ejecuta la operación de copia.
A continuación se muestra los pasos para crear una animación con un AVI:
1. En una ventana coloque el control Animation como se muestra a continuación:

2. Enseguida coloque el siguiente código en la ventana


‘ En el evento Load se carga el AVI al control y se Manda Ejecutaror
Private Sub Form_Load()
Animation1.Open (App.Path & "\Key.Avi")
Animation1.AutoPlay = True
End Sub

3. A continuación se muestra como queda la ventana:

I.S.C. Alejandro Guzmán Zazueta 29


a_zazuetag@hotmail.com
Módulo 4: Acceso a Base de Datos
Usando Objetos de Datos ActiveX (ADO)

♦ Objetos de Datos ActiveX (ADO)

♦ Objetos de Datos Remotos (RDO)

♦ Objetos de Acceso a Datos (DAO)

¿Por qué hay tres interfases de acceso a datos en Visual Basic Ado,
Rdo y Dao?
La tecnología de acceso a datos evoluciona constantemente y cada una de
estas tres interfaces corresponde a un estado de la evolución. La tecnología más
reciente es ADO, con un modelo de objetos más sencillo (y aún más flexible)
que RDO o DAO. Para sus nuevos proyectos debe usar ADO como la interfaz de
acceso a datos.
¿Porqué usar ADO?
La interfaz ADO se ha diseñado como una interfaz de nivel de aplicación fácil de
usar para el más nuevo y eficaz paradigma de acceso a datos de Microsoft, OLE
DB. OLE DB proporciona un acceso de alto rendimiento a cualquier origen de
datos, incluidos bases de datos relacionales y no relacionales, correo electrónico
y sistemas de archivos, texto y gráficos, objetos de negocios personalizados y
mucho más. La implementación de ADO genera una cantidad mínima de
transferencias a través de la red en escenarios clave de Internet y utiliza un
número mínimo de capas entre el servidor y el origen de datos para proporcionar
una interfaz compacta de alto rendimiento. Una metáfora habitual es hacer
referencia a ADO como la interfaz de automatización de OLE. Además ADO
utiliza convenciones y funciones similares a las de DAO y RDO, con una
semántica simplificada que facilita su aprendizaje.

ODBC (Open DataBase Connectivity “Conectividad Abierta de Base de Datos”)


Protocolo estándar que permite que las aplicaciones se conecten con diferentes
servidores o archivos de base de datos. Los controladores ODBC utilizados por
el administrador de ODBC permiten acceso a SQL Server y otros orígenes de
datos, incluyendo Access 7, Archivos DBF etc., estos los distribuyen los
fabricantes.

I.S.C. Alejandro Guzmán Zazueta 30


a_zazuetag@hotmail.com
Método Open (Connection) ADO
Establece una conexión a una Base de Datos a través de ODBC.

Sintaxis

conexión.Open ConnectionString, UserID, Password

Parámetros
ConnectionString Opcional. Es un string conteniendo información de la
conexión.
UserID Opcional. Es un string conteniedo el nombre del
usuario con el que desea establecer la conexión.
Password Opcional. Es un string conteniendo el password que
se usará para establecer la conexión.

El siguiente ejemplo muestra una conexión a un ODBC de nombre Inventa:


Public Cn As ADODB.Connection

Public Function Conectado(sUsuario As String, sPassword As String) as Boolean


On Error GoTo senal
Set Cn = New ADODB.Connection
Cn.ConnectionString = "DRIVER=SQL Server;SERVER=(local);UID=” & sUsuario & “;PWD=”
& sPassword & “;DATABASE=pubs”
Cn.Open
Conectado = True
Exit Function
senal:
Conectado = False
MsgBox Err.Description
Err.Clear
End Function

Cuando haya concluido las operaciones con la conexión, use el método Close
para liberar los recursos asociados con el sistema.

Para este ejemplo

Cn.Close

I.S.C. Alejandro Guzmán Zazueta 31


a_zazuetag@hotmail.com
Método Execute (Connection) ADO
Ejecuta un query específico (sentencia de SQL), procedimiento almacenado o un
texto específico a la base de datos.

Sintaxis
Cuando el comando no regresa ningún registro usar:

conexión.Execute CommandText, RecordsAffected, Options

Cuando el comando regresa registros o renglones de la base de datos


(consulta):

Set recordset = conexión.Execute (CommandText, RecordsAffected,


Options)

Regresa Valores
Los renglones los regresan en un RecordSet.

Parámetros

CommandText Es un string conteniendo la sentencia SQL, nombre de una


tabla, procedimiento almacenado o un texto que se desea
ejecutar.

RecordsAffected Parámetro opcional. Es una variable de tipo Long (entero


largo) en la cual regresa el número de registros afectados
por la operación.

Options Parámetro opcional. Opción que indica cómo se deberá


evaluar el CommandText. A continuación se muestra la
tabla de posibles valores:

adCmdText Indica que el CommandText lo deberá evaluar textualmente.


Indica que el CommandText lo evalúe como el nombre de una
AdCmdTable
tabla.
Indica que el CommandText lo evalúe como un procedimiento
AdCmdStoredProc
almacenado.
Indica que el CommandText contiene un comando no
AdCmdUnknown
conocido.

I.S.C. Alejandro Guzmán Zazueta 32


a_zazuetag@hotmail.com
Ejemplo: Cuando el comando regresa registros o renglones de la base de datos
(consulta)

Dim Rs As ADODB.Recordset

Set Rs = New ADODB.Recordset


Set Rs = Cn.Execute("select * from Familias Where cveFamilia > 1", , adCmdText)
Do Until rs.EOF()
MsgBox Rs(0) & " " & Rs(1) & " " & Rs!NombreFamilia
Rs.MoveNext
Loop
Rs.Close
Set Rs = Nothing

Ejemplo: Cuando el comando regresa no registros

Dim iNum As Long

Cn.Execute "Insert into Familias (ClaveEmpresa,CveFamilia,NombreFamilia)


Values (1,7,'kjgkgkjgkjg')", iNum, adCmdText
MsgBox iNum

A continuación se detalla la sintaxis de las sentencias de SQL para insertar,


modificar y borrar información:

Sintaxis INSERT (Insertar registro(s) en una tabla de la Base de Datos)


INSERT INTO NombreTabla [(campo1[, campo2[, ...]])] VALUES (valor1[, valor2[, ...])

Sintaxis UPDATE (Modifica registro(s) de una tabla de la Base de Datos )


UPDATE NombreTabla SET Campo1=nuevovalor[,Campo2=nuevoValor],[…]
WHERE Condición

Sintaxis DELETE (Borra registro(s) de una tabla de la Base de Datos)


DELETE FROM NombreTabla WHERE Condición

I.S.C. Alejandro Guzmán Zazueta 33


a_zazuetag@hotmail.com
Método Open de un RecordSet de ADO

Sintaxis

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Parámetros

Source: Nombre de variable de objeto Command válido, una sentencia Select


de SQL, un nombre de tabla, una llamada a un procedimiento almacenado o el
nombre de archivo de un Recordset.

ActiveConnection: Nombre de variable de objeto Connection válido o un


String que contiene parámetros ConnectionString.

CursorType: Opcional. Un valor que determina el tipo de cursor que el


proveedor debe usar al abrir el Recordset. Puede ser una de las siguientes
constantes:

Constante Descripción
adOpenForwardOnly Cursor de tipo Forward-only. Predeterminado. Idéntico a un
cursor estático, excepto sólo permite desplazarse hacia delante
en los registros. Esto mejora el rendimiento en situaciones en
las que sólo se quiere pasar una vez por cada registro.

adOpenKeyset Cursor de conjunto de claves. Igual que un cursor dinámico,


excepto que no se pueden ver los registros que agregan otros
usuarios, aunque los registros que otros usuarios eliminan son
inaccesibles desde su conjunto de registros. Los cambios que
otros usuarios hacen en los datos permanecen visibles.

adOpenDynamic Cursor dinámico. Las incorporaciones, cambios y eliminaciones


que hacen otros usuarios permanecen visibles, y se admiten
todo tipo de movimientos entre registros, a excepción de los
marcadores si el proveedor no los admite.

adOpenStatic Cursor estático. Una copia estática de un conjunto de registros


que se puede usar para buscar datos o generar informes. Las
incorporaciones, cambios o eliminaciones que hacen otros
usuarios no son visibles.

LockType: Determina el tipo de bloqueo (concurrencia) que debe usar el


proveedor al abrir el Recordset. Puede ser una de las siguientes constantes:

Constante Descripción

I.S.C. Alejandro Guzmán Zazueta 34


a_zazuetag@hotmail.com
adLockReadOnly Predeterminado. Sólo lectura—no puede modificar
los datos.

adLockPessimistic Bloqueo pesimista, registro a registro: el proveedor


hace lo necesario para asegurar la modificación
correcta de los registros, generalmente bloqueando
registros en el origen de datos durante el proceso
de modificación.

adLockOptimistic Bloqueo optimista, registro a registro: el proveedor


usa bloqueo optimista, bloqueando registros sólo
cuando llama al método Update.

adLockBatchOptimistic Actualizaciones optimistas por lotes: requerido para


el modo de actualización por lotes como
contraposición al modo de actualización inmediata.

El valor de adLockPessimistic no es compatible si la propiedad CursorLocation


está establecida a adUseClient. Si se establece un valor no compatible, no se
producirá un error; en su lugar, se usará el LockType compatible más próximo

Localización del Cursor (CursorLocation)


Establece o devuelve la posición de un motor de cursores usando alguna de las
siguientes constantes:
Constante Descripción

adUseClient Usa cursores del lado del cliente suministrados por una
biblioteca de cursores locales. Los motores de cursores
locales admitirán a menudo muchas características que
los cursores proporcionados por controladores no
admitirán; por tanto, el uso de esta configuración puede
proporcionar una ventaja con respecto a características
que serán habilitadas.

adUseServer Predeterminado. Usa cursores suministrados por el


controlador o por el proveedor de datos. Estos cursores
son, en ocasiones, muy flexibles y conceden un margen
de sensibilidad adicional a los cambios realizados por
otros usuarios en el origen de datos.

I.S.C. Alejandro Guzmán Zazueta 35


a_zazuetag@hotmail.com
Options: Cuenta con las mismas propiedades del Options del cn.Execute

Ejemplo: Rutina para cargar el resultado de un Select en un RecordSet

'Carga un registro en un RecordSet, en modo de bloqueo pesimista


PUBLIC Sub CargaRecordSet(ByVal SQuery As String, Rs as RecordSet)
On Error GoTo AtrapaErr
Set Rs = New ADODB.Recordset
Rs.CursorLocation = adUseServer
Rs.Open SQuery, cn, adOpenDynamic, adLockPessimistic
Exit Sub
AtrapaErr:
MsgBox "El Registro está bloqueado por otro Usuario, intenta más tarde", vbOKOnly +
vbInformation, "Error de Acceso a Base de Datos"
Err.Clear
End Sub

Ejemplo: para modificar un RecordSet


Rs!tiposeguridadpk = iTipSeg 'Carga la llave al buffer del Rs
Rs!desctiposeguridad = Text1(0) ' Carga la descripción del tipo de seguridad al Buffer del Rs
Rs.Update ‘Actualiza el buffer a la base de datos

Ejemplo: Para agregar un registro a la Base de Datos a través de un RecordSet.


Rs.AddNew 'Agrega un registro en blanco a la base de datos
Rs!tiposeguridadpk = iTipSeg 'Carga la llave al buffer del Rs
Rs!desctiposeguridad = Text1(0) ' Carga la descripción del tipo de seguridad al Buffer del Rs
Rs.Update ‘Actualiza el buffer a la base de datos

I.S.C. Alejandro Guzmán Zazueta 36


a_zazuetag@hotmail.com
Módulo 5: Controles que se Llenan con
Información de la Base de Datos
ComboBox

ƒ Método Combo1.AddItem Elemento


Adiciona un elemento al ComboBox

ƒ Propiedad Combo1.NewIndex
Devuelve el índice del último elemento agregado a un control
ComboBox.

ƒ Propiedad Combo1.ItemData(índice) = llave


Devuelve o establece un número llave específico para cada
elemento de un control ComboBox.

ƒ Método Combo1.Clear
Borra el contenido de los controles ComboBox.

ƒ Propiedad Combo1.ListIndex
Devuelve o establece el índice del elemento seleccionado
actualmente en el control.

ƒ Private Sub Combo1_Click()


Llave = Combo1.ItemData(Combo1.ListIndex)
End Sub
Este código pertenece al evento click del ComboBox y regresa la
llave del elemento que se adicionó.

Es un control que permite a los usuarios presentar catálogos y hacer una


selección sobre ellos.

Elemento Llave

Elemento – Es el texto
que aparece dentro del Llave – Generalmente es la
ComboBox. Es la llave primaria del catálogo
información que se desplegado. Esta no se
puede ver. visualiza en el combo.

I.S.C. Alejandro Guzmán Zazueta 37


a_zazuetag@hotmail.com
A continuación se presenta un ejemplo de un llenado de un combo con su llave
primaria en un ItemData:

Public Sub llenacombo(ByRef combo As ComboBox, Sentencia As String)


Dim indice As Integer
Dim Rs As ADODB.Recordset

Set Rs = New ADODB.Recordset


Set Rs = Cn.Execute(Sentencia, , adCmdText)
combo.Clear
If Not Rs.EOF Then
While Not Rs.EOF
combo.AddItem Rs(1)
indice = combo.NewIndex
combo.ItemData(indice) = Rs(0)
Rs.MoveNext
Wend
combo.ListIndex = 0
End If
Rs.Close
Set Rs = Nothing
End Sub

El llamado de este procedimiento puede estar en cualquier parte de la aplicación


porque es público. A continuación se presenta un ejemplo del llenado del
combo1 con la tabla de familias:

llenacombo Combo1, "select CveFamilia,NombreFamilia from Familias"

Cuando se requiere posicionar el ComboBox en un elemento determinado


usando la llave que se tiene en el ItemData use en siguiente Procedimiento:

' Mueve el combo a la llave que se le indique (esta se encuentra en el ItemData)


Public Sub BuscaEnCbo(ByRef cbo As ComboBox, ByVal llave As Long)
cbo.ListIndex = 0
Do While cbo.ListIndex < cbo.ListCount And cbo.ItemData(cbo.ListIndex) <> llave
cbo.ListIndex = cbo.ListIndex + 1
Loop
End Sub

I.S.C. Alejandro Guzmán Zazueta 38


a_zazuetag@hotmail.com
ListView
ƒ Para poder tener acceso al control del ListView primero adicione el control “Microsoft
Windows Common Control X.n” en la Opción de Componentes del menú de Project.

• Evento ColumnClick
' Evento ColumnClick, se dispara cuando el usuario hace click
' en los encabezados del ListView con el fin de que se ordene por
' por esa columna.
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As ColumnHeader)
If ListView1.SortOrder = lvwAscending Then
ListView1.SortOrder = lvwDescending
Else
ListView1.SortOrder = lvwAscending
End If
ListView1.SortKey = ColumnHeader.Index - 1
End Sub
Este evento unido con la propiedad Sorted en true hacen que los registros del ListView se
puedan ordenar haciendo click en las columna de éste.

ƒ Private Sub ListView1_ItemClick(ByVal Item As ListItem)


Text1(1).Text = Item
Text1(0).Text = ListView1.SelectedItem.SubItems(1)
.

El control ListView muestra elementos en una de cuatro vistas diferentes.


Puede organizar los elementos en columnas con o sin encabezados, así
como mostrar iconos y texto juntos.
Configurando el ListView
1. Saque las propiedades del ListView con el click derecho y en la ceja de
General en el concepto de View seleccione 3- lvwReport.

I.S.C. Alejandro Guzmán Zazueta 39


a_zazuetag@hotmail.com
2. Este control se combina con ImageList. El ImageList almacena los iconos
que se desplegarán en el ListView. Para relacionar el ListView con el imageList
pase a la siguiente ceja que es Lista de Imágenes y déjela como se muestra
en la siguiente figura:

3. Ahora muévase a la ceja de Orden y habilite el parámetro de Sorted.


2. Enseguida procederemos a insertar los encabezados de las columnas del
ListView por lo que ubíquese en la siguiente ceja y proceda a insertar las
columnas como lo muestra la figura:

Las columnas que no quiera que se muestren en el ListView en el ancho


(width) asignarles cero.

Para este ejemplo a la Clave de la Familia se le asignó cero en su ancho para


ocultarla.

I.S.C. Alejandro Guzmán Zazueta 40


a_zazuetag@hotmail.com
A continuación se muestra como se ve el ListView

El ListView se puede presentar de 4 maneras diferentes:

· Iconos grandes (estándar)


· Iconos pequeños
· Lista
· Informe

Modificando la propiedad View puede obtener las diferentes presentaciones:

ListView1.View = lvwSmallIcon

ListView1.View = lvwList

ListView1.View = lvwReport

ListView1.View = lvwIcon

Cada una de estas provoca un efecto visual diferente del ListView.

I.S.C. Alejandro Guzmán Zazueta 41


a_zazuetag@hotmail.com
A continuación se muestra un procedimiento genérico para llenar un Listview con
información, asignándole el primer icono de ImageList:

' Procedimiento que llena un ListView


Public Sub llenaListView(ByRef list_View As ListView, SQuery As String, Optional llave As String,
Optional iNumIcono As Integer)
Dim itmX As ListItem
Dim Rs1 As ADODB.Recordset
Dim iContador As Integer
Set Rs1 = New ADODB.Recordset
Set Rs1 = cn.Execute(SQuery)
list_View.ListItems.Clear
If iNumIcono = 0 Then iNumIcono = 1
Do Until Rs1.EOF()
iContador = 0
Set itmX = list_View.ListItems.Add(, , RTrim(Rs1(iContador)), 1, iNumIcono)
For iContador = 1 To (Rs1.Fields.Count - 1)
If Rs1(iContador) = "01/01/1900" Then
itmX.SubItems(iContador) = ""
Else
itmX.SubItems(iContador) = nulos(Rs1, iContador)
End If
Next iContador
Rs1.MoveNext
Loop
Set Rs1 = Nothing
End Sub

' Funcion Nulos para validar que alguna columna del Listview, no contenga valores Null
Public Function nulos(ResultSet As Recordset, iIndice As Integer, Optional esNumero As
Boolean) As String
If IsNull(ResultSet(iIndice)) Then
If esNumero Then
nulos = 0
Else
nulos = ""
End If
Else
nulos = Trim(ResultSet(iIndice))
End If
End Function

I.S.C. Alejandro Guzmán Zazueta 42


a_zazuetag@hotmail.com
Módulo 6: Errores
Verificando un Error

ƒ Err es un objeto con propiedades y métodos.

ƒ Propiedades
Number
Description
Source

Métodos
Raise
Clear

Err es un Objeto
Err es un objeto que contiene información sobre el error que ha ocurrido. Este
tiene propiedades y métodos que usted puede verificar cuando un error ocurre,
limpiar el valor de un error, o generar un error.

Propiedades
La propiedad Number es un entero que indica el último error ocurrido.
Cheque el valor de Err.Number para determinar qué error ocurrió.

La propiedad Description contiene un string con la descripción del error.

La propiedad Source contiene el nombre del objeto de tipo aplicación que


generó el error.

Método
El método Clear limpia un error.

El método Raise genera un error.

I.S.C. Alejandro Guzmán Zazueta 43


a_zazuetag@hotmail.com
Habilitando el Atrapar Errores

ƒ El atrapado de errores sólo es válido por procedimiento.

ƒ On Error GoTo Etiqueta


On Error GoTo ChecaError

ƒ Ignorando el error – continua el proceso.


On Error Resume Next

ƒ Resume. Regresa a la instrucción que generó el error.

ƒ Resume Next. Regresa a la siguiente línea donde se generó el


error.

ƒ Resume inicioFuera. Regresa a una línea determinada o


etiqueta.

ƒ Si no existe la instrucción Resume, el procedimiento termina.

La instrucción On Error habilita el atrapar errores y especifica dónde debe


seguir la ejecución cuando un error ocurre.
La instrucción On Error Resume Next causa que un error sea ignorado. Si el
error ocurre a tiempo de ejecución, el proceso continua con la siguiente línea.

Ejemplo:

Private Sub Command1_Click()


On Error GoTo atrapaError
MsgBox "Antes del error"
Err.Raise 2500, , "Ejemplo de Error" ‘ Genera un error
MsgBox "Siguiente linea despues del error"
Exit Sub
atrapaError:
MsgBox Err.Number & " " & Err.Description
Resume Next
End Sub

I.S.C. Alejandro Guzmán Zazueta 44


a_zazuetag@hotmail.com
Módulo 7:Generación de Reportes
Reportes (Data Report)
Para la elaboración de reportes se hace a través del Data-Report. A
continuación se muestran los pasos para su elaboración:

1. Establecer una conexión a la base de datos. Del menú elija Proyecto y


seleccione Mas Diseñadores Activex y enseguida Enviroment, se
presentará una ventana como la siguiente:

2. Enseguida seleccione Connection1 y saque sus propiedades con el click


derecho del mouse. Enseguida aparece la siguiente ventana:

En la ceja de Conexión y en el parámetro de Usar el nombre del Origen de


Datos, seleccionar el nombre del ODBC para la base de datos, en caso de ser

I.S.C. Alejandro Guzmán Zazueta 45


a_zazuetag@hotmail.com
una base de datos que valide algún usuario puede especificar el usuario y
password y enseguida presionar el botón de aceptar.

3. Enseguida seleccione Connection1 y con el click derecho del mouse


seleccione agregar comando. Enseguida aparece la siguiente ventana:

Ahora teniendo seleccionado el Command1 saque las propiedades con el click


derecho del mouse apareciendo la siguiente ventana:

En esta en parámetro Objeto de base de datos seleccione Tabla y en el


Nombre del objeto, el nombre de la tabla con la que desea hacer el reporte. En
caso de que el reporte se tenga que obtener de varias tablas seleccione
Instrucción SQL y teclee el query en el recuadro de la parte inferior. Una vez
efectuado esto presione el botón de aceptar.

4. Haciendo Click en el más del Command1 se presentará la siguiente ventana:

I.S.C. Alejandro Guzmán Zazueta 46


a_zazuetag@hotmail.com
como se observa en el Command1 se despliegan los campos de la tabla o query
que seleccionó.

4. Ahora inserte la estructura del reporte para los datos de la tabla, para lo cual
entre a la opción del menú Proyecto y elija Agregar Data Report. Deberá
tener tanto la estructura de la conexión como la estructura del reporte
abiertos al mismo tiempo como se muestra en la siguiente imagen:

Ahora arrastre los campos de la tabla en la conexión a la estructura del reporte


en la sección de Detalle. A continuación se muestra cómo podría quedar la
ventana:

I.S.C. Alejandro Guzmán Zazueta 47


a_zazuetag@hotmail.com
5. enseguida en las propiedades del DataReport1 coloque las siguientes
propiedades:

DataMember Command1
DataSource DataEnvironment1

6. Ahora deberá asignar el reporte a un botón en su evento click como se


muestra a continuación:

Private Sub Command1_Click()


DataReport1.Show
End Sub

I.S.C. Alejandro Guzmán Zazueta 48


a_zazuetag@hotmail.com
Cargar un Reporte del Crystal Report con un ResultSet Crystal Report 8

En un reporte de Crystal Report se puede filtrar un conjunto de registro, a través


de la propiedad Selection Formula del control en Visual Basic, pero este tipo de
filtro es ineficiente porque primero cargará todo el universo de registros en el
reporte y hasta después aplicará el filtro para mostrar únicamente los registros
seleccionados. Cuando el volumen de información es mucha el tiempo para
mostrar la información del reporte se elevará sustancialmente, siendo infactible
el uso de este método.
Para solucionar este problema existe el método de pasarle al reporte un
Recorset el cual ya tenga seleccionada la información a reportear,
incrementando sustancialmente la velocidad del cargado.

Para pasar un RecordSet a un reporte, este deberá estar creado en base a un


archivo de definición de datos, a continuación de detalla como crear un reporte
usando un archivo de definición.

Un archivo de definición de datos es un archivo de texto separado por tabs que


contiene información sobre nombre de campo, tipo de dato, y datos de muestra.
Los nombres de campo usados en el archivo de definición de datos se deben
equiparar a los nombres de campo que aparecerán en el reporte a tiempo de
ejecución. La información del tipo de campo indica el tipo de datos en cada
campo (string, numérica, fecha, etc.) y, si es un campo de string, la longitud
máxima permitida por el string. Finalmente, los ejemplos de datos por cada
campo que el Crystal Report mostrara en el reporte en tiempo de diseño.

El siguiente ejemplo muestra los campos en un archivo de definición de datos:

Order ID Long 1
Customer Name String 50 Sample string value
Order Date Date Jan 5, 2000
Order Amount Currency $1.00

Están soportados los siguientes tipos de datos:


Tipo de Datos Descripción
BLOB Campo que contiene imágenes bitmap. bitmap images.
Boolean True/False valor booleano.
Byte 8-bit valor entero.
Currency 64-bit valor de punto flotante, puede incluir el tipo currency.
Date Cualquier valor date/time. Ejemplo:
Jan 5, 1999
07/11/97 5:06:07
07/11/97
23:30:01

I.S.C. Alejandro Guzmán Zazueta 49


a_zazuetag@hotmail.com
Long, int32 32-bit valor entero largo.
Memo Cualquier string con mas de 254 caracteres.
Number 64-bit valor de punto flotante.
Short, int16 16-bit valor entero
String Cualquier string con 254 caracteres como máximo.

La herramienta para crear un archivo de definición de datos está disponible al


seleccionar un origen de datos en la caja de diálogo del Cristal Report cuando
inicia el diseño de un reporte basado el driver Active Data. Enseguida se
muestran los pasos para crear una definición:

1. Al seleccionar la base de datos para un reporte nuevo aparece la ventana


“Data Explorer”, enseguida abra la carpeta de “More Data Sources”, de
igual manera la carpeta de “Active Data” y enseguida la de “Active Data
(Field Definitions Only)”, la ventana aparece como a continuación se
muestra:

I.S.C. Alejandro Guzmán Zazueta 50


a_zazuetag@hotmail.com
2. Al seleccionar la carpeta de “Active Data (Field Definitions Only)”
aparece la siguiente ventana para seleccionar el origen de datos:

3. Presione el botón de New para crear un nuevo archivo de definición de


datos.

I.S.C. Alejandro Guzmán Zazueta 51


a_zazuetag@hotmail.com
4. Use esta ventana para crear los campos para su archivo de definición de
datos. En esta teclee el nombre de los campos, tipo de dato, y datos de
ejemplo para que aparezcan cuando este en modo de diseño y seleccione
impresión preliminar. Si selecciona el tipo de datos String deberá introducir la
longitud de éste.

5. Haga click en el botón de Add para agregar un nuevo campo en su archivo


de definición de datos.

6. Continúe agregando todos los campos que sean necesarios presionando el


botón de Add.

7. Usted puede borrar un campo, seleccionándolo de la lista y presionando el


botón de Delete (borrar).

8. Presione el botón de cerrar de la esquina superior derecha cuando usted


termine. Un mensaje aparecerá preguntando si desea salvar el archivo.

9. Presione que sí y salve el archivo en la ruta donde vaya a colocar el reporte.

10. Cuando termina la nueva definición de datos aparece en la ventana del paso
1.

11. Continúe creando su reporte.

Nota: Una vez terminado el reporte asegúrese de que la bandera de Save Data
with Report está desactivada en la opción del menú File.

I.S.C. Alejandro Guzmán Zazueta 52


a_zazuetag@hotmail.com
Ahora proceda a seguir los siguientes pasos para mandar ejecutar el reporte
desde Visual Basic a través de ADO:

1. Asegúrese de tener las siguientes referencias: Crystal Report Engine 8


Object Library y Microsoft Activex Data Object 2.x.

2. Declare las variables para la Base de Datos y el Recordset en su aplicación.


Estas pueden estar en la sección de declaraciones dentro de la forma o en
un modulo. A continuación se muestra un código similar:
Dim cn As ADODB.Connection ‘ Variable para la conexión a la Base de Datos
Dim Rs As ADODB.Recordset ‘ Variable para el Recordset

Dim crpApplication As CRPEAuto.Application ‘ Variable para crear una aplicación de Cristal con Automation Server
Dim crpReport As CRPEAuto.Report ‘ Variable para abrir el reporte
Dim crpDatabase As CRPEAuto.Database ‘ Variable para la Base de Datos
Dim crpTables As CRPEAuto.DatabaseTables ‘ Variable para tablas de la base de datos
Dim crpTable As CRPEAuto.DatabaseTable ‘ Variable para una tabla

3. Hacer la conexión a la base de datos en el evento load de la forma y en


evento unload cerrar y destruir la conexión:
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.ConnectionString = ("DBQ=" & App.Path & "\Ejemplo.mdb;DefaultDir=" & App.Path & ";Driver={Driver do Microsoft
Access (*.mdb)};DriverId=25;FIL=MS Access;FILEDSN=C:\Documents and Settings\OmarB\Mis
documentos\Ejemplo.dsn;MaxBufferSize=2048;MaxScanRows=8;PageTimeout=5;SafeTransacti
ons=0;Threads=3;UID=admin;UserCommitSync=Yes;")
cn.Open
End Sub

Private Sub Form_Unload(Cancel As Integer)


cn.Close
Set cn = Nothing
End Sub

4. A continuación coloca el siguiente código en un botón para mandar cargar el


Recordset y mandar ejecutar el reporte:
Private Sub Command1_Click()
‘ Carga el Recorset con la información resultante del query
Set Rs = cn.Execute("Select A.NombreEmpresa,A.DomicilioEmpresa,B.NombreUsuario,B.Domicilio " & _
"from Empresa A, DatosUsuario B")
‘ Crea la aplicación del crystal
Set crpApplication = CreateObject("crystal.crpe.application")
‘Abre el reporte
Set crpReport = crpApplication.OpenReport(App.Path & "\ReportEjemplo.Rpt")
' Asigna la base de datos del reporte
Set crpDatabase = crpReport.Database
‘ Asigna la lista de tablas del reporte
Set crpTables = crpDatabase.Tables
‘ La propiedad Item dentro de la colección de tablas de la Base de Datos le debe especificar cual tabla dentro de la
base
‘ de datos se remplazará con el recordset. Después el archivo de definición de datos actuará como la base de datos
con
‘ una sola tabla, solo se deberá pasar 1 en la propiedad item
Set crpTable = crpTables.Item(1)

‘Una vez que se tiene el objeto tabla de base de datos para el objeto Report, usted puede pasar el Origen de Datos al

I.S.C. Alejandro Guzmán Zazueta 53


a_zazuetag@hotmail.com
‘reporte usando el método SetPrivateData. Este método requiere de dos parámetros. El primero es un valor indicando
‘que el origen de datos que desea pasar es de tipo Actives Data Source. Este valor debe ser 3. El segundo parámetro
es
‘el ‘campo del origen de datos (RecordSet).
Call crpTable.SetPrivateData(3, Rs)
'Se dan los parámetros de la presentanción previa del reporte
crpReport.Preview " Título del Reporte", 0, 0, 800, 600, 524288 Or 16777216 Or 268435456
'Selección de impresora
crpReport.SelectPrinter "", "", ""
End Sub

5. Enseguida pruebe mandar a la impresora su reporte.

I.S.C. Alejandro Guzmán Zazueta 54


a_zazuetag@hotmail.com
Módulo 8: Código de Barras

Poner un simple código de barras es una serie de rayas verticales negras y


blancas, que pueden ser leídos por un lector de código de barras. Las líneas
verticales negras y blancas contienen la clave de un producto, con la cual
podremos acceder a la información de este en la base de datos, como su precio,
peso, y tamaño. Una vez que es leído este se convierte en letras y números.
Preferible que tener un cajero que tenga que teclear un número de 20 dígitos
para cada producto.

Por las necesidades particulares y demandas de varias industrias existen


diferentes tipos de código de barras que pueden ser usados. Por ejemplo, el
código UPC es usado para Cds, productos, y revistas (pero no está limitado
para estos), mientras que el código 39 es usado en tiendas de renta de videos,
identificación de tarjetas y para etiquetas. El código 128 es usado
frecuentemente para el embarque industrial. En este documento nos
concentraremos en el código de barras Interleaved 2 de 5.

Cómo Generar el Código de Barras Interleaved 2 de 5 (cadena numérica)


Este código se usa principalmente dentro de industrias y en almacenes
industriales. Para hacer uso de este tipo de código de barras usaremos el tipo de
letra i2of5txt.ttf, el cual deberá instalar en el panel de control.
El código Interleaved 2 de 5 es un método compacto de codificar una secuencia
de caracteres numéricos; solamente dígitos del 0 al 9 puede ser codificados,
pero dentro de una cadena muy larga.
Todos los códigos Interleaved 2 de 5 tiene un número fijo de caracteres
numéricos. Por consiguiente un código de barras con un número impar de
dígitos debe ser rellenado con un cero al inicio. El código de barras usa un
carácter de Inicio al principio y un carácter de paro al final, para delimitar los
dígitos codificados.
Cada letra con el Font está representado con 2 dígitos del 00 al 99. Divide la
cadena de números en pares de dígitos y convierte estos en código de barras
usando la siguiente formula:

A + ABS(A<=49)*48 + ABS(A>=50)*142

Donde A representa el par de dígitos a codificar.


Los pares de números que vayan del 00 al 49 son convertidos a caracteres
números en el rango de 48 (0x30) a 97 (0x61) mientras que los siguientes del 50
al 99 son convertidos en el rango de 192 (0xC0) al 241 (0xF1). El carácter de
inicio es 40 (0x28) y el de paro es 41 (0x29).

I.S.C. Alejandro Guzmán Zazueta 55


a_zazuetag@hotmail.com
El siguiente código muestra la fórmula que se tiene que insertar en Crystal
Reports, con sintaxis de visual (en la esquina superior derecha del Cristal Report
8), este incluye la generación de un dígito verificador:
Dim StartCode, StopCode, DataToPrint, DataToEncode As String
Dim I, CurrentChar as number

‘ El numero a codificar esta fijo pero se puede colocar el nombre de un campo de la base de
‘ datos
DataToEncode = "2002141520"
'DataToEncode = Anio & TipoPago & Referencia
DataToPrint = ""
StartCode = Chr(40)
StopCode = Chr(41)

For I = 1 To Len(DataToEncode) Step 2


'Get the value of each number pair
CurrentChar = Val((Mid(DataToEncode, I, 2)))
'Get the ASCII value of CurrentChar according to chart
DataToPrint = DataToPrint & Chr((CurrentChar + Abs(Iif((CurrentChar <= 49),1,0)) * 48 +
Abs(Iif((CurrentChar >= 50),1,0)) * 142))
Next I

'Get Printable String


Formula = StartCode + DataToPrint + StopCode

I.S.C. Alejandro Guzmán Zazueta 56


a_zazuetag@hotmail.com
Cómo Leer el Código de Barras Interleaved 2 de 5 (cadena numérica)

Para leer el código de barras deberá contar con un lector, ya sea con entrada
para teclado o serial. En el caso de que sea entrada por teclado, no se requiere
agregar código alguno para leer el código, tan solo basta ubicar el cursor en la
caja de textos en la que desea aparezca el número y pasar el código por el
lector. Para el caso de que sea serial, a continuación se muestra un ejemplo:

Private Sub Text2_GotFocus()


' Búfer para almacenar la cadena de entrada
Dim Instring As String
' Usar COM2.
MSComm1.CommPort = 2

' MSComm1.Settings = "9600,O,7,1" 'Velocidad de 9600, con Paridad, 7 Bits de Datos y uno de paro
MSComm1.Settings = "9600,N,8,1" 'Velocidad de 9600, Sin Paridad, 8 Bits de Datos y uno de paro
' Indicar al control que lea todo el búfer al usar Input.
MSComm1.PortOpen = True
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until Len(Buffer$) > 12
' Leer los datos de respuesta de aceptación en el puerto serie.
' Cerrar el puerto serie.
MsgBox Buffer$ 'Manda el número de código a la ventana.
MSComm1.PortOpen = False
End Sub

Private Sub Text2_LostFocus()


Label3.Caption = "" ' Limpia el Label3 al perder el foco
End Sub

Para este ejemplo deberá agregar el control “Microsoft Comm Control 6.0” en el
menú Proyecto – Componentes.

En caso de contar con un lector de código de barras por teclado, solo coloque el
cursor en una caja de textos y el lector pondrá el numero leído.

I.S.C. Alejandro Guzmán Zazueta 57


a_zazuetag@hotmail.com
Módulo 9: Manejo de Imágenes
Cómo acceder y modificar datos de tipo Image en Sql Server Usando ADO
Stream Object.

Requerimientos:
ActiveX Data Objects (ADO), version 2.5
Microsoft Visual Basic Enterprise Editions for Windows, version 6.0
Microsoft OLE DB Provider for SQL Server, version 7.0
Microsoft SQL Server version 7.0

El Stream Object introducido en Actives Data Object 2.5 puede ser usado para
simplificar el acceso y modificación de datos binarios largos (BLOB) en SQL
Server, a continuación se muestra un código de ejemplo:

Command1
Picture

Picture
Command2

CommonDialog1

A continuación se muestra el código de la venana:

Option Explicit
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim mstream As ADODB.Stream

' La imagen del primer registro de la base de datos lo manda salvar


' a un archivo
Private Sub Command1_Click()
On Error GoTo Command1_Error

' Llena el recorset con el resultado de la consulta

I.S.C. Alejandro Guzmán Zazueta 58


a_zazuetag@hotmail.com
Set rs = New ADODB.Recordset
rs.Open "Select * from pub_info", cn, adOpenKeyset, adLockOptimistic

' Crea el objeto de tipo ADODB.Stream para cargar en él la imagen del


' primer registro
Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open
mstream.Write rs.Fields("logo").Value

' Hace uso del control commondialog para abrir una ventana de
' salvar como y así poder seleccionar el nombre con que queremos
' salvar la imagen y su ubicación
With CommonDialog1
.FileName = ""
.Filter = "Image (*.gif)|*.gif"
.ShowSave

If Len(.FileName) <> 0 Then


' Salva la imagen con el nombre de archivo especificado
mstream.SaveToFile .FileName, adSaveCreateOverWrite
' Carga la imagen al Picture2
Picture1.Picture = LoadPicture(.FileName)
End If
End With
rs.Close
Set rs = Nothing
MsgBox "Salvando la imagen de la base de datos al archivo: " & CommonDialog1.FileName
Exit Sub
Command1_Error:
MsgBox Str(Err) & " - " & Error, vbExclamation
End Sub

' Modifica la imagen del primer registro de la tabla pub_info, con


' una imagen gif seleccionada.
Private Sub Command2_Click()

On Error GoTo Command2_Error


' Llena el recorset con el resultado de la consulta
Set rs = New ADODB.Recordset
rs.Open "Select * from pub_info", cn, adOpenKeyset, adLockOptimistic

' Crea el objeto de tipo ADODB.Stream para cargar en él la imagen del


' primer registro
Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open

' Hace uso del control commondialog para poder seleccionar la imagen
' que desea almacenar en la base de datos (ventana de abrir)
With CommonDialog1
.FileName = ""
.Filter = "Image (*.gif)|*.gif"
.ShowOpen
If Len(.FileName) <> 0 Then
' carga en el stream la imagen del archivo

I.S.C. Alejandro Guzmán Zazueta 59


a_zazuetag@hotmail.com
mstream.LoadFromFile .FileName
' asigna el stream al recordset
rs.Fields("logo").Value = mstream.Read
' asigna la imagen al picture1
Picture2.Picture = LoadPicture(.FileName)
' actualiza el recorset para guardar la nueva imagen
rs.Update
End If
End With
rs.Close
Set rs = Nothing
MsgBox "Salvando la imagen: " & CommonDialog1.FileName & ", en la base de datos"
Exit Sub
Command2_Error:
MsgBox Str(Err) & " - " & Error, vbExclamation
End Sub

'Hace la conexión a la base de datos Pubs (Base de Datos Ejemplo que se


' instala con el SQL Server)
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.Open "Driver=SQL Server; Server=(local);Database=Pubs;Uid=sa;Pwd=;"
End Sub

I.S.C. Alejandro Guzmán Zazueta 60


a_zazuetag@hotmail.com
Módulo 10: Automatización OLE con Excel
La automatización OLE habilita que una aplicación exponga sus objetos y
métodos a otra aplicación.
En el presente manual expondremos la automatización OLE con Excel.
Microsoft Excel expone arriba de 100 objetos de Automatización OLE que usted
puede programar usando Visual Basic. Cada uno de estos objetos encapsulan
algunos aspectos de Excel, como hacer una gráfica, dibujar etc.
La aplicación, la gráfica y la hoja son objetos que pueden ser creados
directamente con la función CreateObject. El resto de los objetos existen
solamente como parte de un nivel superior del objeto y no son creados
directamente.

A continuación se muestran los pasos para crear una gráfica en excel.

1. Agregue en las referencias del proyecto “Microsoft Excel x.0 Object Library”

2. Cree una tabla en Access con la siguiente estructura

a partir de los datos que se almacenen en esta tabla se generará una gráfica de
Pie en Excel.

I.S.C. Alejandro Guzmán Zazueta 61


a_zazuetag@hotmail.com
3. Cree una ventana como a continuación se muestra:

Command2

Command1

4. A continuación se nuestra el código que habrá de colocar en esta forma:


Option Explicit
Public Cn As ADODB.Connection ' Variable para la conexión de la Base de Datos
Dim i As Integer ' Sub índice de los arreglos
Dim Rs As Recordset ' RecordSet para almacenar el resultado de la consulta
Dim B(100) As String * 15 ' Declaración de arreglo para las pos. de las columnas
Dim A(100) As String * 30 ' Declaración de arreglo para los Nombres Alumnos
Dim F(100) As Double ' Declaración de arreglo para los promedios
Dim xlChart As Chart ' Declaración para la Gráfica
Dim xl As Excel.Application ' Declaración para generar la aplicación de Excel
Dim iElementos As Integer ' Es el contador para el número de elementos que se utilizarán en la gráfica

'Este procedimiento es para mandar los parámetros ya en el diseño de la gráfica


Private Sub Command2_Click()
Dim strVar As String
Screen.MousePointer = vbHourglass ' Convierte el curso a reloj de arena
RecuperaDatos ' Rutina para cargar los datos de la base de datos
Set xl = CreateObject("Excel.Application") ' Crea la aplicación de Excel
xl.Visible = True
xl.Workbooks.Add ' Adiciona un Workbook a la hoja de excel
xl.Range("A2").Value = "Promedios"
For i = 1 To iElementos ' Pasa los datos de los arreglos a la hoja de Excel
strVar = Trim(B(i))
strVar = strVar & "1"
xl.Range(strVar).Value = A(i)
strVar = Trim(B(i))
strVar = strVar & "2"
xl.Range(strVar).Value = F(i)
Next i
strVar = "A1:" & Trim(strVar)
xl.Range(strVar).Select ' Selecciona los datos de la hoja

' 'Instrucciones para los Bordes en los datos


With xl.Selection.Borders(xlLeft)
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With xl.Selection.Borders(xlRight)
.Weight = xlThin

I.S.C. Alejandro Guzmán Zazueta 62


a_zazuetag@hotmail.com
.ColorIndex = xlAutomatic
End With
With xl.Selection.Borders(xlTop)
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With xl.Selection.Borders(xlBottom)
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
xl.Selection.BorderAround Weight:=xlThin, ColorIndex:=xlAutomatic
xl.Columns("A:M").EntireColumn.AutoFit ' Ancho automático de la columna A a la M

xl.Range(strVar).Select
Set xlChart = xl.Charts.Add()
xlChart.HasLegend = False
xlChart.Type = xl3DPie ' Determinación del tipo de gráfica
xlChart.HasLegend = True ' Para colocar una leyenda dentro de la gráfica

xlChart.ChartWizard , Gallery:=xl3DPie, Format:=4, PlotBy:=xlRows, CategoryLabels:=1, SeriesLabels:=1,


HasLegend:=1

xlChart.HasTitle = True
xlChart.ChartTitle.Text = "Gráfica Promedios" ' Titulo de la grafica
' Procedimiento para que rote la grafica solo en caso de que esta sea de tres dimensiones
For i = 30 To 180 Step 5
xlChart.Rotation = i
Next
Screen.MousePointer = vbDefault
End Sub

' Este procedimiento es para tomar los datos de la base de datos y colocarlos en arreglos,
' así como para determinar el número de columnas que se usarán.
Public Sub RecuperaDatos()
Dim Sentencia As String
' obtenemos los datos de la tabla que generarán la gráfica
Set Rs = Cn.Execute("Select cveAlumno,NombreAlumno,PromedioAlumno From Alumno")
i=1
Do Until Rs.EOF()
' Determina el número de columnas que usará
Select Case Rs!cveAlumno
Case 1
B(i) = "B"
Case 2
B(i) = "C"
Case 3
B(i) = "D"
Case 4
B(i) = "E"
Case 5
B(i) = "F"
Case 6
B(i) = "G"
Case 7
B(i) = "H"
Case 8
B(i) = "I"
Case 9
B(i) = "J"
Case 10
B(i) = "K"
Case 11
B(i) = "L"
Case 12
B(i) = "M"
End Select
' Carga los datos en arreglos
A(i) = Rs!nombrealumno
F(i) = Rs!PromedioAlumno
Rs.MoveNext

I.S.C. Alejandro Guzmán Zazueta 63


a_zazuetag@hotmail.com
i=i+1
Loop
Rs.Close
Set Rs = Nothing
iElementos = i - 1
End Sub

'Cerrar la ventana
Private Sub Command1_Click()
Unload Me
End Sub

' Evento Load se establece la conexión a la Base de Datos


Private Sub Form_Load()
Set Cn = New ADODB.Connection
Cn.ConnectionString = "DBQ=" & App.Path & "\Calificacion.mdb;DefaultDir=" & App.Path & ";Driver={Microsoft Access
Driver (*.mdb)};DriverId=25;FIL=MS
Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;
UID=admin;UserCommitSync=Yes;"
' Abre la conexión a la Base de Datos
Cn.Open
End Sub

' Descarga la ventana y destruye las variables de Excel


Private Sub Form_Unload(Cancel As Integer)
Set xlChart = Nothing
Set xl = Nothing
End Sub

I.S.C. Alejandro Guzmán Zazueta 64


a_zazuetag@hotmail.com
Módulo 11: Implementación del Agente y el
DynamiCube

El agente de Microsoft Versión 2.0, es una tecnología que mantiene las


maneras más naturales para que las personas se puedan comunicar con sus
computadoras. Esta interfaz permite a diseñadores incorporar imágenes
animadas e interactivos en sus aplicaciones.

El Agente de Microsoft proporciona cuatro caracteres estándares: Merli, Genie,


Robby y Peedy. Los agentes adicionales han sido creados por otros marcas que
pueden estar disponibles en el Internet (http://www.microsoft.com/msagent/). Es
también posible crear su propio Agente. Estos son cuatro de los agentes que se
encuentran disponibles:

Para instalar el agente hay que descargar el archivo de Internet sobre tu


computadora según el agente que elijas (el cotorro es Pedí.exe), una vez
instalado el agente el archivo queda almacenado en la siguiente ruta:

C:\WINDOWS\Msagent\CHARS\Peedy.acs

Para el reconocimiento de voz es necesario bajar los archivos ejecutables que


se encuentra en la dirección antes mencionada:
Lhttsspe.exe
Spchapi.exe
después de esto ejecuta el archivo para activar los controladores, para el
reconocimiento.

I.S.C. Alejandro Guzmán Zazueta 65


a_zazuetag@hotmail.com
Para activar el agente en Visual Basic es necesario activar la siguiente librería,
en MENU->Proyecto->Componentes->Microsoft Agent 2.0, en la Caja de
herramientas debe aparecer un icono como el siguiente: . El icono del
agente se puede pegar en una forma nueva o en alguna forma que ya este
diseñada ( puede ser la MDI, para aplicaciones de bienvenida al sistema)

Una vez pegado el icono sobre la forma, en las propiedades del agente(F4), en
la propiedad Nombre se da el que deseé (en el siguiente código de ejemplo se
dio el nombre Agente), con el nombre que se dé se deberá trabajar el código.

seguido de esto se introduce el siguiente código:

En el evento Load de la forma


Private Sub Form_Load()
‘ Código par abrir el agente, dando la ruta
Agente.Characters.Load ("genio"), "C:\windows\msagent\chars\genie.acs"
Agente.Characters("genio").Show
‘Código para dar instrucciones de palabras (lo que el agente dirá)
Agente.Characters("genio").Speak "Hola mundo"
‘Código para dar animación del agente
Agente.Characters("genio").play “greet”
End Sub

Al momento de la ejecución deberá aparecer como sigue:

existen mas animaciones para el agente, estas son algunas otras:

Agente.Characters("Genio").Play "blink"
Agente.Characters("Genio").Play "alert"
Agente.Characters("Genio").Play "Acknowledge"
Agente.Characters("Genio").Play "decline"
Agente.Characters("Genio").Play "GestureDown"
Agente.Characters("Genio").Play "explain"

I.S.C. Alejandro Guzmán Zazueta 66


a_zazuetag@hotmail.com
PROPIEDAD MOVE TO

Está propiedad sirve para, desplazar el agente sobre la pantalla, por medio de
coordenadas, establecidas sobre el código, como sigue:

Agente.Characters("Genio").MoveTo 500, 300

Este código va en Form_Load. (Seguido del código anterior), las coordenadas


(500, 300), son a criterio del programador.

AGREGAR OPCIONES AL MENU POP-UP, AL DAR CLICK DERECHO


SOBRE EL AGENTE.
Para agregar un una opción al menu pop-up teclee la siguiente línea en el
Form_Load.

Agente.Characters("Genio").Commands.Add "cmd1", "&Boton1"

‘subrutina que se activa cuando se hace click en el menu Pop-Up


Private Sub Agente_Command(ByVal UserInput As Object)
If UserInput.Name = "cmd1" Then
Agente.Characters("genio").Speak "hizo click en el boton 1"
End If
End Sub

PROPIEDAD BOOKMARK

Para cuando se quiere arrojar el agente junto con un mensaje.


‘ esta subrutina se activa cuando un marcador “Bookmark” en el texto de hablar
es encontrado.

Private Sub Agente_Bookmark(ByVal BookmarkID As Long)


If BookmarkID = 100 Then
MsgBox "deseas salvar este archivo"
End If
End Sub

En el Form_Load se pone la siguiente instrucción

Agente.Characters("genio")..speak “Deseas salvar \mrk=100\ este archivo”


El marcador “mrk = 100” es el tope en donde se realiza el código de la función
Bookmark del agente en el BookmarkID =100.

I.S.C. Alejandro Guzmán Zazueta 67


a_zazuetag@hotmail.com
Microsoft Agent Character Editor.
Si no quieres usar alguno de los cuatro characters anteriores, puedes usar el
editor de agentes para crear tus propias imágenes de animación y
ensamblarlas, temporizarlas, bifurcarlas y compilarlas en un archivo tipo Agent
Character.
Como en la animación tradicional en un Character esta echa de imágenes
separadas, cada una alterada ligeramente, y cuando se activan secuencialmente
da la ilusión de movimiento.

I.S.C. Alejandro Guzmán Zazueta 68


a_zazuetag@hotmail.com
DynamiCube

DynamiCube es un método para presentar cantidades muy grandes de


información que se encuentra almacenada en bases de datos relacionales en
una forma de sumatoria y tabulada. De esta manera, el usuario tiene la
capacidad de realizar decisiones de una manera más precisa. Los datos
numéricos a introducir pueden provenir de diferentes lugares, ser tabulada,
organizada campos de totales y ser presentada al usuario en forma de un cubo
multidimensional. El usuario final puede modificar la manera en que se
visualizan los datos, añadir campos, así como modificar los parámetros de
cálculo y agregar funciones que se adapten a sus necesidades de análisis.

Características de DynamiCube
• Navegación gráfica y a altas velocidades de datos multidimensionales
• Trabaja con las ediciones Profesional y Empresarial de Visual Basic, así
como con Visual C++, Delphi, Power Builder, Optima ++, el Explorador de
Internet de Microsoft, y Microsoft Acces.
• Soporta datos

Utilizando DynamiCube

En Visual Basic, los controles personalizados se incluyen en la base de un


proyecto. Una vez que un control personalizado es incluido en un proyecto, y
este salvado, no es necesario incluirlo de nuevo cada vez que el proyecto se
reabra; el control aparecerá siempre en la caja de herramientas.

Para incluir el control DynamiCube en su proyecto:


1. Abra Visual Basic e inicie un nuevo proyecto.
2. Seleccione, del Menú Proyecto, la opción Componentes, y en el cuadro de
diálogo que aparecerá, marque la opción DynamiCube Versión 2.0.
3. Presione el botón Aplicar¸ y luego presione Aceptar.
4. Una vez realizados estos pasos, el siguiente control deberá aparecer en su
caja de herramientas:

Una vez que el control esté en su caja de herramientas, arrástrelo hasta la forma
en donde quiere ponerlo y dele el tamaño adecuado, está se vera así

I.S.C. Alejandro Guzmán Zazueta 69


a_zazuetag@hotmail.com
Abra la hoja de propiedades del control (de clic derecho sobre el control y
seleccione “Propiedades” o doble clic en propiedades en la el menú de
propiedades) En la pestaña de General especifique el “Tipo de Conexión” como
ODBC y en seguida teclee la cadena de conexión en el origen de datos.
Ahora coloque el query en la propiedad RecordSource. La pestaña de General
deberá verse así:

Abra la pestaña de layout. De clic en el botón 'Retrieve Fields' para actualizar la


lista de los campos requeridos. Arrastre y suelte los campos de la lista a las filas,
columnas campos y área de datos. De clic en OK para actualizar la vista del
DynamiCube corra su proyecto

I.S.C. Alejandro Guzmán Zazueta 70


a_zazuetag@hotmail.com

You might also like