lunes, 17 de mayo de 2010

Data






















En esta sección se ven algunos ejemplos muy simples del uso del control Data de visual BasicContenido :
· Breve descripción
· Ejemplo 1 : Crear una Agenda simple
· Ejemplo 2 - Propiedad Recordsource en tiempo de ejecución
· Enlazar un control Data con un DbGrid
· Acceder a una base de datos con Password
· Enlaces relacionados

1 - Breve descripción
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.
El control Data permite trabajar con controles enlazados, por ejemplo con controles Label, TextBox, ComboBox, controles Image etc.. para presentar los datos. 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"
Si bien estas propiedades se pueden establecer en tiempo de ejecución, en el ejemplo solo se realizará en tiempo de diseño

2 - Ejemplo 1 : Crear una Agenda simple
El primer paso será crear una base de datos Access con los siguientes campos:
Nombre, Direccion y Telefono. El tipo de dato de los campos establecerle como de Tipo Texto
Luego guardar la tabla con el nombre Contactos
Colocar la base de datos en una carpeta cualquiera, donde se ubicará también el proyecto de ejemplo.
Iniciar un nuevo proyecto de tipo Exe y guardarlo en la carpeta anterior. En el formulario principal, lo primero será colocar un control Data llamado Data1.
Ahora seleccionar el control Data1, y desde la ventana de propiedades serciorarse que la propiedad Connect esté con el valor Access y en la propiedad DataBaseName elegir la base de datos anteriormente creada.
Manteniendo seleccionado siempre el control Data, ahora localizar la propiedad Recordsource para indicar la tabla a la cual estará enlazada, y seleccionamos la Tabla Contactos.
Colocar los siguiente controles en el formulario como está en la siguiente imagen:
· Textbox: txtNombre, txtDireccion y txtTelefono
· TextBox: txtNomEdit, txtDirEdit y txtTelEdit


· El commandButton Agregar colocarle el nombre CmdAgregar
· El botón de Eliminar CmdEliminar
· Refrescar: CmdRefresh
· Actualizar : CmdActualizar
· Modificar: CmdModificar

Ahora para enlzar los textBox llamados txtNombre, txtDireccion y txtTelefono, hay que indicarle en la propiedad DataField de cada uno de los TextBox, el campo por el cual se enlazará. Para el primero, seleccionar el campo Nombre en la propiedad DataField, el segundo Textbox el campo Direccion y el tercero el campo Telefono

El código del formulario:
'Botón para Agregar un Nuevo Registro
Private Sub CmdAgregar_Click()
Data1.Refresh
Data1.Recordset.AddNew
txtNombre.SetFocus
End Sub

'Botón para Eliminar el Registro Activo
Private Sub CmdEliminar_Click()

With Data1.Recordset
'Elimina
If Data1.Recordset.RecordCount = 0 Then Exit Sub
.Delete
'Posiciona en el siguiente
.MovePrevious
If Not .EOF Then .MoveLast
End With

End Sub

'Botón para Actualizar los cambios
Private Sub CmdActualizar_Click()
On Error GoTo errSub
'Actualiza el control data
Data1.UpdateRecord
Data1.Recordset.Bookmark = Data1.Recordset.LastModified

Exit Sub
errSub:
If Err.Number = 524 Then
MsgBox "Para actualizar un registro primero agregue uno nuevo o" & _
"modifique algun registro activo", vbInformation
End If
End Sub
'Botón para modificar el registro activo
Private Sub CmdModificar_Click()

Data1.Recordset.Edit
If txtNomEdit <> "" Then Data1.Recordset("Nombre").Value = txtNomEdit
If txtDirEdit <> "" Then Data1.Recordset("Direccion").Value = txtDirEdit
If txtTelEdit <> "" Then Data1.Recordset("telefono").Value = Val(txtTelEdit)
Data1.Recordset.Update
End Sub
'Refresca el control
Private Sub CmdRefresh_Click()
Data1.Refresh

End Sub

'Evento que ocurre Cuando se produce un error en el control Data
Private Sub Data1_Error(DataErr As Integer, Response As Integer)

MsgBox "Error: " & Error$(DataErr)
Response = 0
End Sub
'Muestra la posición del registro activo del control Data
Private Sub Data1_Reposition()
Screen.MousePointer = vbDefault
On Error Resume Next
'Mostramos el número de registro en el control Data en la propiedad caption
Data1.Caption = "Registro n° : " & (Data1.Recordset.AbsolutePosition + 1)
End Sub


