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 termi ter mi nar el Curs Cu rso o
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 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 Tip Tipos de Dat 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
[email protected]
1
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: Control es que se Llenan Llenan con Información de la Base de
Datos ComboBox ListView Módulo 6: Errores
Verificación de Errores Atrapar Atrapar Errores E rrores 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ódul o 9: Manejo de Imágenes Imágenes
Almacenamiento de imágenes con ADO 2.5 Recuperación de imágenes con ADO 2.5 Módulo 10: Auto matización matización OLE con Excel Modulo 11: Presentación a los Sistemas
Active Skin Microsoft Agent
I.S.C. Alejandro Guzmán Zazueta
[email protected]
2
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: Control es que se Llenan Llenan con Información de la Base de
Datos ComboBox ListView Módulo 6: Errores
Verificación de Errores Atrapar Atrapar Errores E rrores 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ódul o 9: Manejo de Imágenes Imágenes
Almacenamiento de imágenes con ADO 2.5 Recuperación de imágenes con ADO 2.5 Módulo 10: Auto matización matización OLE con Excel Modulo 11: Presentación a los Sistemas
Active Skin Microsoft Agent
I.S.C. Alejandro Guzmán Zazueta
[email protected]
2
Módulo 1: 1: Introducc Introd ucción ión a Visual Basic Colocando Controles Sobre una Forma
E l Toolbox T oolbox despliega despliega los posibles controles. 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 P roject del menú, menú, seleccione Component Components. s. 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
[email protected]
3
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
[email protected]
4
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
[email protected]
5
Usando el Toolbar
Adicionar Forma
Adicionar Proyecto
Cortar
Salvar Proyecto Editor Menú
Ejecuta F5
Pega
Abrir Proyecto
Copiar
Deshacer
Buscar
Propiedades F4 Parar
Romper Repetir
Buscador Objetos F2
Pos. Ventana
Explorador Proyecto
Caja Herramientas
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
[email protected]
6
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
[email protected]
7
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ú. P or ejemplo: MnuCatalogos MnuCDivisiones MnuCEspecialidades MnuCSalir MnuContratistas I.S.C. Alejandro Guzmán Zazueta
[email protected]
8
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. contexto.
Le permite asignar un valor numérico único para el Id. de
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
[email protected]
9
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
[email protected]
10
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
[email protected]
11
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
[email protected]
12
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
[email protected]
13
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
[email protected]
14
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
[email protected]
15
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
[email protected] • Use el tipo de dato apropiado para cada situación •
Variant es el tipo de dato por default.
16
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
[email protected]
17
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 valores positivos. positivos. Variables Alfanuméricas Alfanuméricas (Str (String) ing) 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 Procedim Procedimiento iento I.S.C. Alejandro Guzmán Zazueta • Son locales al procedimiento; no pueden ser públicas.
[email protected] Dim iPrueba as Integer
Variables declaradas en la sección de General Declarations de la forma
18
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. E l primer primer lugar 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 variables locales de un procedimiento 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 Módul o 3: Valid Valid ación de Ent Entrada rada de Dato Datos s I.S.C. Alejandro Guzmán Zazueta
[email protected]
19
Usando Propiedades para Restringir Entrada de Datos
.Maxlength = 10 .Locked = True .PasswordChar
.Default =True .Cancel =Tru =T rue e
P ropiedad ropiedad MaxLengt MaxLength h La propiedad MaxLength determina la máxima longitud de texto permitido en un Tex TextBox Box. El sist siste ema em emite ite un una señ señal bip cuan cuand do el el usu usuar ariio tr trata ata de de te tecle clear más de la longitud permitida. P ropied ropiedad ad Password P asswordC Char 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
[email protected]
20
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
[email protected]
21
' 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
[email protected]
22
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
[email protected]
23
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
[email protected]
24
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
[email protected]
25
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
[email protected]
26
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
[email protected]
27
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 Dialo g .
I.S.C. Alejandro Guzmán Zazueta
[email protected]
28
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 Anim ation 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 Anim ation 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
[email protected]
29
Módulo 4: Acc eso 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
[email protected]
30
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 UserID Password
Opcional. Es un string conteniendo información de la
conexión. Opcional. Es un string conteniedo el nombre del usuario con el que desea establecer la conexión. 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
[email protected]
31
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 (consulta): Set recordset Options)
registros o renglones de la base de datos
= conexión.Execute
(CommandText ,
RecordsAffected ,
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 AdCmdTable AdCmdStoredProc AdCmdUnknown
Indica que el CommandText lo deberá evaluar textualmente. Indica que el CommandText lo evalúe como el nombre de una tabla. Indica que el CommandText lo evalúe como un procedimiento almacenado. Indica que el CommandText contiene un comando no conocido.
I.S.C. Alejandro Guzmán Zazueta
[email protected]
32
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
[email protected]
33
Método Open de un RecordSet de ADO Sintaxis recordset.Open Source, Ac ti veCo nn ect io n, 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 . Acti veConnectio n: 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
I.S.C. Alejandro Guzmán Zazueta
[email protected]
Descripción
34
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 (CursorLo cation)
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
[email protected]
35
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
[email protected]
36
Módulo 5: Contro les 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
Elemento – Es el texto que aparece dentro del ComboBox. Es la información que se puede ver.
I.S.C. Alejandro Guzmán Zazueta
[email protected]
Llave
Llave – Generalmente es la llave primaria del catálogo desplegado. Esta no se visualiza en el combo.
37
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
llave cbo.ListIndex =cbo.ListIndex +1 Loop End Sub
I.S.C. Alejandro Guzmán Zazueta [email protected]
38
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 [email protected]
39
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 [email protected]
40
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 [email protected]
41
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 [email protected]
42
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 [email protected]
43
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 [email protected]
44
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 [email protected]
45
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 [email protected]
46
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 [email protected]
47
5. enseguida en las propiedades del DataReport1 coloque las siguientes propiedades: DataMember DataSource
Command1 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 [email protected]
48
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 Order Date Order Amount
String 50 Date Currency
Sample string value J an 5, 2000 $1.00
Están soportados los siguientes tipos de datos: Tipo de Datos
Descrip ción
BLOB Boolean Byte Currency Date
Campo que contiene imágenes bitmap. bitmap images. True/False valor booleano. 8-bit valor entero. 64-bit valor de punto flotante, puede incluir el tipo currency. Cualquier valor date/time. Ejemplo: J an 5, 1999 07/11/97 5:06:07 07/11/97 23:30:01
I.S.C. Alejandro Guzmán Zazueta [email protected]
49
Long, int32 Memo Number Short, int16 String
32-bit valor entero largo. Cualquier string con mas de 254 caracteres. 64-bit valor de punto flotante. 16-bit valor entero 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 [email protected]
50
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 [email protected]
51
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 [email protected]
52
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.R ecordset ‘ 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 C RP EAuto.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 S ettings\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 =C reateObject("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 [email protected]
53
‘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. E ste 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 [email protected]
54
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ódi go de Barr as Interleaved 2 de 5 (cadena numéri ca)
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 [email protected]
55
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 [email protected]
56
Cómo Leer el Códig o de Barras Interl eaved 2 de 5 (cadena numéric a)
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 [email protected]
57
Módulo 9: Manejo de Imágenes Cómo acceder y modif icar 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 Acti ves 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 [email protected]
58
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 [email protected]
59
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 P ubs (Base de Datos E jemplo 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;P wd=;" End Sub
I.S.C. Alejandro Guzmán Zazueta [email protected]
60
Módulo 10: Auto matizació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 [email protected]
61
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 Dim i As Integer Dim Rs As Recordset Dim B(100) As String * 15 Dim A(100) As String * 30 Dim F(100) As Double Dim xlChart As Chart Dim xl As Excel.Application Dim iElementos As Integer
' Variable para la conexión de la Base de Datos ' Sub índice de los arreglos ' RecordSet para almacenar el resultado de la consulta ' Declaración de arreglo para las pos. de las columnas ' Declaración de arreglo para los Nombres Alumnos ' Declaración de arreglo para los promedios ' Declaración para la Gráfica ' Declaración para generar la aplicación de Excel ' 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.MouseP ointer =vbHourglass ' Convierte el curso a reloj de arena RecuperaDatos ' Rutina para cargar los datos de la base de datos Set xl =C reateObject("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 [email protected]
62
.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 xlChart.HasLegend =True
' Determinación del tipo de gráfica ' 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 =C n.Execute("Select cveAlumno,NombreAlumno,PromedioAlumno F rom 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 [email protected]
63
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.P ath & "\Calificacion.mdb;DefaultDir=" & App.P ath & ";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 [email protected]
64
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 [email protected]
65
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 [email protected]
66
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 SOBRE EL AGENTE.
DERECHO
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 [email protected]
67
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 [email protected]
68
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, P ower 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 [email protected]
69