Introducción al Lenguaje Programación Visual Basic: ¿Por qué objetos y eventos? La mayoría de aplicaciones Windows, así como otros programas, emplean una Interfaz Gráfica de Usuario (GUI), consistente en una o más pantallas llenas de objetos, menús, botones, líneas, cuadros de edición etc, todos inactivos hasta que el usuario provoca un evento al hacer clic con el ratón sobre un botón, barra de menús, en la formas, o un comando de tecla o de vos. Una ves que el evento ocurre, el usuario espera que cada objeto realice su función y se comporte de una manera confiable. Este requerimiento de confiabilidad y predecibilidad es el que hace que la programación orientada a objetos y manejada por eventos sea perfecta para el desarrollo de aplicaciones Windows. Visual Basic proporciona un ambiente de desarrollo donde el trabajo tales como objetos y eventos llega a ser un proceso directo, y lo más importante, bien estructurado. Los Pasos en este proceso son: Crear y dar nombre a una nueva forma Trazar y dar nombres a los objetos que se desplegarán en la forma. Relacionar con los objetos significativos el código que se ejecutará en respuesta a eventos del usuario o generados por el sistema Ambiente Visual Cuando iniciamos Visual Basic, nos mostrará la siguiente Ventana donde podemos seleccionar, que es lo que vamos a desarrollar. En este curso nos centraremos en las primera opcione Estándar EXE. Seleccionamos el tipo de proyecto y presionamos Abrir, si ya tenemos un proyecto seleccionamos la lengüeta Existente o Reciente para que nos muestre los proyectos recientes. Luego le aparacerá el entorno inicial de Visual Basic : Barra de menú Barra de Herramientas Explorador de Proyectos Ventana de Propiedades Cuadro de herramientas Ventana de Posición de formulario Ventana del formulario inicial Conceptos Básicos Eventos: Son las acciones que se producen y que nos interesan identificar para establecer algún tipo de respuesta por parte del objeto. Ejemplo de eventos: - Hacer clic sobre el objeto Al Cargar el objeto Al Cerrar el objeto Propiedades: Es un atributo nominal de un objeto de programación. Las propiedades definen las características del objeto, tales como tamaño, color, longitud, diámetro, o algunas veces, la manera en la cual se comporta el objeto, por ejemplo si un cuadro de texto aceptará líneas de texto múltiples o sencillas. Ejemplo Objeto Propiedades : : gato gato.color = negro gato.height = 10 Métodos: Una descripción completa de un objeto, no se limita a sus propiedades, debe comprender una definición de lo que hace Ejemplo Metodo : gato.juega gato.come gato.duerme Nombre sus Objetos Un buen hábito de programación es el de establecer la propiedad Name de los objetos significativos de su aplicación, aquellos cuyas propiedades y métodos espera usted usar en el código. Visual Basic asigna automáticamente un nombre a cada objeto: Command1, Command2, texbox1, texbox2. Es convencional usar un prefijo de tres letras minúsculas cuando se nombran los objetos significativos, de esta forma podrá reconocer a que objeto se refiere en el código del programa por cmdOK o frmPrincipal que utilizando command7 o form3. Objeto Visual Basic Forma Botón de Comando Etiqueta Cuatro de Texto Barras de desplazamiento Menu Botón de Opción Cuadro de Verificación Cuadro de lista Marco Cuadro de dibujo Imagen Panel Lineas Temporizador Cuadriculas Prefijo frm cmd, btn lbl txt hsb, vsb mnu opt chk lst fra pic img pnl lin tmr grd Ejemplo frmInicio cmdSalir, btnAdicionar lblOpciones txtCodigo vsbHora, hsbRango mnuArchivo optSexo chkSonido lstColores fraMarco dicDibujo imgLogotipo pnpPanel linLinea tmrTiempo grdDatos Variables y Constantes Una variable es una ubicación de almacenamiento temporal con nombre que se encuentra en memoria. Una variable es capaz de contener un cierto tipo de datos que pueden modificarse durante la ejecución del programa. Las variables en VisualBasic, deben limitarse a 255 caracteres, empezar con un carácter alfabético y no pueden contener un punto. Tampoco se pueden usar nombres de variables, las palabras reservadas como por ejemplo: Sub, End o Function. Tipos de Variables Tipo de Datos Byte Boolean Integer Long (long integer) Single Double Currency Date Objeto String Variant User Define Tamaño de Almacenamiento 1 byte 2 bytes 2 bytes 4 bytes 4 bytes 8 bytes 8 bytes 8 byes 4 bytes 1Caracter/1 byte Depende del dato Depende del dato Rango 0 a 255 True o False -32768 a 32767 -2147483648 a 2147483647 -3.40E38 a 3.40E38 -1.80E308 a 1.80E308 -9.22E14 a 9.22E14 1/1/100 a 31/12/9999 Referencia a cualquier objeto Aprox 65,500 Bytes Max Determinado por el tipo Determinado por el tipo Declaraciones de variables Para declarar variables en Visual Basic, lo hacemos con la palabra reservada Dim(Public, Private o Static) seguida del nombre de la misma y luego el tipo: Sintaxis: Dim “nombre” as “tipo de variable” Ejemplo: Dim ciudad as string (DIM) Es la abreviatura de Dimensión, esto reserva espacio en memoria para la variable cuando se ejecute el programa y permitirá a VB que tipo de datos deberá guardar en dicha variable. Declaración Explícita En Visual Basic no es necesario declarar una variable antes de utilizarla. Sin embargo, esta forma de trabajar puede ser una fuente de errores. Ejemplo: Dim M As Integer, N As Integer VarTEmp = M + N N = VaTemp En este ejemplo, VarTEmp no se ha declarado explícitamente. Esto no supone un Error, ya que Visual Basic se encarga de crear dicha variable. Ahora observe que, por error, el nombre de esa variable se ha escrito mal en la última sentencia. Cando Visual Basic encuentra un nuevo nombre no puede determinar si es debido a un error o a la definición de una nueva variable. Para evitar este tipo de errores, podemos indicar a Visual Basic que genere un mensaje de error siempre que encuentre una variable no declarada explícitamente. Para ello, escribiremos la sentencia siguiente en la sección de Declaraciones del formulario, del módulo o de la clase: Option Explicit Esta sentencia opera sólo en el formulario o en el módulo donde se haya puesto. Para tener esa opción activa para todo el código de una aplicación, ejecute la orden Opciones del menú Herramientas, elija el dialogo Entorno y Seleccione la opción Declaración de Variables Requerida. Seleccionada esta opción agrega la sentencia Option Explicit en cualquier nuevo modulo que creemos. Alcances de las variables El alcance de las variables se refiere al área del programa en las cuales es visible la variable; es decir en áreas del proyecto tendremos disponible las variables. Las variables declaradas dentro de funciones o procedimientos, será de alcance local. Estas variables son reinicializadas cada ves que se ejecuta el procedimiento. Las variables de nivel de formulario, estarán disponibles para todos los procedimientos del formulario. Variables Publicas: se utilizan en todo el proyecto Cuando declaramos una variable como publica en un modulo de programa o en el formulario inicial, podremos utilizar esta variable en todo el proyecto: Ejemplo Public NoFactura as long Variables Privadas: se utilizan sólo en el procedimiento Estas variables estarán disponibles solo dentro de nuestro formulario o procedimiento, según el lugar donde se haya declarado: Ejemplo Dim NoFactura as long Variables Estáticas: No pierden su valor Con esta forma de declarar variables conseguiremos que las variables locales no se creen y se destruyan al entrar y salir de los procedimientos donde fueron declaradas sino que se mantenga su valor durante todo el periodo de ejecución de la aplicación. De esta forma a entrar en algún procedimiento las variables recuerdan el valor que tenían cuando se salió de él. Ejemplo Static Nombre Resumen de Alcance de las Variables Alcance Declaración Local Dim, Static (Dentro de un procedimiento) Módulo Dim o Private (sección de declaraciones del módulo) Global Public (sección de declaraciones de un módulo) A nivel del módulo, no hay diferencias entre Dim y private, pero se aconseja utilizar private en contraste con Public Matrices Para declarar matrices debemos colocar entre paréntesis el número de elementos de los que constará a continuación del nombre de la variable: Dim medidas(9) as integer De esta forma tenemos una matriz de 10 elementos identificados del 0 al 9 Podemos obligar a que el primer elemento de una matriz tenga el índice con valor 1. Las matrices multidimensionales se declaran de la siguiente forma: Dim medidas(1 to 10, 1 to 10) as integer Tipos de datos definidos por el usuario El usuario puede definir los datos en VB en la sección General de Declaraciones de un modulo de código, usando la palabra clave Type y End Type. Ej: Type empleado ‘ Crear tipo definido por el usuario. NoEmpleado As integer Nombre As String(30) FechaIngreso as date Salario As doublle End Type Constantes Como su palabra lo dice es Información que no varía hace más fácil la comprensión del código y permite modificar un valor en un solo lugar no ocupa espacio extra, Ejemplo: Const Mínimo = 1, Máximo = 10 Operadores La tabla siguiente muestra un conjunto de operadores comunes que soporta Visual Basic para utilizarlos en programación: Operador + * / \ Mod ^ & =, <>,<,>,<=,>= Operación que realiza Suma Resta Multiplicación División División Entera Residuo de la división entera Exponenciación Concatenación Igual, diferente, menor, mayor........ Conversiones Visual Basic nos proporciona varias funciones de conversión de datos, las cuales nos permiten convertir el valor de una variable al tipo de variable correcto. Esto es importante cuando trabajamos con datos Variant y queremos convertirlo a otro tipo de variable más exacta o para realizar validaciones en los datos. CBol(expresión) CByte(expresión) CCur(expresión) CDate(expresión) CDbl(expresión) CInt(expresión) CLng(expresión) CSng(expresión) CStr(expresión) CVar(expresión) CErr(expresión) conversión a un valor tipo Boolean conversión a un valor tipo Byte conversión a un valor tipo Currency conversión a un valor tipo Date conversión a un valor tipo Double conversión a un valor tipo Integer conversión a un valor tipo Long conversión a un valor tipo Single conversión a un valor tipo String conversión a un valor tipo Variant conversión a un valor tipo Error E/S (Entradas y Salidas) Sencillas La Función Inputbox() La función Inputbox(), despliega un mensaje en un cuadro de diálogo, espera a que el usuario introduzca el texto o seleccióne un boton y luego devuelve el contenido del cuadro de texto. El valor que devuelve la función es un valor tipo variant . Sintaxis: Valor = inputbox (Mensaje,Titulo,omisión,10,10,ArchAyuda,Context) Ejemplo: Valor = inputbox(“Mensaje”, “Prueba”, , 10,10) Parámetros: Mensaje Titulo Omisión posx, posy ArchAyuda Context : Mensaje del cuadro de texto : Titulo del cuadro de texto : Texto por omisión (default) : Posición donde deberá aparecer el cuadro de texto : Cuando se utiliza archivo de ayuda : Índice del archivo de ayuda El procedimiento MsgBox y la Funcion MsgBox() Tanto la función como el procedimiento MsgBox, despliegan un cuadro de dialogo y espera a que el usuario seleccione un botón. La función MsgBox() devuelve un valor entero, indicando cual de los botones de opción ha presionado el usuario. Sintaxis Resp = MsgBox(Mensaje, Tipo, Título, ArchAyuda, Contexto) MsgBox Mensaje, Tipo, Título, ArchAyuda , Contexto Ejemplo MsgBox "Esta es una prueba", vbInformation, "Ejemplo" Parámetros: Mensaje : Mensaje ha desplegar en pantalla Tipo : Tipo de Botón (Error, Información, Pregunta) + Tipo de Opciones (OK, No, Cancel, Retry) Titulo : Titulo del Cuadro de Mensajes ArchAyuda : Archivo de Ayuda Context : Indice de Ayuda Valores de Configuración Tipo MsgBox Valor 0 1 2 3 4 5 16 32 48 64 0 256 512 0 4096 Significado Despliega Boton OK (Aceptar) Despliega los botones OK y Cancel Despliega los botones, Abort, Retry e Ignore Despliega los botones Yes, No , Cancel Despliega los botones Yes (si) y No(No) Despliega los botones Retry y Cancel Despliega el icono Critical (parada critica) Despliega el icono signo de interrogación Despliega signo de exclamación Despliega icono de Información El primer boton por omisión El segundo boton por omisión El Tercer Boton por omision Modal Fijo en la Aplicación Modal Fijo del Sistema Constante VB VbOKOnly VbOkCancel vbAbortRetryIngnore VbYesNoCancel VbYesNo VbRetryCancel VbCritical VbQuestion VbExclamation VbInformation VbDefaultButton1 VbDefaultButton2 VbDefaultButton3 VbAplication Modal VbSystemModal Valores de Retorno de MsgBox() Valor 1 2 3 4 5 6 Significado Botón OK Seleccionado Botón CANCEL Seleccionado Botón ABORT Seleccionado Botón RETRY Seleccionado Botón YES Seleccionado Botón NO Seleccionado Constante VB VbOK Vbancel VbAbort VbRetry VbYes VbNo Estructuras de Decisión Las estructuras de decisión de Visual Basic, caen en dos amplias categorías familiares para todos los programadores de computación: Ramificaciones y Ciclos. Los dispositivos de ramificado como If...Then y Select Case, hacen que el programa continué en una dirección en particular sin mirar nunca atrás. Las construcciones de ciclos como Do...Loop y While...Wend, se usan para repetir un cierto bloque limitado de instrucciones hasta que se cumplan las condiciones especificadas. Estructuras de Ramificación If...Else...EndIf Ejemplo: Resp = MsgBox("Seleccione", vbQuestion + vbYesNo, "Prueba") If Resp = vbYes Then MsgBox "Presiono Yes" Else MsgBox "Presiono No" End If If ElseIf EndIf If Resp = vbYes Then Mess = “Presiono SI” ElseIf Resp = vbNo Then Mess = “Presiono NO” ElseIf Resp = vbCancel Then Mess = “Presiono Cancelar” End If Este fragmento de código toma una decisión basada en tres valores mutuamente excluyentes, VbYes, VbNo y VbCancel, para la variable Resp. IIf Esta función requiere tres argumentos, la condición para verificar, que devolver si la condición es cierta y que devolver si es falsa. Color = IIf ( Color < 15, Color, 1) En este caso, el color permanece igual mientras sea menor que 15, a menos que sea mayor que 15, en cuyo caso obtiene el valor de 1. Select Case....End Select Cuando se necesite ejecutar uno de varios grupos de instrucciones, dependiendo del valor de una cadena o expresión numérica, es mejor la construcción Select Case...End Select: Select Case edad Case 5 Mess = “ 5 años de edad” Case 13 to 19 Mess = “Joven” Case 20 to 35, 50 , 60 to 65 Mess = “Adulto Case Is > 65 Mess = “Respetable” Case Else Mess = “Todos” End Select Estructuras de Repetición (Ciclos) Existen diversas estructuras de repetición en Visual Basic. La estructura While...Wend ejecuta rápidamente una o más instrucciones mientras una condición dada es cierta: Sintaxis While condicion [instrucciones] Wend La condición es una expresión numérica o de cadena que evalúa True (cierto) o False (falso). Si la condicion es True, todos los enunciados se ejecutan hasta que se encuentra la palabra clave Wend. En este punto, regresa al enunciado While y la condición se evalúa nuevamente, y si todavía se cumple se reptie el proceso, de lo contrario continua con la instrucción posterior al Wend. While i < 15 Print i i = i + 1 Wend La estructura Do....Loop proporciona una forma más adecuada y flexible para ejecutar ciclos. Esta repite un bloque de código mientras una condición es True o a partir de que la condición llegue a ser True. Do Until rsClientes.EOF Print rdClientes(“Nombre”) RsClientes.movenext Loop Igualmente se puede utilizar Do If (i = 10) Then MsgBox "llego Exit Do Else Print i End If i = i + 1 Loop Until i > 20 10" La estructura For…Next repite un grupo de instrucciones, un número especificado de veces. Este ciclo crea una variable de contador, especificando sus valores inicial o final. For I = 0 to 10 Print I Next I Se pueden especificar que el contador incremente o decremente en intervalos especificados mediante el uso de Step. Fácilmente se podría imprimir una columna de números que muestre un incremento gradual del 5%. For Porc = 0 to 100 step 5 Print Porc Next Porc Procedimientos y Funciones Procedimiento Un procedimiento es un conjunto de instrucciones que realizan una tara específica sin retornar ningún valor. Este procedimiento se puede ejecutar las veces que sea llamado desde cualquier módulo del programa. Los Procedimientos de declaran con la palabra reservada Sub seguido de el nombre del procedimiento con sus parámetros respectivos. Ejemplo Sub CentrarForma(F as form) F.left = (screen.width – F.width)/2 F.Top = (screen.height – F.height)/2 End Sub Para Hacer el llamado del procedimiento, se debe hacer usando la palabra reservada Call y luego el nombre del procedimiento. Ejemplo Call CentrarForma(frmFicha) Funciones Es un procedimiento que realiza una tarea específica dentro de un programa y al final se obtiene un valor de retorno. Una función se define en un modulo que inicia con la instrucción Function y termina con la instrucción End Function Ejemplo: Function Calcular(val1 As Integer, val2 As Double) As Double Dim total As Double total = val1 * val2 Calcular = total End Function Llamado de la función: Z = Calcular( x , y ) El uso de funciones y/o procedimientos, permiten crear rutinas personalizadas por los programadores para satisfacer las necesidades de su aplicación en particular y evitar la inconveniente e innecesaria repetición de código. Se puede aumentar el poder y la versatilidad de los procedimientos incluyendo cualquiera de las instrucciones y funciones integrados de VB, así como las rutinas previamente definidas por usted. Controles Básicos Los controles son objetos predeterminados que disponen de propiedades y métodos propios, los cuales nos brindan mucha utilidad para el desarrollo de nuestras aplicaciones. CommandButton Utilice un control CommandButon para comenzar, interrumpir o terminar un proceso. Cuando está activado, un CommandButon aparece presionado y a veces se denomina boton de comando. Label Un control Label es un control gráfico que permite mostrar un texto que un usuario no puede modificar directamente. Tambien conocido como etiqueta, este control se utiliza para mostrar textos e instrucciones en las formas. Line Es un control gráfico que se muestra como una línea horizontal, vertical o diagonal. Puede usar este control para dibujar líneas en formularios. Shape Shape, es un control gráfico que se muestra como rectángulo, un cuadrado, una elipse, un círculo, un rectángulo redondeado o un cuadro redondeado. Utilice controles Shape en tiempo de diseño para el diseño de formularios en lugar de los métodos Circle y Line. Picture El objeto Picture le ofrece una forma de manipular mapa de bits, iconos, metarchivo mejorados e imágenes GIF y JPEJ asignados a objetos que tengan la propiedad Picture. CheckBox Un control CheckBox muestra una cuando está activado. El carácter desaparece cuadno el control se desactiva. Utilice este control para ofrecer al usuario una opción de tipo verdadero o falso, o Sí o No. Puede usar controles CheckBox en grupos para mostrar múltiples opciones entre las cuales el usuario pueda seleccionar una o más. OptionButton Un control OptionButton muestra una opción que se puede activar o desactivar. Generalmente, estos controles se utilizan en grupos de opciones en las cuales el usuario solo puede seleccionar una. Los controles OptionButton se agrupan si los dibuja dentro de un contenedor como en un control Frame, un PictureBox o un Formulario. Frame Un control Frame proporciona un agrupamiento identificable para controles. También puede usar un control Frame para subdividir un formulario funcionalmente; por ejemplo, para separar grupos de controles OptionButton. Timer Un control Timer puede ejecutar código a intervalos periódicos produciendo un evento Timer. El control Timer, invisible para el usuario, resulta útil para el procesamiento de fondo. No existe ningún limite práctico en cuanto al número de controles Timer activos que puede tener Visual Basic ejecutándose. DTPicker Utilice el control DTPicker para proporcionar un campo fecha con formato que facilite la selección de fecha. Además, los usuarios pueden seleccionar una fecha a partir de una interfaz de calendario desplegable similar a la del control MonthView. El Control DTPicker tiene dos modos de funcionamiento: 1. El control calendario desplegable (predeterminado) se muestra al usuario un calendario desplegable en el que se puede seleccionar una fecha. 2. El modo formato de hora, el usuario selecciona en un campo la hora (hora, minutos, segundos). Formularios MDI Un formulario MDI (Multiple Document Interface) es un contenedor de otros formularios. La aplicación MDI contendrá un formulario padre MDI y los formularios hijos MDI. Muchas aplicaciones Windows son programas MDI. Excel, por ejemplo, puede desplegar muchas hojas de calculo dentro de su misma ventana principal, todas sobre la misma base, por así decirlo. Específicamente, un formulario MDI es una ventana que actúa como la base de una aplicación y es el contenedor de otros formularios que tienen la propiedad MDI Child establecida como True. Las Ventanas hijas pueden abrirse, minimizarse, redimensionarse, moverse y tratarse como cualquier ventana normal, sin embargo siempre permanecen dentro del área de la ventana padre; es decir, no pueden arrastrarse fuera del área de la ventana principal. Usted crea un formulario MDI (padre) mediante la selección de MDI Form del menú Project . Una aplicación sólo puede tener un formulario padre. Los formularios MDI, sólo pueden contener objetos del menú, cuadros de dibujo, barras de herramientas, barras de estado etc. En resumen, los formularios MDI, no pueden tener controles (a excepción de algunos) ni objetos, simplemente es el formulario padre de la aplicación, el cual se diseñan los menús principal y barras de herramientas del sistema que nos permitan llamar a nuestros formularios de trabajo. Si un formulario hijo tiene menús, la barra de menú del formulario hijo reemplaza automáticamente a la barra del menú del objeto MDI, mientras este activo. La Barra del menú que se diseña para un formulario hijo MDI se desplegará sobre el formulario padre MDI en tiempo de ejecución, cuando el formulario hijo MDI este activo, aunque este aparezca en el formulario hijo en tiempo de diseño. Creación de Menús El Editor de Menú es una aplicación de diseño de menú que se incluye en Visual Basic. Se utiliza para crear menús personalizados de su aplicación. Para iniciar el editor de menú, puede seleccionarlo en el menú Herramientas Tools y luego editor de menús. Editor de Menu: Así se mostrará momento de el menú al ejecutarlo El cuadro de texto Name es donde usted teclea el nombre de control para el elemento del menú. Para permitir el acceso por teclado puede asignarle un ampersand (&) antes de una letra o asignado un acceso rápido(shortcut) para ese opción del menú. También puede asignar una barra de división mediante el tecleo de un solo guión (-). Use los botones de esquema (flechas izquierda, derecha, arriba, abajo) para ajustar los niveles (la jerarquía) de los submenú. Barras de Herramientas Se utilizan barras de herramientas (ToolBar), para proporcionar al usuario un acceso rápido a las opciones más importante de nuestro sistema, así como para mostrarle un ambiente gráfico familiar al de todas las aplicaciones Windows. Ejemplo de Aplicación utilizando el control ToolBar Barra de herramientas Control TooolBar Lista de Imágenes Control ImageList Para Crear una barra de herramientas con iconos gráficos, primeramente se debe utilizar el control ImageList, el cual tendrá el arreglo de imágenes que se utilizarán asi como las propiedades de los gráficos. El primer paso será colocar el control de imágenes sobre el formulario en el que se desea la barra de herramientas. Luego acceder a las propiedades de éste con el botn derecho del ratón. Entre las opciones que se deberá fijar están el tamaño de los gráficos, así como indicar la ruta donde se encuentran ubicados los archivos gráficos y finalmente nombrarlos y ponerles un número de índice con el cual los identificaremos en el control ToolBar. Ejemplo del control ImageList del menú anterior Una vez fijado los gráficos, se procede a colocar el control ToolBar y a fijar las propiedades del mismo, en las cuales se seleccionaran tipo de botón, relieve de la barra, lista de imágenes que se usarán, acciones del mouse etc. Control de Unidades, Directorios y Archivos El control DriveListBox permite al usuario seleccionar una unidad válida de disco en tiempo de ejecución. Este despliega una lista ordenada de las unidades del disco usuario y reacciona automáticamente a los clic del ratón. La propiedad más importante de un DirveListBox es la propiedad Drive, el cual proporciona la unidad actual seleccionada por dicho control. Para sincronizar el DriveListBox con el DirListBox, es necesario indicar lo siguiente en el evento Change: Dir1.Path = Drive1.Drive El control DirListBox despliega una lista jerárquica ordenada de los directorios y subdirectorios del disco del usuario, según la unidad seleccionada por el DriveListBox, permitiendo al usuario navegar entre ellos. Para Mostrar la lista de archivos en el directorio seleccionado es necesario añadir lo siguiente y sincronizarlo con el FileListBox: File1.Path = Dir1.Path El Control FileListBox localiza y lista archivos en el directorio especificado por su propiedad Path en tiempo de ejecución. Usted puede usar este control para desplegar una lista de archivos en el direcotorio actual o puede establecer la propiedad Patern para mostrar solamente cierto tipo de archivos. Ejemplo: Manejador de Errores Hay errores de diferentes tipos: errores de sintaxis, los que ocurren cuando se teclea un mal comando o falta un argumento; los errores en tiempo de ejecución, que son causados por circunstancias fuera de control del programa, que no se previeron en tiempo de diseño; y los errores lógicos, que provocan que su programa produzca resultados incorrectos o inesperados. Visual Basic manipula el primer tipo de error, los de sintaxis, detectando los problemas de sintaxis cuando se escribe el código del programa. Los otros dos tipos de errores, deben ser corregidos por usted. El manejo de errores en tiempo de ejecución es el que aprenderemos a manejar a continuación, para evitar la interrupción del programa en tiempo de ejecución. En Visual Basic, los errores en tiempo de ejecución se refieren como errores interceptables, esto es, Visual Basic reconoce que se ha producido un error y le permite intercepartlo y realizar una acción correctiva, de lo contrario se finalizará la aplicación. La manera de manejar los errores, es mediante el uso de la instrucción On Error GoTo de Visual Basic. Esta es la sintaxis: On Error GoTo “procedimiento” En este caso “procedimiento” es una manera de identificar un bloque de código y es, simplemente, una sola palabra en una línea seguida por dos puntos (:). Ejemplo: Private Sub cmdTest_Clic() On Error GoTo Manejo Exit Sub Manejo: MsgBox “Ha ocurrido un error” Resume End Sub La instrucción Resume le permite volver a intentar la operación que causo el error. Esto puede ser o no lo que usted desea, dependiendo de la naturaleza del error. De hecho, si el error fue debido a algo en el que el usuario no puede hacer nada, Resume causará un ciclo infinito. La instrucción Resume también puede usarse para devolver el control a la instrucción que sigue inmediatamente a la que provocó el error (Resume Next), o para pasar a otra línea o procedimiento dentro del mismo procedimiento principal. Un manejador de errores amigable con el usuario desplegará el número y la descripción del error y ofrecerá algunas alternativas de cómo proceder después de ocurrido el error. El objeto Err sirve para reportar el error (número y descripción). En este caso se podrá indicar el error de la siguiente forma: Msgbox “Ha ocurrido el error No” & Err.Number & “ – “ & Err.Descripción El manejo de errores proporciona una forma de que su programa tenga trato con los procesos fallidos, de lo contrario la aplicación se cerrará completamente. Para practicar el manejador de errores, se puede aplicar al ejemplo de los DriveListBox al error que ocurre cuando se selecciona una unidad no válida. Bases de Datos Conexión a una Base de Datos El Control de Datos (Data) es un control integrado para conectar una aplicación Visual Basic con una fuente de datos que se selecciona. Los controles de datos proporcionan una forma visual y fácil para navegar por los campos, registros y tablas de una o más Bases de Datos. También se usan para enlazar algunos controles, como cuadros de texto, etiquetas, cuadros de dibujo, etc. con los campos de tablas que se seleccionan en su base de datos. Una vez que un control, como un cuadro de texto, está asociado a un campo en particular, cualquier cambio en el contenido del cuadro de texto se registra automáticamente en el campo asociado. En pocas palabras, los controles de datos asociados permitirán que se creen aplicaciones de acceso de datos que requieran muy poca o ninguna codificación. Controles de Datos Asociados : Data Se usa para proporcionar acceso a datos en bases de datos por medio de controles asociados en su formulario. Crea y maneja objetos Database y Recordset para utilizarse por controles asociados. Se requiere para usarse con todos los demás controles asociados. DBCombo Se usa para crear una combinación asociada de cuadro de lista y cuadro de texto o una simple lista desplegable. La lista puede llenarse automáticamente desde un Control Data. DBGrid Se usa para trazar una cuadrícula asociada compuesta de varios registros. La cuadrícula puede llenarse automáticamente desde un control Data. El usuario puede escoger un elemento de la cuadrícula o teclear un valor en el nuevo regisro. El Control Data tiene muchas propiedades, ocho de las cuales se listan en resumen aquí: Align Devuelve o pone un valor entero (0-4) que determina si el control Data se despliega en cualquier tamaño y parte del formulario (0), o si se despliega en la parte superior, inferior, izquierda o derecha de la forma (1-4) y que se dimensiona automáticamente para adaptarse a la anchura del formulario. Caption Una frase a modo de mensaje que se despliega en el propio control Data. DataBase Regresa una referencia al objeto de base de datos subyacente del control Data. DataBaseName Devuelve y establece el nombre y ubicación de la fuente de datos de un control data. Este es a menudo una expresión de cadena que indica el nombre y la ruta completa de la base de datos. ReadOnly Devuelve o establece un valor booleano que indica si los datos pueden editarse. El valor por omisión es False, para permitir la edición. Recordset Devuelve o establece un objeto Recordset que se define por las propiedades de un control Data. RecordsetType Devuelve o establece un valor entero (0-2) que indica el tipo de objeto Recordset que usted desea que cree el control Data : Table, Dynaset o SnapShot. El valor por omisión es 1, Dynaset. RecordSource Devuelve o establece la tabla subyacente o el enunciado SQL para un control Data. Esta propiedad determina cuáles registros serán desplegados por el control Data. Ejemplo : Acceso de Datos desde Visual Basic 1. Creemos un proyecto nuevo 2. Agreguemos una forma 3. Añada un Control Data a la forma 4. Establezca las siguientes propiedades Name Align DataBaseName RecordSource dtaAutores 2 – Align Bottom Ruta Authors 5. Dibuje tres cuadros de texto con las siguientes propiedades Name DataSource DataField txtId, txtNombre, txtAño dtaAutores Au_Id, Autor, Year Born 6. Configure el proyecto para que inicie con esta forma 7. Ejecute el Proyecto. Podrá ver que se pueden consultar los datos de los Autores, uno a uno, se puede navegar al siguiente, al anterior, al primero y al último y no fue necesario escribir código alguno. Uso del DBCombo Este control se ve y trabaja muy parecido a un ComboBox normal no asociado, pero tiene mucho más funcionalidad relacionada con la Base de datos. Puede usarlo para desplegar una lista de datos de su base de datos y ajustar solamente las propiedades DataSource y RowSource, ListField. Para poder utilizar un DBCombo, se requiere que se haya agregado un control Data a la forma. Ejemplo 1. 2. Agregue una nueva forma a su proyecto Añada un Control Data a la forma con las siguientes propiedades Name Caption DatabaseName ReadOnly Align RecordSource 3. dtaAutores Autores Ruta Yes 2 – Align Bottom Authors Agregue un DBCombo a la forma con las siguientes propiedades Name Caption DataSource RowSource ListField dbcAutores dtaAutores dtaAutores Author 4. 5. Configure el Proyecto para que inicie con esta forma Ejecute el Proyecto Como podrá ver le aparece el listado de todos los autores, y de igual forma, no fue necesario escribir código alguno. Uso del DBGrid El Control DBGrid despliega y permite el manejo de datos de un serie de líneas y columnas que representan los registros y los campos del objeto Recordset de un Control Data. Este requiere más sobrecarga que el control estándar de la cuadrícula, pero la funcionalidad que se añade y la atractiva apariencia valen la pena, en la mayoría de los casos. Aunque el control DBGrid ligado a datos se ve similar al control estándar Grid, se puede establecer la propiedad DataSource del Control DBGrid a un Control Data, para que la cuadrícula se llene automáticamente y se pongan encabezados de columna a partir del Recordset del control Data. El control DBGrid es simplemente, en realidad, un conjunto de columnas y líneas, cuyas dimensiones se determinan por la cantidad de campos y registros del Recorset asociado. Este control, cuando se crea inicialmente en tiempo de diseño, despliega dos columnas y dos líneas. Mediante el uso de la ventana Properties, puede cambiar cualquiera de los atributos visibles de la cuadrícula. Cuando establece la propiedad DataSource, accesa al RecordSet que se creó por el control Data y despliega las columnas, que incluyen los encabezados y las líneas del Recordset actual. Las columnas están numeradas de acuerdo a la posición de los campos en el Recordset subyacente (menos 1, como es usual). Las líneas están numeradas iniciando desde cero, el encabezado no se incluye. Ejemplo : 1. Añada un formulario al proyecto 2. Añada un Data Control con las siguientes propiedades Name Caption DatabaseName ReadOnly Align RecordSource dtaAutores Autores Ruta Yes 2 – Align Bottom Authors 3. Agregue un DBGrid al formulario con las siguientes propiedades : Name Caption DataSource dbgAutores Consulta de Autores dtaAutores 4. Configure el Proyecto para que inicie con este formulario 5. Ejecute el Proyecto. Le muestra un listado de todos los datos de los Autores. Objetos Database y Recordset Un objeto Database es una representación lógica de una base de datos física que puede asignarse a una variable de tipo Database y ser manejada por ésta. Una vez que añade un control Data válido a sus aplicaciones, ya está trabajando con un objeto Database. Un Control Data tiene una propiedad Database (que no es la misma que la propiedad DatabaseName) y contiene una referencia al objeto Database asociado con el control actual. Usted puede declarar variables de tipo Database en sus programas y ponerlas iguales a la propiedad Database de un Control Data en particular, o puede asignarles valores mediante el uso del método OpenDatabase(), que se trata a continuación. El método OpenDatabase() abre una base de datos específica y regresa una referencia al objeto Database que la representa. La programación con objetos de acceso a datos consiste en la creación de variables objetos y su manipulación consiste en llamar a sus métodos y establecer sus propiedades. Esta es la sintaxis simplificada para el método OpenDatabase(): Set dbVariable = Objeto.OpenDatabase(dbName) Aquí, dbVariables es una variable del tipo de datos del objeto Database que representa la Base de datos que se abre. El argumento dbName es una expresión de cadena, el nombre de un archivo de base de datos existente. Si el nombre de archivo de la base de datos tiene una extensión, debe incluirla. Si su red lo permite, puede también especificar una ruta de red totalmente calificada, como \\SERVIDOR\\DIR\\BD.MDB. Si dbName no se refiere a una base de datos existente, o si se refiere a una base de datos que ya está abierta para acceso exclusivo por otro usuario, ocurre un error. También deberá observar el uso de un objeto de tipo Workspace . Este se utiliza para transmitir transacciones simultáneas, de tal suerte que actúa como un contenedor para bases de datos abiertas e identifica un contexto de seguridad para las operaciones en la base de datos. Si Usted quiere abrir su base de datos desde el código en lugar de hacerlo con un control Data, este es un fragmento de código que lo haría: Dim dbContacts As Database, wsEspTrab As WorkSpace ‘Declara Variable Set wsEspTrab = DBEngine.Workspaces(0) Set dbContacts = wsEspTrab.OpenDatabase(“c:\sistema\contacts.mdb”) Una vez que obtiene una variable Database válida, puede usarla para ejecutar los métodos Database, como Execute, que ejecuta una instrucción SQL sobre la base de datos que se especifica, u OpenRecordset, que crea un nuevo objeto Recordset. Por ejemplo, podría obtener acceso a su tabla si añade las siguientes líneas al código anterior: Dim rsContacts As Recordset Set rsContacts = dbContacts.OpenRecordset(“Contacts”) Un objeto Recordset es un conjunto lógico de registros asociados con una base de datos física; representa los registros en una tabla o los que resultan de hacer una consulta. Los objetos Recordset son los medios principales por los que usted interactúa con los datos que contiene en su base de datos. Todos los objetos Recordset se contruyen mediante el uso de los registros (filas ) y los campos (columnas) de tablas de bases de datos existentes. Existen tres tipo de objetos Recordset: Tipo Tabla Es una representación de una tabla base que puede usar para añadir, cambiar o borrar registros de una sola tabla sencilla de base de datos. Tipo Dynaset Es el resultado de una consulta que puede tener registros actualizables. Un Recordset tipo Dynaset es un conjunto dinámico de registros que puede usar para añadir, cambiar o borrar registros desde una o varias tablas de base de datos subyacentes. Tipo SnapShot Es una copia estática de un conjunto de registros que puede usar para encontrar datos o generar reportes. Un Recordset tipo snapshot puede contener campos desde una o más tablas de una base de datos, pero puede alterarse. El método OpenRecordset() se usa para crear un nuevo objeto Recordset asociado con la base de datos actual. Esta es la sintaxis simplificada: Set rsVariable = dbVariable.OpenRecordset(Fuente, Tipo ) Aquí, rsVariable es una variable objeto declarada de tipo RecordSet y dbVariable es una variable objeto de tipo Database que se ha asignado a un objeto de base de datos actualmente válido. El argumento que se requiere, Fuente, es una expresión de cadena que especifica el origen de los registros para el nuevo Recordset. Fuente puede ser un nombre de Tabla, un nombre de consulta o una instrucción SQL que regresa registros. Para los Recordset tipo tabla, Fuente puede ser solamente un nombre de tabla. El argumento Tipo es opcional y se usa para indicar uno de los tres tipos de Recordset. Si se omite el tipo, Visual Basic ( por medio de la máquina de base de datos Microsoft Jet ) trata de crear un Recordset tipo tabla. Si esto no es posible, se crea un Recordset tipo dynaset o tipo snapshot. Una vez que establece una variable Recordset puede usar los métodos MoveNext, MovePrevious, MoveFirst y MoveLast para navegar por los registros. Para los Recordset tipo dynaset y snapshot, puede usar también los métodos Find, como FindFirst, para localizar un registro específico en base a un criterio. Consultas a la Base de Datos con SQL El Lenguaje de consulta estructurado (SQL) es un lenguaje que se usa para consultar, actualizar y manejar de otras maneras las bases de datos relacionales. Puede usarse para recuperar, filtrar y ordenar información de bases de datos. Puede usar las instrucciones SELECT de SQL en cualquier parte donde se acepte un nombre de tabla, uno de consulta o de campo. Por ejemplo, puede usar una instrucción SQL en lugar de un nombre de tabla en el método OpenRecordset : Dim Dim Dim Dim wsWS as Workspace dbCDLibrary As Database rsBlues as Recordset sSQL as string SSQL = “SELECT * FROM BLUES “ Set wsWS = DBEngine.Workspaces(0) Set dbCDLibrary = wsWS.OpenDatabase(“Cdisks.MDB”) Set rsBlues = dbCDLibrary.OpenRecordset(sSQL, dbOpenDynaset) Una instrucción SQL es una expresión de cadena que empieza con un comando de lenguaje de consulta estructurado, como SELECT, UPDATE o DELETE y puede incluir cláusulas de filtro y ordenamiento como WHERE y ORDER BY. Las instrucciones SQL, Una consulta de selección pide a la base de datos un conjunto de registros que satisfagan criterios específicos y recibe un Recordset; en cambio, una consulta de acción ejecuta una tarea que se especifica sobre un conjunto de registros que satisfacen el criterio especificado. En ambos casos se pueden usar intrucciones SQL para definir los registros que se quieren recuperar o con los que quiere actuar, y cómo se les quiere ordenar y agrupar. Este es un ejemplo de una consulta de selección que podría usarse con la base de datos Contacts: SELECT Code, Contact, Pone FROM Contacts WHERE State = ‘NY’ ORDER BY Code Si desea quitar todos los contactos de California de su tabla Contacts, use la siguiente consulta de acción: DELETE FROM Contacts WHERE State= ‘CA’ Si usa una consulta SQL para recuperar datos, el motor de base de datos de Visual Basic crea un Recordset tipo dynaset o tipo snapshot, y nunca uno tipo tabla. Una vez que se contruye el Recordset, puede refinarlo mediante el uso de uno de los métodos Find, o poner un ciclo para avanzar paso a paso por los registros de uno en uno. Hay varias formas de ejecutar consultas SQL, que se resumen a continuación: Use una instrucción SQL como un argumento para el método OpenRecordset Establezca la propiedad RecordSource de un control Data y use el método Refresh Use el QueryDef existente en la propiedad RecordSource del control Data Use una consulta de acción SQL como un argumento para el método Execute Cree y ejecute un objeto QueryDef personalizado Ejecute el QueryDef existente con el método OpenRecordset Establecimiento de la propiedad RecordSource de un control Data : Puede crear un Recordset, estableciendo la propiedad RecordSource de un control Data a una cadena de consulta SQL. Estos son los pasos generales a seguir cuando se usa una consulta SQL con un control Data. 1. 2. Diseñe la consulta SQL para que devuelva solamente los registros que Usted desee. Teclee la instrucción SQL de la consulta en la propiedad RecordSource del control Data. Puede hacer esto en tiempo de diseño o de ejecución. Por ejemplo, en tiempo de ejecución puede usar este código: dtaQuery.RecordSource State=’NY’” 3. = ‘SELECT * FROM Contacts WHERE En tiempo de ejecución, use el método Refresh para volver a crear el Recordset: dtaQuery.Refresh Uso de una consulta de acción y del método Execute: Si necesita ejecutar una consulta de acción para efectuar una operación que no devuelva registros, como cuando inserta, borra o actualiza registros, puede usar la instrucción SQL como un argumento en el método Execute. El método Execute puede usarse con un Control Data o con un objeto Database abierto, siempre y cuando la consulta no devuelva registros. Por ejemplo, para borrar registros de una tabla que satisfagan criterios específicos, puede usar el siguiente código: dbContacts.Execute “DELETE FROM Contacts WHERE City = ‘Tacoma’” Reportes (Uso del Data Report) Acerca del Diseñador de entorno de datos (DataEnvironment) El Diseñador de entorno de datos proporciona un entorno interactivo en tiempo de diseño para crear por programa accesos a datos en tiempo de ejecución. En tiempo de diseño se establecen los valores de las propiedades de los objetos Connection y Command, se escribe código para responder a los eventos de la interfaz de objetos de datos de ActiveX® (ADO), se ejecutan comandos y se crean campos agregados y jerarquías. También es posible arrastrar y colocar objetos Data_Environment en formularios o informes para crear controles enlazados a datos. Con el Diseñador de entorno de datos puede llevar a cabo las tareas siguientes: Agregar un Diseñador de entorno de datos a un proyecto de Visual Basic. Crear Crear objetos Command basados en procedimientos almacenados, tablas, vistas, sinónimos e instrucciones SQL. Crear jerarquías de objetos Command basadas en una agrupación de objetos Command, o asociar entre sí uno o varios objetos Command. Escribir y ejecutar código para los objetos Connection y Recordset. Arrastrar y colocar campos de un objeto Command del Diseñador de entorno de datos a un formulario de Visual Basic o al Diseñador de informe de datos. objetos Connection. Diseñar un objeto DataEnvironment En tiempo de diseño, es posible usar el Diseñador de entorno de datos para crear un objeto DataEnvironment. El objeto DataEnvironment puede incluir objetos Connection y Command, jerarquías (relaciones entre objetos Command), agrupaciones y campos agregados. Antes de diseñar el objeto DataEnvironment debe determinar la información que desea presentar, identificar las bases de datos que contienen la información y determinar el objetivo de tiempo de ejecución (por ejemplo, crear un informe de datos). Antes de obtener acceso al Diseñador de entorno de datos debe hacer referencia al mismo en Visual Basic. Para hacer referencia al Diseñador de entorno de datos 1. 2. En el menú Proyecto, haga clic en Referencias. En el cuadro de diálogo Referencias, seleccione Data Environment 1.0 y, a continuación, haga clic en Aceptar. Para agregar un objeto del Diseñador de entorno de datos a un nuevo proyecto de Visual Basic 1. En la ficha Nuevo del cuadro de diálogo Nuevo proyecto, elija proyecto EXE estándar y, a continuación, haga clic en Abrir. 2. En el menú Proyecto, elija Agregar entorno de datos. Visual Basic agrega el Diseñador de entorno de datos al proyecto, muestra la ventana del Diseñador de entorno de datos, y agrega un objeto Connection al entorno de datos. Después de haber agregado un Diseñador de entorno de datos al proyecto, puede crear un objeto Connection; vea el procedimiento en Objetos Connection. Después de crear un objeto Connection, puede agregar objetos Command al mismo; vea el procedimiento en Objetos Command Objetos Connection Para tener acceso a los datos mediante el entorno de datos, debe crear un objeto Connection. Por tanto, cada entorno de datos debería incluir al menos un objeto Connection. Un objeto Connection representa una conexión a una base de datos remota que se utiliza como un origen de datos. Cuando ha agregado un entorno de datos al proyecto de Visual Basic, el Diseñador de entorno de datos incluye automáticamente una nueva conexión, denominada Connection1. En tiempo de diseño, el entorno de datos abre la conexión y obtiene metadatos relativos a la conexión que incluyen los nombres de objetos, las estructuras de tablas y los parámetros de procedimiento de la base de datos. Nota Si se activa la opción Mostrar propiedades inmediatamente después de crear el objeto del cuadro de diálogo Opciones, se mostrará el cuadro de diálogo Propiedades de vínculos de datos cuando agregue un entorno de datos a su proyecto. Esta opción no está seleccionada de forma predeterminada. Crear un objeto Connection La función Agregar conexión está disponible en todo momento, independientemente de si existen otros objetos. Para crear una conexión a una base de datos Haga clic en Agregar conexión en la barra de herramientas del Diseñador de entorno de datos. O bien, Haga clic con el botón secundario del mouse (ratón) en el Diseñador de entorno de datos y seleccione Agregar conexión en el menú emergente. Cuando ha agregado un objeto Connection, se actualiza el entorno de datos para mostrar el nuevo objeto Connection. El nombre predeterminado de este objeto es "Connection" seguido de un número, como Connection1. Utilice el procedimiento siguiente para especificar las propiedades del objeto Connection. Para establecer el nombre de conexión y el origen de datos 3. En la ventana de Propiedades, cambie el nombre predeterminado por un nombre más descriptivo de la base de datos de origen. Por ejemplo, puede cambiar el nombre Connection1 por "Northwind" si el origen de datos es la base de datos Northwind. 4. Haga clic en el objeto Connection y elija Propiedades para tener acceso al cuadro de diálogo Propiedades de vínculos de datos. 5. En el cuadro de diálogo Propiedades de vínculos de datos, especifique la información de conexión en las fichas Conexión y Proveedor. Suele ser una base de datos que contiene datos o procedimientos almacenados. Sólo puede seleccionar un origen para cada objeto Connection. 6. Nota Independientemente del tipo de origen de datos seleccionado, el entorno de datos permite recuperar todos los datos mediante las interfaces ADO y OLE DB. 7. Haga clic en Aceptar para aplicar las propiedades y cerrar el cuadro de diálogo Propiedades de Connection. Establecer la información de inicio La información de inicio sólo es necesaria si el acceso a la base de datos mediante el objeto Connection requiere información de autenticación. Puede especificar que se utilicen conjuntos diferentes de información de inicio en tiempo de diseño y en tiempo de ejecución. Por ejemplo, podría desarrollar una aplicación que utilice una identificación y contraseña de usuario administrador del sistema pero que proporcione al mismo tiempo una identificación de usuario invitado general cuando se ejecuta la aplicación. Nota Cualquier información de inicio especificada en la ficha Propiedades de vínculos de datos se sobrescribe con la información de inicio de sesión especificada en la ventana de Propiedades de Visual Basic. Para especificar la información de inicio 1. Si es necesario, en la ventana de Propiedades de Visual Basic, especifique la identificación y contraseña de usuario que debe usarse en tiempo de diseño y tiempo de ejecución. Es posible especificar también el comportamiento del indicador. 2. Establezca DesignSaveAuthentication a True si desea que la autenticación especificada persista en tiempo de diseño. Esta información no se escribe en el archivo ejecutable o la biblioteca de vínculos dinámicos (DLL). Si el valor de esta opción es False, cualquier información en DesignUserName y DesignPassword se perderá una vez que cierre y vuelva a abrir el proyecto que genere. 3. Establezca RunSaveAuthentication al valor True si desea usar la autenticación especificada en tiempo de ejecución. La información de autenticación se almacena en las propiedades de la clase y persiste en el archivo ejecutable o DLL que genera. Si el valor de esta opción es False, cualquier información en RunUserName y RunPassword se perderá una vez que cierre y vuelva a abrir el proyecto. Nota Por seguridad, debido a que la contraseña no está codificada, no debe especificar que la contraseña persista en tiempo de ejecución ni en tiempo de diseño. Objetos Command Los objetos Command definen información de detalle específica acerca de cómo deben recuperarse los datos mediante una conexión basada en datos. Es posible basar los objetos Command en un objeto de base de datos (como una tabla, una vista, un procedimiento almacenado o un sinónimo) o en una consulta SQL (Structured Query Language). Asimismo, puede crear relaciones entre objetos Command para obtener un conjunto de datos relacionados en forma de jerarquía. Nota Para que un objeto Command sea válido, debe estar asociado con un objeto Connection. Si un objeto Command devuelve datos, se considera "de devolución de conjunto de registros" y es posible tener acceso a sus resultados mediante un objeto Recordset disponible en el objeto DataEnvironment. Sin embargo, si un objeto Command no devuelve datos (por ejemplo, procedimientos almacenados o texto SQL que realice una actualización), se considera de "no-devolución de conjunto de registros". El Diseñador de entorno de datos identifica automáticamente si el objeto Command es de devolución de conjunto de registros. Puede suplantar este valor mediante la casilla de verificación Devolver RecordSet de la ficha Avanzadas del cuadro de diálogo Propiedades de Command. En tiempo de ejecución, la forma de obtener acceso al objeto Command depende de si se trata de un objeto Command de devolución de conjunto de registros. Si se trata de un objeto Command de devolución de un conjunto de registros, puede obtener acceso al objeto Command como una propiedad o como un método del objeto DataEnvironment. Si se trata de un objeto de no-devolución de conjunto de registros, sólo se puede tener acceso al objeto Command como un método. Vea Usar un entorno de datos con su aplicación para obtener más información. Crear un objeto Command La función Agregar comando está disponible en todo momento y es independiente de la existencia de otros objetos. Sin embargo, un objeto Command que no esté asociado con un objeto Connection no es válido. La propiedad ActiveConnection del objeto Command está establecida en el objeto Connection si la conexión puede identificarse mediante el enfoque actual durante el procedimiento de agregar. Si no se identifica un objeto Connection, el objeto Command no es válido mientras no lo asocie con una conexión. Para agregar un objeto Command Haga clic en Agregar comando en la barra de herramientas del Diseñador de entorno de datos. O bien, Haga clic con el botón secundario del mouse en un objeto Connection o en el Diseñador de entorno de datos, y elija la opción Agregar comando del menú emergente. Después de agregar un objeto Command, la vista esquema del entorno de datos presenta el nuevo objeto Command. El nombre predeterminado del objeto es "Command", seguido de un número, como Command1. Utilice el procedimiento siguiente para especificar las propiedades del objeto Command. Para especificar las propiedades del objeto Command 1. Haga clic con el botón secundario del mouse en el objeto Connection y elija Propiedades para tener acceso al cuadro de diálogo Propiedades de Command. 2. Haga clic en la ficha General, y establezca los valores siguientes: Elemento Propósito Cambie el valor predeterminado de Nombre de comando por Nombre de un nombre más descriptivo del objeto de base de datos. Por comando ejemplo, podría modificar el título Command1 por "Clientes" si el objeto Command se basa en una tabla llamada "Clientes". Si creó el objeto Command a partir del menú contextual del objeto Connection, se establece automáticamente el nombre del objeto Connection. No obstante, es posible cambiar esta Conexión conexión. Nota Para que sea válido, cada objeto Command debe estar asociado con un objeto Connection. Objeto de base de Seleccione el tipo de base de datos en la lista desplegable. datos Puede tratarse de un procedimiento almacenado, un sinónimo, una tabla o una vista. Seleccione un nombre de objeto en la lista desplegable. Los Nombre del objeto objetos mostrados provienen de la conexión y coinciden con el tipo del Objeto de base de datos seleccionado. O bien Si selecciona esta opción como el origen de datos, escriba una consulta SQL válida para la base de datos en el cuadro Instrucción SQL. Instrucción SQL O bien, Para generar la consulta, haga clic en SQL Builder para iniciar el diseñador de consultas. Si el objeto Command se basa en una consulta con procedimiento almacenado, puede tener una colección establecer las propiedades de parámetro, haga clic en la cuadro de diálogo Propiedades parámetros o en un de parámetros. Para ficha Parámetros del de Command. 3. Utilice las fichas Relación, Agrupación y Campos agregados para definir relaciones y modelar los datos incluidos en el recordset. 4. Haga clic en la ficha Avanzadas del cuadro de diálogo Propiedades de Command para establecer las propiedades que cambian la forma en que se obtienen o manipulan los datos en tiempo de ejecución. En esta ficha, establezca las propiedades avanzadas que el control de entorno de datos proporciona sobre las propiedades del objeto Command y el objeto Recordset resultante. 5. Haga clic en Aceptar para aplicar las propiedades al nuevo objeto Command y cerrar el cuadro de diálogo. Si se creó correctamente el objeto Command de devolución de conjunto de registros y la opción Mostrar campos está activada en el cuadro de diálogo Opciones, puede hacer clic en el mecanismo de expansión (+) bitmap de la vista esquema del diseñador de entorno de datos para mostrar una lista de campos. Si no se ven campos, puede deberse a un objeto Recordset vacío, un objeto Command no válido o una conexión no válida. Personalizar los objetos Parameter de un objeto Command Si un objeto Command se basa en una consulta con parámetros o en un procedimiento almacenado con parámetros, el objeto Command posee una colección Parameters. Puede personalizar los objetos Parameter incluidos en la colección si cambia el tipo de datos o les asigna un nombre más descriptivo. Cambiar las propiedades de los objetos Parameter asociados El procedimiento siguiente describe cómo puede cambiar las propiedades de los objetos Parameter asociados a un objeto Command. Para cambiar las propiedades del objeto Parameter asociado a un objeto Command 1. Haga clic con el botón secundario del mouse en el objeto Command que desee personalizar y, a continuación, seleccione Propiedades en el menú emergente. 2. En la ficha Parámetros, seleccione un objeto Parameter en el cuadro de lista Parámetro y, a continuación, establezca las propiedades siguientes: Elemento Name Direction DataType Precision Scale Size Host Data Type Required Value Propósito Proporcione un nombre único y descriptivo para el objeto Parameter seleccionado. Especifique si se trata de un parámetro de entrada o de salida, o ambos a la vez, o si el parámetro corresponde al valor devuelto por el procedimiento. Especifique el tipo de datos al que se convierte el objeto Parameter. Especifique la precisión o número máximo de dígitos. Especifique el tamaño máximo, en bytes. Especifique el tamaño máximo en bytes. Especifica el tipo de datos utilizado cuando la aplicación host hace referencia a este objeto Parameter. Cambiar este valor afecta al tipo de datos utilizado para generar la información de la biblioteca de tipos correspondiente al host. Especifica si se requiere un valor del parámetro cuando se ejecuta el objeto Command. Nota Si un parámetro requerido no está establecido cuando se ejecuta el objeto Command, el comando fallará. Especifica el valor predeterminado que debe usarse en tiempo de ejecución (a menos que se proporcione un valor por programa) y, si corresponde, en tiempo de diseño si el objeto Command debe ejecutarse para obtener la información del campo. 1. Haga clic en Aceptar para aplicar las propiedades del parámetro al objeto Command seleccionado y salir del cuadro de diálogo. DataReport (Objeto) El objeto DataReport es el objeto programable que representa al diseñador de informe de datos. Sintaxis DataReport Comentarios El objeto DataReport permite generar informes a partir de los registros de una base de datos. Para usarlo: 1. Configure un origen de datos para tener acceso a una base de datos. 2. Asigne a la propiedad DataSource del objeto DataReport con el origen de datos. 3. Asigne a la propiedad DataMember del objeto DataReport con un miembro de datos. 4. Haga clic con el botón secundario del mouse (ratón) en el diseñador y, a continuación, haga clic en Obtener estructura. 5. Agregue los controles apropiados a las secciones según sea necesario. 6. Establezca las propiedades DataMember y DataField de cada control. 7. En tiempo de ejecución, utilice el método Show para mostrar el diseñador de informe de datos. El objeto DataReport sirve para cambiar por programación la apariencia y el comportamiento del diseñador de informe de datos al modificar el diseño de cada objeto Section. El diseñador de informe de datos ofrece la posibilidad de exportar los informes mediante el método ExportReport. Este método permite especificar un objeto ExportFormat, dentro de la colección ExportFormats, que servirá de plantilla para el informe. Partes del informe de datos El Diseñador de informe de datos consta de los siguientes objetos: 1. Objeto DataReport. El objeto DataReport, similar a un formulario de Visual Basic, consta de un diseñador visual y un módulo de código. Utilice el diseñador para crear el diseño de un informe. También puede agregar código al módulo de código del diseñador para dar formato a los controles o a las secciones contenidas en el diseñador por programa. 2. Objeto Section. Cada sección del Diseñador de informe de datos está representada por un objeto Section de una colección Sections. En tiempo de diseño, cada sección está representada por un encabezado en que puede hacer clic para seleccionar la sección y por un panel de la sección donde puede colocar controles. Utilice el objeto Section y sus propiedades para volver a configurar dinámicamente un informe antes de generarlo. 3. Controles del informe de datos. Se trata de controles especiales que sólo funcionan con el Diseñador de informe de datos. (Nota: en el Diseñador de informe de datos, no puede emplear los controles intrínsecos de Visual Basic ni los controles ActiveX.) Estos controles se encuentran en el Cuadro de herramientas de Visual Basic, agrupados por separado en una ficha llamada DataReport. Secciones del Diseñador de informe de datos El Diseñador de informe de datos predeterminado contiene los siguientes objetos Section: Encabezado de informe: contiene el texto que aparece al principio de un informe, como el título del informe y el nombre del autor o de la base de datos. Si desea que el Encabezado de informe aparezca en la primera página del informe, establezca su propiedad ForcePageBreak en rptPageBreakAfter. Encabezado de página: contiene información que se escribe en la parte superior de cada una de las páginas, como el título del informe. Encabezado y pie de grupo: contiene una sección que se repite en el informe de datos. A cada encabezado de grupo corresponde un pie de grupo. La pareja de encabezado y pie de grupo está asociada con un único objeto Command del Diseñador de entorno de datos. Detalles: contiene la parte "repetida" más interior (los registros) del informe. La sección Detalles está asociada al objeto Command de nivel inferior en una jerarquía de entorno de datos. Pie de página: contiene información que se escribe en la parte inferior de cada una de las páginas, como el número de página. Pie de informe: contiene el texto que aparece al final del informe, por ejemplo un resumen o una dirección o nombre de contacto. El pie de informe aparece entre el último encabezado de página y el último pie de página. Controles del informe de datos Cuando agrega un nuevo Diseñador de informe de datos a un proyecto, los controles siguientes se insertan automáticamente en la ficha DataReport del Cuadro de herramientas: Control TextBox (RptTextBox): permite dar formato al texto o asignar un objeto DataFormat. Control Label (RptLabel): permite colocar etiquetas para identificar los campos o las secciones del informe. Control Image (RptImage): permite insertar gráficos en el informe. Observe que no es posible enlazar este control con un campo de datos. Control Line (RptLine): permite dibujar reglas en el informe para distinguir mejor las secciones. Control Shape (RptShape): permite insertar rectángulos, triángulos o círculos (y óvalos) en un informe. Control Function (RptFunction): un cuadro de texto especial que calcula valores a medida que se genera el informe. Escribir informes con el Diseñador de informe de datos de Microsoft El Diseñador de informe de datos de Microsoft es un generador de informes de datos versátil con capacidad integrada de creación de informes jerárquicos por capas. Puede usarse con un origen de datos como el Diseñador de entorno de datos para crear informes con datos procedentes de muchas tablas relacionales diferentes. Permite imprimir los informes y exportarlos a archivos con formato HTML o de texto. Posibles usos Crear automáticamente informes que se exportan en formato HTML para su distribución instantánea a través de Internet. Crear informes diarios con las sumas de transacciones efectuadas cada día. Características del Diseñador de informe de datos El Diseñador de informe de datos tiene varias características: 1. Funcionalidad arrastrar y colocar aplicada a campos. Esta funcionalidad permite arrastrar campos del Diseñador de entorno de datos de Microsoft al Diseñador de informe de datos. Cuando utiliza esta técnica, Visual Basic crea automáticamente un control TextBox en el informe de datos y establece las propiedades DataMember y DataField del campo que ha colocado. También puede arrastrar un objeto Command del Diseñador de entorno de datos al Diseñador de informe de datos. En este caso, se creará en el informe de datos un control cuadro de texto por cada uno de los campos del objeto Command y se asignarán valores apropiados a las propiedades DataMember y DataField de cada cuadro de texto. 2. Controles del Cuadro de herramientas. El Diseñador de informe de datos posee un conjunto de controles propios. Cuando agrega un Diseñador de informe de datos al proyecto, los controles se crean automáticamente en una ficha llamada DataReport del Cuadro de herramientas. Muchos de estos controles tienen un funcionamiento idéntico a los controles intrínsecos de Visual Basic e incluyen un control Label, Shape, Image, TextBox, y Line. El sexto control (el control Function) genera automáticamente información de uno de los cuatro tipos siguientes: Sum (suma), Average (promedio), Minimum (mínimo) o Maximum (máximo). Para obtener más información acerca del control Function, vea "Agregar un control Function al informe de datos". 3. Vista preliminar. El método Show permite mostrar una vista preliminar del informe. El informe de datos se genera y se muestra en su propia ventana. Nota Es necesario tener una impresora instalada en el equipo para poder usar el modo de vista preliminar. 4. Impresión de informes. Es posible llamar al método PrintReport desde un programa para imprimir un informe. Cuando el informe de datos está en el modo de vista preliminar, los usuarios también pueden imprimirlo si hacen clic en el icono de impresora de la barra de herramientas. Nota Es necesario tener una impresora instalada en el equipo para poder imprimir un informe. 5. Exportación de archivos. El método ExportReport permite exportar la información del informe de datos. Los formatos de exportación incluyen HTML y texto. 6. Exportación de plantillas. Es posible crear una colección de archivos de plantilla para usarlos con el método ExportReport. Esto es conveniente para exportar informes a varios formatos, cada uno ajustado al tipo de informe. 7. Operación asíncrona. Los métodos PrintReport y ExportReports del objeto DataReport son operaciones asíncronas. El evento ProcessingTimeout permite supervisar el estado de cada una de estas operaciones y cancelarlas si llevan demasiado tiempo. Crear un informe de datos sencillo Este tema muestra cómo puede crear un informe de datos sencillo mediante un Diseñador de entorno de datos utilizado como un origen de datos. El Diseñador de entorno de datos emplea la base de datos NorthWind incluida con Visual Basic para crear un sencillo cursor jerárquico. El cursor contiene dos tablas, Clientes y Pedidos, y ambas están vinculadas mediante el campo IdCliente. El informe terminado es similar a la siguiente figura. Informe de datos sencillo: Fechas de los pedidos de clientes Antes de empezar el procedimiento paso a paso, compruebe que la base de datos Northwind (Nwind.mdb) está presente en su equipo. Si no está, copie el archivo del CD de Visual Basic al disco duro. Para insertar un cursor jerárquico sencillo en el Diseñador de entorno de datos Cree un nuevo proyecto Standard EXE. En el menú Proyecto, haga clic en Agregar entorno de datos para agregar un diseñador al proyecto. Si el diseñador no aparece entre las opciones del menú Proyecto, haga clic en Componentes. Haga clic en la ficha Diseñadores y en Entorno de datos para agregar el diseñador al menú. Nota El menú Proyecto proporciona la lista de los cuatro primeros tipos de diseñadores ActiveX cargados para un proyecto. Si se cargan más de cuatro diseñadores, los siguientes aparecerán en el submenú Más diseñadores ActiveX del menú Proyecto. En el cuadro de diálogo Data Link Properties, haga clic en Microsoft Jet 3.51 OLE DB Provider. Esta selección del corrige el proveedor OLE DB para tener acceso a la base de datos Jet. Haga clic en el botón Siguiente para llegar a la ficha Conexión. Haga clic en el botón Examinar (…) que se encuentra junto al primer cuadro de texto. Utilice el cuadro de diálogo Seleccionar base de datos de Access para desplazarse por el archivo nwind.mdb, que está instalado en el directorio Archivos de programa\Microsoft Visual Studio\Vb98. Haga clic en Aceptar para cerrar este cuadro de diálogo. Haga clic con el botón secundario de mouse (ratón) en el icono Connection1, y elija Cambiar nombre. Cambie el nombre del icono a Northwind. Haga clic con el botón secundario del mouse en el elemento Norhwind y, después, haga clic en Agregar comando para mostrar el cuadro de diálogo Command1. En el cuadro de diálogo, establezca las propiedades como se indica a continuación: Propiedad Nombre de comando Conexión Objeto de base de datos Nombre de objeto Valor Clientes Northwind Table Clientes 1. Haga clic en Aceptar para cerrar el cuadro de diálogo. 2. Haga clic con el botón secundario del mouse (ratón) en el comando Clientes y haga clic en Agregar comando secundario para mostrar el cuadro de diálogo Command2. En el cuadro de diálogo, establezca las propiedades como se indica a continuación: Propiedad Nombre de comando Conexión Objeto de base de datos Nombre de objeto Valor Pedidos Northwind Table Pedidos Haga clic en la ficha Relación. La casilla de verificación Relacionar con un comando primario debería estar activada. El cuadro Primario debería contener Clientes; los cuadros Campos primarios y Campos secundarios y parámetros deberían mostrar IdCliente. Cuando se diseñan bases de datos relacionales, se suele usar el mismo nombre para los campos que permiten vincularlas. En este caso, los dos campos vinculados se denominan IdCliente. El Diseñador de entorno de datos hace coincidir automáticamente estos dos campos en el cuadro de diálogo. Haga clic en Agregar. Haga clic en Aceptar para cerrar el cuadro de diálogo. Al hacer clic en el botón Agregar, agrega la relación al objeto Command. Después de cerrar el cuadro de diálogo, el Diseñador de entorno de datos refleja las relaciones de los dos comandos como una jerarquía. Esta jerarquía se usará para crear el informe de datos. Establezca las propiedades del proyecto y del diseñador según los valores indicados a continuación y, después, guarde el proyecto: Objeto Project DataEnvironment Form Propiedad Name Name Name Valor prjNwind deNwind frmShow Crear el informe de datos Después de haber creado el Diseñador de entorno de datos, puede crear un informe de datos. Debido a que no todos los campos del entorno de datos son siempre útiles en un informe, los siguientes temas muestran cómo puede crear un informe limitado que muestra sólo unos pocos campos. Para crear un nuevo informe de datos 1. En el menú Proyecto, haga clic en Agregar informe de datos; Visual Basic agregará el informe de datos al proyecto. Si el diseñador no aparece en el menú Proyecto, haga clic en Componentes. Haga clic en la ficha Diseñadores y en Informe de datos para agregar el diseñador al menú. Nota El menú Proyecto proporciona la lista de los cuatro primeros tipos de diseñadores ActiveX cargados. Si se cargan más de cuatro diseñadores, los siguientes aparecerán en el submenú Más diseñadores ActiveX del menú Proyecto. 2. Establezca las propiedades del objeto DataReport según la tabla siguiente: Propiedad Name Caption Valor rptNwind Informe de datos Northwind 3. En la ventana Propiedades, haga clic en DataSource y, después, en deNwind. A continuación, haga clic en DataMember y en Clientes. Importante Es necesario abrir el Diseñador de entorno de datos antes de establecer la propiedad DataSource con el valor deNwind. Si el diseñador está cerrado, presione Ctrl-R para mostrar la ventana Proyecto y haga doble clic en el icono del entorno de datos. 4. Haga clic con el botón secundario del mouse (ratón) en el Diseñador de informe de datos y en Obtener estructura. Acaba de agregar una nueva sección de grupo al diseñador. Cada sección de grupo posee una correspondencia unívoca con un objeto Command en el entorno de datos; en este caso, la nueva sección de grupo corresponde al objeto Command denominado Clientes. Observe también que al encabezado de grupo corresponde una sección Pie de grupo. 5. Arrastre el campo NombreCompañía (bajo el comando Clientes) del Diseñador de entorno de datos a la sección Encabezado de grupo (Clientes_Encabezado). La sección Encabezado de grupo puede contener cualquier campo del comando Clientes, pero para facilitar la demostración, este ejemplo sólo muestra por el momento el nombre Clientes. 6. Elimine el control Label (rptLabel) denominado Label1. Si no desea incluir un control Label con el control TextBox, desactive la opción Arrastrar y soltar títulos de campo de la ficha Asignación de campos del cuadro de diálogo Opciones del Diseñador de entorno de datos. 7. Arrastre el campo FechaPedido (bajo el comando Pedidos) del Diseñador de entorno de datos a la sección Detalles de pedidos. Elimine el control Label. La sección Detalles de pedidos representa la sección "repetida" más interior y, por tanto, corresponde el objeto Command de nivel inferior de la jerarquía del entorno de datos: el objeto Command denominado Pedidos. 8. Cambie el tamaño de las secciones del Diseñador de informe de datos para que sea similar a la figura siguiente: Es importante que cambie el alto de la sección Detalles de pedidos para que sea lo más corta posible, ya que el alto se multiplicará por cada uno de los objetos FechaPedido devueltos por NombreCompañía. Cualquier espacio innecesario por encima o por debajo del cuadro de texto FechaPedido aumentará la cantidad de espacio sin usar en el informe final. 3. Guarde el proyecto. Vista preliminar del informe de datos con el método Show Ahora que se han creado los objetos del entorno de datos y del informe de datos, casi ha llegado el momento de ejecutar el proyecto. Solamente queda un paso: escribir código para mostrar el informe de datos. Para mostrar el informe de datos en tiempo de ejecución 1. En la ventana Explorador de proyectos, haga doble clic en el icono frmShow para mostrar el Diseñador de formularios. 2. En Cuadro de herramientas, haga clic en la ficha General. Cuando agrega un Diseñador de informe de datos al proyecto, sus controles se agregan a la ficha denominada DataReport. Para usar los controles estándar de Visual Basic, debe cambiar a la ficha General. 3. Haga clic en el icono CommandButton y dibuje un botón de comando en el formulario. 4. Establezca las propiedades del control Command1 como se indica en la tabla siguiente: Propiedad Name Caption Valor cmdShow Mostrar informe 5. En el evento Click del botón, pegue el código siguiente. Private Sub cmdShow_Click() rptNwind.Show End Sub 6. Guarde y ejecute el proyecto. 7. Haga clic en Mostrar informe para mostrar el informe en el modo de vista preliminar. Opcional: configurar el informe de datos como el Objeto inicial: También puede mostrar el informe de datos sin escribir código. 1. En el menú Proyecto, haga clic en Propiedades de prjNwind. 2. En el cuadro Objeto inicial, seleccione rptNwind. 3. Guarde y ejecute el proyecto. Nota Si utiliza este método, puede quitar el objeto Form del proyecto. Extender el informe de datos Ahora que dispone de un informe de datos sencillo, es fácil extenderlo y crear una presentación más compleja. En el procedimiento siguiente, se extiende primero el entorno de datos con las tablas Detalles de pedidos y Productos. El informe extendido incluye los nombres de los productos ordenados por una fecha específica y es similar a la figura siguiente. Informe de datos extendido con detalles sobre los pedidos Para extender el entorno de datos 4. En el Diseñador de entorno de datos, haga clic con el botón secundario del mouse (ratón) en el objeto Command Pedidos. A continuación, haga clic en Agregar comando secundario. 5. En el cuadro de diálogo Propiedades de Command1, establezca las propiedades siguientes: Propiedad Nombre de comando Conexión Objeto de base de datos Nombre de objeto Valor DetallesPedidos Northwind Table Detalles de pedidos 6. Haga clic en la ficha Relación. La casilla de verificación Relacionar con un comando primario debería estar activada. El cuadro Primario debe contener Pedidos; los cuadros Campos primarios y Campos secundarios y parámetros deben mostrar IdPedido. Haga clic en el botón Agregar y, a continuación, en Aceptar para cerrar el cuadro de diálogo. 7. Haga clic con el botón secundario del mouse (ratón) en el objeto Command DetallesPedidos y haga clic en Agregar comando secundario. Establezca las propiedades de la conexión como se indica a continuación: Propiedad Nombre de comando Conexión Objeto de base de datos Nombre de objeto Valor Productos Northwind Table Productos 8. Haga clic en la ficha Relación. La casilla de verificación Relacionar con un comando primario debería estar activada. El cuadro Primario debe contener DetallesPedidos; los cuadros Campos primarios y Campos secundarios y parámetros deben mostrar IdProducto. Haga clic en el botón Agregar y, a continuación, en Aceptar para cerrar el cuadro de diálogo. Extender el informe de datos Después de haber extendido el entorno de datos con tablas nuevas, puede extender también el informe de datos al arrastrar campos del Diseñador de entorno de datos al Diseñador de informe de datos. Para extender el informe de datos 9. Haga clic con el botón secundario del mouse (ratón) en el diseñador Informe de datos y desactive el cuadro Mostrar Encabezado o pie de página. Al desactivar esta opción, se eliminan el encabezado y el pie de página, que no se utilizan por ahora. 10.Haga clic con el botón secundario del mouse (ratón) en el Diseñador de informe de datos y haga clic en Insertar encabezado o pie de grupo. Aparecerá el cuadro de diálogo Insertar nuevo encabezado o pie de grupo. El cuadro de diálogo permite determinar si el nuevo encabezado y el nuevo pie de grupo incluyen otras parejas "anidadas" de encabezado y pie. Esto es importante cuando agrega nuevas parejas de encabezados y pies, ya que la pareja situada más al exterior tiene precedencia sobre las demás. Este aspecto se trata con más detalle en "Partes del informe de datos". 11.Haga clic en Aceptar para seleccionar la posición predeterminada de la nueva pareja de encabezado y pie, y para cerrar el cuadro de diálogo. 12.Seleccione el nuevo encabezado de grupo y cambie el nombre Section1 por Pedidos_Encabezado en la ventana Propiedades. Cambie el nombre Section4 correspondiente al pie de página por Pedidos_Pie. 13.Repita los pasos 2 a 3. Cambie el nombre del nuevo encabezado de grupo por DetallesPedidos_Encabezado y el nombre del nuevo pie de grupo por DetallesPedidos_Pie. 14.Haga clic en la sección Pedidos_Detalle para seleccionarla. En la ventana Propiedades, cambie el nombre de la sección por Productos_Detalle. 15.Con el mouse, arrastre el campo FechaPedido de la sección Productos_Detalle a la sección Pedidos_Encabezado. 16.Arrastre el campo NombreProducto (bajo el comando Productos) del Diseñador de entorno de datos a la sección Productos_Detalle. 17.Elimine el control Label denominado Label1. 18.Ajuste el tamaño de los encabezados de grupo y reorganice los controles de cuadro de texto para que sean similares a la figura siguiente. La figura anterior necesita algunas explicaciones. En primer lugar, se cierran todos los pies de grupo por orden para conseguir el mayor espacio posible. Como ocurre con la sección Detalles, en el informe final se multiplica el espacio adicional que quede en los encabezados o pies de página. Por consiguiente, si un encabezado o pie de página no contiene ningún campo, puede ajustar al máximo la distancia que separa a los encabezados y los pies de página. El encabezado de grupo llamado DetallesPedidos_Encabezado también se ajusta. Si se pregunta por qué no se muestra ningún campo, debe comprender que la tabla Detalles de pedidos de la base de datos Northwind es una tabla combinada, es decir una tabla que sólo contiene los identificadores de registros de la tabla Pedidos, combinados con los identificadores de registros de la tabla Productos. Los campos no aparecen por el momento precisamente porque la tabla Detalles de pedidos no contiene ninguno. Simplemente permite combinar las otras dos tablas. En el Diseñador de informe de datos, por tanto, la tabla Detalles de pedidos sólo sirve para crear grupos de registros: los nombres de producto agrupados por fechas de pedido. Por último, la sección Detalles sólo contiene los nombres de los productos. La sección Detalles contiene el nivel más interior de los registros repetidos. 19.Guarde y ejecute el proyecto. Agregar un campo calculado al informe de datos Un campo calculado es un campo cuyo valor se calcula al generar el informe. Por ejemplo, para calcular los impuestos aplicables a un pedido, debe multiplicar el importe total por un porcentaje correspondiente al impuesto local. Como los porcentajes de los impuestos locales varían, no conviene almacenarlos en la base de datos, sino calcular el impuesto en el momento de generar el informe, es decir, con un campo calculado. En este ejemplo el Diseñador de informe de datos extendido se modifica de forma que incluya un campo Total que calcule el producto de las cantidades por el precio unitario, es decir: Cantidad * PrecioUnidad. Agregar un campo calculado implica los pasos siguientes: Usar una instrucción SQL en el objeto Command del entorno de datos para crear el campo calculado. Agregar tres controles de cuadro de texto al informe de datos: Cantidad, PrecioUnidad y Total (correspondiente al campo calculado). El informe de datos modificado tendrá la apariencia siguiente. Para agregar un campo calculado al informe de datos En el Diseñador de entorno de datos, haga clic con el botón secundario del mouse (ratón) en el comando DetallesPedidos. A continuación haga clic en Propiedades para mostrar el cuadro de diálogo Propiedades de DetallesPedidos. En la ficha General, haga clic en el botón Instrucción SQL y escriba la instrucción siguiente en el cuadro: Select IdPedido, IdProducto, PrecioUnidad, Cantidad, (Cantidad * PrecioUnidad) As Total From [Detalles de pedidos] La instrucción SQL multiplica el valor Cantidad por el valor PrecioUnidad y obtiene el valor Total, es decir, el campo calculado. Observe que el nombre de la tabla Detalles de pedidos incluye espacios, por lo que debe escribirse entre corchetes. Haga clic en Aceptar para cerrar el cuadro de diálogo. Arrastre los campos Cantidad, PrecioUnidad y Total (bajo el comando DetallesPedidos) del Diseñador de entorno de datos a la sección Productos_Detalle del Diseñador de informe de datos. Elimine los dos controles Label, cambie los valores de la propiedad Caption de los restantes controles Label a * y organice los controles de forma que tengan la apariencia siguiente: En el Diseñador de informe de datos, haga clic en el cuadro de texto PrecioUnidad para seleccionarlo. En la ventana Propiedades, haga doble clic en DataFormat para mostrar el cuadro de diálogo Páginas de propiedades. En el cuadro Tipo de formato, haga clic en Moneda. En el cuadro combinado Símbolo, seleccione la moneda correspondiente a su país. Repita los pasos 6 y 7 para cambiar la propiedad DataFormat del cuadro de texto Total a Moneda. Haga clic en el control de cuadro de texto Total para seleccionarlo. En la ventana Propiedades, cambie la propiedad Alignment a 1 – rptJustifyRight. Guarde y ejecute el proyecto. Agregar un control Function al informe de datos El Diseñador de informe de datos tiene su propio conjunto de controles. El control Function es el único que no tiene un equivalente entre los controles intrínsecos de Visual Basic y merece un poco más de explicación. El control Function presenta datos calculados en tiempo de ejecución mediante una función integrada, a medida que se genera el informe. La figura siguiente muestra un ejemplo típico donde se utiliza el control Function para sumar los subtotales de un pedido específico y mostrar el total correspondiente. Si utilizó una instrucción SQL para crear un campo calculado (en el tema anterior, "Agregar un campo calculado al informe de datos"), puede que se pregunte por qué no se puede usar un control Function para calcular el valor de Cantidad * PrecioUnidad. En pocas palabras, el control Function sólo puede calcular los valores cuando los demás registros de una sección de grupo ya se han procesado. En cambio, una instrucción SQL calcula los valores como parte de los campos de un registro al mismo tiempo que se procesan. Siga estos pasos para agregar un control Function al Diseñador de informe de datos: Dibuje un control Function en una sección Pie de página apropiada del Diseñador de informe de datos. Establezca las propiedades DataMember y DataField con valores apropiados (un campo numérico de un objeto Command del entorno de datos que desee usar). Informe de datos con un control Function para presentar Totales Para agregar un control Function al informe de datos 1. Haga clic con el puntero del mouse en el pie de grupo denominado Cliente_Pie y arrástrelo a la parte inferior de la ventana para dejar un espacio entre él y el pie de página Pedidos_Pie. 2. En el Cuadro de herramientas, haga clic en el control rptFunction. 3. Dibuje el control rptFunction en el espacio comprendido entre los dos pies de página. 4. Establezca las propiedades del control rptFunction según la tabla siguiente: Propiedad DataMember DataField Name Alignment DataFormat Valor DetallesPedidos Total fncTotal 1 – rptJustifyRight Currency La propiedad FunctionType del control determina qué operación se realizará con los datos encontrados en la propiedad DataField. De forma predeterminada, la propiedad tiene el valor 0-RptFuncSum, para indicar la suma de los datos. Otras funciones incluyen: Average, Minimum, Maximum, Row Count, STDDev (Desviación estándar) y Value Count. 5. Dibuje un control Line por encima del cuadro de texto Cantidad y un control Label a la izquierda del cuadro de texto. Establezca la propiedad Caption de la etiqueta con el valor Total. 6. Haga clic en el control fncTotal para seleccionarlo. En la ventana Propiedades, haga doble clic en Fuente para mostrar el cuadro de diálogo Fuente. Cambie el Estilo de fuente a Negrita. 7. Repita el paso 6 con el control Label. 8. Coloque los controles en el diseñador de forma que tengan la apariencia siguiente: 9. Guarde y ejecute el proyecto. Aumentar el alcance de la función Puede aumentar el alcance de la función si coloca el control en un pie de grupo inferior. Por ejemplo, podría conseguir el total general del conjunto de pedidos de cada cliente. Para mostrar el total general de todos los pedidos Dibuje un nuevo control Function en la sección Cliente_Pie. Alinee el nuevo control con el control Function creado anteriormente. Dibuje un control Label a la izquierda del nuevo control Function. Establezca las propiedades de los controles como se indica en la tabla siguiente: Control rptFunction rptFunction rptFunction rptFunction rptFunction rptLabel rptLabel rptLabel Propiedad Name DataMember DataField Font (Font Style) Alignment Caption Font (Font Style) Alignment Valor fncGrandTotal DetallesPedidos Total Bold 1 – rptJustifyRight Total general Bold 1 – rptJustifyRight El Diseñador de informe de datos debería presentarse ahora como en la siguiente figura: Guarde y ejecute el proyecto. Construcción y Entrega de la aplicación Archivo Ejecutable Un Archivo ejecutable es una aplicación basada en Windows con una extensión de nombre de archivo .EXE que puede ejecutarse fuera del ambiente de desarrollo de Visual Basic. Este y otros archivos auxiliares requeridos por su programa se entregan a los usuarios en prospecto de la aplicación para instalarse y ejecutarse bajo Windows. La meta final de cualquier proyecto de programación es producir una aplicación ejecutable que se pueda usar y sea útil. Una vez que su proyecto este terminado, el primer paso para crear un archivo de programa ejecutable es seleccionar Make EXE. Para abrir el cuadro de dialogo EXE Options, haga clic en el botón Options. En este cuadro de dialogo, se establecen atributos e información documental del archivo ejecutable: Número de Versión Titulo del proyecto Icono de la aplicación Información del ejecutable Argumentos y/o parámetros adicionales del ejecutable Una vez que regresa al cuadro de dialogo Make EXE File, seleccione el directorio donde se creará el ejecutable y luego presione OK. Durante esta fase, Visual Basic puede descubrir problemas en el código. Si así sucede, se abrirá una ventana Code para mostrarle la línea que causa el problema. Asistente para instalar aplicaciones El Asistente para crear instaladores, es una herramienta que se usa para crear un programa de instalación y los medios de distribición (para discos flexibles o instaladores de red) de su aplicación de Visual Basic. La primera vez que se ejecuta el asistente para instalar aplicaciones le pide a usted la ubicación de archivos importantes que se requieren para que se ejecute correctamente. El asistente para instalar aplicaciones, le proporciona una manera fácil de preparar la distribución de sus proyectos de programación, así como anexar archivos auxiliares que requiere su aplicación