Curso Básico de Programación
en Visual Basic

 

Entrega Treinta y cuatro: 8/Dic/2000
por Guillermo "guille" Som

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

 

Te creías que ya no iba a seguir con el curso básico ¿verdad? Pues te has vuelto a equivocar... Sé que últimamente no soy muy "constante" en esto de las entregas del Curso Básico, pero... alguna que otra vez me dejo "ver". Y ya lo estás "viendo", aquí estamos de nuevo, con una nueva entrega del Curso Básico, el tema en esta ocasión será:

Las bases de datos (¡por fin!)

Aunque empezaremos de forma muy básica, aunque en entregas posteriores veremos cosas más avanzadas, todo se andará, así que no pierdas la esperanza de que algún siglo de estos (¿el que viene?) acabe con el dichoso Curso Básico de Programación en Visual Basic...
La verdad es que tengo que darme prisa, ya que, si me descuido, la nueva versión del VB (VB.NET) estará en la calle y muchas de las cosas dichas hasta ahora no sean válidas... aunque los conceptos "básicos" seguirán siendo válidos, no así los conceptos "particulares" de cada una de las versiones del Visual Basic... en su momento veremos esas diferencias, por ahora hagamos como que no hay ninguna nueva versión que cambie "radicalmente" la forma de "pensar" del Visual Basic actual.
Los ejemplos que voy a utilizar, está hechos con la versión 6.0 del VB, aunque funcionarán, (o al menos deberían funcionar), perfectamente con las versiones 4.0 y superiores... confiemos en ello.

Y ya, sin más dilación, empecemos con el acceso a bases de datos desde el Visual Basic, para ello usaremos como base de ejemplo la incluida en todas las versiones del VB: Biblio.mdb, si no la tienes, necesitarás un poco de imaginación, espero que eso no sea un problema. (Guille, aquí tendrías que haber dicho algo como... "para una mente tan inteligente como la tuya", de esa forma, le darías coba al personal y se mosquearía menos contigo, por no tener la base de ejemplo, ¿cuando vas a aprender?)

Después del comentario del "otro Guille", empecemos con:

El diseño del formulario

Hay quién se queja de que no explico de forma "simplona" cómo crear los formularios y añadir los controles que se usan, en esta ocasión, "intentaré" hacerlo... a ver si lo consigo.

Crea un nuevo proyecto normal, automáticamente se añadirá un formulario llamado Form1.
Pulsa F4 para que se muestre la ventana de propiedades y en la propiedad Caption, escribe: Entrega 34, acceso a datos, verás que en la barra de "caption" del formulario se muestra lo escrito.
Ahora vamos a añadir un Control Data que será el que nos permita acceder a la base de datos que necesitemos usar, para ello, pulsa en el icono: que está en la barra de herramientas del IDE del Visual Basic, si no está visible dicha barra de herramientas, puedes mostrarla de la siguiente forma: (te recuerdo que estoy usando la versión inglesa del Visual Basic, así que si las traducciones son erróneas... échale un poco de imaginación...) 
En el menú Ver (View), pulsa en la opción Barra de Herramientas (Toolbox).
Para añadir cualquiera de los controles que están en la mencionada barra de herramientas, simplemente tienes que hacer una doble pulsación (doble-click) en el icono deseado y se añadirá al formulario. En este caso, se añadirá un Data Control llamado Data1 y el aspecto en el formulario será este:
Selecciónalo (aunque ya debe estar seleccionado) y arrástralo, (es decir: deja pulsado el botón derecho mientras lo mueves), hasta la parte superior del formulario, (para dejar espacio libre al resto de controles que añadiremos a continuación)

Configurando el Data Control (o Control Data)