Private Sub Data1_Validate(Action As Integer, Save As Integer)

Select Case Action
Case vbDataActionMoveFirst
Case vbDataActionMovePrevious
Case vbDataActionMoveNext
Case vbDataActionMoveLast
Case vbDataActionAddNew
Case vbDataActionUpdate
Case vbDataActionDelete
Case vbDataActionFind
Case vbDataActionBookmark
Case vbDataActionClose
Screen.MousePointer = vbDefault
End Select
Screen.MousePointer = vbHourglass
End Sub


Private Sub Form_Load()
'Acá especificar el path de la base de datos
Data1.DatabaseName = App.Path & "\bd1.mdb"

txtNomEdit = "": txtDirEdit = "": txtTelEdit = ""
txtSearchNom = "": txtSearchDir = "": txtSearchTel = ""
End Sub

Private Sub Form_Unload(Cancel As Integer)
Screen.MousePointer = vbDefault
End Sub

Agregar una opción para buscar un registro:
Añadirle al ejemplo anterior los siguientes controles:
· 3 TextBox: txtSearchNom, txtSearchDir y txtSearchTel
· Un Option1 y en el Caption: " Por nombre "
· Un Option2 y en el Caption: " Por Diercción "
· Un Option3 y en el Caption: " Por Teléfono "
· Un CommandButton llamado CmdBuscar



El código del procedimiento al pulsar el botón Buscar
Private Sub CmdBuscar_Click()
If Option1.Value = True Then
Data1.Recordset.FindFirst ("Nombre = '" & txtSearchNom & "'")
ElseIf Option2.Value = True Then
Data1.Recordset.FindFirst ("Direccion = '" & txtSearchDir & "'")
ElseIf Option3.Value = True Then
Data1.Recordset.FindFirst ("telefono = '" & txtSearchTel & "'")
End If
If Data1.Recordset.NoMatch Then MsgBox " Registro no encontrado", vbInformation
End Sub

Descargar ejemplo

3 - Ejemplo 2 - Propiedad Recordsource en tiempo de ejecución

El siguiente ejemplo muestra una forma de utilizar la propiedad Recordsource del control Data
El mismo consiste en un control Combo que tiene cargado los nombres de Clientes de una Tabla, y al seleccionar uno de ellos, poder mostrar otros datos del Cliente en unos TextBox, como muestra esta imagen:


Pasos para crear el ejemplo :
Crear una base de datos llamada base.MDB. Dentro de esta una tabla llamada Clientes en la cual tendrá los siguientes campos: Nombre, Telefono, Pais y Correo. Todos los campos dejarlos como de tipo texto.
Cargar algunos datos de ejemplo y Guardar la base de datos en una carpeta donde también se guardará el proyecto de Visual basic.
Ahora crear un nuevo proyecto en Visual basic y agregar en el formulario los siguiientes controles: Un control Data llamado Data1. Un control ComboBox llamado ComboNombres, Un textBox llamado txtTelefono, otro txtPais y otro txtCorreo
Ahora se enlazará en la propiedad DataField y DataSource de cada TextBox, el campo relacionado y el control Data1 como fuente de los registros.
Por ejemplo, para el txtTelefono seleccionar la propiedad DataSource y seleccionar el control Data1 y en la propiedad DataField escribir el nombre del campo, en este caso Telefono. Todo esto desde la ventana de propeidades como muestra la imagen:

Hacer lo mismo para los restantes Controles textBox

El código fuente del Formulario sería el siguiente:
Option Explicit

'Ejemplo 2 del control Data y la propiedad Recordsource en tiempo de ejecución



Private Sub ComboNombres_Click()

' Al hacer Click en el elemento del combo _
se selecciona mediante sql el registro _
y la cadena Sql se asigna al Recorsource del _
control data
Data1.RecordSource = _
"SELECT * FROM Clientes WHERE Nombre='" & ComboNombres & "'"

'Refresca el control data
Data1.Refresh

End Sub

Private Sub Form_Load()
Dim Path_Base_Dato As String, db As Database
Dim rst As Recordset


Path_Base_Dato = App.Path
Path_Base_Dato = Path_Base_Dato & "\base.mdb"

'Abre la base de datos
Set db = OpenDatabase(Path_Base_Dato)

'Abre el Recordset con la consulta: Selecciona los nombres ordenados
Set rst = db.OpenRecordset( _
"SELECT Nombre FROM Clientes ORDER BY Nombre", _
dbOpenSnapshot)

