Professional Documents
Culture Documents
Cuaderno de Trabajo Visual Basic se encu encuentra bajo una Licencia Creative Commons Atribucin-No ComercialAtribucin Licenciamiento Recproco 3.0 Unported. Diciembre IDSystems
Contenido
INTRODUCCION ..........................................................................................................................................................4 EJERCICIOS SOBRE EL ARCHIVOS ................................................................................................................................5 Ejercicio 06 Texto y RTF .......................................................................................................................................6 Ejercicio 07 Leer datos desde un archivo ............................................................................................................7 Ejercicio 08 Usar output para grabar un archivo .................................................................................................9 Ejercicio 09 Usando APPEND para agregar informacion al archivo.................................................................. 11 Ejercicio 10 Creando archivos de configuracion para aplicaciones .................................................................. 13 Ejercicio 11 Usando Write e Input .................................................................................................................... 15 Ejercicio 12 Usando archivos aleatorios ........................................................................................................... 18 Ejercicio 13 Usando archivos aleatorios y registros ......................................................................................... 21 Ejercicio 14 Ecuacion de 2. Grado ................................................................................................................... 24 Ejercicio 15 Agenda .......................................................................................................................................... 27 Ejercicio 16 Editor de texto con RTF ................................................................................................................. 34 Ejercicio 17 Editor de texto con formularios MDI ............................................................................................ 38 PRACTICAS 1-5 ......................................................................................................................................................... 47 EJERCICIOS SOBRE EL BASES DE DATOS .................................................................................................................. 48 Ejercicio 18 Formulario de Datos...................................................................................................................... 49 Ejercicio 19 BD Navegar .................................................................................................................................... 53 Ejercicio 20 - Connection to an Access Database Using the VB Data Control .................................................... 53 Ejercicio 21 Using Navigation Buttons with Data Control ................................................................................ 55 Ejercicio 22 Using the BOF Action and EOF Action Properties of the Data Control ........................................ 57 Ejercicio 23 Using the EOF and BOF Properties with Navigation Buttons ........................................................ 58 Ejercicio 24 Adding, Updating and Deleting Records ....................................................................................... 58 Ejercicio 25 BD Navegar por codigo.................................................................................................................. 61 Ejericio 26 BD Altas, Bajas y Busqueda ............................................................................................................. 62 Ejercicio 27 Using the Validate Event ............................................................................................................... 64 Ejercicio 28 Using the Find Methods ................................................................................................................ 70 Ejercicio 29 Using the MSFlexGrid Control ....................................................................................................... 78 Ejercicio 30 Using the DBGrid Control .............................................................................................................. 80 Ejercicio 31 Conectando VB con ACCESS 2007 y un control OLE DB de datos. ................................................ 81 Ejercicio 32 Usando cdigo con el control OLE DB. .......................................................................................... 89 Ejercicio 33 Control Data con Archivos de Texto.............................................................................................. 89 Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 2
Ejercicio 34 Control Data con Archivos de Excel .............................................................................................. 91 Ejercicio 35 Control Data con Imgenes OLE..................................................................................................... 92 Ejercicio 36 Control Data con Imgenes Vinculadas ......................................................................................... 96 Ejercicio 37 Control Data OLE DB con MySQL ................................................................................................. 102 Ejercicio 38 Control Data OLE DB con MySQL y Strings................................................................................... 109 Ejercicio 39 - VideoLeccion 11: Introduccin a Visual Basic 6.0 Con Base de Datos ......................................... 111 Ejercicio 40 - VideoLeccion 12: Registro de Usuarios y Sesin de Login ........................................................... 111 Ejercicio 41 - VideoLeccion 13: Registro de Usuarios y Sesin de Login ........................................................... 113 Ejercicio 42 - VideoLeccion 14: Modificar Registro de Usuarios ....................................................................... 113 Ejercicio 43 - VideoLeccion 15: Bsqueda de Registro de Usuario ................................................................... 113 Ejercicio 44 BD Consulta SQL .......................................................................................................................... 114 PRACTICAS 6 10 .................................................................................................................................................. 114 Ejercicio 45 Ordenando una tabla .................................................................................................................. 115 Leccion 46 - VideoLeccion 16: Relacionando Tablas - Mantenimiento Completo de Clientes ......................... 117 Leccion 47 - VideoLeccin 17: Mantenimiento Productos ................................................................................ 117 Ejercicio 48 BD Varias Tablas .......................................................................................................................... 117 Ejercicio 49 BD Suma con SQL ........................................................................................................................ 118 Ejercicio 50 BD Funciones con SQL ................................................................................................................. 119 Ejercicio 51 BD Visor de SQL ........................................................................................................................... 119 Ejercicio 52 BD Consultas SQL ........................................................................................................................ 121 Ejercicio 53 BD con DAO ................................................................................................................................. 122 Ejercicio 54 BD con DAO validacion de campos ............................................................................................. 124 Ejercicio 55 BD Crystal Report ........................................................................................................................ 129 Leccion 56 - VideoLeccin 21: Reportes simples y con parmetros ................................................................. 130 Leccion 57 - VideoLeccin 22: Reporte de Factura ........................................................................................... 130 Leccion 58 - VideoLeccin 23: Reportes Avanzandos usando dos o ms tablas ............................................... 131 Leccion 59 - VideoLeccin 24: ltimos Arreglos, Empaquetado y distribucin ................................................ 131
Pgina 3
INTRODUCCION
Este es el Apendice A o Cuaderno de Trabajo II de Visual Basic. Es la continuacion del primer cuaderno el cual esta lleno de ejercicios practicos llamados Actividades de Aprendizaje. A diferencia de los ejercicios (los cuales son paso a paso) y las practicas (que no se da ninguna solucion), estos ejercicios contienen una imagen del resultado y el codigo que debe ser tecleado. No asi, las propiedades de los controles y otros elementos graficos. Estos ejercicios fueron tomados de Visual Basic Programacion para Docentes y agradezco a Mirta Echeverria y Manuel Perez Valdez quienes tienen una excelente pagina de ejercicios. Sin embargo, hubo que clasificarlos en bloques de temas para llevaran un orden de aprendizaje de acuerdo a la mayoria de los cursos de Visual Basic. Por lo que dicha atribucion es nuestra. Recomendamos ampliamente consultar los dos Cuadernos de Trabajo, asi como su Guia de Estudio. Y tomar las notas resumidas en las clases presenciales de su profesor.
Pgina 4
Pgina 5
Se llama texto enriquecido porque permite incluir distintos tipos de letras, colores y tamaos o sea ms variantes en su formato. Y el control que vamos a usar para desplegar este texto con formato RTF es el RichTextBox 8es un control no estndar, por lo tanto debemos traerlo de Componentes), para el texto comn o sea con formato TXT, usaremos un TextBox de la caja de herramientas estandar. El formulario tendr el siguiente aspecto: Tenemos dos controles para desplegar el texto: un Text1 y un RichTextBox1, y dos botones en cuyos eventos Click se desplegarn por cdigo los archivos mencionados en los controles de texto. Primero debemos crear un archivo en el NotePad o en el Word y grabarlo como TXT y otro con variacines en el tipo, color y tamao de la letra y grabarlo como rtf. Luego abrimos visual y en creamos un nuevo proyecto grabandolo en el mismo directorio y carpeta que tenemos los archivos: txt y rtf. El cdigo de cada botn es el siguiente:
Option Explicit 'Esta expresin nos fuerza a declarar las variables. Private Sub Command1_Click() 'Este boton es el que carga el 'archivo TXT Dim pepe As String 'Declaramos una variable para identificar el 'archivo Dim renglon As String 'Esta variable guardar el tamao de 'cada rengln del archivo renglon = Chr(13) & Chr(10) ' corta a otra lnea Text1.Text = "" Open App.Path & "\rtf.txt" For Input As #1 ' Abre (Open) y da 'entrada (Input) el archivo 'ubicado en el mismo directorio y carpeta en que est la 'aplicacin. App.path significa en la ruta actual de la'aplicacin. 'Sino hay que indicar cual es el Path. While Not EOF(1) ' esto realiza un bucle o sea repite la accin 'hasta que se llegue al final del archivo 1 (End of File)
Pgina 6
Line Input #1, pepe$ ' le da entrada a la linea 1 del archivo Text1.Text = Text1.Text & pepe & renglon 'concatena con & el 'texto del archivo y el tamao del regln. Wend 'repite las ordenes en tanto la condicin es verdadera, en 'este caso hasta tanto no termine el texto del archivo. Close #1 ' cierra el archivo al terminar de cargarlo. End Sub Private Sub Command2_Click() RichTextBox1.LoadFile (App.Path & "\rtf.rtf") 'como podemos 'ver con el Control RichTextBox es ms sencillo el manejo de 'archivos, con la sentencia LoadFile se carga el archivo 'indicando el camino para encontrarlo. End Sub
La cual contiene una caja de texto, botones de comando y un frame para enmarcar el diseo. La caja de texto tiene la propiedad Multiline = true, y la propiedad Scrollbars como 2 Vertical. Ahora he aqu el codigo a teclear: En el boton de salir: Unload Me
Pgina 7
En el boton de Borrar TextBox ' Borramos el contenido de text1 Text1 = "" Y en el boton de Cargar Archivo: ' Esta variable contendr el path del archivo que queremos acceder Dim Archivo As String ' Linea almacenar los datos del archivo "Historia.txt" Dim Linea As String ' Asignamos a la variable Archivo la ruta correcta. El objeto _ App.Path nos devuelve el directorio donde se encuentra nuesta _ aplicacin. Luego le agregamos la barra invertida y el nombre _ del archivo.
' Abrimos el archivo con la variable Archivo, y como el acceso ser de lectura _ utilizamos el modo Input seguido del nmero de archivo "#1" Open Archivo For Input As #1
' Creamos un bucle para controlar que despus de llegar al final del archivo _ la sentencia Input, no continue leyendo y se produzca un error en tiempo de eje _ cucon. Para ello utilizamos la condicin Not EoF(1), que traducido quiere decir _ mientras no llegue al final del archivo, que contine leyendo lnea por lnea. _ ' Dentro del bucle asignamos al control Text1 el valor de la variable Linea mas _
Pgina 8
el contenido que ya estaba guardado en el text box, Por que de lo contrario, el text Box _ solo mostrara el ltimo contenido de la variable "Linea" While Not EOF(1) Line Input #1, Linea Text1.Text = Text1.Text & Linea Wend
2 Cajas de texto 1 boton de comando Etiquetas Frame Un control de timer para que muestre la hora del sistema actual en tiempo real
Private Sub Command1_Click() ' Archivo que contendr el path del archivo a usar Dim archivo As String 'Asignamos el path al archivo con el objeto app.Path archivo = App.Path + "\" + "HorayFecha.txt" ' Abrimos el archivo en modo Output Open archivo For Output As #1 'Con las sentencia print escribimos en la primera linea el valor de text1 _ ' Luego en la segunda linea egrabamos el contenido del text2 Print #1, Text1 Print #1, Text2 'Cerramos el archivo Close #1 End Sub Private Sub Timer1_Timer() ' Utilizamos un Control Timer para mostrar en los text el dia y la _ hora del sistema. La propiedad intervalo del control timer esta en 1000 milisegundos Text1 = Time Text2 = Date End Sub
Pgina 10
Controles: a) Caja de texto b) 3 botones de comando c) Frame Codigo: Private Sub Command1_Click() ' Definimos las variables Dim archivo As String Dim texto As String Dim mensaje As String ' asignamos a la variable archivo la ruta correcta archivo = App.Path + "\" + "Prueba.txt" ' Asignamos a texto el contenido de text1 texto = Text1 ' Abrimos el archivo en modo aPPend para agregar datos al _ archivo que ya contiene datos Open archivo For Append As #1
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 11
' Escribimos un salto de carro y el contenido de la variable texto Print #1, vbCrLf + texto ' Cerramos el archivo Close #1 ' Creamos un mensaje para dar la opcin de ver o no los cambios en el archivo _ con los nuevos datos agregados mensaje = MsgBox(" Deseas ver ahora el contenido del archivo con,los datos agregados", vbYesNo + vbInformation, "Consulta") ' Evaluamos la condicion. Si es verdadera abrimos el archivo para leerlo _ con la sentencia input If mensaje = vbYes Then Open archivo For Input As #1 Text1 = "" ' Borramos el contenido de text1 para que no vuelva _ a imprimir lo que estaba escrito While Not EOF(1) Line Input #1, texto Text1 = Text1 + texto + vbCrLf Wend Else Exit Sub End If Close #1 End Sub
Private Sub Command2_Click() ' Limpiamos el contenido del text1 Text1 = "" End Sub Private Sub Command3_Click() End End Sub
Pgina 12
Necesitaras crear un proyecto con 2 formas, donde la primera es la pantalla de bienvenida (form1) y la segunda es la aplicacin (form2) CONTROLES PARA FORM1 a) b) c) d) Etiqueta Frame CheckBox Boton de comando
Pgina 13
CONTROLES PARA FORM2 a) Etiqueta b) Frame c) Boton de comando CODIGO PARA FORM1 ' Esta variable almacena el path del archivo "Config.dat" Dim archivo As String Private Sub Command1_Click() ' Establecemos el path archivo = App.Path & "\" & "Config.dat" ' Comprobamos si est presionado el control check1. Si lo est _ crea un archivo igual "config.dat" y escribe la cadena "noAbrir" _ , para que la prxima vez no muetre el formulario de bienvenida. If Check1.Value = Checked Then Open archivo For Output As #1 Print #1, "noAbrir" Close ' Cierra el archivo End If Unload Me ' descarga este formulario Form2.Show ' muestra el otro form End Sub Private Sub Form_Load() Dim archivo As String Dim MiVAriable As String ' Variable para almacenar la cadena que se lea _ del archivo "config.dat" archivo = App.Path & "\" & "Config.dat" Open archivo For Input As #1 ' Abre el archivo para leerlo Line Input #1, MiVAriable ' Almacenamos el valor Close ' Cerramos el archivo If MiVAriable = "noAbrir" Then ' Hacemos la comprobacin Unload Me Form2.Show End If End Sub
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 14
CONTROLES 1) 2) 3) 4) 5) 5 cajas de texto Etiquetas Botones de comando Frame Caja de lista (listbox)
CODIGO ' Variables globales para almacenar los datos cuando grabemos o leamos _ los mediante las sentencias write e input Dim apellido As String Dim nombre As String Dim telefono As String Dim direccion As String Dim dni As String Dim archivo As String
Pgina 15
'********************************************************* _ procedimientos '********************************************************* ' Procedimiento para agregar datos separados por comas con la _ sentencia Write Private Sub agregarEntrada(apellido As String, nombre As String, telefono As String, direccion As String, dni As String) ' Las variables que van en los parmetros del procedimiento _ contienen el valor de los textBox archivo = App.Path + "\" + "datos.dat" ' variable que almacena el path del archivo datos.dat Open archivo For Append As #1 ' Abrimos el archivo en modo Append _ para agregar datos al final del archivo Write #1, apellido, nombre, telefono, direccion, dni ' Grabamos los _ datos pasandole como parmetro a la sentencia Write las variables se _ paradas por comas Close ' Cerramos el archivo End Sub ' Procedimiento para leer los datos del archivo y mostrarlos en los _ textBox cuando hacemos click en un nombere del list1 Private Sub mostrarDatos() Dim contador As Integer ' variable que almacena un valor que _ luego se comparar con la propiedad listindex del list1, para _ saber cuales son los datos que tenemos que recupera y mostrar _ las cajas de texto archivo = App.Path + "\" + "datos.dat" Open archivo For Input As #1 ' Abrimos el archivo para leer los datos _ mediante la sentencia Input While Not EOF(1) ' Comenzamos a leer el archivo Input #1, apellido, nombre, direccion, telefono, dni If contador = List1.ListIndex Then ' if contador es igual al elemento _ que seleccionamos en el list, entonces imprimimos los valores y _ salimos de la rutina con Exit Sub. Si no es igual el contador se _ va incrementando en 1 hasta que en algun punto coincide con el _ numero del elemento seleccionado
Pgina 16
texApe.Text = apellido texNom.Text = nombre texDir.Text = direccion texDni.Text = dni texTel.Text = telefono Close Exit Sub End If contador = contador + 1 Wend Close End Sub Private Sub cargarDatos() List1.Clear ' Borramos los datos previos para que no vuelva a duplicar los datos archivo = App.Path + "\" + "datos.dat" Open archivo For Input As #1 While Not EOF(1) ' Mientras no se llegue al fin de archivo que _ valla recuperando los datos y agregue solo el apellido en el _ control List Input #1, apellido, nombre, direccion, telefono, dni List1.AddItem apellido Wend Close End Sub Private Sub Command3_Click() On Error GoTo mensaje cargarDatos ' Llamamos a la rutina para cargar los datos Exit Sub mensaje: MsgBox "No hay datos para cargar", vbInformation + vbOKOnly, "Mensaje" End Sub Private Sub Command1_Click() ' Esta rutina es para que no se puedan grabar datos si el _ campo "Apellido" est vaco, mostrando un mensaje y luego sali _ endo de la rutina. Si esta todo bien ignora lo anterior y se eje _ cuta la rutina "agregarEntrada", que lleva como parmetros el con _ tenido de las cajas de texto If texApe.Text = "" Then
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 17
MsgBox "El campo Apellido no puede estar vacio", vbInformation + vbOKOnly, "Advertencia" Exit Sub End If agregarEntrada texApe, texNom, texDir, texTel, texDni End Sub Private Sub List1_Click() mostrarDatos 'Llamamos a la rutina que recupera los datos cada vez que seleccio _ namos un elemento del control List1 End Sub
Pgina 18
CONTROLES 1) 2) 3) 4) 5) Cajas de texto Etiquetas Caja combo (combobox) Frame Boton de comando
CODIGO 'Aqu declaramos una estructura de datos con tres campos de longi _ tud fija. O sea que cada registro que grabemos tendr el tamao de _ 50 bytes. Private Type T_personas Apellido As String * 20 Nombre As String * 20 edad As String * 10 End Type 'Esta variable est asociada a la estructura T_personas, que luego _ nos servir para grabar o leer datos en el archivo datos.dat Dim persona As T_personas 'Esta variable almacenar el valor del combo para obtener el n de regis _ tro donde grabar o leer datos Dim nRegistro As Integer ' Private Sub Command1_Click() ' Pasamos los parmetros de los textBox al procedimiento que grabar _ los datos grabarDatos Texape, Texnom, Texedad End Sub Private Sub Command2_Click() 'Llamamos al procedimiento para leer los datos del archivo leerDatos End Sub Private Sub Form_Load() ' Aqu cargamos los combos con valores del 1 al 100 cuando inicia el form Dim x As Integer For x = 1 To 100
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 19
Combo1.AddItem x Combo2.AddItem x Next x End Sub ' Procedimiento para grabar registros Private Sub grabarDatos(Apellido As String, Nombre As String, edad As String) 'Abrimos el archivo en modo aleatorio y le pasamos el tamao de la _ estructura Open App.Path + "\" + "datos.dat" For Random As #1 Len = Len(persona) 'Asignamos a los campos de la extructura Type los valores que recibe _ de los parmetros del procedimiento y que contiene los valores de los textBox persona.Apellido = Apellido persona.Nombre = Nombre persona.edad = edad ' Almacenamos aqu el numero de registro donde grabar los datos nRegistro = Combo1.Text ' Grabamos los datos Put #1, nRegistro, persona ' Cerramos el archivo Close End Sub Private Sub leerDatos() 'Abrimos el archivo en modo aleatorio y le pasamos el tamao de la Open App.Path + "\" + "datos.dat" For Random As #1 Len = Len(persona) ' Almacenamos aqu el numero de registro de donde leer los datos nRegistro = Combo2.Text ' Leemos los datos y los almacenamos en la variable "Persona" Get #1, nRegistro, persona 'Cerramos el archivo Close ' Mostramos en los labels los valores leidos Lblape = persona.Apellido Lblnom = persona.Nombre
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 20
CODIGO 'Ac declaramos una estructura de datos con tres campos de longi tud fija. 'O sea que cada registro que grabemos tendr el tamao de 50 bytes. Private Type T_personas Apellido As String * 20 Nombre As String * 20 edad As String * 10 End Type 'Esta variable est asociada a la extructura T_personas, que luego _ nos servir para grabar o leer datos en el archivo datos.dat Dim persona As T_personas 'Esta variable almacenar el valor del combo para obtener el n de regis _ tro donde grabar o leer datos Dim nRegistro As Integer
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 21
Private Sub Command1_Click() ' Pasamos los parmetros de los textBox al procedimiento que grabar los datos grabarDatos Texape, Texnom, Texedad End Sub Private Sub Command2_Click() 'Llamamos al procedimiento para leer los datos del archivo leerDatos End Sub Private Sub Command3_Click() Dim tamao As Integer tamao = FileLen(App.Path & "\" + "datos.dat") / Len(persona) MsgBox "El archivo datos.dat contiene: " & tamao & " registros", vbInformation + vbOKOnly End Sub Private Sub Form_Load() 'Cargamos los combos con valores del 1 al 100 cuando inicia el form Dim x As Integer Open App.Path & "\" + "datos.dat" For Random As #1 Len = Len(persona) Close For x = 1 To 100 Combo1.AddItem x Combo2.AddItem x Next x End Sub ' Procedimiento para grabar registros Private Sub grabarDatos(Apellido As String, Nombre As String, edad As String) 'Abrimos el archivo en modo aleatorio y le pasamos el tamao de la _ estructura de datos Open App.Path + "\" + "datos.dat" For Random As #1 Len = Len(persona) 'Asignamos a los campos de la estructura Type los valores que recibe _ de los parmetros del procedimiento y que contiene los valores de los textBox persona.Apellido = Apellido persona.Nombre = Nombre persona.edad = edad ' Almacenamos en nRegistro el numero de registro donde grabar los datos
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 22
nRegistro = Combo1.Text ' Grabamos los datos Put #1, nRegistro, persona ' Cerramos el archivo Close End Sub Private Sub leerDatos() 'Abrimos el archivo en modo aleatorio y le pasamos el tamao la estructura Open App.Path + "\" + "datos.dat" For Random As #1 Len = Len(persona) ' Almacenamos el numero de registro de donde leer los datos nRegistro = Combo2.Text ' Leemos los datos y los almacenamos en la variable "Persona" Get #1, nRegistro, persona 'Cerramos el archivo Close ' Mostramos en los labels los valores leidos Lblape = persona.Apellido Lblnom = persona.Nombre Lbledad = persona.edad End Sub
Pgina 23
Este ejercicio utiliza funciones matemticas como clculo de raz cuadrada. Y un control especial CommonDialog que convoca a las ventanas estndar de Windows, que asociados a los mtodos Put y Get nos permiten Abrir y Guardar un fichero como txt. El cdigo del ejercicio es el siguiente:
Dim a As Single, b As Single, c As Single 'Variable de los Datos Dim x1 As Single, x2 As Single 'Variable de las respuestas Dim del As Single 'Variable para los sumandos dentro del radical Private Sub cmdCalcular_Click() del = (b ^ 2 - 4 * a * c) If del >= 0 Then 'Si las races son reales e iguales x1 = (-b + Sqr(del)) / (2 * a) x2 = (-b - Sqr(del)) / (2 * a) txtX1.Text = Format(x1, "###,##0.00") txtX2.Text = Format(x2, "###,##0.00") Else 'Si son complejas x1 = Format((-b) / (2 * a), "###,##0.00") x2 = Format((Sqr(-del)) / (2 * a), "###,##0.00") txtX1.Text = x1 & " + " & x2 & " i" txtX2.Text = x1 & " - " & x2 & " i" End If End Sub Private Sub cmdSalir_Click() End End Sub Private Sub Form_Load() 'Inicializar las variables a=1 b=2 c=1 'Inicializar las cajas de texto
Pgina 24
txtA.Text = a txtB.Text = b txtC.Text = c End Sub Private Sub mnuAbrir_Click() Dim Fichero As String 'Variable para el nombre del Fichero CommonDialog1.Action = 1 'Ventana Abrir Fichero = CommonDialog1.FileName If Fichero = "" Then Exit Sub Open Fichero For Random As #1 'Abrir el Fichero 'Tomar los valores del Fichero Get #1, 1, a Get #1, 2, b Get #1, 3, c Get #1, 4, x1 Get #1, 5, x2 Close #1 'Asignar los valores a las cajas de texto. txtA.Text = a txtB.Text = b txtC.Text = c cmdCalcular_Click 'Mandar a calcular End Sub Private Sub mnuSalvar_Click() Dim Fichero As String If Fichero = "" Then mnuSalvarComo_Click Exit Sub End If Open Fichero For Random As #1 'Abrir el Fichero. 'Guardar el valor de las variables en el Fichero. Put #1, , a Put #1, , b Put #1, , c Put #1, , x1 Put #1, , x2 Close (1) End Sub Private Sub mnuSalvarComo_Click() Dim Fichero As String CommonDialog1.Action = 2 'Abrir la ventana Salvar como. Fichero = CommonDialog1.FileName If Fichero = "" Then Exit Sub Open Fichero For Random As #1 'Abrir el Fichero. 'Guardar el valor de las variables en el Fichero. Put #1, , a Put #1, , b Put #1, , c Put #1, , x1
Pgina 25
Put #1, , x2 Close (1) End Sub Private Sub txtA_LostFocus() If IsNumeric(txtA.Text) Then 'Si el dato es numrico a = txtA.Text 'Asignar el valor del TextBox a la variable Else MsgBox "Valor incorrecto", vbInformation txtA.SetFocus 'Poner el foco en el TextBox End If End Sub Private Sub txtA_Change() 'Limpiar los resultados si hay un cambio de dato en el texto. txtX1.Text = "" txtX2.Text = "" End Sub Private Sub txtA_GotFocus() 'Seleccionar los textos txtA.SelStart = 0 txtA.SelLength = Len(txtA.Text) End Sub Private Sub txtB_Change() txtX1.Text = "" txtX2.Text = "" End Sub Private Sub txtB_GotFocus() txtB.SelStart = 0 txtB.SelLength = Len(txtB.Text) End Sub Private Sub txtB_LostFocus() If IsNumeric(txtB.Text) Then b = txtB.Text Else MsgBox "Valor incorrecto", vbInformation txtB.SetFocus End If End Sub Private Sub txtC_Change() txtX1.Text = "" txtX2.Text = "" End Sub Private Sub txtC_GotFocus() txtC.SelStart = 0 txtC.SelLength = Len(txtC.Text) End Sub
Pgina 26
Private Sub txtC_LostFocus() If IsNumeric(txtC.Text) Then c = txtC.Text Else MsgBox "Valor incorrecto", vbInformation txtC.SetFocus End If End Sub
Ejercicio 15 Agenda
Agenda muy simple en Visual basic utilizando Ficheros de acceso aleatorio o tambin denominados Random , para almacenar los datos de los contactos de la Agenda.
Una vista del ejemplo:
Para manipular los datos se utiliza una estructura o UDT que tiene las siguientes variables:
Pgina 27
1. ' Estructura para los datos de los contactos de la agenda 2. Private Type Contacto 3. Nombre As String * 40 4. Apellido As String * 50 5. Telefono As String * 40 6. Mail As String * 70 7. Nota As String * 250 8. End Type
Como se puede ver en la imagen, tiene una opcin para buscar un registro y especificar por que campo buscar, ya sea por el nombre del contacto, el Apellido, el telefono o el correo electrnico.
Luego agregar 7 CommandButton con los siguientes nombres: 1. CmdAnterior : Botn para ir al anterior registro 2. cmdSiguiente : Botn para ir al siguiente registro 3. cmdGuardar : Botn para guardar los cambios cuando se seleccion previamente la opcin Nuevo Registro 4. cmdEliminar: Elimina el registro actual 5. cmdNuevo : Aade un nuevo reg 6. cmdBuscar : Para buscar 7. Cmdsalir : Descarga el Form
Ahora, agregar un control ComboBox llamado Combo1. A este combo, establecerle en la propiedad Style el valor 2 ( DropDownList ) y agregarle los siguientes valores en la propiedad List: Nombre, Apellido, Telefono e Mail en ese orden Nota: Para agregar datos en la propiedad List desde la ventana de propiedades, debes mantener la tecla Ctrl presionada y presionar la tecla Enter para aadir un nuevo dato o Item. Por ltimo, agregar un control Label llamado lblStatus que servir para poder mostrar cuando nos desplazamos por los registros, con los botones anterior y siguiente, el nmero del registro actual y la cantidad de registros que hay en el archivo. Este Label lo puedes situar en la parte inferior del formulario o donde quieras.
Pgina 28
Pgina 29
60. ' Subrutina que Visualiza los datos en los textBox 61. '################################################## 62. 63. Private Sub VisualizarDatos() 64. 65. 'Lee del fichero en el registro posicionado y almacena los datos_ _ 66. en la la variable UDT 67. Get #FileFree, RegActual, Datos 68. 69. ' Mostramos los datos en las cajas de texto 70. With Datos 71. txtApellido = Trim(.Apellido) 72. txtNombre = Trim(.Nombre) 73. txtTelefono = Trim(.Telefono) 74. txtMail = Trim(.Mail) 75. txtNota.Text = Trim(.Nota) 76. End With 77. 78. 'Mostramos en el control Label la posicin del registro actual _ 79. y la cantidad o Total de registros que hay en el archivo 80. lblStatus.Caption = "Registro Actual: " & CStr(RegActual) & vbNewLine _ 81. & " Total de registros: " & CStr(RegUltimo) 82. 83. End Sub 84. 85. 'Botn que elimina un registro del archivo 86. '############################################ 87. 88. Private Sub cmdEliminar_Click() 89. 90. Pos = RegActual 91. 92. If MsgBox(" Est seguro de eliminar el contacto ? ", vbYesNo) = vbNo Then 93. 94. txtNombre.SetFocus 95. 96. Exit Sub 97. End If 98. 99. ' Verificamos que el archivo temporal no exista, si existe se elimina 100. If Dir("Temporal.tmp") = "Temporal.tmp" Then 101. Kill "Temporal.tmp" 102. End If 103. 104. FileTemp = FreeFile 105. 'Abrimos y creamos un nuevo fichero temporal 106. Open "Temporal.tmp" For Random As FileTemp Len = Len(DatosTemp) 107. 108. RegActual = 1 109. RegActualTemp = 1 110. 111. 'Se recorren los registros del archivo 112. 113. For p = 1 To RegUltimo - 1 114. 115. Get #FileFree, RegActual, Datos 116. 117. 'Este es el registro que se elimina 118. If RegActualTemp = Pos Then 119. RegActual = RegActual + 1 120. End If
Pgina 30
121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181.
With DatosTemp .Apellido = Trim(Datos.Apellido) .Nombre = Trim(Datos.Nombre) .Telefono = Trim(Datos.Telefono) .Mail = Trim(Datos.Mail) .Nota = Trim(Datos.Nota) End With 'Escribe en el archivo temporal los datos Put #FileTemp, RegActualTemp, DatosTemp RegActual = RegActual + 1 RegActualTemp = RegActualTemp + 1 Next
Close FileFree 'Elimina el archjivo con los datos Kill "Datos.dat" Close FileTemp 'Renombra el archivo temporal a datos.dat Name "Temporal.tmp" As "Datos.dat"
' Mostramo los datos en los textbox Cargar RegActual = Pos VisualizarDatos End Sub Private Sub cmdGuardar_Click() GuardarDatos End Sub Private Sub Cmdsalir_Click() 'Guarda los cambios en el archivo antes de salir GuardarDatos 'cierra el archivo abierto Close #FileFree End End Sub Private Sub form_load() 'Carga el primer registro del archivo Cargar 'Selecciona en el combo para la bsqueda de datos Combo1 = Combo1.List(0) Cargarcaptions End Sub
Pgina 31
182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. _ 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241.
Private Sub Cargar() FileFree = FreeFile Open "Datos.dat" For Random As FileFree Len = Len(Datos) RegActual = 1 ' Almacenamos la posicin del ltimo registro RegUltimo = LOF(FileFree) / Len(Datos) If RegUltimo = 0 Then RegUltimo = 1 End If 'Cargamos los datos en los Textbox VisualizarDatos End Sub 'Botn que agrega un nuevo registro '##################################### Private Sub cmdNuevo_click() RegUltimo = RegUltimo + 1
'Limpia los datos de la estructura para poder agregar un nuevo registro With Datos .Apellido = "" .Nombre = "" .Telefono = "" .Mail = "" .Nota = "" End With ' Graba datos vacios en el nuevo registro hasta que se presione el botn Guardar que graba los verdaderos datos Put #FileFree, RegUltimo, Datos RegActual = RegUltimo
Private Sub cmdSiguiente_click() If RegActual = RegUltimo Then MsgBox " Ultimo registro ", vbInformation Else 'Incrementa la posicin RegActual = RegActual + 1 'Cargamos los datos en el textbox del siguiente registro VisualizarDatos
Pgina 32
242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. al 255. 256. 257. 258. 259. 260. 261. 262. 263. 264. 265. 266. 267. 268. 269. 270. 271. 272. 273. 274. 275. r 276. 277. 278. 279. 280. 281. 282. 283. 284. 285. 286. 287. 288. 289. 290. 291. 292. 293. 294. 295. 296. 297. 298. 299. 300.
End If txtNombre.SetFocus End Sub 'Botn para posicionar en el Anterior registro '############################################## Private Sub CmdAnterior_click() If RegActual = 1 Then MsgBox " Primer registro ", vbInformation Else 'Decrementamos la variable que mantiene la posicin del registro actu RegActual = RegActual - 1 'Mostramos los datos en las cajas de texto VisualizarDatos End If txtNombre.SetFocus End Sub 'Botn para Buscar datos '############################################## Private Sub cmdBuscar_click() Dim Encontrado As Boolean, PosReg As Long, tmp As Contacto If txtBuscar = "" Then txtNombre.SetFocus: Exit Sub Encontrado = False 'Recorremos desde el primer hasta el ltimo en busca del registro a busca
For PosReg = 1 To RegUltimo 'Leemos el registro Get #FileFree, PosReg, tmp 'Si es el dato es igual salimos del bucle If UCase(txtBuscar) = UCase(Trim(BuscarPor(tmp))) Then Encontrado = True Exit For End If Next If Encontrado Then RegActual = PosReg 'Cargamos los datos en los text VisualizarDatos Else MsgBox "Nombre: " & txtBuscar & " No se ha encontrado el registro" End If txtNombre.SetFocus
Pgina 33
301. 302. 303. 304. 305. 306. 307. 308. 309. 310. 311. 312. 313. 314. 315. 316. 317. 318. 319. 320. 321. 322. 323. 324. 325. 326. 327. 328. 329. 330.
End Sub 'Funcin que retorna el valor de la bsqueda '############################################# Private Function BuscarPor(t As Contacto) Select Case Combo1.ListIndex Case Case Case Case 0: 1: 2: 3: BuscarPor BuscarPor BuscarPor BuscarPor = = = = t.Nombre t.Apellido t.Telefono t.Mail
End Select End Function ' Establece los captions de los controles Command del formulario Private Sub Cargarcaptions() Me.Caption = " Agenda simple utilizando archivos aleatorios " CmdAnterior.Caption = " Anterior " cmdSiguiente.Caption = " Siguiente " cmdGuardar.Caption = " Guardar " cmdEliminar.Caption = " Eliminar " cmdNuevo.Caption = " Nuevo " cmdBuscar.Caption = " Buscar " Cmdsalir.Caption = " Salir " End Sub
Pgina 34
opciones, para que sea un poco mas entendible. Y otra cosa tambin usar un formulario MDI para tener multiples documentos abiertos en la misma aplicacin
Nota: Colocar los controles en cualquier posicin de la pantalla y no colocarles nada en el Caption ni el tamao ni nada, ya que se hace por cdigo, es decir se les asigna el caption y se redimensionan en tiempo de ejecucin . Pegar el cdigo en el formulario
1. Option Explicit 2. 3. 4. Const FILTRO_EXTENSIONES As String = "Archivos de texto (txt)|*.txt|" & _ 5. "Rich Text Formato (RTF)|*.rtf|" & _ 6. "Archivos INI|*.ini|Archivos HTML|" & _ 7. "*.htm|Todos los archivos|*.*" 8. 9. Private Sub Iniciar() 10. Dim i As Integer 11. 12. 'Acomodamos el primer botn en la esquina superior izquierda 13. cmdOpcion(0).Move 50, 10, 1000, 250 14. 15. For i = 1 To 10 16. Load cmdOpcion(i) 17. cmdOpcion(i).Visible = True 18. Next 19. 20. 'Caption de los CommandButton para las opciones 21. With cmdOpcion 22. .Item(0).Caption = "Nuevo" 23. .Item(1).Caption = "Abrir" 24. .Item(2).Caption = "Guardar" 25. .Item(3).Caption = "Cortar" 26. .Item(4).Caption = "Copiar" 27. .Item(5).Caption = "Pegar" 28. .Item(6).Caption = "Bold" 29. .Item(7).Caption = "Italic" 30. .Item(8).Caption = "Underlined" 31. .Item(9).Caption = "Imprimir" 32. .Item(10).Caption = "Color"
Pgina 35
33. End With 34. 35. ' Va posicionando un botn al lado del otro 36. For i = 1 To cmdOpcion.Count - 1 37. cmdOpcion(i).Move cmdOpcion(i - 1).Width * i, 10, 1000, 250 38. Next 39. End Sub 40. 41. Private Sub cmdOpcion_Click(Index As Integer) 42. On Error GoTo men 43. 44. Dim ret As VbMsgBoxResult, cnt As Long 45. 46. Select Case Index 47. ' crear un Nuevo archivo 48. ''''''''''''''''''''''''' 49. Case 0 50. ret = MsgBox("Guardar el archivo?", vbQuestion + vbYesNo, App.Title) 51. If ret = vbYes Then 52. RichTextBox.Text = "" 53. 'guardamos el archivo 54. GuardarArchivo 55. End If 56. 'Limpiamos el RichTextBox 57. RichTextBox.Text = "" 58. 59. 'Para Abrir un Archivo con el CommonDialog 60. ''''''''''''''''''''''''''''''''''''''''''''' 61. Case 1 62. Call Abrir_Archivo 63. 'Para Guardar un Archivo 64. ''''''''''''''''''''''''''' 65. Case 2 66. Call GuardarArchivo 67. 'Opcin Para cortar el Texto del RichTexBox Seleccionado 68. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 69. Case 3 70. 'Pegamos en el portapapeles de windows con ClipBoard 71. Clipboard.SetText RichTextBox.SelText 72. 'Eliminamos lo seleccionado en el RichTextBox 73. RichTextBox.SelText = "" 74. 'Copiar al Clipboard 75. ''''''''''''''''''''''''' 76. Case 4 77. Clipboard.SetText RichTextBox.SelText 78. 'Pegar el contenido del portapapeles en el RichTextBox 79. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 80. Case 5 81. RichTextBox.SelText = Clipboard.GetText 82. 'Texto en negrita con la propiedad SelBold 83. '''''''''''''''''''''''''''''''''''''''''''' 84. Case 6 85. RichTextBox.SelBold = Not RichTextBox.SelBold 86. ' Aplica Italic al texto seleccionado 87. '''''''''''''''''''''''''''''''''''''''' 88. Case 7 89. RichTextBox.SelItalic = Not RichTextBox.SelItalic 90. ' Aplica Underline al texto seleccionado 91. ''''''''''''''''''''''''''''''''''''''''' 92. Case 8 93. ' Texto en cursiva
Pgina 36
94. RichTextBox.SelUnderline = Not RichTextBox.SelUnderline 95. ' Imprimir el contenido del RichTextBox 96. ''''''''''''''''''''''''''''''''''''''''' 97. Case 9 98. 'Titulo del dilogo Imprimir 99. CommonDialog.DialogTitle = "Seleccionar impresora" 100. ' Abre el commondialog para seleccionar impresora 101. CommonDialog.ShowPrinter 102. ' imprimimos el archivo 103. RichTextBox.SelPrint CommonDialog.PrinterDefault, rtfText 104. 105. 'Color del texto 106. '''''''''''''''''''''' 107. Case 10 108. On Error Resume Next 109. CommonDialog.DialogTitle = "Seleccionar color para el texto" 110. 'Abrimos el commondialog 111. CommonDialog.ShowColor 112. 'Establecemos el color en el Texto seleccionado del RichTextBox 113. RichTextBox.SelColor = CommonDialog.Color 114. End Select 115. 116. Exit Sub 117. men: 118. If Err.Number = 424 Then Resume Next 119. End Sub 120. 121. '* Subrutia para guardar el archivo en disco 122. ''''''''''''''''''''''''''''''''''''''''''''''''''''''' 123. Private Sub GuardarArchivo() 124. 125. 'Titulo del cuadro de dilogo y otras opciones 126. With CommonDialog 127. .DialogTitle = "Guardar Archivo" 128. .Filter = FILTRO_EXTENSIONES 129. 130. 'Abre el Common Dialog guardar 131. .ShowSave 132. If .FileName = "" Then Exit Sub 133. If .FilterIndex = 2 Then 134. RichTextBox.SaveFile .FileName 135. Else 136. RichTextBox.SaveFile .FileName, rtfText 137. End If 138. End With 139. End Sub 140. 141. '* Sub para Abrir un archivo del disco 142. ''''''''''''''''''''''''''''''''''''''''''''''''''''' 143. Private Sub Abrir_Archivo() 144. Dim ret As VbMsgBoxResult 145. 146. If RichTextBox <> "" Then 147. ret = MsgBox(" Guardar el archivo ?", vbQuestion + vbYesNo, App.Titl e) 148. 'Si elegimos si, entonces guardamos el archivo 149. If ret = vbYes Then GuardarArchivo 150. End If 151. 152. With CommonDialog 153. .DialogTitle = "Abrir Archivo"
Pgina 37
154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176.
' Extenciones del Commondialog .Filter = FILTRO_EXTENSIONES ' Abrimos el Commondialog .ShowOpen If .FileName = "" Then Exit Sub 'Si es un vbNullstring salimos ' Cargamos el fichero en el RichTextBox con el mtodo LoadFile RichTextBox.LoadFile .FileName End With End Sub
Private Sub Form_Load() Call Iniciar End Sub Private Sub Form_Resize() 'Redimensionamos el control RichTextBox al tamao _ del formulario usando el mtodo Move del mismo. RichTextBox.Move 0, cmdOpcion(0).Top + cmdOpcion(0).Height, _ ScaleWidth, ScaleHeight End Sub
El men Archivo:
Pgina 38
El men Edicin:
Los nombres de los menues debern ser los siguientes: Men Archivo: 1. 2. 3. 4. 5. Abrir: mnuAbrir Nuevo: mnuNuevo Guardar: mnuGuardar Guardar Como: mnuGuardarComo Salir: mnuSalir
Men edicin 1. 2. 3. 4. Copiar: mnuCopiar Cortar: mnuCortar Pegar: mnuPegar Seleccionar todo: mnuSeleccionar
Nota: si no sabs como crear los menes con el editor de visual basic, pods chequear este enlace que explica resumidamente como crear uno:
Pgina 39
Ahora hay que especificar en el formulario Mdi, en la propiedad MdiChild, que se encuentre en True, para que de esta manera los formularios se abran dentro de este. Ahora indicar en el men Proyectos > Propiedades de proyecto, que el formulario de inicio sea el MDI, en la opcin Objecto inicial.
Luego agregar un control CommonDialog llamado CommonDialog1 en el formulario Mdi y tambin otro en el formulario frmDocumento para poder utilizar los Cuadros de dilogo Abrir Archivo y Guardar como. ( El control CommonDialog lo acceds desde el men proyecto, Componentes > Microsoft Common Dialog Control ). En el formulario frmDocumento, colocar un control RichTextBox llamado RichTextBox1 y establecerle a este desde la ventana de propiedades, la propiedad Multiline en True, La propiedad Scrollbars en 3. ( opara que muestre Ambas barras de desplazamiento) Por ltimo colocar un mdulo bas al proyecto
Agregar el cdigo fuente a los formularios y al mdulo bas Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 40
Option Explicit
Private Sub MDIForm_Initialize() CommonDialog1.Filter = "Documento de texto|*.txt|Todos los Archivos|*.*" End Sub
CommonDialog1.ShowOpen
FrmDoc.Show
ActiveForm.Caption = CommonDialog1.FileName
ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName
Select Case Err.Number Case 70 ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName Resume Next End Select
Pgina 41
End Sub
If Forms.Count = 1 Then MsgBox "No hay documentos para guardar", vbInformation Exit Sub End If
CommonDialog1.ShowSave
End Sub
Pgina 42
If Forms.Count = 1 Then MsgBox "No hay documentos para guardar", vbInformation Exit Sub End If If InStr(1, ActiveForm.Caption, sCaption) Then CommonDialog1.ShowSave If CommonDialog1.FileName = "" Then Exit Sub ActiveForm.RichTextBox1.SaveFile CommonDialog1.FileName Else ActiveForm.RichTextBox1.SaveFile ActiveForm.Caption
End If
End Sub
'Men nuevo archivo Private Sub mnuNuevo_Click() Set FrmDoc = New frmDocumento nForms = nForms + 1 FrmDoc.Caption = sCaption & nForms FrmDoc.Show End Sub
Pgina 43
'Men salir Private Sub mnuSalir_Click() Set FrmDoc = Nothing End End Sub
'Menu para seleccionar todo el texto Private Sub mnuSeleccionar_Click() On Local Error Resume Next
End Sub
'Men Copiar texto Private Sub mnuCopiar_Click() On Local Error Resume Next Clipboard.SetText ActiveForm.RichTextBox1.SelText End Sub
'Men cortar texto Private Sub mnuCortar_Click() On Local Error Resume Next Clipboard.SetText ActiveForm.RichTextBox1.SelText ActiveForm.RichTextBox1.SelText = "" End Sub
Pgina 44
Option Explicit
Private Sub Form_Resize() 'Redimensionamos el control RichtextBox al ancho y alto del formulario RichTextBox1.Move ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight If WindowState = vbMaximized Then 'mdiform1.Caption = Me.Caption Else mdiform1.Caption = "" End If End Sub
If InStr(1, Me.Caption, sCaption) Then CommonDialog1.ShowSave RichTextBox1.SaveFile CommonDialog1.FileName Else RichTextBox1.SaveFile Me.Caption End If Case vbCancel:
Pgina 45
End Select
End Sub
Public FrmDoc As frmDocumento Public nForms As Integer Public Const sCaption = "Nuevo documento sin ttulo "
En este enlace est el cdigo fuente para descargar del proyecto anterior, que incluye una barra de herramientas para las opciones ( abrir, guardar etc.. ) y un cuadro de buscar y reemplazar para los documentos
Pgina 46
PRACTICAS 1-5
1.- Hacer una aplicacin que permita abrir un archivo de texto y mostrarlo en una caja de texto. La aplicacin debe permitir seleccionar el archivo de la unidad de disco mediante el cuadro de dilogo Abrir. 2.- Hacer una aplicacin que permita almacenar en un archivo con estructura de base de datos los campos: Nombre, Apellido, Edad y lugar de nacimiento. El programa debe permitir visualizar los registros agregados en un control ListView. Tambin debe permitir borrar un registro almacenado en el archivo de base de datos. 3.- Hacer una aplicacin que permita borrar un archivo de una unidad de disco. El nombre de este archivo y la unidad donde este se encuentra debe ser especificado en una caja de texto y mediante un botn de Borrar el programa debe permitir borrarlo. Si el archivo no se encuentra se debe mostrar un mensaje informando al usuario que ese archivo no existe. 4.- Hacer una aplicacin que permita almacenar en un archivo el texto escrito en una caja de texto. El programa debe permitir al usuario escribir el nombre del archivo y la unidad donde desea guardarlo. Para esto, usted debe utilizar el cuadro de dilogo Guardar del control Common Dialog. 5.- Hacer una aplicacin similar al Bloc de notas de Windows. Debe dar funciones a las opciones del primer men (Archivo) y del tercer men (Fuente). Utilice para esto el control Common Dialog.
Pgina 47
Pgina 48
Visual Basic cuenta con una cantidad importante de Asistentes. Entre ellos el asistente para la creacin de un Formulario de datos, osea un formulario que va a mostrar datos de una Base de datos. Para incorporar al Asistente vamos a Complementos, Administrador de complementos y alli se nos abre una ventana desde donde podemos seleccionar cualquiera de los Asistentes.
Seleccionamos VB 6 Data Form Wizard y hacemos doble click, o marcamos en la casilla de seleccin, para qu se cargue. Luego hacemos Aceptar y al ir a Complementos veremos la opcion de del asistente incluida. La seleccionamos y se abrir una ventanacon la introduccin al Asistente. Pasamos a Siguiente, ya que aqu no podemos cargar la configuracin de ningn perfil, porque no tenemos ninguna configuracin o plantilla grabada.
Pgina 49
En esta pantalla seleccionamos qu tipo de base de datos vamos a usar, si una de Access o de un servidor remoto. En este caso elegimos Access. Y pasamos a la pantalla siguiente.
En esta pantalla si hacemos Click en el botn Examinar podemos elegir la base de datos que vamos a usar.
Pgina 50
Aqu aparece una lista de opciones, que nos permite elegir qu tipo de formulario vamos a crear y como vamaos a mostrar los datos. Registro individual: nos mostrar registro por registro. Cuadrcula: lo har en una grilla. Maestro/Detalle: relaciona dos tablas. FlexGrid mostrar: las tablas con sus resmenes y totales de los datos existentes en la tabla y Chart lo har de manera grfica. Nosotros vamos a elegir a manera de grilla o Cuadrcula.
En esta pantalla seleccionamos la tabla de la base de datos. Y de ella los campos que queremos mostrar. Los seleccionamos y con los botones con flecha los vamos pasando a la lista de la derecha. Si queremos ordenar los datos por un campo determinado lo elegimos del combo desplegable.
Pgina 51
Aqui hacemos Click en seleccionar todos los botones o elegimos solo algunso. estos nos permiten navegar la grilla. La pantalla Siguiente nos pregunta si queremos guardar esta configuracin como una plantilla para futuros formularios. Luego hacemos Finalizar.
Al cerrase la ventana del Asistente veremos en nuestro proyecto estndar un nuevo formulario, si no usamos el primero o Form1 lo podemos eliminar. Posicionados en la ventana proyecto con el botn derecho tenemos la opcin de eleminarlo. Y grabamos la aplicacin con el formulario que cre el asistente. Sino lo usamos como formulario de presentacin. Como vemos en la ventana cdigo el asistente, ya codific los botones de navegacin y de cierre de la Aplicacin.
Pgina 52
Ejercicio 19 BD Navegar
Este ejercicio es muy simple y nos permite solamente navegar una Base de datos ya existente usando un control standard de la barra de herramientas de Visual Basic, el Control Data Este control tiene dos propiedades importantes la DataBaseName, o sea la base de datos a la cual se asocia , en este caso usaremos la Hwind.mdb una de las dos bases que incluye Visual Basic, la otra es Biblio.mdb. Y la RecordSource que asocia al control con una tabla especfica en este caso Customers, o sea Clientes o usuarios. Observen que no hemos escrito ni una lnea de cdigo y sin embargo podemos recorrer los registros que componen la tabla a travs del control Data. El formulario muestra los campos del registro a travs de cajas de texto cuya propiedad DataField se asocian al campo correspondiente luego de establecer como DataSource o sea como base de origen la Data1 que es el control creado anteriormente.
Recuerden que siempre que trabajemos con bases de datos tendrn que cargar el DataBaseName nuevamente de acuerdo al recorrido de sus mquinas.
To do these exercises, you should make a folder into which you will copy the two database files mentioned above. Then, within the folder you have created, make separate subfolder for each exercise, one level below the root of your folder. The DatabaseName property for the Data control in these exercises assumes that the database file resides one directory level above the folder in which the exercise project files reside.
STEPS: 1. Open a new Visual Basic project. 2. Put a data control (an intrinsic control, located in the VB toolbox) on the form and set the properties as follows: Value datAuthors Use the arrows to view the data Connect Access (default) DatabaseName ..\biblio.mdb DefaultType UseJet (default) RecordSource Authors (choose from list) Property (Name) Caption Notes: When you use the Data Control in a project, the properties that must be set are DatabaseName and RecordSource, in that order. DatabaseName is the name of the database you want to use, and the RecordSource is the name of the table in that database that you want to use. 3. On your form, create a text box for each field in the Authors table, with labels. (If you were to open the database in Access, you would see that the three fields of the Authors table are Au_ID, Author, and Year Born.) Set the properties of the three textboxes as follows: Name txtAuthID txtAuthor txtYearBorn DataSource datAuthors datAuthors datAuthors DataField Au_ID Author Year Born
In addition, set the Enabled property of txtAuthID to False. When you want a control (such as a text box) to display data from a database, the properties that must be set are DataSource and Datafield. The DataSource is the name of the data control on the form (it should already be configured), and the DataField is the name of the particular field in the database that should be displayed in the control (this field will be in the table that was chosen for the RecordSource of the data control).
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 54
4. Save and run the project. Use the arrows on the data control to scroll through the data. 5. On any record, change the data in the author name or year born field. Move ahead, then move back to the record you changed. Note that your changes remain in effect. The data control automatically updates a record when you move off of the record.
Note that this exercise demonstrated that you can create a simple but functional application that allows the user to browse through the rows of a database table (or result set) and to update rows in that table without writing any code.
2. Set the Visible property of the data control (datAuthors) to False. 3. Make four command buttons with the following properties:
Pgina 55
4. Put the following four lines of code in the appropriate Click events for the buttons: Event cmdMoveNext_Click cmdMoveLast_Click cmdMovePrevious_Click cmdMoveFirst_Click 5. Save and run your program. 6. Move to the last record and then click the Move Next button twice. What happens? (We will fix this in Exercise 4.) Code datAuthors.Recordset.MoveNext datAuthors.Recordset.MoveLast datAuthors.Recordset.MovePrevious datAuthors.Recordset.MoveFirst
Pgina 56
Ejercicio 22 Using the BOF Action and EOF Action Properties of the Data Control
Note: EOF (End Of File) is a Boolean property of the recordset object that becomes true when an attempt is made to move forward past the last record in a recordset. BOF (Beginning Of File) is a Boolean property of the recordset object that becomes true when an attempt is made to move backward past the first record in a recordset. STEPS: 1. Copy the files from Exercise #1 into a new folder and open the VBP file in the new folder. 2. Click once on the data control and make sure that the following properties are set: BOFAction = 0 Move First EOFAction = 0 Move Last 3. Run the program and notice what happens when you use the arrows to move previous when you are on the first record already, or move next when you are already on the last record. End the program, and set the data control properties as follows: BOFAction = 1 BOF EOFAction = 1 EOF Notice what happens to the arrows on the data control when you try to move past the last or first record. 4. Now set the EOFAction property to 2 AddNew. 5. Run the program; click the >| arrow on the data control to move to the end of the records; then click on the > arrow to move to the next record (which does not exist). 6. A blank record should appear. Type some data in all the fields (the author ID will be entered automatically), then move to a previous record. Move back to the last record to verify that your data is still there. 7. End the program, then start it again. Verify that the data you entered is still in the database.
Pgina 57
Note that this exercise demonstrated that you can create a simple but functional application that not only allows the user to browse through the rows of a database table and to update rows in that table, but also allows the user to add a new record to that table without writing any code.
Ejercicio 23 Using the EOF and BOF Properties with Navigation Buttons
STEPS: 1. Copy the files from Exercise #2 into a new folder and open the VBP file in the new folder. 2. When the user clicks on the MoveNext button, and there is no next record, your code should stay on the same record (the last one). Put the following code in the cmdMoveNext_Click() event: datAuthors.Recordset.MoveNext If datAuthors.Recordset.EOF = True Then datAuthors.Recordset.MoveLast End If FYI: Instead of Recordset.MoveLast, you could use MoveFirst to let the user loop around to the first record. 3. Put similar code in the cmdMovePrevious_Click() event. In this case, you will be checking for Recordset.BOF = True.
4. Save and run the project and test it thoroughly.
Pgina 58
This exercise shows you how to invoke the Update, AddNew, and Delete methods of the recordset object through code. STEPS: 1. Copy the Exercise #4 files into a new folder and open the VBP file. 2. Add three more buttons to the form and set their properties as follows: Name cmdNewRecord cmdSaveRecord cmdDeleteRecord Caption New Record Save Record Delete Record Enabled True False True
3.
When the user clicks on New Record, your program should enable the Save Data button and disable the others. Put the following code in the cmdNewRecord_Click() event: datAuthors.Recordset.AddNew cmdSaveRecord.Enabled = True cmdMoveFirst.Enabled = False cmdMoveLast.Enabled = False cmdMovePrevious.Enabled = False cmdMoveNext.Enabled = False
Pgina 59
cmdDeleteRecord.Enabled = False cmdNewRecord.Enabled = False 4. Save and run the program to make sure the buttons are enabled and disabled correctly. 5. When the user clicks on the Save button to save the data that was entered, the Update method should be called and the buttons should be redisplayed. Place the following code in the cmdSaveRecord_Click() event: datAuthors.Recordset.Update cmdSaveRecord.Enabled = False cmdMoveFirst.Enabled = True cmdMoveLast.Enabled = True cmdMovePrevious.Enabled = True cmdMoveNext.Enabled = True cmdDeleteRecord.Enabled = True cmdNewRecord.Enabled = True 6. Something to watch out for with the Delete method is that when a record is deleted, the recordset is no longer pointing to a valid record, but the data from the deleted record still remains in the controls. If the user attempted to update the record at that point, a run-time error would occur. To prevent this from happening, you should move the user to a valid record immediately following the delete. Another issue is that if you attempt to delete a record that has a related record in another table, the Jet (Access) database engine will not allow the delete, and a run-time error will occur. If you don't trap the error, the program will crash. Finally, it is good programming practice to ask the user to confirm any destructive action. Place the following code, which addresses the above-mentioned issues, in the cmdDelete_Click() event: On Error GoTo Delete_Error If MsgBox("Are you sure you want to delete this record?", _ vbQuestion + vbYesNo + vbDefaultButton2, _ "Confirm") = vbNo Then Exit Sub Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 60
End If
'delete the current record datAuthors.Recordset.Delete 'move to a valid record cmdMoveNext_Click Exit Sub Delete_Error: ' This error will occur if you attempt to delete an author that is related to ' another table in the biblio.mdb database ... MsgBox "This record cannot be deleted. Error code = " _ & Err.Number & vbCrLf & Err.Description, _ vbCritical, "Cannot Delete" 7. Save and test your program to make sure all functions work.
Pgina 61
Private Sub Command1_Click() Data1.Recordset.MoveFirst ' Se ubica en el primer registro End Sub Private Sub Command2_Click() Data1.Recordset.MovePrevious ' Se mueve al registro previo If Data1.Recordset.BOF Then 'Si es el primero muestra un 'mensaje. MsgBox "Este es el Primer Registro.", , "Registros" Data1.Recordset.MoveFirst End If End Sub Private Sub Command3_Click() Data1.Recordset.MoveNext ' Se ubica en el siguiente If Data1.Recordset.EOF Then ' Si es el ltimo muestra un mensaje MsgBox "Este es el ltimo Registro.", , "Registros" Data1.Recordset.MoveLast ' Se ubica en el ltimo. End If End Sub Private Sub Command4_Click() Data1.Recordset.MoveLast ' Se ubica en el ltimo. End Sub
Las propiedades BOF y EOF indican el comienzo del archivo: begin of file y el final del archivo: end of file. El objeto Recordset que sigue al objeto data identifica al objeto: conjunto de registros.
Pgina 62
La base con la que trabajamos es Biblio.mdb y la tabla Editores o Publishers. El cdigo correspondiente a los botones avanzar y Atrs ya los hemos visto en el ejercicio anterior por lo tanto vamos a centrarnos en los botones Agregar, Eliminar y Buscar cuyos cdigos son:
Private Sub Command1_Click() mensaje = MsgBox("Complete los datos y haga un Click" + Chr(10) + "en el botn de registro siguiente.", vbInformation) Data1.Recordset.AddNew Text2.SetFocus End Sub Private Sub Command2_Click() mensaje = MsgBox("Est seguro de Borrar el registro?", vbOKCancel, "Eliminacin de Registros") If mensaje = vbOK Then Data1.Recordset.Delete Data1.Recordset.MoveNext If Data1.Recordset.EOF Then Data1.Recordset.MoveLast End If End Sub Private Sub Command3_Click() buscar = InputBox("Ingrese la Ciudad a Buscar:", "Bsqueda") Data1.Recordset.FindFirst "City=" & "'" & buscar & "'" If Data1.Recordset.NoMatch Then mensaje = MsgBox("No existe la Ciudad Buscada.", vbCritical) Command4.Enabled = False Else Command4.Enabled = True End If End Sub Private Sub Command4_Click() Data1.Recordset.FindNext "City=" & "'" & buscar & "'" End Sub
El mtodo AddNew nos permite agregar un nuevo registro, y la actualizacin la podemos hacer a travs de botn grabar o moviendo el puntero al pasar al siguiente registro. Para eliminar un registro lo hacemos con el Mtodo Delete, previa confirmacin a travs de un MsgBox de la misma. Para que la base se mantenga actualizada en el procedimiento Activate del formulario incluimos:
Private Sub Form_Activate() Data1.UpdateRecord ' esto actualiza la data End Sub
Y para el procedimiento Buscar abrimos un InputBox que guarde la cadena a buscar, en este caso una ciudad por ejemplo: New York o Buenos Aires y con el mtodo FindFirst (Buscar primero) y el campo
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 63
establecido en este caso City (Ciudad) establece los criterios de la bsqueda. Luego con FindNext establece el criterio de la segunda bsqueda.
This exercise introduces the Validate event of the data control, as well as the CancelUpdate and UpdateControls methods of the data control, the Bookmark and LastModified properties of the recordset object, and the DataChanged property of bound controls.
The Validate event of the data control occurs prior to a record Move and prior to an Update, Delete, Unload, Close, or setting of a Bookmark. This means that any code contained in the Validate event procedure will be executed prior to the execution of a statement containing one of these methods. For example, if somewhere in your program you code the statement datAuthors.Recordset.Update, when VB encounters this statement, any code in the Validate event will be executed first. The Validate event takes in two VB-provided arguments: Action and Save. (For example, the Validate event procedure header for this exercise will look like this: Private Sub datAuthors_Validate(Action As Integer, Save As Integer). The Action argument tells you which particular action (MoveFirst, Update, etc.) caused the Validate event to fire. The value of Action can be tested by comparing it to a literal integer value (1, 2, 3, etc.) or with its corresponding VB predefined constant (vbDataActionMoveFirst, vbDataActionUpdate, etc.). In addition, whatever action triggered the Validate event can be cancelled if you set the value of Action to zero (or to the predefined constant vbDataActionCancel) prior to exiting the Validate event procedure. The values of Action and their corresponding predefined constants are as follows: Value Description 0 Cancel the operation when the Sub exits vbDataActionMoveFirst 1 MoveFirst method vbDataActionMovePrevious 2 MovePrevious method vbDataActionMoveNext 3 MoveNext method vbDataActionMoveLast 4 MoveLast method vbDataActionAddNew 5 AddNew method vbDataActionUpdate 6 Update operation (not UpdateRecord) Constant vbDataActionCancel Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 64
7 8 9 10 11
Delete method Find method The Bookmark property has been set The Close method The form is being unloaded
The Save argument is a Boolean value indicating whether or not bound data has changed. You can set Save to False to prevent VB from saving changes to a record. DataChanged is a run-time only Boolean property available with data-bound controls (such as the textboxes you have been using), typically used in the Validate event. You would typically use DataChanged as a first test to see if a particular field needs further validation (if the user did not change the data in a field, why bother doing further validation on that field?) The logic structure would look something like the following: If txtMyField.DataChanged Then If (something is wrong with txtMyField) Then MsgBox "Invalid data in this field" End If End If The CancelUpdate method is used to cancel any pending updates resulting from an Edit or AddNew operation. For example, if a user invokes the Edit or AddNew method and hasn't yet invoked the Update method, CancelUpdate cancels any changes made after Edit or AddNew was invoked. The UpdateControls method gets the current record from a Data control's Recordset object and displays the appropriate data in controls bound to a Data control. This method is typically used to restore the contents of bound controls to their original values, as when a user makes changes to data and then decides to cancel the changes. This method does not cause the Validate event to fire. Similarly, the UpdateRecord method (not used in this exercise) saves the current contents of bound controls to the database during the Validate event without triggering the Validate event again. Bookmark is a property of the Recordset object that contains a binary string identifying the current record. If you assign the Bookmark value to a variable and then move to another record, you can make the earlier record current again by setting the Bookmark property to that string variable. LastModified is a property of the Recordset object that returns a bookmark indicating the most recently added or changed record. STEPS: 1. 2. Copy your files from Exercise 5 into a new folder. Place two new command buttons on your form and set their properties as follows:
Pgina 65
3.
Place the following statements in the general declarations section of your form: Private blnAddingNewRecord As Boolean Private blnValidationError As Boolean
4.
Code the event procedure for the new cmdUndo button, which consists of only one statement: datAuthors.UpdateControls
5. Modify the cmdNewRecord_Click() event procedure to look like the following (new statements are shown in bold):
datAuthors.Recordset.AddNew If blnValidationError Then Exit Sub cmdSaveRecord.Enabled = True cmdCancelNew.Enabled = True cmdMoveFirst.Enabled = False
Pgina 66
cmdMoveLast.Enabled = False cmdMovePrevious.Enabled = False cmdMoveNext.Enabled = False cmdDeleteRecord.Enabled = False cmdNewRecord.Enabled = False
cmdUndo.Enabled = False
blnAddingNewRecord = True
Explanation When the user initiates the process to add a record, the code invokes the AddNew method, which will cause the Validate event to fire, which will set the blnValidationError flag. This will catch the case where the user has modified the current record (and has made errors) and then clicks the "New Record" button. In that case the error is flagged, the AddNew is canceled, and the user must correct the problem with the current record. If everything's OK, we enable the "Cancel New" button so that they can cancel the process, and disable the "Undo" button, because that is only applicable when the user is changing, not adding a record. We also set the blnAddingNewRecord flag to true, which will be tested in the Validate event (shown in a few steps below).
6. Modify the cmdSaveRecord_Click() event procedure to look like the following (new statements are shown in bold):
datAuthors.Recordset.Update If blnValidationError Then Exit Sub ' make the new record the current record datAuthors.Recordset.Bookmark _ = datAuthors.Recordset.LastModified cmdSaveRecord.Enabled = False cmdCancelNew.Enabled = False cmdMoveFirst.Enabled = True cmdMoveLast.Enabled = True
Pgina 67
blnAddingNewRecord = False
Explanation When the user initiates a save for a newly added record, the Update method is invoked (with the statement datAuthors.Recordset.Update). This will cause the Validate event to fire, where we will set the blnValidationError flag. When the Validate event terminates, control resumes with the If statement, where that flag is tested. If there is an error, we want to exit the sub early, which will let the user continue working on the current record to correct the problem. Otherwise, if the flag is False, that means that all validation checks passed and we can continue on our merry way.
The statement
datAuthors.Recordset.Bookmark = datAuthors.Recordset.LastModified causes the newly added record to become the current record. This is necessary if you want to see the data for the new record on the form after you add it, because the AddNew method and subsequent Update method does not cause the newly added record to become the "current" record. Therefore, without this statement, the record that was current before you invoked the "New Record" operation would be displayed, and you would have to go to the last record to see the newly added record. Since this event completes the operation of adding a new record, the cmdCancelNew button is disabled, the cmdUndo button is enabled and the blnAddingNewRecord flag is set to False. 7. Code the Validate event procedure for the datAuthors data control. Recall that this event fires prior to a record Move and prior to an Update, Delete, Unload, Close, or setting of a Bookmark. Since Validate is the default procedure for a data control, you can get the procedure header by doubleclicking on the data control. The code is shown below: Private Sub datAuthors_Validate(Action As Integer, Save As Integer) If Action = vbDataActionBookmark Then Exit Sub If Action = vbDataActionDelete Then Exit Sub 'check to see if a valid author id is entered:
Pgina 68
If txtAuthor.DataChanged Or blnAddingNewRecord Then If Trim$(txtAuthor) = "" Then MsgBox "Author name must be entered" txtAuthor.SetFocus GoTo CancelValidateAction End If End If 'check to see if a valid year is entered If txtYearBorn.DataChanged Or blnAddingNewRecord Then If Val(txtYearBorn) = 0 Then MsgBox "Invalid year" txtYearBorn.SetFocus GoTo CancelValidateAction End If End If blnValidationError = False Exit Sub CancelValidateAction: blnValidationError = True Action = vbDataActionCancel Save = False End If End Sub 8. Code the Click event procedure for the cmdCancelNew command button. If the user wants to cancel the adding of a new record, the CancelUpdate method should be used; then the UpdateControls Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 69
method is used to restore the controls on the form to the values of the current record (the record that was displayed on the form prior to the initiation of the AddNew operation). The code is shown below: Private Sub cmdCancelNew_Click() 'cancel the AddNew datAuthors.Recordset.CancelUpdate datAuthors.UpdateControls 'enable & disable the appropriate buttons cmdSaveRecord.Enabled = False cmdCancelNew.Enabled = False cmdMoveFirst.Enabled = True cmdMoveLast.Enabled = True cmdMovePrevious.Enabled = True cmdMoveNext.Enabled = True cmdDeleteRecord.Enabled = True cmdNewRecord.Enabled = True cmdUndo.Enabled = True blnAddingNewRecord = False End Sub
9. Save, run and test the program. Make sure you understand what the code is doing.
Pgina 70
If the criteria is expressed in a literal string, that string must be enclosed in double quotes. Typically, you must use VB's string-handling functions (especially the "&" for concatenation) to get the desired results.
Examples: datBooks.Recordset.FindFirst "ISBN = '123-456-789-0' " datMembers.Recordset.FindNext "Amount > 100" datMembers.Recordset.FindNext "DateOfBirth < #1/1/1950#" datBooks.Recordset.FindNext "Amount > " & txtAmount.Text datMembers.Recordset.FindNext "FirstName = '" & txtName.Text & "'" The next example assumes that the variable dtmBirthDay is of the Date data type: datMembers.Recordset.FindNext _ "DateOfBirth < #" & Format$(dtmBirthDay, "mm/dd/yyyy") & "#"
In this exercise, the user selects both the field name and the relational operator from combo boxes, then enters the search value in a textbox. The criteria for the Find methods are thus formed by statements similar to the following:
If cboField.Text = "Author" Then strQuote = "'" Else strQuote = "" txtCriteria.Text = Val(txtCriteria.Text) End If strCriteria = _ cboField.Text & " " & cboRelOp.Text & _ " " & strQuote & txtCriteria.Text & strQuote datAuthors.Recordset.FindFirst strCriteria Additional Notes: If the name of the field in the database table has spaces in its name, you must put square brackets around the field name, as in the following example: Pgina 71
datProducts.Recordset.FindFirst _ "ProductName = '" & Replace$(strSearchText, "'", "''") & "'" For example, if strSearchText contained "Chef Anton's Cajun Gumbo", the criteria in the above statement would evaluate to ProductName = 'Chef Anton''s Cajun Gumbo' and the double apostrophe in "Anton''s" would be correctly interpreted by the SQL parser as a single apostrophe. In this particular example, if the Replace function was NOT used (i.e., you simply coded "ProductName = '" & strSearchText & "'" for the criteria, the result would be ProductName = 'Chef Anton's Cajun Gumbo' which would result in an error: the SQL parser would interpret the criteria to be "Chef Anton" with extraneous characters ("s Cajun Gumbo") at the end. The Recordset has a NoMatch property. It is set to False to begin with. If you use a Find method and a record is not found, then the NoMatch property is set to True. You should use this property to determine whether or not a record was found. If a match is found, NoMatch will be set to True, and the found record becomes the current record. STEPS: 1. Copy the files from Exercise 6 into a new folder. Follow steps 2 through 4 to get your form to resemble the following:
Pgina 72
2. Add four command buttons to the form and set their properties as follows: Name cmdFind cmdFindAgain cmdCancelFind cmdGo Caption F&ind Find &Again Cance&l Find &Go! Enabled True False False False
3. Add two combo boxes and set their properties as follows (Note: you can set the List property of a listbox or combo box in the Properties box by typing in values and pressing Ctrl+Enter - this action is analogous to using the AddItem method in code). Name cboField Style 2 - Dropdown List Enabled False List Au_Id Author [Year Born] = > < >= <= Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 73
cboRelOp
2 - Dropdown List
False
<> Like
4. Add a textbox called txtCriteria and set its Enabled property to False.
5. Place the following statements in the Form_Load event:
Private Sub cboRelOp_Click() If cboRelOp.Enabled Then txtCriteria.SetFocus End If End Sub 7. To ensure that strBookmark always references the current record, place this statement strBookmark = datAuthors.Recordset.Bookmark at the end of each of these event procedures: cmdMoveFirst_Click Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 74
cmdMoveLast_Click cmdMoveNext_Click cmdMovePrevious_Click This is necessary to ensure that we have a pointer to a valid record available in case the Find method fails, which leaves the current record pointer undefined. 8. Place the following code in the cmdFind_Click event (disables navigating and updating controls and enables "Find" controls): blnFirstFind = True txtAuthor.Enabled = False txtYearBorn.Enabled = False cmdMoveFirst.Enabled = False cmdMoveLast.Enabled = False cmdMovePrevious.Enabled = False cmdMoveNext.Enabled = False cmdDeleteRecord.Enabled = False cmdNewRecord.Enabled = False cmdUndo.Enabled = False cmdSaveRecord.Enabled = False cmdCancelNew.Enabled = False cmdFind.Enabled = False cmdCancelFind.Enabled = True cmdGo.Enabled = True cboField.Enabled = True cboRelOp.Enabled = True txtCriteria.Enabled = True
Pgina 75
9. Place the following code in the cmdGo_Click event (prepares criteria argument for the Find methods, then performs the Find): Dim strQuote As String Dim strCriteria As String If cboField.Text = "Author" Then strQuote = "'" Else strQuote = "" txtCriteria = Val(txtCriteria) End If strCriteria = _ cboField.Text & " " & cboRelOp.Text & _ " " & strQuote & txtCriteria & strQuote
With datAuthors.Recordset If blnFirstFind Then blnFirstFind = False .FindFirst strCriteria Else .FindNext strCriteria End If If .NoMatch Then MsgBox "Data not found" .Bookmark = strBookmark cmdFind_Click Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 76
cmdFindAgain.Enabled = False Else cmdFindAgain.Enabled = True cboField.Enabled = False cboRelOp.Enabled = False txtCriteria.Enabled = False cmdGo.Enabled = False End If End With 10. In the cmdFindAgain_Click event, place the following line (performs the same actions as the cmdGo_Click event): cmdGo_Click 11. Place the following code in the cmdCancelFind_Click() event (enables the navigation and updating controls, disables the Find controls): txtAuthor.Enabled = True txtYearBorn.Enabled = True cmdMoveFirst.Enabled = True cmdMoveLast.Enabled = True cmdMovePrevious.Enabled = True cmdMoveNext.Enabled = True cmdDeleteRecord.Enabled = True cmdNewRecord.Enabled = True cmdUndo.Enabled = True cmdSaveRecord.Enabled = True cmdCancelNew.Enabled = True cmdFind.Enabled = True Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 77
cmdCancelFind.Enabled = False cmdGo.Enabled = False cboField.Enabled = False cboRelOp.Enabled = False txtCriteria.Enabled = False
12. Run the program and test the Find operations using different fields, relational operators, and search strings.
Pgina 78
STEPS: 1. Place two data controls on the form and set their properties as follows: Name datCategories datProducts DatabaseName ..\NWIND.MDB ..\NWIND.MDB RecordSource Categories (leave blank) Visible True False
Set the Caption property of datCategories to "Use Arrow Buttons to Navigate Records".
2. Place three textboxes and one OLE control on the form. Set the DataSource property for each of these four controls to datCategories. Set the DataField property for these controls to CategoryID, CategoryName, Description, and Picture respectively. Set the Enabled property of the Category ID textbox to False. For the Description text box, set its MultiLine property to True and set its ScrollBars property to 2 Vertical. Add appropriate label controls to accompany the textboxes, and group these four controls into a frame, as shown in the screen-shot. 3. If necessary, add the MSFlexGrid to your toolbox from the Components item of the Project menu. Place an MSFlexGrid control on your form, and set its properties as follows: Property AllowUserResizing DataSource FixedCols Value 1 flexResizeColumns datProducts 0
4.
datCategories.Refresh This will force the controls bound to datCategories to be populated sooner than they would otherwise, and will also trigger the Reposition event of the datCategories control. (The Reposition event of a data control occurs whenever a Move method is executed against that control.)
5.
datProducts.RecordSource _ = "SELECT * FROM Products " _ & "WHERE CategoryID = " & txtCatID datProducts.Refresh
Pgina 79
Once you have installed the DBGrid control, proceed with the steps of Exercise 9: STEPS: 1. 2. 3. 4. 5. Copy your files from Exercise 8 to a new folder and open the project. Delete the MSFlexGrid control. Out of Project | Components, include the Microsoft Data Bound Grid Control. Place a DBGrid on your form in the position previously occupied by the flex grid. Set the DBGrid's properties as follows: Property AllowAddNew AllowDelete AllowUpdate DataSource Value True True True datProducts
Pgina 80
6.
The code can remain as is. Save and run the program; experiment by using the grid to add, update, and delete records. While this application is certainly not bullet-proof, you'll find that built-in error-checking will prevent most "illegal" actions attempted by the user (such as trying to change the primary key, changing a foreign key to a non-existent value, or deleting a record with a related record in another table).
La extensin de la base de datos, puede ser .accdb o .mdb. Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 81
Antes de comenzar en VB para facilitar nuestras conexiones, crearemos un enlace a la base de datos usando un servicio de Windows. En la carpeta donde tengamos nuestro proyecto y nuestra base de datos, pulsamos botn derecho para crear un nuevo archivo. 1. Nos ubicamos en la carpeta donde tenemos nuestro proyecto 2. Pulsamos botn derecho para crear un nuevo archivo de texto
3. Le damos un nombre y cambiamos la extensin .txt a .udl. Nos preguntara si queremos sobreescribir la extensin y decimos que si.
Pgina 82
4. Ahora veremos que tenemos un nuevo archivo (icono diferente) y debemos indicarle los parmetros de conexin. Damos doble click para abrirlo. a) Primero debemos indicarle cual ser el proveedor o controlador de Base de datos a usar:
b) Pulsamos en Siguiente, e indicamos el origen de los datos. Esto es, el nombre de nuestro archivo de base de datos de Access:
Pgina 83
Si tuviera una contrasea (por estar protegido) aqu la teclearamos. Y si queremos saber si la conexin es correcta, pulsamos el botn de PROBAR CONEXIN. Por ultimo cerramos, pulsando el botn ACEPTAR.
Ahora en Visual Basic, primero debemos poner el control que pueda leer este formato. De la barra de componentes pulsamos el botn derecho y aparecer la caja de dialogo para seleccionarlo:
Pgina 84
Debemos de marcar la casilla que dice MICROSOFT ADO DATA CONTROL 6.0, con la ubicacin de MSADODC.OCX. Este control se instala cuando instalamos Office 2007 o posterior por lo que el control debe aparecer en nuestro directorio de Windows\System32. En caso de no aparecer (no tenemos office 2007 instalado) deberemos descargar los complementos necesarios MDAC del sitio de Microsoft en Internet. Ahora, debemos ver que aparece el control en nuestra barra de herramientas, por lo tanto lo arrastramos a nuestra forma:
Pgina 85
Siguiendo con la misma secuencia que para el CONTROL DATA, debemos poner las propiedades de conexin a este control. Para este control, es mas sencillo dar un click con el botn derecho dentro de el, para que aparezca un submen y seleccionar las propiedades:
Pgina 86
Donde en el origen de la conexin, debemos indicarle la ubicacin del archivo UDL que acabamos de crear. Tambien podramos usar el origen de datos de manera directo o usar la cadena de conexin requerida. Ahora debemos indicar adems el Origen de los registros:
Es importante seleccionar el tipo de comando como TABLE (ver imagen) y despus en la caja combo de abajo aparecern las tablas de nuestra base de datos. Seleccionamos cual es la que vamos a utilizar. Despues de ello, podemos dar en ACEPTAR. Ponemos nuestros controles de etiqueta y cajas de texto, segn corresponda a los campos de nuestra tabla. Y en las propiedades de la caja de texto, debemos indicar el origen de los datos y el campo que esta asociado: Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 87
Notemos que el DATASOURCE es el nombre del control que hemos puesto y configurado. Y el DATAFIELD, ser el campo asociado que queremos presentar. Grabamos nuestro proyecto, ejecutamos y veremos que ya comienza a mostrarnos la informacin de la tabla. Todo esto sin escribir una lnea de cdigo!.
Pgina 88
Siguiendo las mismas propiedades del Control Data, agrega el cdigo que corresponde a cada uno de los botones.
Pgina 89
Donde, la primer fila indican los nombres de los campos que vamos a utilizar. Ademas, los campos estn separados por coma (delimitados). Creamos un nuevo proyecto en Visual Basic, agregamos nuestro Control Data, pero en las propiedades debemos especificar lo siguiente:
Donde la conexin, la estamos indicando como TEXT, y seleccionamos nuestro archivo de texto en la siguiente propiedad. Ademas, debemos seleccionar nuestro RECORDSOURCE:
Y listo. Para el resto de nuestro formulario, pondremos las etiquetas, cajas de texto y las propiedades de DataSouce y DataField como corresponde.
Pgina 90
Vemos en la parte superior estarn los nombres de los campos, y en la parte inferior los registros que contiene. Una vez grabado nuestro archivo de Excel, dentro de Visual Basic, tomamos el control DATA y seleccionamos
Pgina 91
como hicimos con el tipo de texto, el formato de Excel 8.0, ubicamos nuestro archivo, incluimos el RecordSource y lo demas ya lo sabes. Prueba a practicarlo con este tipo de archivo. Veras que sigue las mismas instrucciones que los anteriores.
Pgina 92
Ahora usaremos Access para ingresar los datos y las imgenes. Abrimos Access, seleccionamos el archivo y comenzamos a capturar algunos registros. Luego tenemos que poner las imgenes. Para hacer esto: 1. 2. 3. 4. Nos posicionamos en el campo del registro deseado Pulsamos el botn derecho del raton y se abrir un submen En las opciones que aparecen, seleccionamos INSERTAR OBJETO Aparecera una caja de dialogo indicndonos si creamos un nuevo objeto o insertamos uno existente.
Seleccionamos la segunda opcin, y pulsamos EXAMINAR para ubicar al archivo deseado. NOTA: SE RECOMIENDA ALTAMENTE QUE LAS IMGENES SEAN BMP (.BMP) PARA QUE PUEDAN SER VISUALIZADAS CORRECTAMENTE, YA QUE OTROS FORMATOS PUEDEN NO ESTAR DEBIDAMENTE REGISTRADOS (.JPG o .GIF) A continuacin se pulsa ACEPTAR y nuestra imagen queda incrustada en el campo. No la veremos inmediatamente sino asi:
Ahora, ya tenemos una base de datos con imgenes incrustadas y podemos cerrar la aplicacin y regresar a Visual Basic. Nuestro proyecto queda mas o menos asi:
Pgina 93
Vemos que tenemos las etiquetas y cajas de texto correspondientes a los campos, asi como un control de imagen, botones de navegacin Y DOS CONTROLES DATA. Y agregamos tambin un control de COMMON DIALOG En el primer control data (Data1) lo dejaremos VACIO. Ya que lo usaremos mediante cdigo. En el segundo control data ponemos las propiedades necesarias para accesar a nuestra base de datos de Access como es conocido: 1. CONNECT 2. DATABASE 3. RECORDSOURCE Vinculamos las cajas de texto al control de datos DATA2. Y el control de imagen al control de datos DATA1. En la propiedad de DATAFIELD de la imagen pondremos el nombre del campo que tiene nuestra tabla (foto) aunque nos aparezca un error. Esto es asi, porque no esta definido todava el control DATA1. Ahora pondremos el cdigo para funcionar. Comenzamos con el FORM_LOAD: Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 94
Private Sub Form_Load() Dim basedatos As String basedatos = App.Path 'si no tiene la bara final la aade If Right$(basedatos, 1) <> "\" Then basedatos = basedatos & "\" basedatos = basedatos & "inventarioOLE.mdb" ' Le indica al Data la base de datos Data1.DatabaseName = basedatos 'Fuente de los registros para el control data Data1.RecordSource = "Select foto FROM Productos" 'Refresca el control Data1.Refresh End Sub En este espacio (que es cuando se carga la forma) definimos una variable para conocer donde se encuentra nuestra base de datos y con cdigo, asignamos las propiedades. Notemos que la propiedad RECORDSOURCE contiene una sentencia SQL especficamente para cargar las fotos (Y NINGUN OTRO CAMPO) de nuestra tabla. Al final se hace una actualizacin del control. Ahora pondremos el cdigo para los botones de Siguiente y Previo: Private Sub cmdNext_Click() Data1.Recordset.MoveNext Data2.Recordset.MoveNext If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast Data2.Recordset.MoveLast End If End Sub Private Sub cmdPrev_Click() Data1.Recordset.MovePrevious Data2.Recordset.MovePrevious If Data1.Recordset.BOF = True Then Data1.Recordset.MoveFirst Data2.Recordset.MoveFirst End If End Sub
Pgina 95
Aqu observamos que necesitamos poner el movimiento del puntero en los dos controles: uno para nuestros registros y otro para la imagen. Por ultimo, si queremos agregar una imagen a nuestra base de datos directamente desde visual basic, en el botn de comando que creamos pondremos lo siguiente: Private Sub cmdAddImagen_Click() CommonDialog1.DialogTitle = " Seleccionar imagen para grabar en campo OLE " CommonDialog1.ShowOpen If CommonDialog1.FileName = "" Then Exit Sub 'Crea un nuevo registro con el mtodo AddNew 'Data1.Recordset.AddNew Data1.Recordset.Edit
' Carga el grfico seleccionado en el control Picture y al estar enlazado _ se almacena e el campo imagenes Picture1.Picture = LoadPicture(CommonDialog1.FileName) 'Actualiza el recordset Data1.Recordset.Update 'Refresca el control Data 'Data1.Refresh End Sub Aqu es donde usamos el control Common Dialog para abrir la caja de dialogo y ubicar la imagen, obtener su nombre, y a) agregar un nuevo registro o b) editar el registro. Mostramos la imagen en pantalla y como nuestro campo esta vinculado previamente, simplemente actualizamos con RECORDSET.UPDATE.
Pgina 96
La diferencia con el ejercicio anterior, es que las imgenes no se guardaran en la base de datos, sino que estarn separadas como archivos dentro de la carpeta del proyecto. Aunque tambin pueden estar en una subcarpeta donde la referencia de la imagen es igual al campo de cdigo. Asi por ejemplo: Campo Codigo A100 Nombre de la Imagen A100.jpg Imagen
Pgina 97
A200
A200.jpg
A300
A300.jpg
Enlazaremos estas imgenes con su correspondiente registro de la base de datos. Vamos a comenzar. En primer lugar tendremos que tener nuestra base de datos. Esta fue creada usando el Asistente de Visual Basic como hemos hecho. La llamamos INVENTARIO. Y dentro de esta esta una tabla llamada PRODUCTOS. Que contiene los siguientes campos: Campo Codigo Descripcion FechaEnt Cantidad Depto Foto1 Foto2 Notas Tipo Text Text Date / Time Integer Text Binary Text Memo Tamao 15 50 8 2 50 0 50 0
Y aunque tenemos 2 campos para fotos, no utilizaremos ninguna de ellas. En el primer campo de FOTO1, es del tipo binario (para almacenar la foto dentro de la base de datos que no haremos), y el segundo FOTO2 como tipo texto por si deseamos grabar la ruta de la foto y usarla en la presentacin. Tenemos que tener algunos datos de prueba, asi como algunas imgenes de los productos que queremos presentar.
Pgina 98
A continuacin, debemos crear nuestra forma y debemos agregar los siguientes elementos:
Tenemos nuestras etiquetas y cajas de texto segn los campos que contenga la tabla. Tambien debemos poner un control de IMAGEN en la parte donde queramos y su propiedad STRETCH como TRUE. Agregaremos los botones correspondientes para navegar por los registros y para agregar, guardar y borar los datos. El control data inferior, debe contener la conexin a nuestra base de datos de Access, y los controles de texto deben estar enlazados a los campos correspondientes. Comenzemos con nuestro botn SIGUIENTE: Private Sub cmdSig_Click() If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast End If Data1.Recordset.MoveNext If Len(Text1.Text) = 0 Then fotoshow = "no_data.jpg" Else fotoshow = Text1.Text + ".jpg" End If Si el registro de datos es el final entonces Mueve el puntero hasta el ultimo registro Fin si Mueve el puntero al siguiente registro Si el campo cdigo esta vacio Entonces Fotoshow igual a imagen vacia Si no Fotoshow igual al cdigo + extensin jpg Fin Si
' Checar si hay o no hay imagen. Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 99
Como vemos, todo el truco esta en identificar la imagen del producto con su correspondiente cdigo y mostrarla en consecuencia. Por lo que cada producto deber ser identificado correctamente. Los botones de previo, inicio y final, contienen el mismo tipo de cdigo para prevenir errores. Los botones restantes contienen el cdigo visto anteriormente. El cdigo completo del programa queda asi: Private Sub cmdAgregar_Click() Data1.Recordset.AddNew cmdGuardar.Enabled = True cmdInicio.Enabled = False cmdFin.Enabled = False cmdPrevio.Enabled = False cmdSig.Enabled = False cmdEliminar.Enabled = False cmdAgregar.Enabled = False End Sub Private Sub cmdEliminar_Click() On Error GoTo Delete_Error If MsgBox("Seguro quiere eliminar este registro?", _ vbQuestion + vbYesNo + vbDefaultButton2, _ "Confirme") = vbNo Then Exit Sub End If 'delete the current record Data1.Recordset.Delete 'move to a valid record cmdSig_Click Exit Sub Delete_Error: ' This error will occur if you attempt to delete an author that is related to ' another table in the biblio.mdb database ... MsgBox "Este registro no puede ser eliminado. Error code = " _ & Err.Number & vbCrLf & Err.Description, _ vbCritical, "No se puede eliminar" End Sub Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 100
Private Sub cmdFin_Click() Data1.Recordset.MoveLast If Len(Text1.Text) = 0 Then fotoshow = "no_data.jpg" Else fotoshow = Text1.Text + ".jpg" End If Image1.Picture = LoadPicture(fotoshow) End Sub Private Sub cmdGuardar_Click() Data1.Recordset.Update cmdGuardar.Enabled = False cmdInicio.Enabled = True cmdFin.Enabled = True cmdPrevio.Enabled = True cmdSig.Enabled = True cmdEliminar.Enabled = True cmdAgregar.Enabled = True End Sub Private Sub cmdInicio_Click() Data1.Recordset.MoveFirst If Len(Text1.Text) = 0 Then fotoshow = "no_data.jpg" Else fotoshow = Text1.Text + ".jpg" End If Image1.Picture = LoadPicture(fotoshow) End Sub Private Sub cmdPrevio_Click() If Data1.Recordset.BOF = True Then Data1.Recordset.MoveFirst End If Data1.Recordset.MovePrevious If Len(Text1.Text) = 0 Then fotoshow = "no_data.jpg" Else fotoshow = Text1.Text + ".jpg" End If Image1.Picture = LoadPicture(fotoshow) End Sub Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 101
Private Sub cmdSig_Click() If Data1.Recordset.EOF = True Then Data1.Recordset.MoveLast End If Data1.Recordset.MoveNext If Len(Text1.Text) = 0 Then fotoshow = "no_data.jpg" Else fotoshow = Text1.Text + ".jpg" End If ' Checar si hay o no hay imagen. Image1.Picture = LoadPicture(fotoshow) End Sub
Pgina 102
4. En la caja de dialogo que aparece, ir primero a la pestaa CONTROLADORES. De la caja de lista que se muestra, recorrerla hasta encontrar (o no) el Driver de MySQL (como se ve en la imagen):
Pgina 103
Si no estuviera, debemos descargarlo e instalarlo en la computadora. Suponemos que nuestro servidor de MySQL esta en ejecucin, y que tenemos una base de datos creada en el a manera de prueba. Para este ejercicio, se creo una base de datos llamada TEST, con una Tabla llamada CONTACTOS, que contiene los campos: a) ID b) Nombre c) Apellido d) Direccion Y a la cual le agregamos unos registros de prueba. El siguiente paso es crear una conexin permanente a nuestra base de datos desde el entorno de la herramienta administrativa. (Por eso, este mtodo no es recomendable para aplicaciones profesionales que se tengan que instalar en varias computadoras, ya que tendramos que crear esta conexcion en cada una de las maquinas donde se ejecutara). Dentro del administrador de orgenes de datos ODBC (del panel de control, herramientas administrativas), seleccionamos primero la pestaa de DNS de usuario, y a continuacin pulsamos el botn de AGREGAR
Aparecera una segunda ventana, que nos indicara cual ser el controlador que usaremos (en este caso el de MySQL):
Pgina 104
Al pulsar finalizar, aparece inmediatamente la caja de dialogo del Conector ODBC Mysql:
Pgina 105
Donde pondremos un nombre para nuestra conexin en Data Source Name (este es un nombre con lo cual nosotros identificamos la conexin y ser ausada por Visual Basic mas adelante). Una descripcin de la conexin que es opcional. Y luego la parte mas importante, el nombre del servidor o su direccin IP (caso de que este en red o en internet). Como ejemplo tenemos: a) localhost, b) 127.0.0.1, c) 192.168.1.74 El numero de puerto donde esta escuchando nuestro servidor.Generalmente se queda con el mismo que identifica. El nombre del usuario que tiene acceso a la base de datos y su password (contrasea) Despues, la base de datos a la cual nos queremos conectar, que aparecer de la caja combo. Aunque hay un botn que dice PROBAR CONEXIN, al momento en que aparezcan las bases de datos en la caja combo significa que si hubo una conexin exitosa con el servidor MySQL. Cuando hayamos terminado le damos ACEPTAR. Y veremos que la conexin queda en la primer ventana:
Ahora si,ya podemos ir a nuestro proyecto de Visual Basic para crear nuestra aplicacin. Debemos crear nuestra forma con los controles ya conocidos: Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 106
Aqu vemos que tenemos nuestras etiquetas, cajas de texto y un control ADO. Recordemos que este control
debe ponerse a la caja de herramientas, agregndolo desde complementos como Data Control 6.0 (forma parte de Office 2007).
Microsoft ADO
Pulsamos el botn derecho del raton para que aparezca el submen del control y nos vamos a la opcin de PROPIEDADES. Aparecera la caja:
Pgina 107
Donde seleccionamos la conexin que creamos previamente y aparece en la caja combo del origen de datos ODBC. Despues, debemos ir a la pestaa de ORIGEN DE REGISTROS y seleccionar la tabla con la cual trabajaremos:
Pulsamos aceptar, y ya solo nos queda relacionar nuestras cajas de texto con el control de datos y con el campo dado como hicimos en todos los ejercicios anteriores.
Pgina 108
Vemos que tenemos nuestras etiquetas, cajas de texto y unos botones. Tambien tenemos el control de datos OLE DB (Microsoft ADO Data Control) que estar invisible al usuario. Aqu, debemos de poner nicamente cdigo. Ni siquiera las cajas de texto tendrn en sus propiedades el enlace con ningn control. Comenzamos poniendo el cdigo en la seccin general de la forma: Dim bd As ADODB.Connection Dim rs As ADODB.Recordset Esto me prepara dos variables que se usaran como objetos para usar las conexiones. Despues, en el FORM_LOAD(), pondremos: Set bd = New ADODB.Connection bd.ConnectionString = "Driver={MySQL ODBC 5.1 Driver};SERVER=localhost;User=root;DATABASE=test;PORT=3306;Option=3;" bd.Open Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 109
Aqu indicamos que se cree un nuevo objeto ADODB (no visible), que contenga la cadena de conexin: Driver={MySQL ODBC 5.1 Driver};SERVER=localhost;User=root;DATABASE=test;PORT=3306;Option=3; Y que finalmente se abra dicha conexin. Como vemos, tenemos que indicar el controlador de la base de datos a usar, el nombre del servidor (o ip), el usuario, su clave de acceso (si tiene), la base de datos, el puerto (opcional) y la opcin 3. A continuacin, pondremos el cdigo para el botn de CHECK que es quien inicializa los valores del programa: Dim sql As String Set rs = New ADODB.Recordset sql = "Select * from contactos" rs.Open sql, bd, adOpenDynamic, adLockBatchOptimistic Text1.Text = rs!nombre Text2.Text = rs!apellido Lo que hacemos es que preparamos una variable de cadena que contendr las instrucciones SQL que necesitamos para mostrar los datos. Creamos un nuevo objeto de registro de datos no visible, y abrimos dicho registro con la instruccin rs.OPEN. Finalmente, asignamos a nuestras cajas de texto, los valores de los campos. Por ultimo, para que podamos navegar como lo hemos estado haciendo, creamos dos botones de siguiente y previo y este es su cdigo: Private Sub cmdPrevio_Click() rs.MovePrevious If rs.BOF = True Then rs.MoveFirst End If Text1.Text = rs!nombre Text2.Text = rs!apellido End Sub Private Sub cmdSiguiente_Click() rs.MoveNext If rs.EOF = True Then rs.MoveLast End If Text1.Text = rs!nombre Text2.Text = rs!apellido End Sub Que no se diferencia mucho del cdigo visual que hemos visto en ejercicios anteriores. Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 110
Ejercicio 39 - VideoLeccion 11: Introduccin a Visual Basic 6.0 Con Base de Datos
En este ejercicio haremos un repaso de lo aprendido hasta el momento. Ve el video indicando y realiza lo siguiente: El video se divide en 2 partes: la primera de conceptos y la segunda de aplicacin. Responde brevemente a lo siguiente: Pregunta Qu es una base de datos? Respuesta
Menciona las razones por las que usar una Base de Datos:
Parte II Para este ejercicio deberas tener la base de datos NWIND que viene con Visual Basic, de preferencia en una de las carpetas que indica el video. 1. Crear un nuevo proyecto, y en una nueva forma, grabar y darle nombre a la forma. 2. Crear dos modulos .BAS para poner nuestro cdigo. 3. En un modulo declararemos nuestras variables globales a. Global Base as New 4. Como no tenemos una referencia a ADO, debemos crearla primero. Nos iremos al men de PROYECTO. REFERENCIAS, y en la caja de dialogo veremos que es muy semenjante a la ventana de COMPLEMENTOS, de ah seleccionamos el control OLE DB ACTIVEX DATA OBJECTS 2.1 o superior 5. Regresamos a nuestro modulo de declaracin y completamos la sentencia: a. Global Base as New ADODB.Connection b. Global RsUsuarios As New ADODB.Recordset 6. Ahora en nuestro modulo de Sentencias creamos una funcin principal que reemplace a la estndar de VB. Y escribimos: a. Sub Main() i. With base Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 111
1. .CursorLocation = adUserClient 2. .Open 3. LoginForm.Show ii. End With b. End Sub 7. Nos falta conocer la cadena de conexin, para lo cual debemos agregar el control ADO que hemos usado previamente, insertndolo desde la caja de componentes. a. Una vez puesto en la forma, abrimos la caja de propiedades y seleccionamos la opcin de generar la cadena de conexin. b. Seleccionamos el proveedor OLE 4.0 y ubicamos donde esta nuestro archivo de base de datos de Access. c. Probamos la conexin d. Damos aceptar y veremos entonces que se nos ha generado la cadena de conexin que pondremos en el inciso 2 del paso 6. e. Modificamos un poco la cadena de conexin para eliminar las referencia de ubicacin absoluta y en su lugar usaremos las instrucciones de APP.PATH para ubicarla de manera relativa en nuestro proyecto. 8. Ahora, necesitamos cambiar las propiedades del proyecto y seleccionamos la opcin de PROPIEDADES del men PROYECTO para que en lugar de que se cargue la forma login, se ejecute la subrutina SUB MAIN() que hemos creado. Ahora creamos el diseo del formulario para crear una ventana de login. Debemos indicar las etiquetas, cajas de texto, botn de comando y las propiedades que necesitemos segn nuestro diseo. Una vez creada la interfaz, tenemos que agregar el cdigo para el manejo de registros. Asi que debemos abrir nuevamente el modulo donde tenemos la funcin MAIN. Ah creamos una nueva funcin que llamaremos USUARIOS. El cdigo es: Sub usuarios() With RsUsuarios If .state = 1 then .close .Open Select * from usuarios, Base, adOpenStatic, adLockOptimistic End With End Sub Grabamos nuestro modulo y de regreso a nuestro formulario, en el evento LOAD de la forma, debemos llamar a esta funcin: Private Sub Form_Load() Usuarios End Sub El resto del cdigo es: Private cmdCerrar_Click() Unload me Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 112
End Sub Private cmdOk_Click() If txtuser.text = then msgbox Ingrese nombre de Usuario, vbInformation, Aviso: txtUser.SetFocus: Exit Sub If txtuser.pass = then msgbox Ingrese clave de Usuario, vbInformation, Aviso: txtpass.SetFocus: Exit With RsUsuarios .Requery .Find id= & trim(txtuser.text) & If .eof then Msgbox Usuario incorrecto, vbInformation, Aviso Exit sub Else If clave=trim(txtpass.text) then enviar un formulario NewUserForm.show Else Msgbox Clave incorrecta,vbInformation, Aviso Exit Sub End if End With End Sub
Pgina 113
Le decimos que seleccione de la tabla Authors todos los registros por eso usamos el asterisco (*) y que ordene el campo Author en forma ascendente, esto podra ser DESC o sea descendente. As vemos mostrarse en la grilla el listado de autores ordenado alfabticamente.
PRACTICAS 6 10
1.- Hacer una aplicacin que permite registrar en una base de datos los datos de los empleados de una empresa. Los campos son: Nombre, Apellido, Edad, Cargo, Sueldo, Direccin, Telfono y Fecha de contrato. El programa debe permitir al usuario obtener distintos tipos de reporte, como por ejemplo: los empleados que ganen ms de 10,000 pesos, los empleados mayores de 50 aos de edad, etc. 2.- Hacer una aplicacin que permita gestionar un almacn de un supermercado.
Pgina 114
3.- Hacer una aplicacin que permita gestionar un sistema de inscripcin de una universidad o un colegio. 4.- Crear un pequeo punto de venta. Esto es un sistema que permita vender artculos, imprimir facturas y generar reportes de ventas. 5.- Crear una pequea aplicacin que permita gestionar el almacn de una farmacia.
Este ejercicio nos permite ordenar los registros de una tabla en forma ascendente o descendente. Los registros se despliegan en una grilla, y tambin podemos seleccionar la cantidad de registros que queremos mostrar. Obviamente necesitaremos conexin con una base de datos, para lo que usaremos un control data. El cdigo es:
Dim tipo As Byte Dim Orden As String Private Sub Command1_Click() Dim N As Long DBGrid1.Visible = True N = Text1.Text 'Para entrar el nmero de registros. Select Case tipo Case 1 Orden = "DESC" Case 2 Orden = "ASC" End Select
Pgina 115
'Selecciona a partir de los ltimos. Data1.RecordSource = "SELECT TOP " & N & " * " & _ "FROM Empleados " & _ "ORDER BY IdEmpleado " & Orden Data1.Refresh End Sub Private Sub Command2_Click() End End Sub Private Sub Form_Load() N=3 Text1.Text = 3 Oden = "ASC" optAscendente_Click End Sub Private Sub optAscendente_Click() If optAscendente.Value Then tipo = 1 DBGrid1.Visible = False End Sub Private Sub Option1_Click() End Sub Private Sub optDescendente_Click() If optDescendente.Value Then tipo = 2 DBGrid1.Visible = False End Sub Private Sub Text1_Change() DBGrid1.Visible = False End Sub Private Sub Text1_Click() Text1.SelStart = 0 Text1.SelLength = Len(Text1.Text) End Sub Private Sub Text1_LostFocus() If IsNumeric(Text1.Text) Then If ((Text1.Text) >= 1 And (Text1.Text) <= 9) Then N = Text1.Text Else MsgBox "El nmero de registros debe estar entre 1 y 9", vbInformation Text1.SetFocus End If Else MsgBox "Entre un valor numrico entre 1 y 9" Text1.SetFocus End If End Sub
Pgina 116
Tenemos 6 controles Text para desplegar los datos y cuatro controles data que conectan con distintas tablas: El Data1 con en su propiedad RecordSource con Tiles, la Data2 con Publishers, la data3 con Title Author y la Data4 con Authors. Y los controles de texto: Text1 (Ttulo) en su propiedad DataSource con la data1, Datafield con Title; el Text2 (Editor) con la Data2 y el Datafield: Name; el Text3 (Editor) con la Data1 y el datafield: Year publisher; el Text4 (Autor) con la Data4 y el datafield Author; el Text5 con la Data1 y el datafield: Subject y el Text6 (Comentarios) con la Data1 y el datafield Comments. El codigo correspondiente es:
Option Explicit 'El RecordType es Table Private Sub Data1_Reposition() 'Con Seek busca los campos correspondientes.Si estos campos estn vacis aparecer el asterisco. Data2.Recordset.Seek "=", Data1.Recordset.Fields("PubID") If Data2.Recordset.NoMatch Then Text4.Text = "***"
Pgina 117
Data3.Recordset.Seek "=", Data1.Recordset.Fields("ISBN") If Data3.Recordset.NoMatch Then Text2.Text = "***" Exit Sub Data4.Recordset.Seek "=", Data3.Recordset.Fields("AU_ID") End Sub Private Sub Form_Load() 'refresca las tablas o sea las actualiza Data2.Refresh Data3.Refresh Data4.Refresh 'establece cuales son las llaves para indexarlas. Data2.Recordset.Index = "PrimaryKey" Data3.Recordset.Index = "ISBN" Data4.Recordset.Index = "PrimaryKey" End Sub
Este ejercicio usa un control DBGrid y dos Control Data uno que abre la tabla que se muestra en la grilla y otro que ejecuta la suma. El control DBGrid, como vimos en el ejemplo anterior debe estar relacionado a la tabla que usamos. El cdigo en el evento Load es el siguiente:
Private Sub Form_Load() 'La grilla debe estar conectada a la data 1 Data1.DatabaseName = App.Path & "\DBase.mdb" Data1.RecordSource = "Select * from DBorder " Data2.DatabaseName = App.Path & "\DBase.mdb" Data2.RecordSource = "SELECT sum(OrderAmt) As total from DBOrder " Data2.Refresh Text1.Text = Data2.Recordset!total End Sub
Una vez cargado el programa ejecuta las consultas SQL y nos muestra la suma total del precio de los productos. Suma todos los campos de la tabla DBOrder y los carga en total, luego le damos salida a este valor en un control TextBox.
Cuaderno de Trabajo Visual Basic con Base de Datos Pgina 118
Este ejercicio nos muestra el uso de tres funciones: Mnima, Mxima y Media. El formulario tiene cuatro controles de Texto donde muestra: en el primero la cantidad de registros (Count ofAuthor) en el segundo la fecha menor de nacimiento de los Autores (MinofYear Born), el tercero la fecha mayor de nacimiento de los Autores (Maxofyear Born) y el cuarto la media de los aos de nacimiento de los Aurores (AvgofYear Born). Cada caja de texto de comunica con el control Data1 y cada Datafield se refiere a : CountofAutor, MinofYear, Maxofyear y AvgofYear. Y la consulta SQL esta hecha directamente en la propiedad RecordSource del control Data1, cuya sintxis es:
SELECT Count(*) AS CountofAuthor, Avg([Year Born]) AS [AvgogYear Born], Min ([Year Born])AS [MinofYear], Max ([Year Born]) AS [Maxofyear] FROM Authors
Esto selecciona todos los registros, volcando el valor a CountofAuthor, luego la media de los aos de nacimiento de los autores, guardndola en el alias AvgogAuthor como variable y as con los otros valores. No olviden cambiar el camino o Path del ejercicio original al cargarlo en sus mquinas. La base usada es Biblio.mdb.
Pgina 119
Como vemos este formulario est compuesto por: dos controles Text, un MSFlexGid, dos botones, uno que busca y selecciona la base de datos y otro para ejecutar el cdigo SQL de la caja de texto2, un control data que vincula a una base de datos y un commonddialog que nos permite seleccionar la base a consultar, el camino de la base seleccionada se muestra en el Text1. El cdigo es el siguiente:
Option Explicit Private Sub Command1_Click() On Error GoTo nobase CommonDialog1.CancelError = True CommonDialog1.Filter = "Database|*.mdb" CommonDialog1.ShowOpen Data1.DatabaseName = CommonDialog1.FileNameaqui se enlaza a una 'Base de Datos. Data1.Refresh If Err = 0 Then Text1.Text = CommonDialog1.FileName 'aqui se muestra el camino de la 'base de datos. Else MsgBox Err.Description End If nobase: On Error GoTo 0 End Sub Private Sub Command2_Click() On Error GoTo sqlerror Data1.RecordSource = Text2 'aqui se vuelca la consulta SQL Data1.Refresh Exit Sub sqlerror: MsgBox Err.Description End Sub
Pgina 120
Uso de las funciones de Visual basic en una instruccin SELECT: Al cargar cualquier base de datos mediante el Jet en un aaplicacin Visual Basic, es posible utilizar cualquier funcin propia del entorno como parte de una instruccin SQL. Ejemplo 1: Vista con una columna que muestra los tres primeros caracteres de una columna de la tabla base usando la funcin Left. SELECT Left(Name,3), Name FROM Authors Ejemplo 2: Combinar varias columnas en una sola dentro de una vista: SELECT Name AS Nombre, City & ' , ' & StateProv & ' ' & Zip AS Domicilio FROM Publishers Ejemplo 3: Tambin pueden usarse las funciones de Visual basic como parte de la clasula WHERE, este ejemplo devuelve aquellos registros que tienen como segundo caracter de la columna Name la letra 'a': SELECT Name FROM Publishers WHERE Mid$(Name,2,1) = "a" Las desventajas son la incompatibilidad con otras bases de datos como SQL Server, que no ejecuta las funciones de Visual Basic y que la velocidad del acceso al ejecutarse la consulta disminuye. Si queremos ganar en Portabilidad y Velocidad mejor no usarlas.
Leccin 18:Incorporando proceso de Facturacin Leccin 19: Programando proceso de facturacin Leccin 20: Consultas simples, con parmetros y detalladas
Las Bases tradicionales como FoxPro, DBase, Paradox se orientan a Registros, las operaciones que tienen que ver con la base se realizan registro por registro (bucle). En cambio Access y otras que soportan SQL estn orientadas a conjuntos de datos, se hacen con sonsultas SQL. Las Bases de Datos que trabajan con SQL pueden ejecutar operaciones en tablas enteras con una sola instruccin. El objeto Recordset de tipo Table es adecuado para ejecutar procesamientos orientados a registros. Los tipos Dynaset y Snapshot lo son para procesamientos orientados a conjuntos de datos. El primero es dinmico, permite lectura y escritura, el segundo slo lectura. Al crear el Dynaset por cdigo en lugar de un control data debemos crear dos objetos: el DataBase y el RecordSet. Para esto nada mejor que un ejercicio.
En este ejercicio vamos a ver como creamos la DataBase y el RecordSet y contamos los registros que contiene una de las Tablas. Tambin vamos a usar la propiedad Filter para crear un nuevo RecordSet. El cdigo es:
Option Explicit Private Sub Form_Load() 'Lo primero que debo hacer es incorporar la referencia Microsoft DAO 3.51. 'creacin de los objetos Database y recordset para manejar 'un conjunto de datos de tipo Dynaset Dim db As Database 'este es el objeto Database Dim rs As Recordset ' este es el objeto recordset 'creamos dos variables locales Dim strNombreDB As String Dim strNombreRS As String 'creamos una variable para contar los registros Dim intRegs As Integer 'inicializamos las variables strNombreDB = App.Path & "\books6.mdb" strNombreRS = "Titles" 'crea los objetos 'abre la base de datos y hace que el objeto db apunte a ella Set db = DBEngine.OpenDatabase(strNombreDB) 'genera el Dynaset a partir de la tabla Titles Set rs = db.OpenRecordset(strNombreRS, dbOpenDynaset) 'cuenta los registros en el conjunto de datos With rs
Pgina 123
.MoveLast ' se mueve al final del registro intRegs = .RecordCount ' obtiene la cantidad de registros End With 'los vuelca en un msgbox MsgBox strNombreRS & ": " & intRegs, vbInformation, "Total de Registros en el conjunto de Datos" 'los imprimo en el formulario Print strNombreRS & ": " & intRegs & " Registros" Print "____________________________________" 'Uso de la propiedad Filter y el Mtodo OpenRecordset 'para obtener un segundo conjunto de datos. Dim strFiltro As String Dim rs2 As Recordset strFiltro = "YearPub > 1990" 'crea el conjunto filtrado. 'Pruebe a cambiar el ao a 1980 o 1993. rs.Filter = strFiltro Set rs2 = rs.OpenRecordset With rs2 .MoveLast ' moverse al final del conjunto de datos intRegs = .RecordCount 'obtenga el total End With MsgBox strFiltro & ": " & intRegs, vbInformation, "Total de registros en el segundo conjunto de datos" 'lo imprime en el formulario Print strNombreRS & ": " & strFiltro & ": " & intRegs & " Registros" End Sub
En esta ejercitacin vamos a trabajar con algunos ejemplos de validacin de campos. en este primer ejercicio vamos a validar filtrando el teclado. O sea podrn ingresar slo nmeros del 0 al 9, en el primer cuadro de texto. Y letras en el segundo cuadro de texto. Y ambos en el tercero. El cdigo es:
Private Sub Text1_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789" 'habilita solo nmeros
Pgina 124
If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' sino es vlido lo vuelve nulo End If End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) ' cambia a maysculas. End Sub Private Sub Text3_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" KeyAscii = Asc(UCase(Chr(KeyAscii))) If KeyAscii > 26 Then ' si no es un codigo de control If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 End If End If End Sub
En este ejercicio vamos a agregar el uso de un control nuevo que nos facilita la validacin de campos. El MaskedEdit, que debemos traer desde componentes. Este control funciona como el cuadro de texto pero con algunas propiedades extras. Importante! Debe establecer la propiedad PromptIncluede como False cuando lo utilice como control enlazado. De lo contrario puede dar Error. En la propiedad Mask: le determinamos un formato para nmero telefnico: (##) ### - ####. Y en la propiedad Format seleccionamos para Importe: $#,##0.00;($#.##0.00). El cdigo es:
Private Sub Form_Load() 'Carga la lista desplegable With Combo1
Pgina 125
.AddItem "Minorista" .AddItem "Mayorista" .AddItem "Distribuidor" .AddItem "Otro" .ListIndex = 0 ' estalece de forma predeterminada el primer elemento. End With End Sub
Aqu vamos a validar por cdigo un campo requerido y un rango de mayor y menor, pero vamos a hacer la validacin a travs de el Click de un Botn.O sea vamos a hacer la validacin a nivel de formulario y no de campos. Para esto vamos a crear una funcin validoform que cuando chequee que est todo correcto devuelva un valor adecuado, aceptando la informacin del formulario, de lo contrario devuelva un mensaje de error. El cdigo es:
Option Explicit Private Sub Command1_Click() Dim strMsj As String strMsj = validoform() If strMsj = "" Then Unload Me Else MsgBox strMsj, vbExclamation, "Error de validacin" End If End Sub Private Sub Form_Load() 'Carga la lista desplegable With Combocliente .AddItem "Minorista" .AddItem "Mayorista"
Pgina 126
.AddItem "Distribuidor" .AddItem "Otro" .ListIndex = 0 ' estalece de forma predeterminada el primer elemento. End With End Sub Public Function validoform() As String 'valida el formulario y devuelve un mensaje de error si no es vlido 'variables para la validacin del rango Dim intSup As Integer Dim intInf As Integer Dim strMsjSupInf As String 'variables para la validacin de la longitud Dim intMinLong As Integer Dim intMaxLong As Integer Dim strMsjMinMax As String Dim strEnviarMsj As String 'valores del rango intSup = 100 intInf = 0 strMsjSupInf = "El campo Superior/Inferior debe contener un valor entre " & CStr(intInf) & " y " & CStr(intSup) & "." 'valores de la longitud intMinLong = 3 intMaxLong = 10 strMsjMinMax = "El campo Maysculas debe tener entre " & CStr(intMinLong) & " y " & CStr(intMaxLong) & " caracteres." strEnviarMsj = "" 'verifique el campo Superior/Inferior With txtsupeinf If Val(.Text) < intInf Or Val(.Text) > intSup Then strEnviarMsj = strEnviarMsj & vbCrLf & strMsjSupInf & vbCrLf .SetFocus End If End With 'verifique el campo maysculas With txtletrasmayusculas If Len(.Text) < intMinLong Or Len(.Text) > intMaxLong Then strEnviarMsj = strEnviarMsj & vbCrLf & strMsjMinMax & vbCrLf .SetFocus End If End With validoform = strEnviarMsj 'valido el campo dinero If MaskEddinero.Text <> "" Then 'Tiene datos? If Not IsNumeric(MaskEddinero.Text) Then ' son numericos? strEnviarMsj = strEnviarMsj & vbCrLf & "El campo dinero debe tener un valor numrico." & vbCrLf MaskEddinero .SetFocus End If End If 'verifico el campo combinado With txtcombinado If Len(Trim(.Text)) = 0 Then strEnviarMsj = strEnviarMsj & vbCrLf & "El campo combinado es requerido." & vbCrLf .SetFocus End If End With validoform = strEnviarMsj End Function Private Sub txtcombinado_KeyPress(KeyAscii As Integer) Dim strvalido As String
Pgina 127
strvalido = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" KeyAscii = Asc(UCase(Chr(KeyAscii))) If KeyAscii > 26 Then ' si no es un codigo de control If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 End If End If End Sub Private Sub txtletrasmayusculas_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) ' cambia a maysculas. End Sub Private Sub txtnumeros_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789" 'habilita solo nmeros If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' sino es vlido lo vuelve nulo End If End Sub
Pgina 128
Primero veremos la aplicacin Crystal Reports, vamos a Inicio, programas y dentro de Microsoft Visual Basic selecionamos Crystal reports, una vez dentro de la aplicacin, elegimos File o Archivo, nuevo report o nuevo Informe y cuando nos pregunte qu Base de datos vamos a utilizar le decimos Biblio.mdb. Entonces veremos una pantalla similar a esta:
La pantalla en tiempo de diseo la tenemos dividida en el encabezado, los detalles donde insertamos los campos de la tabla con la que vamos a trabajar y el pie de pgina. Investiguen y prueben las distintas opciones haciendo uso de la Ayuda. Luego que seleccionamos los campos Au_ID y Author grabamos el archivo y cerramos la aplicacin. Luego abrimos Visual Basic y creamos la siguiente aplicacin:
Pgina 129
El formulario contiene un Control data cuya propiedad DatabaseName es Biblio.mdb y la propiedad RecordSource: la tabla Authors. Luego tenemos una DBGrid trada de componentes cuya propiedad DataSource es :DataControl. Un Crystal Report, tambin trado de componentes, cuya propiedad ReportFileName es el informe que creamos recientemente,, en la aplicacin Crystal Reports: aut.rpt. Luego agregamos una caja de texto para ingresar la identificacin del Autor y actualizar el informe y dos botones, uno que muestra la grilla actualizada y otro que genera el Informe activando el Control crystal report. El programa en ejecucin al generar el informe de uno de los Autores se ve as:
El valor 1 de Action le da salida por pantalla luego, haciendo click en el icono de la impresora podemos darle salida por la misma.
Pgina 130
Pgina 131