Curso Básico de Programación
en Visual Basic

 

Entrega Treinta y seis: 14/Feb/2001
por Guillermo "guille" Som

Si quieres linkar con las otras entregas, desde el índice lo puedes hacer

 

En esta entrega veremos cómo usar el ADO Datacontrol para acceder a las bases de datos del tipo MDB (Access).
El ejemplo usado será parecido al de la entrega anterior, aunque con unos pequeños cambios, para usar el tipo de acceso a bases de datos ADO, en lugar de DAO.
Me imagino que habrás leído por ahí las diferencias entre ADO y DAO, cosa que aquí no voy a hacer... porque si lo hiciera, seguramente acabaría aburriendo hasta... a mi mismo. Así que pasaré a las explicaciones básicas de cómo usarlo, que es la intención de este curso básico, aunque, cuando lo crea conveniente, profundizaré en los temas que crea conveniente, así que... vamos al tema y veamos...

Cómo usar el ADO datacontrol.

Empecemos desde cero.
Crea un nuevo proyecto, se creará un proyecto con un formulario.
En el menú Proyecto/Componentes... selecciona Microsoft ADO Data Control -seguramente irá acompañado de la versión del control, en mi caso me indica que es 6.0 (SP4) (OLEDB)-
Cuando pulses en aceptar, para cerrar el cuadro de diálogo de añadir componentes, te mostrará un nuevo objeto en la barra de herramientas. Asegúrate de que tienes abierto el formulario y haz doble-click en dicho control, de esta forma se añadirá un ADO datacontrol al formulario.
Lo primero que hay que hacer es configurarlo para acceder a una base de datos, pero todo esto se puede hacer mediante código, así que no voy a explicarte cómo hacerlo desde el IDE de Visual Basic.
Añade el siguiente código al evento LOAD del formulario:


' Indicar el path correcto de la base de datos
' ¡ACUERDATE DE PONER EL PATH CORRECTO!
Const sPathBase As String = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB"
'
' Crear la conexión manualmente
' Con "Provider=Microsoft.Jet.OLEDB.4.0;" se permite abrir bases de datos de Access 2000
With Adodc1
    .ConnectionString = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=" & sPathBase & ";"
    ' Indicarle de que tabla vamos a leer los datos
    .RecordSource = "Authors"
End With
 


Nota:

He de aclarar que las pruebas sobre acceso a bases de datos con el ADO datacontrol están realizadas con el Visual Basic 6.0 y el Service Pack 4 (SP4). Si el código anterior te produjera un error, primero comprueba que está escrito correctamente (hay que empezar por lo más simple), si sigue sin funcionar, prueba a cambiar el 4.0 que está entre comillas por 3.51, si aún así tampoco funciona... prueba a instalar el ADO, creo que se instala automáticamente con el Internet Explorer 5.5, si a pesar de todo esto tampoco funciona... no se que aconsejarte, aparte de que consigas el VB6 y el SP4... o también que pases de esta entrega...

Te explico un poco el código anterior.
La constante es para que sea fácil modificarla si prefieres usar otra base de datos.
El With Adodc1 es para indicarle al VB que vamos a modificar varias propiedades del ADO datacontrol, aquí supongo que no has modificado el nombre de dicho control, si lo has hecho, cambia Adodc1 por el nombre que hayas puesto.
El método .ConnectioString, según dice la ayuda del Visual Basic: Contiene la información que se utiliza para establecer una conexión a un origen de datos. Osea, es lo que le dice al ADO datacontrol de que base de datos obtener los datos y también de que tipo es, en este caso es una base de datos del tipo Microsoft.Jet, o lo que es lo mismo, del tipo Access.
Por tanto Provider= indica de que tipo de base de datos se trata y Data Source= el path de la base de datos en cuestión, (fíjate que se usa la constante con el path y nombre de la base de datos).
Por último a la propiedad .RecordSource le indicamos que es lo que queremos que maneje el datacontrol, en este caso una tabla de la base de datos; aunque también podríamos haberle indicado una consulta, pero esto último lo veremos en otra ocasión.

Ahora vamos a añadir unos cuantos controles al formulario, para poder trabajar con los datos manejados por el ADO datacontrol.
Los controles que usaremos serán 3 etiquetas y 3 cajas de texto, pero ambos serán un array de controles, (en el ejemplo de las entregas 34 y 35 usamos controles independientes, pero creo que es más cómodo usar array de controles).

Cómo crear un array de controles.