' Se mueve al primer registro
rst.MoveFirst
Do While Not rst.EOF
'Agrega el Nombre al Combo
ComboNombres.AddItem rst!Nombre

'siguiente registro
rst.MoveNext
Loop

'Cierra el recordset y la base
rst.Close
db.Close

'Se asigna la base de datos al Data1
Data1.DatabaseName = Path_Base_Dato

'Seleccionamos el primer elemento del combo
ComboNombres.ListIndex = 0

Me.Caption = " Ejemplo de la propiedad recordsource del control Data "

End Sub

Este mismo ejemplo lo podés descargar desde este enlace:
Descargar Ejemplo 2 - Control Data

4 - Enlazar un control Data con un DbGrid

Para enlazar un control Data a un control DbGrid, es muy simple. Una ves que el control Data ya tiene especificado en la propiedad DataBaseName el nombre de la base de datos, y en la propiedad Recordsource la fuente de los registros ( consulta sql o tabla) , solo hay que especificar en la propiedad DataSource del control DbGrid, el control Data al cual estará enlazado. Como muestra la imagen:


Para enlzar un control MsFlexGrid, se realiza de la misma forma, especificando en el control FlexGrid en la propiedad DataSource, el Data al cual enlazarlo.

Enlazar un control Data con un DbGrid y especificar el RecordSource en tiempo de ejecución
Este ejemplo es similar al anterior, es decir, se enlazará un control Data con un DbGrid, pero al cambiar la propiedad Recordsource del control Data en tiempo de ejecución, el DbGrid visualizará los nuevos datos.
Colocar un DbGrid llamado DbGrid1, un control Data llamado Data1, un control TextBox llamado Text1 , un CommonDialog1, y dos botones, Command1 y Command2
El Command1 será para seleccionar la base de datos. El Command2 para ejecutar la consulta sql que se escribirá en el control Text1.
Esta es una vista del ejemplo

Importante: Al control DbGrid, especificarle en la propiedad DataSource el control Data1

El código fuente del formulario:
Option Explicit

Private Sub Command1_Click()

On Error GoTo ErrSub

With Data1
'Se asigna el Recordsource al data
.RecordSource = Trim$(Text1.Text)
.Refresh 'refresca el control
End With

Exit Sub

ErrSub:
MsgBox Err.Description, vbCritical, " Error "
End Sub

Private Sub Command2_Click()

On Error GoTo ErrSub


'Abre el cuadro de diálogo para Seleccionar la base de datos
With CommonDialog1

.DialogTitle = " Seleccionar base de datos para anlzar con el Data "
.Filter = "Archivos de base de datos Access*.mdb"
.ShowOpen

If .FileName = "" Then
Exit Sub
Else
'Le especifica el path de la Bd al control data1
Data1.DatabaseName = .FileName
MsgBox " Ahora escriba una consulta en Text1 para " & _
"cargar el DbGrid ", vbInformation
End If

End With

Exit Sub

ErrSub:
MsgBox Err.Description, vbCritical, " Error "

End Sub



Private Sub Data1_Error(DataErr As Integer, Response As Integer)
Response = 0
End Sub

Private Sub Form_Load()
Me.Caption = " Ejemplo DbGrid y el control Data "

Command1.Caption = " Ejecutar consulta "
Command2.Caption = " Seleccionar BD "

' Tipo de base de datos para el Data
Data1.Connect = "Access"
End Sub


Descarga ejemplo


5 - Abrir una base de datos con Password

Estos dos ejemplos muestran como abrir una base de datos Microsoft Access con password para asociarla luego a un control Data
El primer ejemplo abre una Bd de tipo Access 2000, el segundo una Bd de tipo Access 97.

Este ejemplo requiere incluir la referencia a Microsoft DAO desde el menú Proyecto - Referencias e incluir un control Data llamado Data1
Option Explicit

Private Sub Form_Load()

Dim Path As String
Dim db As Database
Dim rst As Recordset


Path = App.Path & "\Bd1.mdb"


Set db = DBEngine.OpenDatabase(Path, False, False, "MS Access;PWD=EL_PASSWORD")

' Abre el recordset
Set rst = db.OpenRecordset("El_Campo")

' Asocia el recordset al control Data
Set Data1.Recordset = rst

End Sub

Abrir la base con Password en Access 97:
Private Sub Form_Load()

Dim Password As String


' Passsword de la base de datos
Password = ";PWD=" & "el_password"

