CUADERNO DE TRABAJO TRABAJO VISUAL BASIC con B Base de Datos

Cuaderno de Trabajo Visual Basic se encu encuentra bajo una Licencia Creative Commons Atribución-No ComercialAtribución Licenciamiento Recíproco 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 código con el control OLE DB. .......................................................................................... 89 Ejercicio 33 – Control Data con Archivos de Texto.............................................................................................. 89 Cuaderno de Trabajo Visual Basic con Base de Datos Página 2

Ejercicio 34 – Control Data con Archivos de Excel .............................................................................................. 91 Ejercicio 35 –Control Data con Imágenes OLE..................................................................................................... 92 Ejercicio 36 –Control Data con Imágenes 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: Introducción a Visual Basic 6.0 Con Base de Datos ......................................... 111 Ejercicio 40 - VideoLeccion 12: Registro de Usuarios y Sesión de Login ........................................................... 111 Ejercicio 41 - VideoLeccion 13: Registro de Usuarios y Sesión de Login ........................................................... 113 Ejercicio 42 - VideoLeccion 14: Modificar Registro de Usuarios ....................................................................... 113 Ejercicio 43 - VideoLeccion 15: Búsqueda 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 - VideoLección 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 - VideoLección 21: Reportes simples y con parámetros ................................................................. 130 Leccion 57 - VideoLección 22: Reporte de Factura ........................................................................................... 130 Leccion 58 - VideoLección 23: Reportes Avanzandos usando dos o más tablas ............................................... 131 Leccion 59 - VideoLección 24: Últimos Arreglos, Empaquetado y distribución ................................................ 131

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 4

EJERCICIOS SOBRE EL ARCHIVOS
A continuacion se presentan algunos ejemplos de manejo de archivos simples con Visual Basic. Algunos archivos de tipo texto, documento o configuracion que son usados por algunas aplicaciones.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 5

Ejercicio 06 – Texto y RTF
En este Ejercicio vamos a ver como hacemos para directamente desplegar un texto ya copiado y grabado en un archivo con extensión TXT, que podemos tipear en cualquier editor como el NotePad, por ejemplo y otro texto con formato RTF (Rich Text File, o sea archivo de texto enriquecido) . Este formato puede grabarse en el Word, vamos a grabar como... y allí seleccionamos RTF.

Se llama texto enriquecido porque permite incluir distintos tipos de letras, colores y tamaños o sea más 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 estándar, por lo tanto debemos traerlo de Componentes), para el texto común 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 desplegarán por código 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 variaciónes en el tipo, color y tamaño 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 código de cada botón es el siguiente:
Option Explicit 'Esta expresión 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 tamaño de 'cada renglón del archivo renglon = Chr(13) & Chr(10) ' corta a otra línea 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 'aplicación. App.path significa en la ruta actual de la'aplicación. 'Sino hay que indicar cual es el Path. While Not EOF(1) ' esto realiza un bucle o sea repite la acción 'hasta que se llegue al final del archivo 1 (End of File)

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 tamaño del reglón. Wend 'repite las ordenes en tanto la condición 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 más sencillo el manejo de 'archivos, con la sentencia LoadFile se carga el archivo 'indicando el camino para encontrarlo. End Sub

Ejercicio 07 – Leer datos desde un archivo
Este ejercicio es para repasar como leemos un archivo de texto usando la instrucción INPUT. Primeramente creamos una interfaz como la siguiente:

La cual contiene una caja de texto, botones de comando y un frame para enmarcar el diseño. 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 _ aplicación. Luego le agregamos la barra invertida y el nombre _ del archivo.

Archivo = App.Path & "\" & "Historia.txt"

' Abrimos el archivo con la variable Archivo, y como el acceso será de lectura _ utilizamos el modo Input seguido del número de archivo "#1" Open Archivo For Input As #1

' Creamos un bucle para controlar que después de llegar al final del archivo _ la sentencia Input, no continue leyendo y se produzca un error en tiempo de eje _ cucíon. Para ello utilizamos la condición Not EoF(1), que traducido quiere decir _ mientras no llegue al final del archivo, que continúe leyendo línea por línea. _ ' Dentro del bucle asignamos al control Text1 el valor de la variable Linea mas _

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 8

el contenido que ya estaba guardado en el text box, Por que de lo contrario, el text Box _ solo mostraría el último contenido de la variable "Linea" While Not EOF(1) Line Input #1, Linea Text1.Text = Text1.Text & Linea Wend

' Cerramos el archivo Close #1

Ejercicio 08 – Usar output para grabar un archivo
Este ejercicio utiliza la instrucción OUTPUT para crear un archivo y grabar la informacion.

Los controles que lleva son: a) b) c) d) e) Codigo
Cuaderno de Trabajo Visual Basic con Base de Datos Página 9

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 10

Ejercicio 09 – Usando APPEND para agregar informacion al archivo
Cuando no queremos eliminar un archivo existente podemos agregar informacion al archivo usando la setencia APPEND del comando OPEN.

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 Página 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 opción 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 12

Ejercicio 10 – Creando archivos de configuracion para aplicaciones
Este ejercicio nos permite mostrar una pantalla de bienvenida al cargar una aplicación. Mediante un control checkbox, podemos indicarle que muestre o no la misma pantalla las siguientes veces que ejecutemos el programa. Se grabara entonces en un archivo de datos, dicho valor para que cuando se ejecute el programa carguemos la pantalla de bienvenida o no. Un clasico ejemplo de muchos programas de software cuando dan la bienvenida.

Necesitaras crear un proyecto con 2 formas, donde la primera es la pantalla de bienvenida (form1) y la segunda es la aplicación (form2) CONTROLES PARA FORM1 a) b) c) d) Etiqueta Frame CheckBox Boton de comando
Página 13

Cuaderno de Trabajo Visual Basic con Base de Datos

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 próxima 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 comprobación Unload Me Form2.Show End If End Sub
Cuaderno de Trabajo Visual Basic con Base de Datos Página 14

Ejercicio 11 – Usando Write e Input
En este ejercicio usaremos la sentencia WRITE en lugar de la sentencia PRINT para grabar los datos como campos. Se realizara una simulacion de agenda con varios campos, para grabar el archivo.

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 parámetros 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 parámetro 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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á vacío, 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 parámetros el con _ tenido de las cajas de texto If texApe.Text = "" Then
Cuaderno de Trabajo Visual Basic con Base de Datos Página 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

Ejercicio 12 – Usando archivos aleatorios
Este simple programa muestra como grabar datos y recuperar los mismos en un archivo Aleatorio. El programa consta de 2 procedimientos principales. Uno llamado "grabarDatos", que grabará los datos en el archivo "datos.dat". Los parámetros que lleva este procedimiento son los valores de los textBox. Cuando presionemos el botón "grabar", se llamará al procedimiento y grabará los datos en el n° de registro que hayamos seleccionado en el combo1. Este combo está cargado con numeros del 1 al 100. El procedimiento "leerDatos" recuperará los datos del registro que especifiquemos en el combo2.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 tamaño 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 parámetros 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 Página 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 tamaño 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 parámetros 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 tamaño 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 Página 20

Lbledad = persona.edad End Sub

Ejercicio 13 – Usando archivos aleatorios y registros
Este ejercicio es igual al ejercicio anterior con el agregado de un botón que comprueba cuantos registros tenemos grabados en el archivo “datos.dat" utilizando para ello la función FileLen