A estas alturas ya deberías saber cómo hacerlo, pero te voy a refrescar la memoria.
Añade una etiqueta al formulario (se creará Label1).
Selecciónala, (simplemente haz click en ella)
Del menú Edición, selecciona Copiar, (también puedes hacerlo con el botón derecho del ratón).
Del menú Edición, selecciona Pegar, se mostrará un mensaje preguntando si quieres crear un array de Label1, contesta que si.
Vuelve a pegar (Edición/Pegar)
Y ya tienes tres etiquetas con índices que van desde cero a dos.
Añade un TextBox y haz la misma operación que con la etiqueta: Selecciónalo; cópialo; pégalo, contesta que SI al mensaje de que quieres crear un array; vuelve a pegar. Al final tendrás tres cajas de Texto llamados Text1 con índices de cero a dos.
Posiciona los controles de forma que las etiquetas estén alineadas con las cajas de texto, no te preocupes por el Caption de las etiquetas, ya que lo modificaremos desde código.

Añade unos cuantos controles más, para que podamos hacer búsqueda, etc. tal y como se hizo en las dos entregas anteriores.
Al final deberíamos tener los siguientes controles:

Control Índices del array (o ninguno si no es un array)
Label1 0 a 2
Text1 0 a 2
Label2 Ninguno (no es un array)
Text2 Ninguno (no es un array)
Option1 Ninguno (no es un array)
Option2 Ninguno (no es un array)
cmdBuscar Ninguno (no es un array)
cmdBuscarSig Ninguno (no es un array)
cmdSalir Ninguno (no es un array)
cmdAdd Ninguno (no es un array)
cmdBorrar Ninguno (no es un array)
Adodc1 Ninguno (no es un array)

Y en esta imagen tienes una idea de cómo están dispuestos:


El formulario de prueba de la entrega 36


Aquí te muestro el código usado para que funcione este invento, como comprobarás, es prácticamente el mismo que el usado en las entregas anteriores, con unas cuantas añadiduras para que funcione correctamente con el ADO datacontrol. Por tanto creo que no necesita más explicaciones que las que se incluyen en el propio código.
El código del procedimiento Buscar es el que tiene más cambios, entre otras cosas porque la forma de buscar en ADO es diferente al de DAO, en este último (DAO), se usan FindFirst, FindNext, etc. y en ADO sólo existe Find.
También he usado un marcador en la rutina de buscar; por si no se hallan datos, que el registro activo sea el mismo que estaba antes de buscar. Échale un vistazo a los comentarios que hay en el código.

'
'------------------------------------------------------------------------------
' Prueba de ADO Datacontrol para la entrega 36                      (14/Feb/01)
'
' ©Guillermo 'guille' Som, 2001
'------------------------------------------------------------------------------
Option Explicit

Private Sub Adodc1_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
    ' Mostrar el ID del registro actual
    ' si se pasa del primero o del último, dará error

    On Error Resume Next

    ' Mostrar el ID del registro actual usando el recordset pasado como parámetro
    Adodc1.Caption = "Registro actual: " & pRecordset.AbsolutePosition

    ' Si da error, indicarlo                                        (20/Sep/99)
    If Err Or pRecordset.BOF Or pRecordset.EOF Then
        Adodc1.Caption = "Ningún registro activo"
        ' Habría que moverlo a un registro con información
        ' *** Dejarlo comentado ***
        ' para que el procedimiento de búsqueda avise si no hay datos activos
        'Adodc1.Recordset.MoveFirst
    End If

    Err = 0
End Sub

Private Sub cmdAdd_Click()
    ' Añadir un nuevo registro
    Adodc1.Recordset.AddNew
    ' Añadimos algún texto, para que no se pierda este registro
    Text1(1) = "Nuevo"
    ' Actualizamos los datos
    Adodc1.Recordset.Update
    ' Hacemos que se "recargue" los datos del recordset
    Adodc1.Refresh
    ' Movemos al último registro para que los cambios se hagan permanentes
    ' y se muestre el nuevo registro
    Adodc1.Recordset.MoveLast
End Sub

Private Sub cmdBorrar_Click()
    ' Borrar el registro actual
    ' Se comprueba que haya algún registro activo,
    ' para ello se comprueba que no hayamos pasado del principio o el final del Recordset
    '
    ' Comprobar que hay registros, porque si no hay, dará error
    If (Adodc1.Recordset.EOF Or Adodc1.Recordset.BOF) Then
        ' Avisar de que no hay registros
        Adodc1.Caption = "Ningún registro activo"
    Else
        ' Eliminar el registro actual
        Adodc1.Recordset.Delete
        '
        ' Movemos al primer registro para que los cambios se hagan permanentes
        ' (también podriamos haberlo movido al último registro)
        Adodc1.Recordset.MoveFirst
    End If
