Documente Academic
Documente Profesional
Documente Cultură
BAJO
VISUAL BASIC con Base
B
de Datos
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.
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:
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.
En el boton de salir:
Unload Me
Text1 = ""
' Esta variable contendrá el path del archivo que queremos acceder
del archivo.
' Abrimos el archivo con la variable Archivo, y como el acceso será de lectura _
' Creamos un bucle para controlar que después de llegar al final del archivo _
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 _
Wend
Close #1
Este ejercicio utiliza la instrucción OUTPUT para crear un archivo y grabar la informacion.
a) 2 Cajas de texto
b) 1 boton de comando
c) Etiquetas
d) Frame
e) Un control de timer para que muestre la hora del sistema actual en tiempo real
Codigo
'Cerramos el archivo
Close #1
End Sub
Text1 = Time
Text2 = Date
End Sub
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:
' 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")
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)
a) Etiqueta
b) Frame
c) CheckBox
d) Boton de comando
a) Etiqueta
b) Frame
c) Boton de comando
End Sub
End Sub
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) 5 cajas de texto
2) Etiquetas
3) Botones de comando
4) Frame
5) 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
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
Open archivo For Input As #1 ' Abrimos el archivo para leer los datos _
mediante la sentencia Input
Wend
Close
End Sub
End Sub
End Sub
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.
El procedimiento "leerDatos" recuperará los datos del registro que especifiquemos en el combo2.
1) Cajas de texto
2) Etiquetas
3) Caja combo (combobox)
4) Frame
5) Boton de comando
CODIGO
'
Private Sub Command1_Click()
' Pasamos los parámetros de los textBox al procedimiento que grabará _
los datos
grabarDatos Texape, Texnom, Texedad
End Sub
For x = 1 To 100
persona.Apellido = Apellido
persona.Nombre = Nombre
persona.edad = edad
'Cerramos el archivo
Close
End Sub
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.
' Pasamos los parámetros de los textBox al procedimiento que grabará los datos
grabarDatos Texape, Texnom, Texedad
End Sub
persona.Apellido = Apellido
persona.Nombre = Nombre
persona.edad = edad
'Cerramos el archivo
Close
End Sub
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:
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
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
Put #1, , x1
Put #1, , x2
Close (1)
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.
Para manipular los datos se utiliza una estructura o UDT que tiene las siguientes variables:
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.
1. txtNombre
2. txtApellido
3. txtTelefono
4. txtMail
5. txtNota
6. txtBuscar
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.
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.
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
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 .
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"
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
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
El menú Archivo:
Menú Archivo:
1. Abrir: mnuAbrir
2. Nuevo: mnuNuevo
3. Guardar: mnuGuardar
4. Guardar Como: mnuGuardarComo
5. Salir: mnuSalir
Menú edición
1. Copiar: mnuCopiar
2. Cortar: mnuCortar
3. Pegar: mnuPegar
4. 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:
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.
Option Explicit
'Menú abrir
Private Sub mnuAbrir_Click()
CommonDialog1.ShowOpen
FrmDoc.Show
ActiveForm.Caption = CommonDialog1.FileName
ActiveForm.RichTextBox1.LoadFile CommonDialog1.FileName
End If
Exit Sub
errSub:
If Forms.Count = 1 Then
MsgBox "No hay documentos para guardar", vbInformation
Exit Sub
End If
CommonDialog1.ShowSave
Exit Sub
errSub:
End Sub
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:
End Sub
'Menú pegar
Private Sub mnuPegar_Click()
On Local Error Resume Next
'Menú salir
Private Sub mnuSalir_Click()
Set FrmDoc = Nothing
End
End Sub
ActiveForm.RichTextBox1.SelStart = 0
ActiveForm.RichTextBox1.SelLength = Len(ActiveForm.RichTextBox1.Text)
End Sub
If flagGuardar Then
ret = MsgBox(" Guardar cambios", vbYesNoCancel)
End If
Exit sub
errSub:
End Select
End Sub
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
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.
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).
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.
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.
En esta pantalla si hacemos Click en el botón Examinar podemos elegir la base de datos que vamos a
usar.
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.
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.
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.
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.
STEPS:
2. Put a data control (an intrinsic control, located in the VB toolbox) on the form and set the
properties as follows:
Property Value
(Name) datAuthors
Caption Use the arrows to view
the data
Connect Access (default)
DatabaseName ..\biblio.mdb
DefaultType UseJet (default)
RecordSource Authors (choose from
list)
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:
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).
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.
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. Copy the files from Exercise #1 into a new folder and open the VBP file in the new
folder.
4. Put the following four lines of code in the appropriate Click events for the buttons:
Event Code
cmdMoveNext_Click datAuthors.Recordset.MoveNext
cmdMoveLast_Click datAuthors.Recordset.MoveLast
cmdMovePrevious_Click datAuthors.Recordset.MovePrevious
cmdMoveFirst_Click datAuthors.Recordset.MoveFirst
6. Move to the last record and then click the Move Next button twice. What happens? (We will
fix this in Exercise 4.)
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:
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:
Notice what happens to the arrows on the data control when you try to move past the last or
first record.
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.
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).
datAuthors.Recordset.MoveNext
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.
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.
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:
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
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:
Exit Sub
datAuthors.Recordset.Delete
cmdMoveNext_Click
Exit Sub
Delete_Error:
' This error will occur if you attempt to delete an author that is
related to
7. Save and test your program to make sure all functions work.
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.
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.
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 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:
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
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:
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:
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
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:
2. Place two new command buttons on your form and set their properties as follows:
3. Place the following statements in the general declarations section of your form:
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
cmdSaveRecord.Enabled = True
cmdCancelNew.Enabled = True
cmdMoveFirst.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
datAuthors.Recordset.Bookmark _
= datAuthors.Recordset.LastModified
cmdSaveRecord.Enabled = False
cmdCancelNew.Enabled = False
cmdMoveFirst.Enabled = True
cmdMoveLast.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 double-
clicking on the data control. The code is shown below:
txtAuthor.SetFocus
GoTo CancelValidateAction
End If
End If
If Val(txtYearBorn) = 0 Then
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
9. Save, run and test the program. Make sure you understand what the code is doing.
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:
Examples:
The next example assumes that the variable dtmBirthDay is of the Date data type:
datMembers.Recordset.FindNext _
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:
strQuote = "'"
Else
strQuote = ""
txtCriteria.Text = Val(txtCriteria.Text)
End If
strCriteria = _
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:
• 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 _
For example, if strSearchText contained "Chef Anton's Cajun Gumbo", the criteria in the above
statement would evaluate to
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
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:
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).
Author
[Year Born]
cboRelOp 2 - Dropdown List False =
>
<
>=
<=
Like
4. Add a textbox called txtCriteria and set its Enabled property to False.
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.
If cboField.Enabled Then
cboRelOp.SetFocus
End If
End Sub
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
cmdMoveFirst_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
strQuote = "'"
Else
strQuote = ""
txtCriteria = Val(txtCriteria)
End If
strCriteria = _
With datAuthors.Recordset
If blnFirstFind Then
blnFirstFind = False
.FindFirst strCriteria
Else
.FindNext strCriteria
End If
If .NoMatch Then
.Bookmark = strBookmark
cmdFind_Click
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
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.
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:
1. Place two data controls on the form and set their properties as follows:
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 Value
AllowUserResizing 1 –
flexResizeColumns
DataSource datProducts
FixedCols 0
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.)
datProducts.RecordSource _
= "SELECT * FROM Products " _
& "WHERE CategoryID = " & txtCatID
datProducts.Refresh
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. Copy your files from Exercise 8 to a new folder and open the project.
3. Out of Project | Components, include the Microsoft Data Bound Grid Control.
4. Place a DBGrid on your form in the position previously occupied by the flex grid.
Property Value
AllowAddNew True
AllowDelete True
AllowUpdate True
DataSource datProducts
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.
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.
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:
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:
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:
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:
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!.
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.
Siguiendo las mismas propiedades del Control Data, agrega el código que corresponde a cada uno de los
botones.
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:
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.
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
Prueba a practicarlo con este tipo de archivo. Veras que sigue las mismas instrucciones que los anteriores.
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.
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)
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:
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.
basedatos = App.Path
'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.
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
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:
CommonDialog1.ShowOpen
'Actualiza el recordset
Data1.Recordset.Update
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.
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.
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:
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.
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.
End Sub
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.
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
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
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
End Sub
Podemos usar Visual Basic para que se conecte con el servidor de MySQL también. Para ello tenemos 2
opciones:
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.
¿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
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):
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.
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:
debe ponerse a la caja de herramientas, agregándolo desde complementos como Microsoft ADO
Data Control 6.0 (forma parte de Office 2007).
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:
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.
Por el contrario con el método de conexiones de cadena, simplemente pondremos el código respectivo en
nuestra forma y enlazaremos nuestros controles.
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:
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:
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.
Por ultimo, para que podamos navegar como lo hemos estado haciendo, creamos dos botones de siguiente y
previo y este es su código:
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.
En este ejercicio haremos un repaso de lo aprendido hasta el momento. Ve el video indicando y realiza lo
siguiente:
Pregunta Respuesta
¿Qué es 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
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 cmdCerrar_Click()
Unload me
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
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:
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.
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.
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.
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:
End Sub
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
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:
'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 "
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.
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.
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.
El código es el siguiente:
Option Explicit
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
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.
Se pueden combinar las versiones de WHERE para combinar tablas y limitar registros seleccionados en
una sola instrucción SELECT.
Podemos modificar el nombre que SQL le asigna a las columnas con la claúsula AS.
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
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':
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.
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:
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.
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:
'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
With rs
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:
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:
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
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
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 que debemos traer de componentes, para
incluirlo en la Caja de herramientas.
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.
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 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