CODIGO 'Acá declaramos una estructura de datos con tres campos de longi tud fija. 'O sea que cada registro que grabemos tendrá el tamaño 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 Página 21

Private Sub Command1_Click() ' Pasamos los parámetros 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 tamaño As Integer tamaño = FileLen(App.Path & "\" + "datos.dat") / Len(persona) MsgBox "El archivo datos.dat contiene: " & tamaño & " 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 tamaño 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 parámetros 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 Página 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 tamaño 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 23

Ejercicio 14 – Ecuacion de 2º. Grado

Este ejercicio utiliza funciones matemáticas como cálculo de raíz cuadrada. Y un control especial CommonDialog que convoca a las ventanas estándar de Windows, que asociados a los métodos Put y Get nos permiten Abrir y Guardar un fichero como txt. El código 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 raíces 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 25

Put #1, , x2 Close (1) End Sub Private Sub txtA_LostFocus() If IsNumeric(txtA.Text) Then 'Si el dato es numérico 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 también 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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 opción para buscar un registro y especificar por que campo buscar, ya sea por el nombre del contacto, el Apellido, el telefono o el correo electrónico.

Pasos a seguir para armar el formulario con los controles:
Agregar en un Formulario 6 controles TextBox con los siguiente nombres: 1. 2. 3. 4. 5. 6. txtNombre txtApellido txtTelefono txtMail txtNota txtBuscar

Luego agregar 7 CommandButton con los siguientes nombres: 1. CmdAnterior : Botón para ir al anterior registro 2. cmdSiguiente : Botón para ir al siguiente registro 3. cmdGuardar : Botón para guardar los cambios cuando se seleccionó previamente la opción Nuevo Registro 4. cmdEliminar: Elimina el registro actual 5. cmdNuevo : Añade 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 añadir 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 número 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 28

Colocar el código fuente en el formulario:
1. Option Explicit 2. 3. 'Variables 4. '################################################## 5. 6. ' Estructura para los datos de los contactos de la agenda 7. Private Type Contacto 8. Nombre As String * 40 9. Apellido As String * 50 10. Telefono As String * 40 11. Mail As String * 70 12. Nota As String * 250 13. End Type 14. 15. 'Variables para utilizar la estructura anterior 16. Dim Datos As Contacto 17. Dim DatosTemp As Contacto 18. 19. 'Variables para el archivo de los datos de contacto y temporal 20. Dim FileFree As Integer 21. Dim FileTemp As Integer 22. 23. 'Variables para la posición del primer y último registro 24. Dim RegActual As Long 25. Dim RegUltimo As Long 26. ' Variable para la posición Temporal del registro 27. Dim RegActualTemp As Long 28. 29. Dim Pos As Integer, p As Integer 30. 31. 32. 33. 34. '###################################################### 35. 'Funciones y procedimientos 36. '###################################################### 37. 38. 39. 40. ' Subrutina que guarda los datos en el archivo 41. '############################################# 42. 43. Private Sub GuardarDatos() 44. 45. 'Asignamos los datos de la estructura con el contenido de los textBox 46. With Datos 47. 48. .Nombre = txtNombre.Text 49. .Apellido = txtApellido 50. .Telefono = txtTelefono.Text 51. .Nota = txtNota.Text 52. .Mail = Trim(txtMail) 53. 54. End With 55. 56. 'Escribimos los datos en el archivo y en la posición 57. Put #FileFree, RegActual, Datos 58. End Sub 59.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 posición 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. 'Botón 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Get #FileFree, RegActual, Datos

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 búsqueda de datos Combo1 = Combo1.List(0) Cargarcaptions End Sub

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 posición 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 'Botón 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 botón Guardar que graba los verdaderos datos Put #FileFree, RegUltimo, Datos RegActual = RegUltimo

VisualizarDatos txtNombre.SetFocus End Sub

'Botón para posicionar en el siguiente registro '##############################################

Private Sub cmdSiguiente_click() If RegActual = RegUltimo Then MsgBox " Ultimo registro ", vbInformation Else 'Incrementa la posición RegActual = RegActual + 1 'Cargamos los datos en el textbox del siguiente registro VisualizarDatos

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 'Botón 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 posición del registro actu RegActual = RegActual - 1 'Mostramos los datos en las cajas de texto VisualizarDatos End If txtNombre.SetFocus End Sub 'Botón 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 'Función que retorna el valor de la búsqueda '############################################# 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

Ejercicio 16 – Editor de texto con RTF
Este es un código fuente de un editor de texto muy simple tipo Bloc de notas.
El ejemplo es de lo mas fácil, ya que utiliza el control RichTextBox , y en realidad este control hace casi todo por si solo, por ejemplo para leer un archivo y cargarlo en el RichTextBox se utiliza el método LoadFile, y para Guardar en disco el Método SaveFile ( En el código está mas o menos comentado los parámetros de dichas funciones y métodos). El ejemplo tiene opciones para Crear , Abrir y Guardar los archivos en varias extenciones ( las soportadas por el RichTextBox). Los comandos clásicos de Cortar , Copiar, Pegar texto etc... También para Colorear la fuente seleccionada en el control, Imprimir el documento, Aplicar algunos Atributos al texto ( Negrita, subrayado, Cursiva), en fin, se le pueden agregar infinidad de opciones extras. Nota: Lo ideal es crearle un menú clásico " Menú Archivo ", " Menú Edición " etc..., y los botones hacerlos con un Toolbar por ejemplo, ya sea utilizando el control toolBar del visual basic o fabricandose una barra propia, ya que el ejemplo solo utiliza botones CommandButton para las

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 34

opciones, para que sea un poco mas entendible. Y otra cosa también usar un formulario MDI para tener multiples documentos abiertos en la misma aplicación

A continuación se describen los pasos para crear el ejemplo:
Agregar los siguiente controles en un formulario: • • • Un control Commondialog llamado Commondialog Un control RichTextBox llamado RichTextBox Un CommandButton llamado cmdOpcion, y en la propiedad index colocarle el valor 0, para formar un array y poder crear los demás en tiempo de ejecución

Nota: Colocar los controles en cualquier posición de la pantalla y no colocarles nada en el Caption ni el tamaño ni nada, ya que se hace por código, es decir se les asigna el caption y se redimensionan en tiempo de ejecución . Pegar el código 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 botón 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"

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 35

33. End With 34. 35. ' Va posicionando un botón 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. 'Opción 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 36