'Path de la bd
Data1.DatabaseName = App.Path & "\bd1.mdb"

Data1.Connect = Password

Data1.Refresh



End Sub

6 - Enlaces relacionados
· Página de ejemplos usando Microsoft Dao
· 1 - Ejemplo para cargar una tabla en un DbGrid al seleccionarla en un control ListBox
·
· Vista del ejemplo:
·
·
· Descripción:
· Al seleccionar una base de datos mediante el Command "Abrir Base", se llama a un subrutina que mediante DAO recorre las tablas de la base y las agrega al control ListBox. Una ves cargadas los nombres de las tablas, al seleccionar una de ellas, se enlaza el control DbGrid con el control Data, es decir se le pasa a la propiedad RecordSource del Data el comando SQL con el nombre de la tabla, y automaticamente el control DbGrid presentará los datos de la misma.
· Para el ejemplo se requiere de un control Listbox llamado List1. Un control DbGrid llamado DbGrid1. Un CommonDialog para poder utilizar el cuadro de diálogo de windows para seleccionar el archivo de base de datos, un Command1 y Un control Data llamado Data1
· Luego de esto seleccionar el control Dbgrid y en la propiedad DataSource del mismo, desde la ventana de propiedades, especificar el control Data1, para que de esta forma quede enlazado
· Por último se debe agregar desde el menú Proyecto - > referencias, la referencia: Microsoft DAO.
·
· Código en un formulario:
· Option Explicit
·
· 'Botón para elegir el archivo MDB
· Private Sub Command1_Click()
· With CommonDialog1
·
· .Filter = "Archivo MDB*.mdb"
· .DialogTitle = "Seleccionar base de datos "
·
· .ShowOpen
·
·
· If .FileName = "" Then Exit Sub
·
· Call Cargar_Tabla(.FileName)
·
· End With
· End Sub
·
· Sub Cargar_Tabla(Path As String)
·
· Dim BD As Database
· Dim Tabla As TableDef
·
· 'Abre la base de datos
· Set BD = OpenDatabase(Path)
·
· List1.Clear
·
· ' Recorre la tala de la base en un bucle y las _
· agrega en el control ListBix
· For Each Tabla In BD.TableDefs
·
· 'Si no es una tabla de sistema
· If Left$(Tabla.Name, 4) <> "MSys" Then
· List1.AddItem Tabla.Name
· End If
· Next
·
· 'cierra la base de datos
· BD.Close
·
· ' Asigna la base de datos al control Data
· Data1.DatabaseName = Path
·
· End Sub
·
· 'recibe como parámetro el nombre de la tabla
· Sub Enlazar_DbGrid_Data(Tabla As String)
·
· Dim sql As String
·
· ' Cadena SQL
· sql = "SELECT * FROM " & "[" & Tabla & "]"
·
· ' Establece el RecordSource al Data, es decir el Sql
· Data1.RecordSource = sql
·
· 'Refresca
· Data1.Refresh
·
· End Sub
·
· Private Sub Form_Load()
· Command1.Caption = " Abrir base de datos"
· Me.Caption = " Ejemplo para enlazar un Data a un DbGrid"
· End Sub
·
·
· Private Sub List1_Click()
·
· If List1.ListIndex <> -1 Then
· 'Le envía el nombre de la tabla seleccionada en el List
· Call Enlazar_DbGrid_Data(List1.List(List1.ListIndex))
· End If
·
· End Sub
·
·
· 2 - Ejemplo para buscar datos - Método FindNext y FindPrevious del objeto Recordset
·
· El siguiente ejemplo es muy simple y permite mediante estos dos métodos buscar un registro. El primero buscará haci adelante y el FinPrevious hacia atrás. También hay otros dos métodos, uno llamado FindLast, que busca el último registro, y FindFirst que busca el último. pero en este ejemplo solo se verá el uso de los dos mencionados en el título.
· Para armar el ejemplo se necesita colocar en un formulario como muestra la imagen los siguientes controles:
·
·
·
· Un control Data llamado Data1. Dos controles Commandbutton para buscar los datos. y cuatro controles textBox. El text1, Text2 y text3, en la propiedad DataSource , indicar el control Data1 para que de esta menra queden enlazados a la base de datos. El text4 se utilizará para ingresar el dato a buscar.
· En le FormLoad, especificar lo siguiente:
· En la Propiedad DatabaseName del control data, la ruta de la base de datos:
· En la propiedad REcordSource, la Tabla.
· en la propiedad TextField de los Text1, Text2 y Text3, los campos que visualizará cda textBox.
· Nota: en este ejemplo se utiliza la base de datos que se instala con visual basic, llamada NWIND.MDB
·
· Código fuente en el formulario:
·
· 'Busca hacia adelante
· Private Sub Command1_Click()
· Data1.Recordset.FindPrevious "Ciudad Like '" & Text4 & "'"
· End Sub
·
· 'Busca hacia atrás
· Private Sub Command2_Click()
· Data1.Recordset.FindNext "Ciudad Like '" & Text4 & "'"
· End Sub
·
·
·
· Private Sub Form_Load()
· Path = "C:\Archivos de programa\Microsoft Visual Studio\VB98\NWIND.MDB"
·
· 'Path de la base de datos para la propiedad DatabaseName
· Data1.DatabaseName = Path
·
· 'Tabla para la propiedad RecordSource
· Data1.RecordSource = "Clientes"
·
· 'Especifica los DAtaField de los controles
· Text1.DataField = "Nombre_del_contacto"
· Text2.DataField = "Ciudad"
· Text3.DataField = "Teléfono"
·
·
· Command1.Caption = " Buscar hacia Atrás "
· Command2.Caption = " Buscar hacia adelante "
· Me.Caption = " Ejemplo del método Find para buscar datos"
·
· End Sub
·
·
· Ejemplo para filtrar con el operador Like
· Este otro sencillo formulario , utiliza un control data y un MsFlexgrid enlazado. Al escribir en un textbox , se filtran los datos utilizando el operador like de sql de microsoft jet.
· Nota : En este caso se utiliza los campos idProducto y NombreProducto, de la base de datos nwind del directorio de visual basic.
· Vista del form
·
·
· Descargar ejemplo
·
· 3 - Pasar datos desde Microsoft Excel hacia Access
· Este es un simple ejemplo que utiliza dos controles Data para exportar datos de una hoja de cálculo Excel hacia una base de datos mdb.
· Uno de los controles Data, se enlaza con la hoja de Excel, y otro control data para acceder a la base de datos.
· Formulario
·
·
· Para el ejemplo, la hoja debe tener tres campos o columnas con algunos datos, por ejemplo :
·
·
· 1 - Indicar en el código fuente, el nombre de la hoja del Excel y el nombre de la tabla en la propiedad Recordsource de cada control Data
· 2 - Crear tres campos dentro de la bd
· Importante: asi como está el ejemplo, los campos en la base de datos , deben ser del mismo tipo o similares, ya que sino dará error de conversión de tipos. Para este caso, se colocaron por default como de tipo " Texto "
·
· Código fuente en el formulario
· Option Explicit
·
· Private Sub Command1_Click()
·
· On Error GoTo Mensaje_Error
·
· ' path del excel
· Data1.Connect = "Excel 8.0;"
· Data1.DatabaseName = App.Path & "\archivo_Excel.xls"
·
· ' Especifica la Hoja que tiene los datos
· Data1.RecordSource = "Hoja1$"
· ' refresca
· Data1.Refresh
·
· ' path del archivo Access
· Data2.Connect = "Access"
· Data2.DatabaseName = App.Path & "\archivo_Access.mdb"
·
· 'indica el nombre de la tabla a usar
· Data2.RecordSource = "Tabla1"
·
· ' refresca
· Data2.Refresh
·
· ' Mueve al primer registro en la hoja
· Data1.Recordset.MoveFirst
·
· ' mientras haya registros
· Do While Data1.Recordset.EOF = False
·
· With Data2.Recordset
· .AddNew ' agrega uno nuevo
·
· ' asigna los datos a cada campo
· .Fields(0) = Data1.Recordset.Fields(0)
· .Fields(1) = Data1.Recordset.Fields(1)
· .Fields(2) = Data1.Recordset.Fields(2)
·
· ' actualiza la base de datos con los nuevos cambios
· .Update
·
· ' se posiciona en el siguiente registro
· Data1.Recordset.MoveNext
· End With
· Loop
· ' ok
· MsgBox " Datas exportados a Access correctamente !!!", vbInformation
·
· Exit Sub
· ' error
· Mensaje_Error:
· MsgBox Err.Description
·
· End Sub
·
· Private Sub Form_Load()
· Command1.Caption = " Datos desde Excel hacia Access "
· End Sub
·





Volver al índice

No hay comentarios:

Publicar un comentario