Ahora vamos a indicarle al Data1 dónde está la base de datos que queremos usar.
Selecciona el Data1 que hemos añadido al formulario, simplemente haz un "click" en dicho control, (debería seguir seleccionado, salvo que hayas pulsado con el ratón en el formulario), pulsa F4 para mostrar la ventana de propiedades y en dicha ventana pulsa en la propiedad DatabaseName, en la columna de la izquierda te mostrará un botón con los tres puntos suspensivos que indican que se mostrará un diálogo, (esto último es una "convención", que nos indica que cuando se seleccione esa opción, en este caso al hacer click en el botón, se mostrará un cuadro de diálogo), para seleccionar un fichero de bases de datos.
El fichero que vamos a usar, Biblio.mdb, normalmente está en el mismo directorio en el que está instalado el Visual Basic, por tanto, tendrás que "localizar" dicho directorio, normalmente suele estar en Archivos de programa\Microsoft Visual Studio\VB98 en el caso del VB6, en el caso del VB5 puede estar en Archivos de programa\DevStrudio\VB o simplemente en DevStudio\VB, de la unidad de arranque, por defecto en C. En el caso del VB4, no recuerdo ahora en que directorio se instalaba...
Una vez seleccionada la base de datos, ya disponemos de una conexión, mediante el control Data a dicha base de datos.
Pero, (como es habitual, siempre hay un pero), en casi todas las bases de datos suelen existir varias "tablas" que contienen datos. Para seleccionar una de las tablas, vuelve a mostrar la ventana de propiedades del control Data y selecciona la propiedad RecordSource, verás que en la cuadrícula de la derecha hay una lista desplegable, en ella se muestran las tablas disponibles, en nuestro ejemplo usaremos la de Autores, por tanto selecciona dicho elemento de la lista, puede que en lugar de llamarse Autores, (si la base de datos no está traducida), se llame Authors.
Ahora si que tenemos configurado nuestro control Data para que muestre los datos almacenados en una tabla de una base de datos.

Para continuar con nuestro ejemplo, vamos a añadir otros controles con los cuales poder mostrar la información contenida en dicha tabla de autores.

Vamos a añadir tres etiquetas (Label) y tres cajas de texto (TextBox)
En la barra de herramientas haz doble-click en el icono de las etiquetas: , (si posicionas el puntero del ratón sobre dicho "icono", verás que te muestra un ToolTip con el texto Label), se añadirá un nuevo control al formulario llamado Label1, posiciona dicha etiqueta en la parte izquierda del formulario, debajo del control Data1 y vuelve a repetir la operación dos veces más, (posiciona cada una de las etiquetas debajo de la anterior), para obtener un total de tres etiquetas: Label1, Label2 y Label3 respectivamente.
Para añadir las tres cajas de texto que necesitamos, repite la operación, pero en este caso el control que debes elegir de la barra de herramientas es: (TextBox). Alinéalos a la derecha de cada una de las etiquetas anteriores. Ahora tendremos también estos tres controles: Text1, Text2 y Text3, el aspecto del formulario sería el siguiente:



Vamos a cambiar el tamaño de las etiquetas y las cajas de texto.
Selecciona la primera etiqueta (Label1) y haz que el alto de la misma sea 315, esto puedes hacerlo de dos formas:
1.) Usando el el ratón, arrastra hacia arriba desde la parte inferior del control (al seleccionar se muestran unos cuadros que indican que puedes cambiar el tamaño arrastrando en cualquiera de ellos, según la posición de dicho "cuadro" servirá para el ancho, alto o ambos)
2.) Escribiendo dicho tamaño en la ventana de propiedades, en este caso en la propiedad Height.

Para que las tres etiquetas tengan el mismo tamaño, podemos hacerlo también de dos formas, para que se cambien de tamaño todas las etiquetas a un mismo tiempo, en lugar de ir cambiado cada una de ellas por separado:
1.) Selecciona las tres etiquetas y escribe el tamaño en la propiedad Height de la ventana de propiedades.
2.) Selecciona las etiquetas Label3, Label2 y por último Label1, (manteniendo pulsado la tecla Ctrl y haciendo un simple Click con el ratón), abre el menú Formato (Format) y selecciona la opción Hacer del mismo tamaño (Make same size), de dicho menú, selecciona Altura (Height). En este procedimiento, es importante que el último control seleccionado sea el que indique el tamaño con el que queremos igualar el resto de los controles.

Seguramente todo esto ya lo sabrás, pero... (de alguna forma hay que hacer que esta entrega sea más larga, ¿verdad Guille?)

A continuación vamos a cambiar el tamaño de las cajas de texto:
Selecciona Text1 y haz que el ancho sea: 2895.
Selecciona los otros dos controles e iguálalos en el ancho... imagínate cómo...

El aspecto final será este otro:



Una vez diseñado el "aspecto" del formulario, (eres libre de adecuarlo a tus gustos particulares), vamos a indicarle al Visual Basic que nos muestre información de la tabla de autores en cada una de las cajas de texto:
Selecciona las tres cajas de texto, pulsa en la ventana de propiedades y selecciona la propiedad DataSource, con esta propiedad indicamos que Data control queremos usar con cada caja de texto, (o con cualquier otro control que tenga la mencionada propiedad).
En la lista desplegable, selecciona el único elemento que hay: Data1 (o el nombre que le hayamos dado al control data).
Ahora vamos a "enganchar" cada una de los textboxes con un registro de la mencionada tabla de autores:
Selecciona el control Text1 y en la ventana de propiedades selecciona DataField, de la lista desplegable selecciona Au_ID.
En los otros controles, selecciona Author para el Text2 y Year Born para el Text3.
Ahora asignemo al caption de las etiquetas los datos que nos mostrará, asigna el Caption de cada una de las tres etiquetas, (ya sabes, pulsa en la etiqueta, muestra la ventana de propiedades y modifica la propiedad Caption), con estos valores: ID: para el Label1, Autor: para el Label2 y Año nacimiento: para el Label3.

¡Y ya está!

Pulsa F5 para ejecutar el proyecto y verás que se muestra el primer registro, (seguramente en el año de nacimiento Year Born, no te muestre nada hasta que llegues al registro 73.)
Para mostrar el resto de registros, pulsa en los botones de "desplazamiento" del control data, dichos controles sirven para ir al: Primero, anterior, siguiente y último respectivamente.
Si escribes o modificas lo que se muestra, también se modificará en la base de datos.

Fíjate que no hemos usado ni una línea de código, entre otras cosas porque todo lo hemos realizado en tiempo de diseño.

Pero ahora vamos a ver cómo hacer que todo esto funcione igual, pero en lugar de hacerlo en tiempo de diseño, lo haremos en tiempo de ejecución, es decir: al ejecutar el proyecto, aunque la asignación de la propiedad DataSource de las cajas de texto hay que hacerlo en tiempo de diseño, ya que no se puede hacer en tiempo de ejecución.
Para ello usaremos otro formulario, con los mismos controles que el actual, pero sin "conectarlos" a ninguna tabla de una base de datos ni nada de eso.
Antes guarda el proyecto actual, yo lo he llamado Basico34.vbp, el formulario lo he guardado como fBasico34.frm

Crea un nuevo proyecto, añade un formulario, en éste añade un Data control, tres etiquetas y tres cajas de texto, selecciona las tres cajas de texto y en la ventana de propiedades selecciona DataSource y asigna el Data1, además de asignar el tamaño, tanto de las cajas de texto como de las etiquetas.

Ya deberías saber que cuando se ejecuta una aplicación de Visual Basic y por defecto se muestra un formulario, al mostrarse dicho formulario, se ejecuta, (entre otros), el evento Form_Load, será en este evento donde le indiquemos al Visual Basic que base de datos usaremos, que tabla y que campos.
Veamos el código, para poder introducir este código, haz doble click en el formulario, por defecto se mostrará el evento Form_Load.

'
Private Sub Form_Load()
    ' Indicarle el path de la base de datos
    ' ¡ACUERDATE DE PONER EL PATH CORRECTO!
    Data1.DatabaseName = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB"
    '
    ' Indicarle que tabla queremos usar
    Data1.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

Pulsa F5 y verás que también funciona.

Para ir abriendo boca de lo que seguirá, vamos a añadir una caja de texto en la cual se podrá escribir un número y al pulsar INTRO se mostrará el autor que tenga ese número como Au_ID, para ello añade una nueva caja de texto, no asignes el DataSource, ya que este texbox no estará ligado a la base de datos.
La posición y el tamaño de esa caja de texto que he puesto es la siguiente: Left= 1500, Top= 120, Width = 615 y 315 de altura. El nombre es Text4.

Lo que vamos a hacer es que cuando se pulse INTRO en ese control, se convertirá el valor introducido a un número y se hará una búsqueda en el contenido del Data1, aquí te muestro el código:

'
Private Sub Text4_KeyPress(KeyAscii As Integer)
    ' Se buscará sólo cuando pulsemos INTRO
    Dim nReg As Long
    '
    ' Comprobar si la tecla pulsada es Intro: 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 TextBox 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

