jueves, 15 de enero de 2009

Bases de Datos con Data Control

Visual Basic permite utilizar el Control Data para crear aplicaciones de bases de datos para una gran variedad de formatos de base de datos. El Control Data interactúa con el motor de base de datos Microsoft Jet y permite crear aplicaciones preparadas para datos con la mínima cantidad de código posible.

El Control Data se utiliza con el motor de base de datos Microsoft Jet para acceder a base de datos de diferentes formatos como por ejemplo: Microsoft Access, Dbase, Excel, FoxPro, Lotus y Paradox, aunque en los ejemplos solo se utilizará Microsoft Access como base de datos.

Para presentar los datos el Control Data permite trabajar con controles enlazados, (Label, TextBox, ComboBox, Image etc.). Esto quiere decir que al colocar un Control Data y enlazarlo a una base de datos y luego enlazar dichos controles con el Control Data, los cambios que se realicen en los controles enlazados se reflejarán en la base de datos.

Para enlazar la base de datos con un Control Data ubicado en el formulario, se utiliza la propiedad DataBaseName y Connect. En la propiedad Connect se especifica el tipo de base de datos, por ejemplo: Access. Luego, ya se puede seleccionar la base de datos. Para indicar con que tabla se encontrará unida al control se utiliza la propiedad RecordSource.

Nota: Antes de especificar la tabla en la propiedad RecordSource hay que indicar la propiedad DataBaseName y Connect, de lo contrario se producirá un error "Debe rellenar las propiedades DataBaseName y Connect para llevar a cabo la operación"


Práctica 1


1.- Crear un Nuevo Proyecto

2.- En el Form1 agregar un Data Control, ubicado en el Cuadro de Herramientas.


3.- Luego de añadirlo en el formulario, (Data1) selecciónelo y arrástrelo hasta la parte superior del formulario.

Configuración del Data Control (o Control Data)

4.- Indicarle al Data1 la base de Datos que se quiere usar, seleccionarlo y en la propiedad DatabaseName, y buscar el archivo Bilblio.mdb, normalmente esta en el mismo directorio en el que esta instalado el Visual Basic, por lo tanto hay que localizar dicho directorio, normalmente suele estar en: Archivos de programa\Microsoft Visual Studio\VB98.

Una vez seleccionada la Base de datos ya se dispone de una conexión mediante el Data Control a dicha Base de Datos.

Tomando en cuenta que en casi todas las bases de datos suelen existir varias “tablas” que contienen datos. Para seleccionar unas de las tablas, seleccionar la propiedad RecordSource y abrir la lista desplegable que aparece del lado derecha, en ella se encuentran las tablas disponibles para esa base de datos, en este caso se seleccionara la de Authors.

5.- Añadir 3 etiquetas (Label) y tres cajas de texto (TextBox).





6.- Ejecutar el Proyecto.


Práctica 2

Ahora, en lugar de hacerlo en tiempo de diseño, se hará en tiempo de ejecución, es decir al ejecutar el proyecto: al ejecutar el proyecto, aunque la asignación de la propiedad DataSource de las cajas de texto se hará en tiempo de diseño, ya que no se puede hacer en tiempo de ejecución.

Para ello, se usará otro formulario, con los mismos controles de la Práctica 1, pero sin “conectarlos” a ninguna tabla de una base de datos.

1.- Crear un Proyecto Nuevo.
2.- En el Formulario, añadir un Data Control, tres etiquetas y tres cajas de texto.
3.- Seleccionar las tres Cajas de Texto y en la ventana de propiedades, seleccionar DataSource y asignar Data1, además de asignar el tamaño, tanto en las cajas de texto como en las etiquetas.
4.- Hacer doble click en el formulario, por defecto se mostrará el evento Form_Load.
5.- Escribe el siguiente Código:


Option Explicit

Private Sub Form_Load()
'Indicar el path de la base de datos
Data1.DatabaseName = "C:\Archivos de programa\
Microsoft Visual Studio\VB98\BIBLIO.MDB"
'
'Indicar la tabla que se quiere utilizar
Data.RecordSource = "Authors"
'
'Asignar a cada uno de los texboxes el campo de la tabla
Text1.DataField = "Au_ID"
Text2.DataField = "Author"
Text3.DataField = "Year Born"
End Sub

6.- Ejecutar el Proyecto.

7.- Añadir una Caja de Texto en la cual se podrá escribir un número y al pulsar ENTER se mostrará el autor que tenga ese número como AU_ID. Para ello se añade una nueva caja de texto (no asignar DataSource), ya que este TextBox no estará ligado a la Base de Datos.
La posición y el tamaño de esta caja de texto es: Left = 1500, Top = 120, Width = 615 y 315 de altura. El nombre es Text4.
Cuando se pulse ENTER en ese control, se convertirá el valor introducido a un número y se hará una búsqueda en el contenido del Data1. El código es el siguiente:



Private Sub Text4_KeyPress(KeyAscii As Integer)
'Se buscará sólo cuando se pulse ENTER
Dim nReg As Long
'
'Comprobar si la tecla pulsada es ENTER: vbKeyReturn o
'13 que es lo mismo
If KeyAscii = vbKeyReturn Then
' Esta asignación evita que suene un BEEP
KeyAscii = 0
' Convertir el contenido de TexBox en un Número
nReg = Val(Text4)
'Buscar la primera coincidencia en el recordset del Data1
'en el campo Au_ID
Data1.Recordset.FindFirst "Au_ID = " & nReg
End If
End Sub


8.- Ejecutar el Proyecto.

Para realizar la búsqueda se usa FindFirst, esto hará que se muestre (o asigne como registro activo) el primer registro que coincida con lo indicado, en este caso el Au_ID que tenga como valor el número indicado en la variable nReg, ósea el valor introducido en el Text4.
En caso de que no se encuentre el valor buscado, no alterará el registro actual.

Buscar el campo Autor
Añadir dos controles Options para buscar tanto por el número del ID como por el nombre del Autor, el aspecto del formulario sería este:



Option1 será el que indique que se busque por el ID y Option2 será para buscar por el campo Autor, el código es el siguiente:


Private Sub Text4_KeyPress(KeyAscii As Integer)
'Se buscará sólo cuando se pulse ENTER
Dim nReg As Long
'
'Comprobar si la tecla pulsada es ENTER: vbKeyReturn o
'13 que es lo mismo
If KeyAscii = vbKeyReturn Then
' Esta asignación evita que suene un BEEP
KeyAscii = 0
' Convertir el contenido de TexBox en un Número
nReg = Val(Text4)
'Buscar la primera coincidencia en el recordset del Data1
If Option1.Value Then
' en el campo Au_ID
Data1.Recordset.FindFirst "Au_ID = " & nReg
End If
If Option2.Value Then
'en el campo Author
Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'"
End If
End If
End Sub




Práctica 3


Búsquedas en una Base de Datos:

En esta ocasión se añadirá un botón Buscar y Buscar Siguiente, para poder seguir buscando a partir del último registro encontrado.
En la Práctica 2, se buscaba al pulsar la tecla Enter en la caja de texto, pero ahora se creará un procedimiento Buscar, el cual, según el parámetro recibido, buscará la primera coincidencia o seguirá buscando desde el último dato hallado.
Antes de añadir un nuevo botón, hay que modificar el código actual para usar el nuevo procedimiento Buscar.

1.- Crear un nuevo procedimiento, en el menú Herramientas (Tools), seleccionar Agregar procedimiento…., colocarle el nombre Buscar y hacerlo privado, ya que sólo se usará desde el formulario.
2.- Copiar el siguiente Código:

Private Sub Buscar()
' Procedimiento para buscar el dato indicado
Dim nReg As Long
'
' Buscar la primera coincidencia en el recordset del Data1
'
If Option1.Value Then 'en el campo Au_ID
'Convertir el contenido de TextBox en un número
nReg = Val(Text4)
'
Data1.Recordset.FindFirst "Au_ID = " & nReg
End If
If Option2.Value Then 'En el campo Author
'
Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'"
End If
End Sub

Ahora hay q modificar el evento KeyPress del control Text4, para que llame al nuevo procedimiento.
3.- Borrar el código que había anteriormente en ese evento y sustituirlo por este otro:

Private Sub Text4_KeyPress(KeyAscii As Integer)
'Se buscará sólo cuando se pulse ENTER
'
'Comprobar si la tecla pulsada es ENTER: vbKeyReturn o 13 que es lo mismo
If KeyAscii = vbKeyReturn Then
' Esta asignación evita que suene un BEEP
KeyAscii = 0
' Llamar al procedimiento Buscar:
Buscar
End If
End Sub

4.- Ejecutar el proyecto y verificar que todo funcione igual.
5.- Añadir un botón para que busque el primer registro que coincida con lo escrito, esto hará lo mismo que cuando se pulsa Enter en el Text4, pero para el usuario será más lógico que el hecho de tener que pulsar Enter. Cambiar la propiedad Nombre: cmdBuscar y el Caption: Buscar.
6.-Escribir el siguiente código:

Private Sub cmdBuscar_Click()
'Simplemente llama al procedimiento Buscar:
Buscar
End Sub