End Sub

Private Sub cmdBuscar_Click()
    ' Buscar el primer registro que coincida con el dato buscado
    Buscar
End Sub

Private Sub cmdBuscarSig_Click()
    ' Buscar el siguiente
    Buscar True
End Sub

Private Sub cmdSalir_Click()
    Unload Me
End Sub

Private Sub Form_Load()
    '
    Text2 = ""
    Option2.Value = True
    '
    ' Indicar el path correcto de la base de datos
    ' ¡ACUERDATE DE PONER EL PATH CORRECTO!
    Const sPathBase As String = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB"
    '
    ' Crear la conexión manualmente
    ' Con "Provider=Microsoft.Jet.OLEDB.4.0;" se permite abrir bases de datos de Access 2000
    With Me.Adodc1
        .ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & sPathBase & ";"
        ' Indicarle de que tabla vamos a leer los datos
        .RecordSource = "Authors"
    End With
    ' Indicar el DataSource de los Textboxes
    ' ya que con ADO se puede asignar en tiempo de ejecución
    Dim i As Long
    For i = 0 To 2
        Set Text1(i).DataSource = Adodc1
    Next
    ' Asignar los campos
    Text1(0).DataField = "Au_ID"
    Text1(1).DataField = "Author"
    Text1(2).DataField = "Year Born"
    ' Mostrar en las etiquetas el campo a usar
    For i = 0 To 2
        Label1(i).Caption = Text1(i).DataField & ":"
    Next
End Sub

Private Sub Text2_KeyPress(KeyAscii As Integer)
    ' Se buscará sólo cuando pulsemos INTRO
    '
    ' Comprobar si la tecla pulsada es Intro: vbKeyReturn o 13 que es lo mismo
    If KeyAscii = vbKeyReturn Then
        On Error Resume Next
        ' Esta asignación evita que suene un BEEP
        KeyAscii = 0
        '
        Buscar
    End If
End Sub

Private Sub Buscar(Optional ByVal Siguiente As Boolean = False)
    ' Procedimiento para buscar el dato indicado                    (18/Ene/01)
    ' Si Siguiente = True, se busca a partir del registro activo
    Dim nReg As Long
    Dim vBookmark As Variant ' En ADO debe ser Variant, no vale un String
    Dim sADOBuscar As String
    '
    ' Iniciamos la detección de errores
    On Error Resume Next
    '
    ' Buscar la primera coincidencia en el recordset del Data1
    If Option1.Value Then
        ' Convertir el contenido de TextBox en un número
        nReg = Val(Text2)
        ' en el campo Au_ID
        sADOBuscar = "Au_ID = " & nReg
    End If
    If Option2.Value Then
        ' en el campo Author
        sADOBuscar = "Author Like '" & Text2.Text & "'"
    End If
    ' Guardar la posición anterior, por si no se halla lo buscado...
    vBookmark = Adodc1.Recordset.Bookmark
    '
    If Siguiente = False Then
        ' Buscar desde el principio
        Adodc1.Recordset.MoveFirst
        Adodc1.Recordset.Find sADOBuscar
    Else
        ' Busca a partir del registro actual
        Adodc1.Recordset.Find sADOBuscar, 1
    End If
    ' Devolverá un error si no se halla lo buscado
    ' aunque no siempre es así...
    If Err.Number Or Adodc1.Recordset.BOF Or Adodc1.Recordset.EOF Then
        Err.Clear
        MsgBox "No existe el dato buscado o ya no hay más datos que mostrar."
        ' Posicionar el recordset en la posición guardada
        Adodc1.Recordset.Bookmark = vBookmark
    End If
End Sub


Y con esto acabamos la introducción a las bases de datos.
En futuras entregas veremos otras cosillas sobre el acceso a datos, aunque antes de seguir con el acceso a base de datos, empezaremos a ver un nuevo tipo de módulo de código: las clases. Así que... prepárate para lo que viene.

Nos vemos
Guillermo
P.S.
Si quieres bajarte los ejemplos usados, pulsa este link. (basico36_cod.zip 4.21 KB)


 
entrega anterior ir al índice siguiente entrega

Ir al índice principal del Guille