Para realizar la búsqueda he usado 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 o sea el valor introducido en el Text4.
En caso de que no se halle el valor buscado, no se alterará el registro actual, es decir "aparentemente" no pasará nada y todo se quedará tal y como estaba... o bien se pondrá en el primer registro, creo que es esto último lo que ocurre...

Ahora vamos a buscar en el campo Autor.

A diferencia del campo Au_ID, que es numérico y sólo buscamos una coincidencia "exacta", el campo Autor es del tipo String y en él podríamos buscar una coincidencia exacta, al igual que en el caso del ID o bien "algo" que esté contenido en dicho campo, tal es el caso de que queramos buscar la primera coincidencia de una autora llamada Jane; como habrás comprobado, la información del autor se muestra en el formato Apellido, Nombre, por tanto si queremos buscar el nombre sería más bien complicado, ya que lo que buscamos está al final...
Para ello podemos usar los signos de comodines ? (interrogación) y * (asterisco).
-El primero de ellos sirve para indicarle que no tenga en cuenta el caracter que esté en la posición indicada por la interrogación, por tanto, si buscamos esto: J?an, mostrará tanto Juan como Jean, es decir, dará por bueno cualquier secuencia que empiece por "J", tenga cualquier caracter y acabe por "an".
-En el segundo caso, el del asterisco, si éste está al principio de lo escrito, le estaremos indicando que encuentre todo lo que tenga al final el texto indicado: *Jane, buscará el primer registro que acabe con Jane, pero si especificamos el asterisco al final: Jane*, mostrará todos los registros que empiecen por Jane, por último, si usamos dos asteriscos, uno al principio y otro al final: *Jane*, nos mostrará el primero que "contenga" el nombre indicado, no importando los caracteres que tenga antes o después.
Cuando busquemos datos exactos la comparación la haremos con el signo igual (=), pero si queremos usar la búsqueda con comodines no nos servirá el signo igual, ya que hay que indicarle que queremos usar una comparación más versátil, en este caso usaremos LIKE.
Hay que saber que al buscar en campos del tipo String (cadenas de caracteres), hay que usar los apóstrofes para indicar el principio y final de la cadena buscada, si no lo hiciéramos, se produciría un error.
Después de lo dicho, el código de búsqueda quedaría de la siguiente forma:

'
Private Sub Text4_KeyPress(KeyAscii As Integer)
    ' Se buscará sólo cuando pulsemos INTRO
    Dim nReg As Long
    '
    ' Comprobar si la tecla pulsada es Intro: 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 TextBox en un número
        nReg = Val(Text4)
        ' Buscar la primera coincidencia en el recordset del Data1
        ' en el campo Author
        Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'"
    End If
End Sub

Fíjate que no he usado ningún comodín, por tanto tendrás que escribirlos tú, por ejemplo, para buscar la primera Jane, tendrás que escribir: *Jane en la caja de texto y pulsar Intro.
Haz la prueba, ejecuta el proyecto y 
escribe *Jane en el Text4 y pulsa Intro, te mostrará el registro 1897, (Lenser, Jane),
ahora escribe *Jane* y tras pulsar Intro, te mostrará el registro 840 que contiene Janet, (Hamlin, Janet),
escribe *J y verás que se muestra el registro número 1242, (Baer, J)
para terminar estas pruebas, escribe J* y en esta ocasión se mostrará el registro 1, (Jacobs, Russell)

Y ahora un ejercicio:
Añade dos controles Options para que podamos buscar tanto por el número del ID como por el nombre del Autor, el aspecto del formulario sería este:



El Option1 será el indique que se busque por el ID y Option2 será para buscar por el campo Author.

La solución en la próxima entrega.


Bueno, hasta aquí ha llegado esta primera entrega referente al acceso a datos.
En futuras entregas veremos cómo realizar búsquedas (o consultas), así como otras cosas más, entre ellas acceder a una base de datos sin el Data Control y también al acceso a bases de datos del tipo ADO (activeX Data Objects).
Pero eso será en otra ocasión, hasta entonces, ¡que lo programes bien!

Nos vemos
Guillermo
P.S.
Si quieres bajarte los ejemplos usados (y la solución al ejercicio), pulsa este link. (basico34_cod.zip 4.35 KB)

La página con las soluciones de esta entrega.


 
entrega anterior ir al índice siguiente entrega

Ir al índice principal del Guille