7.- Ejecutar el proyecto.
8.- Agregar un botón nuevo, Cambiar la propiedad Nombre: cmdBuscarSig y el Caption: Buscar Siguiente.
9.- Crear un nuevo procedimiento, en el menú Herramientas (Tools), seleccionar Agregar procedimiento…., colocarle el nombre BuscarSiguiente y hacerlo privado, ya que sólo se usará desde el formulario.
10.- Escribir el siguiente Código:

Private Sub BuscarSiguiente()
' Procedimiento para buscar el dato indicado
Dim nReg As Long
'
' Buscar la siguiente coincidencia, a partir del último hallado
'
If Option1.Value Then 'en el campo Au_ID
' Convertir el contenido de TextBox en un Número
nReg = Val(Text4)
'
Data1.Recordset.FindNext "Au_ID = " & nReg
End If
If Option2.Value Then 'en el campo Author
'
Data1.Recordset.FindNext "Author Like '" & Text4.Text & "'"
End If
End Sub

El Código es prácticamente el mismo que el del procedimiento Buscar, lo único que cambia es que aquí se usa FindNext en lugar de FindFirst.
Es decir, FindFirst busca el primer dato que coincida con lo buscado y FindNext el siguiente al último que se buscó.

11.- Para probar este procedimiento, en el evento cmdBuscarSig_Click, escribir el siguiente código:


Private Sub cmdBuscarSig_Click()
'Buscar el Siguiente registro
BuscarSiguiente
End Sub

12.- Ejecutar el proyecto

Práctica 4

Añadir y Eliminar Registros
1.- En el proyecto anterior, añadir dos nuevos botones y asignarle los nombres cmdAdd y cmdBorrar, así como los Captions Añadir y Eliminar. El codigo para cada boton sera el siguiente:

Private Sub cmdAdd_Click()
'Añadir un nuevo registro
Data1.Recordset.AddNew
End Sub
Private Sub cmdBorrar_Click()
'Eliminar el registro actual
Data1.Recordset.Delete
End Sub

Tanto cuando se añade, como cuando se borra, se debería mover el registro actual para que los cambios tengan efecto en la base de datos, ya que si se añade un nuevo registro y el mismo no se actualiza se pierde, para ello se puede agregar un botón para Actualizar y otro para Refrescar que recargara los datos del Control Data
En el caso de Eliminar, se debe mover al primer registro, para que el registro activo sea uno con información.
Este seria el código de los eventos Click de los botones:

Private Sub cmdAdd_Click()
'Refreca o recarga los datos del Control Data
Data1.Refresh
'Añadir un nuevo registro
Data1.Recordset.AddNew
'Coloca el Cursor en el Text2 (Nombre)
Text2.SetFocus
End Sub

Private Sub cmdBorrar_Click()
' Borrar el registro actual
' Se comprueba que haya algún registro activo,
' para ello se comprueba que no haya pasado
' del principio o el final del Recordset
'
' Comprobar que hay registros, porque si no hay, dará error
If (Data1.Recordset.EOF Or Data1.Recordset.BOF) Then
' Avisar de que no hay registros
Data1.Caption = "Ningún registro activo"
Else
' Eliminar el registro actual
Data1.Recordset.Delete
'
' Se Mueve al primer registro para que
' los cambios se hagan permanentes
' (también podriamos haberlo movido al último registro)
Data1.Recordset.MoveFirst
End If
End Sub
Private Sub cmdActualizar_Click()
'Actualiza el Control Data
Data1.UpdateRecord
' Se marca al ultimo registro modificado
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
Exit Sub
End Sub
Private Sub cmdRefrescar_Click()
'Refreca o recarga los datos del Control Data
Data1.Refresh
End Sub


Ejercicio Propuesto


Agenda
1.-Crear una base de datos en Access que contenga una tabla con los siguientes campos: Nombre, Dirección, E-Mail y Teléfono. El tipo de dato de los campos establecerlo como de Tipo Texto.
Luego guardar la tabla con el nombre Contactos
2.- Crear un proyecto en Visual Basic. En el formulario principal, enlazar el control Data llamado Data1 a la Base de datos creada en Access.
Colocar los siguientes controles en el formulario como está en la siguiente imágen:

Este proyecto debe tener botones para:
1.- Añadir, Eliminar, Refrescar y Actualizar Registros.
2.- Efectuar búsquedas donde el usuario pueda seleccionar el tipo de búsqueda preferida:
• Por Nombre
• Por Dirección
• Por Teléfono
3.- Un Botón para Buscar.
4.- Un Botón para Salir del Proyecto.

Práctica 5 - Agenda


Se requieren dos Formularios: El primero es el Acceso al Sistema y el segundo la Agenda donde se hacen búsquedas, agregar, eliminar, actualizar y refrescar.

Código Fuente de Acceso al Sistema