94. RichTextBox.SelUnderline = Not RichTextBox.SelUnderline 95. ' Imprimir el contenido del RichTextBox 96. ''''''''''''''''''''''''''''''''''''''''' 97. Case 9 98. 'Titulo del diálogo 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 diálogo 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"

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 método 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 tamaño _ del formulario usando el método Move del mismo. RichTextBox.Move 0, cmdOpcion(0).Top + cmdOpcion(0).Height, _ ScaleWidth, ScaleHeight End Sub

Ejercicio 17 – Editor de texto con formularios MDI
El siguiente ejemplo es un editor de texto muy simple utilizando un formulario Mdi, y formularios secundarios o hijos para cada archivo de texto, es decir similar a como lo hace el Word u otras aplicaciones que utilizan múltiples documentos

1 - Pasos para crear el ejemplo:
Iniciar un nuevo proyecto Exe, añadir un formulario MDI y dejarlo por defecto con el nombre Mdi Form1. También agregar un formulario y renombrarlo a FrmDocumento Las opciones que tendrá el editor serán: 1. En el menú Archivo: Abrir, Nuevo, guardar , guardar como y salir 2. El menú Edición : Copiar, Cortar, Pegar y seleccionar Todo.

La vista de los menúes quedará similar a los siguientes gráficos:

El menú Archivo:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 38

El menú Edición:

Los nombres de los menues deberán ser los siguientes: Menú Archivo: 1. 2. 3. 4. 5. Abrir: mnuAbrir Nuevo: mnuNuevo Guardar: mnuGuardar Guardar Como: mnuGuardarComo Salir: mnuSalir

Menú edición 1. 2. 3. 4. Copiar: mnuCopiar Cortar: mnuCortar Pegar: mnuPegar Seleccionar todo: mnuSeleccionar

Nota: si no sabés como crear los menúes con el editor de visual basic, podés chequear este enlace que explica resumidamente como crear uno:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 39

Crear menúes en visual basic

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 opción Objecto inicial.

Luego agregar un control CommonDialog llamado CommonDialog1 en el formulario Mdi y también otro en el formulario frmDocumento para poder utilizar los Cuadros de diálogo Abrir Archivo y Guardar como. ( El control CommonDialog lo accedés 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 módulo bas al proyecto

Agregar el código fuente a los formularios y al módulo bas Cuaderno de Trabajo Visual Basic con Base de Datos Página 40

Código fuente a colocar en el Formulario Mdi

Option Explicit

Private Sub MDIForm_Initialize() CommonDialog1.Filter = "Documento de texto|*.txt|Todos los Archivos|*.*" End Sub

'Menú abrir Private Sub mnuAbrir_Click()

On Error GoTo errSub

CommonDialog1.ShowOpen

If CommonDialog1.FileName <> "" Then Set FrmDoc = New frmDocumento

FrmDoc.Show

ActiveForm.Caption = CommonDialog1.FileName

ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName

End If Exit Sub errSub:

Select Case Err.Number Case 70 ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName Resume Next End Select

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 41

End Sub

'Menu Guardar Como Private Sub mnuGuarcomo_Click()

On Error GoTo errSub

If Forms.Count = 1 Then MsgBox "No hay documentos para guardar", vbInformation Exit Sub End If

CommonDialog1.ShowSave

If CommonDialog1.FileName = "" Then Exit Sub ActiveForm.RichTextBox1.SaveFile CommonDialog1.FileName

Exit Sub errSub:

Select Case Err.Number Case 91 Resume Next End Select

End Sub

'Menú para guardar el archivo Private Sub mnuGuardar_Click()

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 42

On Error GoTo errSub

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

Exit Sub errSub:

Select Case Err.Number Case 91 Resume Next End Select

End Sub

'Menú nuevo archivo Private Sub mnuNuevo_Click() Set FrmDoc = New frmDocumento nForms = nForms + 1 FrmDoc.Caption = sCaption & nForms FrmDoc.Show End Sub

'Menú pegar Private Sub mnuPegar_Click() On Local Error Resume Next

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 43

ActiveForm.RichTextBox1.SelText = Clipboard.GetText End Sub

'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

ActiveForm.RichTextBox1.SelStart = 0 ActiveForm.RichTextBox1.SelLength = Len(ActiveForm.RichTextBox1.Text)

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

Código fuente a colocar en el formulario frmDocumento

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 44

Option Explicit

Public flagGuardar As Boolean

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

Private Sub Form_Unload(Cancel As Integer)

On Error GoTo errSub

Dim ret As Integer

If flagGuardar Then ret = MsgBox(" Guardar cambios", vbYesNoCancel) End If

Select Case ret Case vbYes:

If InStr(1, Me.Caption, sCaption) Then CommonDialog1.ShowSave RichTextBox1.SaveFile CommonDialog1.FileName Else RichTextBox1.SaveFile Me.Caption End If Case vbCancel:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 45

Exit Sub End Select

Set FrmDoc = Nothing

Exit sub errSub:

Select Case Err.Number Case 75 Resume Next

End Select

End Sub

Private Sub RichTextBox1_Change() flagGuardar = True End Sub

Código fuente a colocar en el Módulo bas

Public FrmDoc As frmDocumento Public nForms As Integer Public Const sCaption = "Nuevo documento sin título "

En este enlace está el código 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

vista previa del mdi

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 46

PRACTICAS 1-5
1.- Hacer una aplicación que permita abrir un archivo de texto y mostrarlo en una caja de texto. La aplicación debe permitir seleccionar el archivo de la unidad de disco mediante el cuadro de diálogo Abrir. 2.- Hacer una aplicación 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. También debe permitir borrar un registro almacenado en el archivo de base de datos. 3.- Hacer una aplicación 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 botón 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 aplicación 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 diálogo Guardar del control Common Dialog. 5.- Hacer una aplicación 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 47

EJERCICIOS SOBRE EL BASES DE DATOS
Por ultimo, se presentan algunos ejercicios para ver como Visual Basic interctua con una base de datos, usando diferentes caracteristicas. La base de datos mas comun a usar en VB es ACCESS por lo que para la realizacion de las actividades, debera tener lista su base de datos, ya que de lo contrario estas no funcionaran. Pregunte a su profesor como crear sus bases de datos o como obtenerlas (si es que el se las proporcionara antes de realizar los ejercicios).

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 48

Ejercicio 18 – Formulario de Datos

Visual Basic cuenta con una cantidad importante de Asistentes. Entre ellos el asistente para la creación 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 selección, 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 introducción al Asistente. Pasamos a Siguiente, ya que aquí no podemos cargar la configuración de ningún perfil, porque no tenemos ninguna configuración o plantilla grabada.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 botón Examinar podemos elegir la base de datos que vamos a usar.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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. Cuadrícula: lo hará en una grilla. Maestro/Detalle: relaciona dos tablas. FlexGrid mostrará: las tablas con sus resúmenes y totales de los datos existentes en la tabla y Chart lo hará de manera gráfica. Nosotros vamos a elegir a manera de grilla o Cuadrícula.

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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 configuración como una plantilla para futuros formularios. Luego hacemos Finalizar.

Al cerrase la ventana del Asistente veremos en nuestro proyecto estándar un nuevo formulario, si no usamos el primero o Form1 lo podemos eliminar. Posicionados en la ventana proyecto con el botón derecho tenemos la opción de eleminarlo. Y grabamos la aplicación con el formulario que creó el asistente. Sino lo usamos como formulario de presentación. Como vemos en la ventana código el asistente, ya codificó los botones de navegación y de cierre de la Aplicación.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 específica en este caso Customers, o sea Clientes o usuarios. Observen que no hemos escrito ni una línea de código y sin embargo podemos recorrer los registros que componen la tabla a través del control Data. El formulario muestra los campos del registro a través 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 tendrán que cargar el DataBaseName nuevamente de acuerdo al recorrido de sus máquinas.

Ejercicio 20 - Connection to an Access Database Using the VB Data Control
This tutorial provides a brief introduction to developing database applications with Visual Basic through a series of nine step-by-step exercises. It should be noted that these exercises use the Data control with other controls bound to it. The Data control does a lot for you "behind the scenes" and you may be tempted to use it in your applications, but be advised that the Data control is rarely used in professional applications – the norm is to write your own database access code so that you have complete control over the process. These exercises are worthwhile in that you can see what data bound controls are all about, but again be advised that they should not be used for professional application development. For further information on why data bound controls are "evil", read this article. The intrinsic Data control is geared toward MS-Access 97 and earlier databases, although a later VB service pack added connectivity for Access 2000 databases. These articles use the two sample Access databases provided with Visual Basic (BIBLIO.MDB and NWIND.MDB). These databases are provided in Access 97 format. On a default installation of VB6, these databases can be found in the folder: C:\Program Files\Microsoft Visual Studio\VB98. Cuaderno de Trabajo Visual Basic con Base de Datos Página 53

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 Página 54

At this point, your form should resemble the screen-shot below:

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.

Ejercicio 21 – Using Navigation Buttons with Data Control
In the previous exercise, you saw that by clicking specific buttons of the data control, you could move to the first, previous, next, or last record. What is happening is that the data control is automatically invoking specific methods of the recordset object: namely the MoveFirst, MovePrevious, MoveNext, and MoveLast methods. You can also invoke these methods through code, which is what this exercise demonstrates. STEPS: 1. folder. Copy the files from Exercise #1 into a new folder and open the VBP file in the new

2. Set the Visible property of the data control (datAuthors) to False. 3. Make four command buttons with the following properties:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 55

Name cmdMoveNext cmdMoveLast cmdMovePrevious cmdMoveFirst

Caption Next Record Last Record Previous Record First Record

At this point, your form should resemble the screen-shot below:

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Ejercicio 24 – Adding, Updating and Deleting Records
In previous exercises, you saw that with the data control, changes to a record are automatically updated when the user moves off of that record – this is the Update method of the recordset object of the data control at work. You also saw that, by setting the EOFAction of the data control to "2 – AddNew", the data control will invoke the AddNew method of the recordset object, which causes all the bound controls to be cleared so that the user can enter data. In addition to being invoked automatically through the data control, the Update and AddNew methods can also be invoked through code. The recordset object also has a Delete method, which can only be invoked through code – it cannot be accessed automatically through the data control.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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

Your form should resemble the following:

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 Página 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.

Ejercicio 25 – BD Navegar por codigo
En este ejercicio agregamos cuatro botones o sea CommandButton para realizar por código a través del evento click las acciones correspondientes a: primer registro, siguiente registro, registro previo y último registro.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Ejericio 26 – BD Altas, Bajas y Busqueda
En este ejercicio vamos a seguir avanzando en cuanto a las posibilidades de manipular los contenidos de la Base de datos. Vamos a agregar y eliminar registros y hacer búsquedas. El formulario contiene los siguientes controles:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 62

La base con la que trabajamos es Biblio.mdb y la tabla Editores o Publishers. El código correspondiente a los botones avanzar y Atrás ya los hemos visto en el ejercicio anterior por lo tanto vamos a centrarnos en los botones Agregar, Eliminar y Buscar cuyos códigos son:
Private Sub Command1_Click() mensaje = MsgBox("Complete los datos y haga un Click" + Chr(10) + "en el botón de registro siguiente.", vbInformation) Data1.Recordset.AddNew Text2.SetFocus End Sub Private Sub Command2_Click() mensaje = MsgBox("¿Está seguro de Borrar el registro?", vbOKCancel, "Eliminación 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:", "Búsqueda") 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 método AddNew nos permite agregar un nuevo registro, y la actualización la podemos hacer a través de botón grabar o moviendo el puntero al pasar al siguiente registro. Para eliminar un registro lo hacemos con el Método Delete, previa confirmación a través 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 método FindFirst (Buscar primero) y el campo
Cuaderno de Trabajo Visual Basic con Base de Datos Página 63

establecido en este caso City (Ciudad) establece los criterios de la búsqueda. Luego con FindNext establece el criterio de la segunda búsqueda.

Ejercicio 27 – Using the Validate Event
This exercise will add the following functionality to the form you created in Exercise 5: • • Validating the user's input when they update an existing record or add a new record to the database. An Undo feature which will enable the user to cancel changes that they make to a record.

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 Página 64

vbDataActionDelete vbDataActionFind vbDataActionBookmark vbDataActionClose vbDataActionUnload

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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 65

Name cmdUndo cmdCancelNew

Caption Undo Cancel New Record

Enabled True True

At this point, your form should resemble the following:

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 67

cmdMovePrevious.Enabled = True cmdMoveNext.Enabled = True cmdDeleteRecord.Enabled = True cmdNewRecord.Enabled = True
cmdUndo.Enabled = True

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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 Página 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.

Ejercicio 28 – Using the Find Methods
The Recordset object has methods FindFirst, FindLast, FindNext, and FindPrevious. You can use these to search for a particular record in the Recordset. The syntax is datControl.Recordset.FindFirst criteria where criteria is a string item consisting of a field name, a relational (comparison) operator, and a value. It is essentially the same as a SQL WHERE clause without the word WHERE. The comparison operators that can be used are =, >, <, >=, <=, <>, Like, Between, and In. The value on the right-hand side of the comparison operator must conform to the following rules: string values must be enclosed in single quotes numeric values are not enclosed in quotes date values must be enclosed in #'s (pound signs)

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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: Página 71

Cuaderno de Trabajo Visual Basic con Base de Datos

datBooks.Recordset.FindFirst "[Pay Rate] > 30000"
• For string values, if there is the possibility that the search string will contain an apostrophe, an extra measure should be taken to "double" the apostrophes in the string – otherwise, the apostrophe embedded in the string will be interpreted as the end of the string and a syntax error will most likely result. The easiest way to provide this "insurance" against embedded apostrophes is to use the Replace$ function on the string in question to replace any occurrences of a single apostrophe with two apostrophes:

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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 Página 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:

cboField.Text = cboField.List(0) cboRelOp.Text = cboRelOp.List(0)
6. Code the Click events for the combo boxes (to provide smoother navigation for the user). The Enabled tests are necessary because the Form_Load event assigns the first element of the their respective List property arrays to their respective text properties, which automatically invokes the Click event, which will normally perform a SetFocus. SetFocus cannot be invoked on a disabled control; nor can it be invoked prior to completion of a Form Load.

Private Sub cboField_Click() If cboField.Enabled Then cboRelOp.SetFocus End If End Sub

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 Página 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 Página 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 Página 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.

Ejercicio 29 – Using the MSFlexGrid Control
The MSFlexGrid can be used to display multiple records in a grid. It cannot be used to edit data or add and delete records. Follow the steps in this exercise to create a Categories and Products master/detail form similar to the screen-shot shown below:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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

Enclose the grid in a frame, as shown in the screen-shot.

4.

Place the following line of code in the Form_Load event:

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.

Place the following code in the datCategories_Reposition event:

datProducts.RecordSource _ = "SELECT * FROM Products " _ & "WHERE CategoryID = " & txtCatID datProducts.Refresh

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 79

6. Save and run the program.

Ejercicio 30 – Using the DBGrid Control
This exercise uses the DBGrid control, which goes a step further than the MSFlexGrid in that allows the user to add, update, and delete records. The DBGrid control does not install automatically when you install Visual Basic 6.0, but it is available on the VB 6/VS 6 CD. To install the DBGrid control, perform the following steps. • Locate these three files on your VB6 installation CD: DBGRID32.OCX, DBGRID32.DEP, and DBGRID.REG. All three files should be located in this folder: D:\COMMON\TOOLS\VB\CONTROLS (where "D:" is the drive letter of your CD-ROM drive). If you cannot locate your installation CD, you may download these three files here. Copy these three files to your Windows "System" directory (the default system directory varies depending on the OS being used: On Windows 2000 and NT the default is WINNT\SYSTEM32; on XP the default is WINDOWS\SYSTEM32, and on 95, 98, and ME it is WINDOWS\SYSTEM). Double-click on DBGRID.REG to register the DBGRID32.OCX. You should now see the control (under the name "Microsoft Data Bound Grid Control 5.0 (SP3)") when you access the Components dialog by selecting Project|Components within VB. (If not, click on the “Browse…†button in the Components dialog and locate the DBGRID32.OCX file by browsing to the folder in which you copied it previously.)

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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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).

Download the project files for these exercises here.

Ejercicio 31 – Conectando VB con ACCESS 2007 y un control OLE DB de datos.
Basicamente es seguir los mismos pasos que en el ejercicio 19, al usar un control de datos (Control Data), pero ahora usando el nuevo manejador para Access 2007. En primer lugar, necesitamos crear una base de datos en Access 2007 como acostumbramos. Repitamos nuestra base de datos Agenda, pero con el formato para 2007.

La extensión de la base de datos, puede ser .accdb o .mdb. Cuaderno de Trabajo Visual Basic con Base de Datos Página 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 botón derecho para crear un nuevo archivo. 1. Nos ubicamos en la carpeta donde tenemos nuestro proyecto 2. Pulsamos botón derecho para crear un nuevo archivo de texto

3. Le damos un nombre y cambiamos la extensión .txt a .udl. Nos preguntara si queremos sobreescribir la extensión y decimos que si.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 82

4. Ahora veremos que tenemos un nuevo archivo (icono diferente) y debemos indicarle los parámetros de conexión. 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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 83

Si tuviera una contraseña (por estar protegido) aquí la teclearíamos. Y si queremos saber si la conexión es correcta, pulsamos el botón de PROBAR CONEXIÓN. Por ultimo cerramos, pulsando el botón ACEPTAR.

Ahora en Visual Basic, primero debemos poner el control que pueda leer este formato. De la barra de componentes pulsamos el botón derecho y aparecerá la caja de dialogo para seleccionarlo:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 84

Debemos de marcar la casilla que dice MICROSOFT ADO DATA CONTROL 6.0, con la ubicación 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:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 85

Siguiendo con la misma secuencia que para el CONTROL DATA, debemos poner las propiedades de conexión a este control. Para este control, es mas sencillo dar un click con el botón derecho dentro de el, para que aparezca un submenú y seleccionar las propiedades:

Dando click en la ultima opción, veremos la caja de dialogo:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 86

Donde en el origen de la conexión, debemos indicarle la ubicación del archivo UDL que acabamos de crear. Tambien podríamos usar el origen de datos de manera directo o usar la cadena de conexión requerida. Ahora debemos indicar además el Origen de los registros:

Es importante seleccionar el tipo de comando como TABLE (ver imagen) y después en la caja combo de abajo aparecerán 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, según 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 Página 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 información de la tabla. Todo esto sin escribir una línea de código!.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 88

Ejercicio 32 – Usando código con el control OLE DB.
Al igual que con el ejercicio de Control Data, este control actualizado contiene propiedades similares que nos permiten crear nuestros propios botones para navegar, agregar, guardar, borrar. Usando este mismo control crea una nueva versión del ejercicio anterior. Esto te dara una idea:

Siguiendo las mismas propiedades del Control Data, agrega el código que corresponde a cada uno de los botones.

Ejercicio 33 – Control Data con Archivos de Texto
Para este ejercicio nuevamente usaremos el Control Data de Visual Basic, pero usando nuestro archivo de texto secuencial que había creado en los primeros ejercicios. Nuestro archivo de texto secuencial (o datos) debe verse mas o menos asi:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 89

Donde, la primer fila indican los nombres de los campos que vamos a utilizar. Ademas, los campos están 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 conexión, 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 90

Ejercicio 34 – Control Data con Archivos de Excel
En este ejercicio, veremos la versatilidad que tiene el control de datos para conectarse a otros tipos de archivo. Primeramente debemos tener nuestra hoja de calculo (o archivo de Excel) preparada. Este es un ejemplo:

Vemos en la parte superior estarán 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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.

Ejercicio 35 –Control Data con Imágenes OLE
Ahora usaremos imágenes dentro de nuestra base de datos. Los campos que permiten almacenar este tipo de información se llaman campos OLE (Object Linking and Embedding). Las imágenes se guardan dentro de la misma base de datos y no se recomienda cuando tenemos muchos registros porque el tamaño de nuestro archivo crecería enormemente. Otra situación se presenta con los formatos de imágenes, que generalmente tienen que ser en BMP (Estandar) en lugar de JPG o GIF que son imágenes comprimidas. Primero deberas crear una base de datos que contenga un campo OLE al menos. Esto lo hacemos usando el Asistente Visual de Datos de VB donde creamos la base de datos, la tabla, los campos.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 92

Ahora usaremos Access para ingresar los datos y las imágenes. Abrimos Access, seleccionamos el archivo y comenzamos a capturar algunos registros. Luego tenemos que poner las imágenes. Para hacer esto: 1. 2. 3. 4. Nos posicionamos en el campo del registro deseado Pulsamos el botón derecho del raton y se abrirá un submenú En las opciones que aparecen, seleccionamos INSERTAR OBJETO Aparecera una caja de dialogo indicándonos si creamos un nuevo objeto o insertamos uno existente.

Seleccionamos la segunda opción, y pulsamos EXAMINAR para ubicar al archivo deseado. NOTA: SE RECOMIENDA ALTAMENTE QUE LAS IMÁGENES SEAN BMP (.BMP) PARA QUE PUEDAN SER VISUALIZADAS CORRECTAMENTE, YA QUE OTROS FORMATOS PUEDEN NO ESTAR DEBIDAMENTE REGISTRADOS (.JPG o .GIF) A continuación 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 imágenes incrustadas y podemos cerrar la aplicación y regresar a Visual Basic. Nuestro proyecto queda mas o menos asi:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 93

Vemos que tenemos las etiquetas y cajas de texto correspondientes a los campos, asi como un control de imagen, botones de navegación Y DOS CONTROLES DATA. Y agregamos también un control de COMMON DIALOG En el primer control data (Data1) lo dejaremos VACIO. Ya que lo usaremos mediante código. 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 todavía el control DATA1. Ahora pondremos el código para funcionar. Comenzamos con el FORM_LOAD: Cuaderno de Trabajo Visual Basic con Base de Datos Página 94

Private Sub Form_Load() Dim basedatos As String basedatos = App.Path 'si no tiene la bara final la añade 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 código, asignamos las propiedades. Notemos que la propiedad RECORDSOURCE contiene una sentencia SQL específicamente para cargar las fotos (Y NINGUN OTRO CAMPO) de nuestra tabla. Al final se hace una actualización del control. Ahora pondremos el código 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 botón 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 método AddNew 'Data1.Recordset.AddNew Data1.Recordset.Edit

' Carga el gráfico 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.

Ejercicio 36 –Control Data con Imágenes Vinculadas
En este ejercicio vamos a usar una base de datos y vincularla con imágenes. En lugar de que en nuestra tabla tengamos un campo OLE para presentar como imagen, vamos a vincular las imágenes por separado de una base de datos de productos. Veremos la forma como podemos navegar por dicha tabla y ver los productos al mismo tiempo.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 96

La diferencia con el ejercicio anterior, es que las imágenes no se guardaran en la base de datos, sino que estarán separadas como archivos dentro de la carpeta del proyecto. Aunque también pueden estar en una subcarpeta donde la referencia de la imagen es igual al campo de código. Asi por ejemplo: Campo Codigo A100 Nombre de la Imagen A100.jpg Imagen

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 97

A200

A200.jpg

A300

A300.jpg

Enlazaremos estas imágenes 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 Tamaño 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 presentación. Tenemos que tener algunos datos de prueba, asi como algunas imágenes de los productos que queremos presentar.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 98

A continuación, debemos crear nuestra forma y debemos agregar los siguientes elementos:

Tenemos nuestras etiquetas y cajas de texto según 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 conexión a nuestra base de datos de Access, y los controles de texto deben estar enlazados a los campos correspondientes. Comenzemos con nuestro botón 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 código esta vacio Entonces Fotoshow igual a imagen vacia Si no Fotoshow igual al código + extensión jpg Fin Si

' Checar si hay o no hay imagen. Cuaderno de Trabajo Visual Basic con Base de Datos Página 99

Image1.Picture = LoadPicture(fotoshow) End Sub

Mostrar en control picture la variable fotoshow

Como vemos, todo el “truco” esta en identificar la imagen del producto con su correspondiente código 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 código para prevenir errores. Los botones restantes contienen el código visto anteriormente. El código 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 Página 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 Página 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

Ejercicio 37 –Control Data OLE DB con MySQL
Podemos usar Visual Basic para que se conecte con el servidor de MySQL también. Para ello tenemos 2 opciones: 1. Por medio del control y conexión de Windows 2. Por medio de código (strings). Generalmente en las aplicaciones profesionales se utiliza el segundo método porque el programador puede cambiar muy fácilmente la conexión y no debe configurar nada. No sucede asi con el primer método que aunque es mas sencillo (visualmente) tiene la desventaja de quedar “anclado” a la computadora donde se realiza. Antes de continuar, tenemos que asegurarnos de: 1. Tener instalado el servidor de MySQL y ejecutándose en Windows (u otro sistema) 2. O tener instalado un servidor web como XAMPP que contiene MySQL y que este activo y funcionando 3. Y tener el DRIVER para conectarse con el servidor. En este caso el Connecto ODBC 5.1 de MySQL (que se puede descargar directamente desde la pagina del producto). ¿Como saber si tenemos instalado o no el DRIVER en nuestra computadora? He aquí los pasos: 1. Ir al panel de control 2. Seleccionar HERRAMIENTAS ADMINISTRATIVAS 3. Seleccionar ORIGENES DE DATOS

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 102

4. En la caja de dialogo que aparece, ir primero a la pestaña CONTROLADORES. De la caja de lista que se muestra, recorrerla hasta encontrar (o no) el Driver de MySQL (como se ve en la imagen):

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 103

Si no estuviera, debemos descargarlo e instalarlo en la computadora. Suponemos que nuestro servidor de MySQL esta en ejecución, 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 conexión permanente a nuestra base de datos desde el entorno de la herramienta administrativa. (Por eso, este método no es recomendable para aplicaciones profesionales que se tengan que instalar en varias computadoras, ya que tendríamos que crear esta conexcion en cada una de las maquinas donde se ejecutara). Dentro del administrador de orígenes de datos ODBC (del panel de control, herramientas administrativas), seleccionamos primero la pestaña de DNS de usuario, y a continuación pulsamos el botón de AGREGAR

Aparecera una segunda ventana, que nos indicara cual será el controlador que usaremos (en este caso el de MySQL):

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 104

Al pulsar finalizar, aparece inmediatamente la caja de dialogo del Conector ODBC Mysql:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 105

Donde pondremos un nombre para nuestra conexión en Data Source Name (este es un nombre con lo cual nosotros identificamos la conexión y ser ausada por Visual Basic mas adelante). Una descripción de la conexión que es opcional. Y luego la parte mas importante, el nombre del servidor o su dirección 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 (contraseña) Despues, la base de datos a la cual nos queremos conectar, que aparecerá de la caja combo. Aunque hay un botón que dice PROBAR CONEXIÓN, al momento en que aparezcan las bases de datos en la caja combo significa que si hubo una conexión exitosa con el servidor MySQL. Cuando hayamos terminado le damos ACEPTAR. Y veremos que la conexión queda en la primer ventana:

Ahora si,ya podemos ir a nuestro proyecto de Visual Basic para crear nuestra aplicación. Debemos crear nuestra forma con los controles ya conocidos: Cuaderno de Trabajo Visual Basic con Base de Datos Página 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, agregándolo desde complementos como Data Control 6.0 (forma parte de Office 2007).

Microsoft ADO

Pulsamos el botón derecho del raton para que aparezca el submenú del control y nos vamos a la opción de PROPIEDADES. Aparecera la caja:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 107

Donde seleccionamos la conexión que creamos previamente y aparece en la caja combo del origen de datos ODBC. Despues, debemos ir a la pestaña 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.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 108

Ejercicio 38 –Control Data OLE DB con MySQL y Strings
Por el contrario con el método de conexiones de cadena, simplemente pondremos el código respectivo en nuestra forma y enlazaremos nuestros controles. Sin embargo, debemos de: 1) Tener el servidor MySQL ejecutándose 2) Tener el driver de conector a MySQL En este nuevo ejecicio, creamos un proyecto y nuestra forma quedara mas o menos asi:

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 código. Ni siquiera las cajas de texto tendrán en sus propiedades el enlace con ningún control. Comenzamos poniendo el código en la sección 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 Página 109

Aquí indicamos que se cree un nuevo objeto ADODB (no visible), que contenga la cadena de conexión: Driver={MySQL ODBC 5.1 Driver};SERVER=localhost;User=root;DATABASE=test;PORT=3306;Option=3; Y que finalmente se abra dicha conexión. 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 opción 3. A continuación, pondremos el código para el botón 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 instrucción 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 código: 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 código “visual” que hemos visto en ejercicios anteriores. Cuaderno de Trabajo Visual Basic con Base de Datos Página 110

Ejercicio 39 - VideoLeccion 11: Introducción 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 aplicación. Responde brevemente a lo siguiente: Pregunta ¿Qué es una base de datos? Respuesta

Menciona las razones por las que usar una Base de Datos:

¿Cómo interactua Visual Basic con 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 código. 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 declaración 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 función principal que reemplace a la estándar de VB. Y escribimos: a. Sub Main() i. With base Cuaderno de Trabajo Visual Basic con Base de Datos Página 111

1. .CursorLocation = adUserClient 2. .Open “” 3. LoginForm.Show ii. End With b. End Sub 7. Nos falta conocer la cadena de conexión, para lo cual debemos agregar el control ADO que hemos usado previamente, insertándolo desde la caja de componentes. a. Una vez puesto en la forma, abrimos la caja de propiedades y seleccionamos la opción de generar la cadena de conexión. b. Seleccionamos el proveedor OLE 4.0 y ubicamos donde esta nuestro archivo de base de datos de Access. c. Probamos la conexión d. Damos aceptar y veremos entonces que se nos ha generado la cadena de conexión que pondremos en el inciso 2 del paso 6. e. Modificamos un poco la cadena de conexión para eliminar las referencia de ubicación 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 opción 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 diseño del formulario para crear una ventana de login. Debemos indicar las etiquetas, cajas de texto, botón de comando y las propiedades que necesitemos según nuestro diseño. Una vez creada la interfaz, tenemos que agregar el código para el manejo de registros. Asi que debemos abrir nuevamente el modulo donde tenemos la función MAIN. Ahí creamos una nueva función que llamaremos USUARIOS. El código 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 función: Private Sub Form_Load() Usuarios End Sub El resto del código es: Private cmdCerrar_Click() Unload me Cuaderno de Trabajo Visual Basic con Base de Datos Página 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

Ejercicio 40 - VideoLeccion 12: Registro de Usuarios y Sesión de Login

Ejercicio 41 - VideoLeccion 13: Registro de Usuarios y Sesión de Login

Ejercicio 42 - VideoLeccion 14: Modificar Registro de Usuarios

Ejercicio 43 - VideoLeccion 15: Búsqueda de Registro de Usuario

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 113

Ejercicio 44 – BD Consulta SQL
En este ejercicio vamos a hacer una pequeña consulta SQL, para los que no conocen la sintaxis de este lenguaje pueden consultar el archivo SQL.doc que los va a ayudar. En la propiedad RecordSource, donde seleccionamos la tabla a utilizar en los ejercicios anteriores, también podemos hacer las consultas SQL directamente, luego veremos que podemos hacerlas a través de un control y modificar esta propiedad. Lo primero que debemos hacer es seleccionar la base de datos que vamos a utilizar y vincularla a la propiedad DataBaseName del control data en este caso, seguimos trabajando con la base Biblio que viene con Visual Basic. Luego de crear el control data1 y determinar su propiedad DataBasename, agregamos un control databound grid de componentes: Microsoft Data Bound Grid y lo agregamos. El formulario muestra el siguiente aspecto visual:

Y la consulta que hacemos en la propiedad RecordSource es:
SELECT * FROM Authors ORDER BY Author ASC

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 podría ser DESC o sea descendente. Así vemos mostrarse en la grilla el listado de autores ordenado alfabéticamente.

PRACTICAS 6 – 10

1.- Hacer una aplicación que permite registrar en una base de datos los datos de los empleados de una empresa. Los campos son: Nombre, Apellido, Edad, Cargo, Sueldo, Dirección, Teléfono y Fecha de contrato. El programa debe permitir al usuario obtener distintos tipos de reporte, como por ejemplo: los empleados que ganen más de 10,000 pesos, los empleados mayores de 50 años de edad, etc. 2.- Hacer una aplicación que permita gestionar un almacén de un supermercado.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 114

3.- Hacer una aplicación que permita gestionar un sistema de inscripción de una universidad o un colegio. 4.- Crear un pequeño punto de venta. Esto es un sistema que permita vender artículos, imprimir facturas y generar reportes de ventas. 5.- Crear una pequeña aplicación que permita gestionar el almacén de una farmacia.

Ejercicio 45 – Ordenando una tabla

Este ejercicio nos permite ordenar los registros de una tabla en forma ascendente o descendente. Los registros se despliegan en una grilla, y también podemos seleccionar la cantidad de registros que queremos mostrar. Obviamente necesitaremos conexión con una base de datos, para lo que usaremos un control data. El código 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 número de registros. Select Case tipo Case 1 Orden = "DESC" Case 2 Orden = "ASC" End Select

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 número de registros debe estar entre 1 y 9", vbInformation Text1.SetFocus End If Else MsgBox "Entre un valor numérico entre 1 y 9" Text1.SetFocus End If End Sub

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 116

Leccion 46 - VideoLeccion 16: Relacionando Tablas - Mantenimiento Completo de Clientes

Leccion 47 - VideoLección 17: Mantenimiento Productos

Ejercicio 48 – BD Varias Tablas
La idea de este ejercicio es conectar varias tablas desde el formulario, o sea volcar en campos de texto los datos de distintas tablas. Para esto deben estar definidas como tabla en en la propiedad RecordType. Siempre usamos la base de datos Biblio.mdb. Pero recuerden que al bajar el ejercicio deben actualizar los Path con la ubicación de la base de datos de su disco rígido. El formulario se ve de la siguiente manera:

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 (Título) 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 están vaciós aparecerá el asterisco. Data2.Recordset.Seek "=", Data1.Recordset.Fields("PubID") If Data2.Recordset.NoMatch Then Text4.Text = "***"

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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

Ejercicio 49 – BD Suma con SQL

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 código 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 Página 118

Ejercicio 50 – BD Funciones con SQL

Este ejercicio nos muestra el uso de tres funciones: Mínima, Máxima 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 años 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 sintáxis 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 años de nacimiento de los autores, guardándola 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 máquinas. La base usada es Biblio.mdb.

Ejercicio 51 – BD Visor de SQL
El siguiente ejercicio nos permite crear un Visor de conusltas SQL, esto es de mucha utilidad para probra el código de las consultas y practicar este lenguaje de consultas estructuradas de información contenida en tablas de Base de Datos. La explicación esta hecha en Visual basic 6, pero también la pueden hacer en el 5 cambiando el control MsFlex Grid por el Data Bound Grid de la versión 5.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 código 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 código 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

Como vemos se incluyen alguna rutinas para controlar posibles erroes.

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 120

Ejercicio 52 – BD Consultas SQL
Para ejecutar estas consultas SQL, pueden usar el visor del ejercicio anterior, o el Administrador Visual de datos de Visual basic, abrir la Base Books6.mdb y tipear las consultas en la ventana de código SQL y ejecutarlas. El SQL del JetDataManager soporta el uso de operadores como: BETWEEN, IN y LIKE. Ejemplos: SELECT PubID, Name, StateProv, City FROM Publishers WHERE PubID BETWEEN 10 AND 15 Con IN puedo hacer una lista de condiciones: SELECT PubID, Name, City, StateProv FROM Publishers WHERE StateProv IN ('NY' , 'CA' , 'RI') Puedo usar LIKE para obtener una vista cuyos registros cumplan con un patrón específico. Ejemplo: aquellos registros cuya columna StateProv tenga una letra I en su comienzo, o el PubID sea un valor determinado. SELECT PubID, Name, City, StateProvFROM Publichers WHERE StateProv LIKE ' I ' SELECT PubID, Name, City, StateProv FROM Publichers WHERE PubID LIKE 10 Puedo usar WHERE para vincular tablas en un solo conjunto de Datos. la instrucción crea una vista que muestra el título de un libro y el nombre de la editorial. esto se logra con WHERE al solicitar que genere una vista donde los valores de la columna PubID de ambas confluyen. SELECT Titles.Title, Publishers.Name FROM Publishers.Title WHERE Publishers.PubID = Titles.PubID Se pueden combinar las versiones de WHERE para combinar tablas y limitar registros seleccionados en una sola instrucción SELECT. SELECT Titles.PubID, Titles.Title, Publishers.Name FROM Titles, Publishers WHERE Titles.PubID = Publishers.PubID AND Publishers.PubID BETWEEN 5 AND 10 Podemos modificar el nombre que SQL le asigna a las columnas con la claúsula AS. SELECT Titles.PubID AS CodigoPub, Titles.Title AS TituloLibro, Publishers.Name AS NombrePub, Authors.Name AS NombreAutor FROM Titles, Publishers, Authors WHERE Titles.PubID = Publishers.PubID AND Titles.AUID = Authors.AUID Funciones SQL: Es posible usar WHERE y las funciones agregadas en un mismo SELECT, para limitar los registros a incluir en los cálculos que realizan las funciones.SELECT COUNT(UNits) AS RecuentoUnidades, AVG(Units) AS PromedioUnidades, SUM(Units) AS SumatoriaUnidades, MIN(Units) AS UnidadMinima, MAX(Units) AS UnidadMaxima FROM BookSales WHERE Qtr = 1
Cuaderno de Trabajo Visual Basic con Base de Datos Página 121

Uso de las funciones de Visual basic en una instrucción SELECT: Al cargar cualquier base de datos mediante el Jet en un aaplicación Visual Basic, es posible utilizar cualquier función propia del entorno como parte de una instrucción SQL. Ejemplo 1: Vista con una columna que muestra los tres primeros caracteres de una columna de la tabla base usando la función 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: También pueden usarse las funciones de Visual basic como parte de la claúsula 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.

Lección 18:Incorporando proceso de Facturación Lección 19: Programando proceso de facturación Lección 20: Consultas simples, con parámetros y detalladas

Ejercicio 53 – BD con DAO
Cualquier programa que accede a tablas utiliza objetos de acceso a datos, aún si lo hace a través de controles enlazados sin codificación, utiliza estos objetos de acceso a datos. El Modelo de Objetos de Acceso a datos puede ser: DAO 3.51 (versión actual de VB6) DAO 2.5/3.51(compatible con versiones anteriores) Y otros Modelos como: RDO (Remote data Object) y ADO (Objetos Activos de Acceso a Datos). El objeto fundamental en los programas basados en DAO es el Recorset. este es el objeto que contiene la colección de registros que utilizan los programas. Existen tres tipo diferentes de Recordset: Dynaset, table y Snapshot. Otro objeto es el Database (o base de datos) que convoca a la Base.
Cuaderno de Trabajo Visual Basic con Base de Datos Página 122

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 están 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 instrucción. 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 dinámico, permite lectura y escritura, el segundo sólo lectura. Al crear el Dynaset por código 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. También vamos a usar la propiedad Filter para crear un nuevo RecordSet. El código es:
Option Explicit Private Sub Form_Load() 'Lo primero que debo hacer es incorporar la referencia Microsoft DAO 3.51. 'creación 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 Método 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 año 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

Ejercicio 54 – BD con DAO validacion de campos

En esta ejercitación vamos a trabajar con algunos ejemplos de validación de campos. en este primer ejercicio vamos a validar filtrando el teclado. O sea podrán ingresar sólo números del 0 al 9, en el primer cuadro de texto. Y letras en el segundo cuadro de texto. Y ambos en el tercero. El código es:
Private Sub Text1_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789" 'habilita solo números

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 124

If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' sino es válido lo vuelve nulo End If End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) KeyAscii = Asc(UCase(Chr(KeyAscii))) ' cambia a mayúsculas. End Sub Private Sub Text3_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ" 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 validación 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 número telefónico: (##) ### - ####. Y en la propiedad Format seleccionamos para Importe: $#,##0.00;($#.##0.00). El código es:
Private Sub Form_Load() 'Carga la lista desplegable With Combo1

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 código un campo requerido y un rango de mayor y menor, pero vamos a hacer la validación a través de el Click de un Botón.O sea vamos a hacer la validación a nivel de formulario y no de campos. Para esto vamos a crear una función validoform que cuando chequee que está todo correcto devuelva un valor adecuado, aceptando la información del formulario, de lo contrario devuelva un mensaje de error. El código es:
Option Explicit Private Sub Command1_Click() Dim strMsj As String strMsj = validoform() If strMsj = "" Then Unload Me Else MsgBox strMsj, vbExclamation, "Error de validación" End If End Sub Private Sub Form_Load() 'Carga la lista desplegable With Combocliente .AddItem "Minorista" .AddItem "Mayorista"

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 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 válido 'variables para la validación del rango Dim intSup As Integer Dim intInf As Integer Dim strMsjSupInf As String 'variables para la validación 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 Mayúsculas 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 mayúsculas 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 numérico." & 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

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 127

strvalido = "0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZÁÉÍÓÚ" 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 mayúsculas. End Sub Private Sub txtnumeros_KeyPress(KeyAscii As Integer) Dim strvalido As String strvalido = "0123456789" 'habilita solo números If InStr(strvalido, Chr(KeyAscii)) = 0 Then KeyAscii = 0 ' sino es válido lo vuelve nulo End If End Sub

Ejercicio 55 - Crear un reporte simple utilizando el DataReport
http://www.recursosvisualbasic.com.ar/htm/tutoriales/datareport.htm

Ejercicio 56 - Ejemplo para cargar un Datareport sin estar enlazado a un DataEnvironment
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/132-datareport-sindataenvironment.htm

Ejercicio 57 - Genera informe de un ListView para imprimir
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/485-generar-informe-de-listviewpara-imprimir.htm

Ejercicio 58 - Refrescar Dataenvironment con parametros
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/487-refrescar-dataenvironmentcon-parametros.htm

Ejercicio 59 - Datareport - Imprimir ficha del cliente
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/481-imprimir-ficha-de-clientecon-datareport.htm

Ejercicio 60 - Crystal Reports
http://www.recursosvisualbasic.com.ar/htm/tutoriales/manual-crystal-reports.htm

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 128

Ejercicio 61 – BD Crystal Report
Esta es una aplicación generadora de Informes. Estos informes se diseñan a partir de una Base de datos y la aplicación nos permite añadir un encabezado, fechas, textos, pie de páginas. etc. O hacer en tiempo de ejecución a partir de un programa de Visual Basic una consulta SQL y luego usando el control Crystal Report crear un Informe y darle salida por pantalla o impresora. Como vemos son dos cosas distintas aunque en el fondo cumplen la misma función que es generar un Informe. tenemos la aplicación Crystal Reports y el control Crystal Report incluirlo en la Caja de herramientas. que debemos traer de componentes, para

Primero veremos la aplicación Crystal Reports, vamos a Inicio, programas y dentro de Microsoft Visual Basic selecionamos Crystal reports, una vez dentro de la aplicación, 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 diseño 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 página. 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 aplicación. Luego abrimos Visual Basic y creamos la siguiente aplicación:

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 129

El formulario contiene un Control data cuya propiedad DatabaseName es Biblio.mdb y la propiedad RecordSource: la tabla Authors. Luego tenemos una DBGrid traída de componentes cuya propiedad DataSource es :DataControl. Un Crystal Report, también traído de componentes, cuya propiedad ReportFileName es el informe que creamos recientemente,, en la aplicación Crystal Reports: aut.rpt. Luego agregamos una caja de texto para ingresar la identificación 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 ejecución al generar el informe de uno de los Autores se ve así:

El código para actualizar la grilla es :
Private Sub Command1_Click() Data1.RecordSource = "Select * from authors Where Au_ID = " & Text1.Text Data1.Refresh DBGrid1.Refresh End Sub

Y para generar el Informe:
Private Sub Command2_Click() CrystalReport1.Action = 1 End Sub

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.

7. Crystal Reports http://www.vb6.us/tutorials/using-crystal-reports-vb6-tutorial

Leccion 62 - VideoLección 21: Reportes simples y con parámetros

Leccion 63 - VideoLección 22: Reporte de Factura

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 130

Leccion 64 - VideoLección 23: Reportes Avanzandos usando dos o más tablas

Leccion 65 - VideoLección 24: Últimos Arreglos, Empaquetado y distribución

Cuaderno de Trabajo Visual Basic con Base de Datos

Página 131

Sign up to vote on this title
UsefulNot useful