Option Explicit
Dim Sesion As Workspace
Dim DBAgenda As Database 'variable llamada DBAgenda que apuntará al objeto Database
Dim RsUsuario As Recordset 'variable llamada RSUsuario que apuntará al objeto RecordSet
Dim RsContactos As Recordset 'variable llamada RSAgenda que apuntará al objeto RecordSet
'Para poder abrir la base de datos, necesitamos saber el path en el que se encuentra
'dicha base de datos, para ello vamos a crea una constante,
'en la cual tendrás que indicar el path correcto, es decir,
'el sitio exacto en el que se encuentra la base de datos, en nuestro caso será Agenda.mdb
Const sPathBD As String = "F:\IUTOMS\Visual Basic\Ejemplos de Visual Basic\DAO\agenda.mdb"
Dim Error As Integer

Private Sub Form_Load()
TxtUsuario = ""
TxtContraseña = ""
'Se carga la sesion como area de trabajo
Set Sesion = Workspaces(0)
' Se carga la BD Agenda
Set DBAgenda = Sesion.OpenDatabase(sPathBD)
' Se carga la Tabla Usuario
Set RsUsuario = DBAgenda.OpenRecordset("Usuario", dbOpenTable)
'define el indice de la tabla usuario
RsUsuario.Index = "Usuario" 'define el indice de la tabla usuario
End Sub

Private Sub CmdEntrar_Click()
'Verifica si el campo usuario esta vacio
If TxtUsuario = "" Then
MsgBox "Introduzca el Usuario"
Exit Sub
End If
' Verifica si el campo contraseña esta vacio
If TxtContraseña = "" Then
MsgBox "Debe Introducir la contraseña"
Exit Sub
End If
'define el indice para el recordset usuario
RsUsuario.Index = "Usuario"
'Busca el usuario por indice
'el método Seek para buscar un registro en un Recordset de tipo table
'El Recordset debe tener definido un índice antes de poder utilizar el método Seek.
' Seex "=" significa Igual que los valores de clave especificados.
RsUsuario.Seek "=", TxtUsuario
'verifica si el recordset esta vacio
If RsUsuario.NoMatch = True Then
MsgBox "El Usuario no está en la Base de Datos"
Error = Error + 1 'Cuenta los intentos de acceso fallidos
TxtUsuario = ""
TxtContraseña = ""
'valida si hay 3 intentos
If Error = 3 Then
End
End If
Exit Sub
End If
'Validación de la contraseña
If RsUsuario!Contraseña <> TxtContraseña Then
MsgBox "Contraseña Incorrecta"
TxtUsuario = ""
TxtContraseña = ""
'Cuenta los intentos fallidos
Error = Error + 1

'valida si hay 3 intentos
If Error = 3 Then
MsgBox "Sorry... Bye..."
End
End If
Exit Sub
End If
'Compara q la contraseña q esta en la bd sea igual a la q indico el usuario en el Text
' Y entra a la Agenda
If RsUsuario!Contraseña = TxtContraseña Then
MsgBox "Bienvenido a la Agenda"
frmAccesoDatos.Show
End If
End Sub

Private Sub CmdSalir_Click()
End
End Sub

Código Fuente de Acceso a Datos



Option Explicit

Private Sub CmdActualizar_Click()
'Actualiza el Control Data
Data1.UpdateRecord
'Se marca al último registro modificado
Data1.Recordset.Bookmark = Data1.Recordset.LastModified
Exit Sub
End Sub

Private Sub CmdAdd_Click()
'Refresca o recarga los datos del Control Data
Data1.Refresh
'Añadir un Nuevo Registro
Data1.Recordset.AddNew
'Coloca el cursor en el Id_Codigo
TxtIdContacto.SetFocus
End Sub

Private Sub CmdBorrar_Click()
'Eliminar el registro actual
'Se comprueba que haya algún registro activo,
'para ello se comprueba que no haya pasado del principio o el final del Recordset
'
'Comprobar que hay registros, porque si no hay, dará error
If (Data1.Recordset.EOF Or Data1.Recordset.BOF) Then
'Avisar que no hay registros
Data1.Caption = "Ningún Registro Activo"
Else
'Eliminar el registro actual
Data1.Recordset.Delete
' Se mueve al primer registro para que los cambios se hagan permanentes
' (tambien se puede mover al último registro)
Data1.Recordset.MoveFirst
End If
End Sub

Private Sub CmdBuscar_Click()
'Simplemente llama al procedimiento Buscar
Buscar
End Sub

Private Sub CmdBuscarSig_Click()
'Buscar el Siguiente Registro
BuscarSiguiente
End Sub

Private Sub CmdRefrescar_Click()
'Refresca o recarga los datos del Control Data
Data1.Refresh
End Sub

Private Sub CmdSalir_Click()
End
End Sub

Private Sub Form_Load()
TxtBuscar = ""
End Sub