Bases de Datos en Visual Basic 6.0

35
BASES DE DATOS EN VISUAL BASIC 6.0 Las bases de datos 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. 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

description

Bases de Datos en Visual Basic 6.0

Transcript of Bases de Datos en Visual Basic 6.0

Page 1: Bases de Datos en Visual Basic 6.0

BASES DE DATOS EN VISUAL BASIC 6.0

Las bases de datos

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.

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)

Page 2: Bases de Datos en Visual Basic 6.0

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:

Page 3: Bases de Datos en Visual Basic 6.0

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...

Page 4: Bases de Datos en Visual Basic 6.0

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

Page 5: Bases de Datos en Visual Basic 6.0

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

Page 6: Bases de Datos en Visual Basic 6.0

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 IfEnd 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 '

Page 7: Bases de Datos en Visual Basic 6.0

' 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 IfEnd 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

SOLUCION:

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

Page 8: Bases de Datos en Visual Basic 6.0

KeyAscii = 0 ' Convertir el contenido de TextBox 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 IfEnd Sub

Se que hay muchos programadores de VB a los que no les gusta usar el Datacontol para acceder a las bases de datos; pero también se que usar este control es más fácil que usar código directo, aunque esto último también lo vamos a ver a lo largo de este curso básico, incluso lo vamos a mezclar con el Datacontrol, ya que se puede acceder a bases de datos de las dos formas de forma conjunta.En esta entrega vamos a ampliar el ejemplo usado en la entrega anterior, para añadirle algunas opciones nuevas, para añadir nuevos registros y para eliminar registros existentes, por tanto, si quieres conservar intacta la base de datos Biblio.mdb, te recomiendo que hagas una copia de la misma. También vamos a usar la opción de buscar que puse como ejercicio, por tanto, si no te has leído las soluciones de la entrega 34, es conveniente de que le eches un vistazo.

Vamos a empezar por mejorar la búsqueda en la base de datos:

Buscar en una base de datos.

En esta ocasión vamos a añadir un botón buscar y buscar siguiente, para que podamos seguir buscando a partir del último registro encontrado.En el ejemplo anterior, se buscaba al pulsar Intro en la caja de textos, pero ahora vamos a 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, vamos a modificar el código actual para usar el nuevo procedimiento Buscar.

Crea un nuevo procedimiento, en el menú Herramientas (Tools), selecciona Añadir procedimiento..., llámalo Buscar y haz que sea privado, ya que no tiene ningún sentido que sea público, porque sólo se usará desde el formulario.También puedes copiar y pegar el siguiente código:

'Private Sub Buscar() ' Procedimiento para buscar el dato indicado (12/Feb/01) 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

Page 9: Bases de Datos en Visual Basic 6.0

End If If Option2.Value Then ' en el campo Author ' Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'" End IfEnd Sub

Ahora hay que modificar el evento KeyPress del control Text4, para que llame al nuevo procedimiento.Borra el código que había anteriormente en ese evento y sustitúyelo por este otro:

'Private Sub Text4_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 ' Esta asignación evita que suene un BEEP KeyAscii = 0 ' Llamamos al procedimiento Buscar: Buscar End IfEnd Sub

Pruébalo, para que veas que todo funciona como antes.

Ahora, vamos a añadir un botón para que busque el primer registro que coincida con lo escrito, esto es para hacer lo mismo que cuando pulsas Intro en el Text4, pero para el usuario será más lógico que el hecho de tener que pulsar Intro.Por tanto, añade un nuevo botón, (no te preocupes por ahora dónde colocarlo en el formulario, ya lo haremos dentro de poco), cámbiale el nombre a cmdBuscar y el Caption a Buscar, (por defecto será Command1) y escribe o añade este código (también puedes hacerlo copiando y pegando):

'Private Sub cmdBuscar_Click() ' Simplemente llamamos al procedimiento Buscar: BuscarEnd Sub

Poca cosa, ¿verdad? Pues es igual de efectivo que pulsando Intro en el Text4, pruebalo para que veas que funciona.

Creo que ya es hora de que nos vayamos complicando la vida...

Vamos a añadir un botón para seguir buscando a partir del último dato hallado:Añade un nuevo botón, llámalo cmdBuscarSig y en el Caption pones: Buscar siguiente, (seguramente el texto lo escribirá en dos líneas, pero no te preocupes).El código a usar en el evento Click de ese nuevo botón sería prácticamente el mismo que en el de Buscar, aunque antes debemos añadir un nuevo procedimiento para que busque el siguiente dato al último que buscó:

'Private Sub BuscarSiguiente() ' Procedimiento para buscar el dato indicado (12/Feb/01) Dim nReg As Long

Page 10: Bases de Datos en Visual Basic 6.0

' ' 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 IfEnd Sub

Si te fijas, 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ó.Para probar este nuevo procedimiento, en el evento cmdBuscarSig_Click, escribe: BuscarSiguiente.Así es como quedaría ese evento:

Private Sub cmdBuscarSig_Click() ' Buscar el siguiente registro BuscarSiguienteEnd Sub

Como hemos visto, el código usado en los dos procedimientos de búsqueda son prácticamente iguales, así que vamos a unificarlos para crear un sólo procedimiento de búsqueda, de esta forma, refrescarás tu memoria y sabrás algo más de parámetros en procedimientos, así como parámetros opcionales.

Parámetros opcionales.

Como sabrás, (y si no lo sabes, te lo cuento yo ahora), a partir de la versión 4 de Visual Basic se pueden usar parámetros opcionales en los procedimientos y funciones.Esto quiere decir que podemos usar el procedimiento de varias formas, indicando todos los parámetros o sólo los que realmente son necesarios.Por ejemplo, en el caso en que estamos ahora, el procedimiento Buscar podría tener un parámetro opcional para indicarle si es la primera búsqueda o la siguiente.No voy a entrar en demasiadas explicaciones, ya que este tema lo veremos de forma más amplia en otra entrega, sobre todo porque tiene sus pormenores, o lo que es lo mismo, existen diferencias entre las versiones 4 y posteriores (al menos hasta la 6) de Visual Basic e incluso en las dos últimas se puede usar de dos formas diferentes...

En esta ocasión voy a usar el formato de las versiones 5 y 6, en estas versiones los parámetros opcionales pueden ser de un tipo de datos diferente a Variant y también pueden indicársele un valor por defecto, para que, si no se especifica, tenga el valor indicado; por supuesto, si no le indicamos el valor, tendrán el valor que ese tipo de datos tengan por defecto, por ejemplo el tipo Boolean tendrá un valor False si no se indica el valor.Cuando se indican parámetros con tipo, a diferencia de los parámetros del tipo Variant, no se puede usar IsMissing para comprobar si el parámetro se ha especificado o no, pero, eso es otro tema...

Page 11: Bases de Datos en Visual Basic 6.0

Este es el código del procedimiento Buscar y a continuación te indico cómo llamarlo desde el evento Click del botón cmdBuscarSig:

'Private Sub Buscar(Optional ByVal Siguiente As Boolean = False) ' Procedimiento para buscar el dato indicado (12/Feb/01) ' Si Siguiente = True, se busca a partir del registro activo ' Si no se indica, (valdrá False), buscará el primer registro 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) ' ' Si se busca el siguiente dato If Siguiente Then Data1.Recordset.FindNext "Au_ID = " & nReg Else Data1.Recordset.FindFirst "Au_ID = " & nReg End If End If If Option2.Value Then ' en el campo Author ' ' Si se busca el siguiente dato If Siguiente Then Data1.Recordset.FindNext "Author Like '" & Text4.Text & "'" Else Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'" End If End IfEnd Sub

Private Sub cmdBuscarSig_Click() ' Buscar el siguiente registro Buscar TrueEnd Sub

Puedes borrar el procedimiento BuscarSiguiente, ya que no es necesario. Tampoco es necesario modificar el código de los eventos Text4_KeyPress ni el de cmdBuscar_Click, ya que esos dos eventos llaman al procedimiento Buscar con el valor predeterminado y al ser opcional, no es necesario indicarlo...

Si pruebas el nuevo código, te darás cuenta de que, la primera vez, pulsando tanto en Buscar como en Buscar siguiente, encuentra lo mismo, esto es debido a que FindNext, busca a partir de la última posición hallada y en el caso de buscar por primera vez, busca desde el principio.En el caso de que cambies el texto buscado y pulses en Buscar siguiente, se mostrará el próximo registro, desde el último hallado, que contenga dicho texto, (estas pruebas hay que hacerlas en el campo Author, ya que no tienen ningún sentido hacerlo en el ID del autor). Para buscar el resto de autores con el nuevo texto, tendrás que pulsar en Buscar para que empiece a buscar desde el principio.

Page 12: Bases de Datos en Visual Basic 6.0

Fíjate en el código, se da por hecho de que Siguiente tiene un valor, el cual, (al ser del tipo Boolean), puede ser False o True. En caso de que sea True, es decir se ha especificado con ese valor, se buscará con FindNext y en caso de no especificarse o de hacerlo con el valor False, se usará FindFirst.Lo mismo da: Buscar False que Buscar (sin parámetros)Esto último: lo de no especificarse o si se especifica con el valor False, es algo que hay que tener en cuenta si el parámetro fuese de tipo Variant (cosa obligatoria si usas VB4), ya que IsMissing sólo nos informa si el parámetro no se ha especificado, pero si se especifica, puede hacerse con un valor False o True, por tanto, también habría que tenerlo en cuenta... Ya sé que dije que lo iba a dejar para otra entrega... pero, que haces si estás usando VB4 ¿dejar aquí el curso?Así que vamos a ver el código de Buscar para usar con VB4 o con las versiones 5 y 6 pero usando el tipo Variant.

'Private Sub Buscar(Optional ByVal vSiguiente As Variant) ' Procedimiento para buscar el dato indicado (12/Feb/01) ' ' Si Siguiente = True, se busca a partir del registro activo ' Si no se indica, (valdrá False), buscará el primer registro ' ' Cuando el parámetro es de tipo Variant, ' no se puede indicar un valor por defecto, ' así que vamos a usar una variable interna para indicar el valor del parámetro Dim Siguiente As Boolean ' Dim nReg As Long ' ' Asignar correctamente el valor del parámetro indicado ' Si no se especifica, le asignamos el valor por defecto, en este caso: False If IsMissing(vSiguiente) Then Siguiente = False Else ' Si se indica, asignarlo a la variable interna Siguiente = CBool(vSiguiente) End If

' El resto del código es igual que antes

' 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) ' ' Si se busca el siguiente dato If Siguiente Then Data1.Recordset.FindNext "Au_ID = " & nReg Else Data1.Recordset.FindFirst "Au_ID = " & nReg End If End If If Option2.Value Then ' en el campo Author ' ' Si se busca el siguiente dato If Siguiente Then

Page 13: Bases de Datos en Visual Basic 6.0

Data1.Recordset.FindNext "Author Like '" & Text4.Text & "'" Else Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'" End If End IfEnd Sub

Fíjate que he cambiado el nombre del parámetro y he creado una variable interna que es la que posteriormente se usa para saber si se busca desde el primero o desde el anterior.En el caso de que no se haya especificado el parámetro, la comprobación de IsMissing se cumple, por tanto aquí le indicaremos el valor que queramos que tenga por defecto, en nuestro ejemplo no es necesario asignar ningún valor, ya que False es el valor que tendrá la variable Siguiente si no le asignamos ningún valor.Por tanto en este ejemplo, podríamos haber hecho sólo lo siguiente, sin necesidad de usar el IsMissing:Siguiente = CBool(vSiguiente)Pero lo he mostrado de la forma recomendable, para que sepas qué hacer en el caso de que el valor por defecto fuese otro del que Visual Basic asigna a las variables por defecto.

Una vez visto el procedimiento de búsqueda, vamos a añadir dos nuevos botones para Añadir y Eliminar registros.Recuerda lo que te dije al principio: haz una copia de la base de datos para que las pruebas no afecten al contenido de la misma.

Añade dos nuevos botones y asignales los nombres cmdAdd y cmdBorrar, así como los captions Añadir y Eliminar, el código será el siguiente:

'Private Sub cmdAdd_Click() ' Añadir un nuevo registro Data1.Recordset.AddNewEnd Sub

Private Sub cmdBorrar_Click() ' Eliminar el registro actual Data1.Recordset.DeleteEnd 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 probarlo, ejecuta el proyecto, pulsa en Añadir y directamente sin hacer nada más cierra el ejecutable, (pulsando en la x del formulario o ventana).Ejecuta de nuevo el proyecto y si pulsas en el botón de ir al último registro del Datacontrol, verás que no hay ningún registro nuevo.Ahora vuelve a pulsar en Añadir y escribe lo que quieras en las cajas de texto del Nombre y Año de nacimiento y pulsa en el botón de ir al primer registro y después al último (ya sabes que me refiero a los botones del Datacontrol), verás que ahora si se muestra dicho registro y si pulsas en el botón de ir al anterior, verás que se salta un número... ese es el que había reservado para nosotros, pero al no actualizar los datos, se perdió en el limbo...

Page 14: Bases de Datos en Visual Basic 6.0

¿Será por estos detalles que algunos programadores prefieran usar código puro y duro en lugar del Datacontrol?Puede... pero no creo que sea por este motivo... ya que esto mismo se puede mejorar y no es necesario abandonar el Datacontrol para que todo funcione más o menos como debiera...Primero vamos a hacer que los nuevos datos tengan algo, para ello, le asignaremos la cadena Nuevo al nombre del autor y haremos que se desplace al último registro, para que los datos sean permanentes, (si no modificamos algunos de los campos, el nuevo registro se perdería)En el caso de Eliminar, vamos a movernos al primer registro, para que el registro activo sea uno con información.Este sería el código de los eventos Click de los dos botones:

'Private Sub cmdAdd_Click() ' Añadir un nuevo registro Data1.Recordset.AddNew ' Añadimos algún texto, para que no se pierda este registro Text2 = "Nuevo" ' Movemos al último registro para que los cambios se hagan permanentes ' y se muestre el nuevo registro Data1.Recordset.MoveLastEnd Sub

Private Sub cmdBorrar_Click() ' Eliminar el registro actual Data1.Recordset.Delete ' Movemos al primer registro para que los cambios se hagan permanentes ' (también podriamos haberlo movido al último registro) Data1.Recordset.MoveFirstEnd Sub

Toma nota de la forma en que se haría para mover al primer o al último registro del Recordset.También habría que tener en cuenta si hemos sobrepasado el principio o el final de los registros, cosa que ocurre cuando no hay más registros, para ello podemos comprobar tanto EOF (End Of File, final del fichero) como BOF (Beginnig Of File, principio del fichero) y en caso de que sea cierto (True), avisar o simplemente no hacer nada...Esto sólo habría que hacerlo al eliminar registros, ya que al añadir se supone que habrá al menos el que añadimos...

'Private Sub cmdBorrar_Click() ' ' 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 Else ' Eliminar el registro actual Data1.Recordset.Delete ' ' Movemos al primer registro para que los cambios se hagan permanentes ' (también podriamos haberlo movido al último registro) Data1.Recordset.MoveFirst End IfEnd Sub

Page 15: Bases de Datos en Visual Basic 6.0

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 2000With 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

Page 16: Bases de Datos en Visual Basic 6.0

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 2Text1 0 a 2Label2 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)

Page 17: Bases de Datos en Visual Basic 6.0

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

Page 18: Bases de Datos en Visual Basic 6.0

' 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 = 0End 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.MoveLastEnd 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 IfEnd Sub

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

Private Sub cmdBuscarSig_Click() ' Buscar el siguiente Buscar TrueEnd Sub

Page 19: Bases de Datos en Visual Basic 6.0

Private Sub cmdSalir_Click() Unload MeEnd 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 & ":" NextEnd 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 IfEnd 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

Page 20: Bases de Datos en Visual Basic 6.0

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 IfEnd Sub

Confío en que no acabes tarumba con tantas vueltas que estoy dando... la entrega anterior fue sobre las clases en Visual Basic y esta que te ofrezco ahora sigue los pasos de la entrega 36 sobre el acceso a bases de datos, aunque en esta ocasión sin usar el data control y con DAO. En otra entrega, veremos lo mismo, pero usando ADO... hasta que finalmente nos quedemos con ese tipo de acceso a datos, ya que Microsoft no "quiere" que sigamos usando DAO y lo trata como obsoleto, aunque no lo es tanto... pero como hay que está a la última en esto de programación, habrá que hacerles caso... así que también ve preparando el cuerpo, ya que a partir del 2002 la "nueva ola" será .NET y habrá que ir "concienciándose" de la nueva tecnología... pero no te preocupes que también podrás aprenderla... para que no te quedes atrás, aunque eso será en un futuro... talvez no muy lejano...

Cómo acceder a bases de datos DAO, sin el datacontrol.

Empecemos desde el principio... para que te vayas acostumbrando... aunque ya deberías saber crear tus propios formularios y añadir los controles que te indique... aunque prácticamente no te lo haya explicado en el curso, es algo que te enseñan en prácticamente cualquier libro e incluso en los "tutoriales" que incluye el Visual Basic.Sólo decirte que usando la versión 5CCE de Visual Basic no se pueden acceder a datos, así que tendrás que usar la versión Profesional o la Empresarial... pero si de verdad te quieres dedicar a esto de la programación... esa serán las versiones de

Page 21: Bases de Datos en Visual Basic 6.0

las que deberías disponer... y no me preguntes dónde conseguirlas... ya que las venden en cualquier "tienda" de informática o en los distribuidores que puedes encontrar en Internet.

Vayamos al tema que nos interesa, ya que no es plan de hacer "marketing" gratuito a los distribuidores que "no sponsorizan" este curso básico... ¡hum!

Crea un nuevo proyecto, se creará un proyecto con un formulario.Añade los siguientes controles para que el formulario quede con el aspecto que te muestro a continuación, (que es parecido al usado en las entregas anteriores de acceso a datos): 

Aspecto del formulario en tiempo de diseño

Los controles usados son:En la parte superior:cmdMover, un array de 0 a 3Label1, un array de 0 a 2, Text1, un array de 0 a 2cmdAdd, cmdActualizar, cmdBorrarEl segundo grupo:Label2, Text2, Option1, Option2, cmdBuscar, cmdBuscarSigElbotón de salir es: cmdSalir

En el menú Proyecto/Referencias... selecciona Microsoft DAO 3.51 Object Library -aunque también puedes seleccionar cualquier otra que empiece por Microsoft DAO... cualquiera de ellas vale... puede que también tengas la 3.6 e incluso la 2.5/3.51 Compatibility Library, todo dependerá de la versión de DAO que tengas instalada-A diferencia de cuando seleccionas un componente, después de cerrar el cuadro de diálogo no verás nada nuevo en la ventana de herramientas, ya que las referencias no añaden nuevos controles, pero si que añaden nuevas librerías que exponen objetos que podemos usar en nuestra aplicación...

Uno de esos objetos es el objeto Database, el cual se usará para "mantener" una referencia a la base de datos, con la cual podremos abrir recordsets que nos

Page 22: Bases de Datos en Visual Basic 6.0

permitirán, entre otras cosas, introducir y modificar los datos de cualquier tabla incluida en la base de datos a la que queramos acceder...

¿Qué es un Recordset?Según la ayuda de Visual Basic, "Un objeto Recordset representa los registros de una tabla o los registros del resultado de ejecutar una consulta". Una consulta es... eso... una consulta... una especie de búsqueda avanzada, en la que podemos indicar varios criterios de búsqueda... aunque también, como verás pronto, es algo más sencillo que todo eso. No te preocupes que veremos algunos ejemplos de "consultas".

Para poder manejar los objetos Database y Recordset, hay que crear unas variables para dichos objetos, por tanto en la sección de declaraciones del formulario (General/Declaraciones), añade estas líneas:

Option Explicit

Private db As DatabasePrivate rs As Recordset 

De esta forma tendremos una variable llamada db que apuntará al objeto Database y otra, llamada rs, que apuntará a un objeto del tipo Recordset.En el evento Form_Load asignaremos los "objetos reales" a esas dos variables.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á BIBLIO.MDB, la base de ejemplo que se incluye con Visual Basic.

Const sPathBase As String = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB"

A continuación abrimos la base de datos usando la función OpenDatabase, la cual devuelve un objeto de la base de datos recién abierta, uno de los parámetros que espera recibir dicha función es el path de la base de datos que queremos abrir, en nuestro ejemplo usaremos el contenido de la constante anterior: sPathBase.

 ' Crear el objeto de base de datosSet db = OpenDatabase(sPathBase)

A continuación creamos el objeto recordset a partir de una "consulta" realizada a la base de datos, en este caso lo que queremos "consultar" son TODOS los campos de la tabla Authors:

 ' Crear el recordset con la tabla que queremos manipularSet rs = db.OpenRecordset("SELECT * FROM Authors", dbOpenDynaset)

La constante dbOpenDynaset le indica al método OpenRecordset que lo que queremos asignar a la variable rs, (de tipo Recordset), es del tipo Dynaset, este tipo de recordset permite mostrar y modificar los datos asignados a dicho recordset; además de este tipo de recordset, existen otros los cuales sólo se pueden usar para "recorrer" los datos o mostrarlos, si así lo prefieres, pero no permiten modificarlos, ese tipo de recordset también lo veremos en esta misma entrega.

Una vez que tenemos la variable rs, podemos acceder al contenido de la tabla Authors tal y como lo haciamos antes con el control Data. Para que te hagas una

Page 23: Bases de Datos en Visual Basic 6.0

idea, rs tendrá el mismo funcionamiento que el que tenía Data1.Recordset en los ejemplos de las entregas anteriores sobre acceso a datos, en particular las entregas 34 y 35.

Como no tenemos un control data, el cual nos permitía movernos por los diferentes registros de la tabla, en el formulario hay cuatro botones, que se usarán para esa tarea: movernos tanto al primero, anterior, siguiente o último registro, el código para hacerlo es el que te muestro a continuación:

Private Sub cmdMover_Click(Index As Integer) On Error Resume Next ' ' Cuando las propiedades BOF y EOF dan como resultado TRUE, ' es que no hay datos, por tanto, salir del procedimiento If rs.BOF = True And rs.EOF = True Then Exit Sub End If ' ' Mover al registro indicado según el botón pulsado If Index = 0 Then ' Al primero rs.MoveFirst ElseIf Index = 1 Then ' Al anterior rs.MovePrevious ElseIf Index = 2 Then ' Al siguiente rs.MoveNext ElseIf Index = 3 Then ' Al último rs.MoveLast End If ' ' Si estamos antes del primero. mover al primero If rs.BOF Then rs.MoveFirst ' Si estamos después del último, mover al último ElseIf rs.EOF Then rs.MoveLast End If ' Si no se ha producido error, mostrar los datos If Err = 0 Then MostrarRegistro End If ' Err = 0End Sub

Lo primero que hacemos es comprobar si hay datos en el recordset, para ello comprobamos que ni BOF ni EOF den como resultado un valor verdadero. Cuando BOF es True, significa que el recordset está "antes" del primer registro, por otro lado EOF será True cuando estemos después del final de los registros. Cuando estas dos propiedades devuelven un valor verdadero, es que no hay datos en el recordset.

A continuación movemos el "puntero" del recordset al registro indicado, según el valor de Index sabremos que botón se ha pulsado y por tanto que "acción" tenemos que elegir. En los comentarios puedes ver qué valor corresponde con cada movimiento.

Page 24: Bases de Datos en Visual Basic 6.0

Como es posible que el usuario pulse en el botón anterior o siguiente después de estar al principio o al final respectivamente, tenemos que "controlar" si ya estamos al principio o al final del recordset para posicionarnos en el registro adecuado.

Por último, si todo ha ido bien, (no se ha producido un error), llamamos al procedimiento que muestra el contenido del registro activo en las cajas de texto.Esto último lo hace el procedimiento MostrarRegistro, cuyo código es el siguiente:

Private Sub MostrarRegistro() ' Mostrar los datos del registro actual ' A este procedimiento hay que llamarlo cada vez que ' queramos mostrar los datos del registro actual. With rs Text1(0) = .Fields("Au_ID") Text1(1) = .Fields("Author") Text1(2) = .Fields("Year Born") End WithEnd Sub

Si le echas un vistazo al código de las pruebas con el control Data, notarás que no era necesario llamar expresamente a un procedimiento para que los datos se mostraran, esto era así porque el propio datacontrol se encargaba de actualizar la información en los controles que tenía "enlazados", pero ahora no tenemos un control que "automatice" esta tarea, así que, tenemos que hacerlo por nuestros medios... por suerte no es tan difícil.

Ahora vamos a ver los procedimientos de Añadir un nuevo registro, actualizar uno ya existente y eliminar el registro actual. En el propio código encontrarás la explicación de que es lo que hace cada línea usada.

El código de Añadir un nuevo registro:

Private Sub cmdAdd_Click() ' Añadir un nuevo registro With rs .AddNew ' Añadimos algún texto, para saber que es un nuevo dato .Fields("Author") = "Nuevo Autor" ' Actualizamos los datos, para que se graben en el recordset .Update End WithEnd Sub

El código de Actualizar el contenido de las cajas de texto en el recordset:

Private Sub cmdActualizar_Click() ' Guardar el contenido de las cajas de texto With rs ' Antes de actualizar los datos del recordset, ' hay que ponerlo en modo edición .Edit ' Este campo es autonumérico, así que no asignarlo '.Fields("Au_ID") = Text1(0) + 0 ' Añadimos una cadena vacía al final ' ya que si Text1(1) está vacío, se asignará un valor NULL y dará error .Fields("Author") = Text1(1) & ""

Page 25: Bases de Datos en Visual Basic 6.0

' Idem con el año de nacimiento, pero como es numérico, se sumará 0 .Fields("Year Born") = Text1(2) + 0 ' Actualizar los datos en el recordset .Update End WithEnd Sub

Y por último el código para eliminar un registro... como siempre, borrar es muy fácil...

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 Not (rs.EOF Or rs.BOF) Then ' Eliminar el registro actual rs.Delete ' ' Movemos al primer registro cmdMover_Click 0 End IfEnd Sub

Bien, básicamente estas tareas son prácticamente iguales a las usadas con el datacontrol, con la salvedad de que hay que mostrar los datos cuando se cambia el registro activo.Ahora veremos el código usado para buscar los datos, el cual es también prácticamente lo mismo que cuando se tenía el datacontrol. Fíjate que la única diferencia es que en lugar de usar la propiedad Recordset del datacontrol, se usa el recordset "cargado" con los datos y que está contenido en la variable rs.

Este es el código de buscar y buscar siguiente, para lo cual usamos los métodos FindFirst y FindNext respectivamente.

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

Private Sub cmdBuscarSig_Click() ' Buscar el siguiente 'Buscar Siguiente:=True Buscar TrueEnd 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 sBookmark As String Dim sBuscar As String ' ' Iniciamos la detección de errores On Error Resume Next

Page 26: Bases de Datos en Visual Basic 6.0

' ' 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 sBuscar = "Au_ID = " & nReg End If If Option2.Value Then ' en el campo Author sBuscar = "Author Like '" & Text2.Text & "'" End If ' With rs ' Guardar la posición anterior, por si no se halla lo buscado... sBookmark = .Bookmark ' If Siguiente = False Then ' Buscar desde el principio .MoveFirst .FindFirst sBuscar Else ' Busca a partir del registro actual .FindNext sBuscar End If ' Devolverá un error si no se halla lo buscado ' aunque no siempre es así... If .NoMatch 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 .Bookmark = sBookmark End If ' Mostrar los datos del registro actual MostrarRegistro End WithEnd Sub

¿Cómo realizar consultas con DAO?

Ya hemos visto cómo introducir y modificar registros, también hemos visto cómo buscar un dato y seguir mostrando el resto de las coincidencias que se vayan produciendo. Pero hay ocasiones en las que a veces es necesario poder ver TODO el resultado de la búsqueda, incluso a veces nos interesa buscar más de un dato a la vez. Eso mismo se puede hacer con FindFirst y FindNext, es decir, podemos buscar en más de un campo del mismo registro el dato o datos que nos interesa a un mismo tiempo. Pero además de usar recordsets de sólo lectura, podemos acelerar esa tarea de "obtener" la información que queramos realizando consultas en lugar de ir buscando uno por uno los datos. Independientemente de cómo hagamos la consulta, siempre nos quedará el recurso de poder usar los métodos FindXXX para buscar a su vez datos dentro del resultado de la consulta, ya que al fin y al cabo el resultado de dicha consulta se almacena en un objeto recordset... ¡que lio! ahora veremos con ejemplos cómo funciona todo esto.

Para mostrar el resultado de la "búsqueda" o consulta, vamos a usar un control ListView.Para añadir un control ListView a nuestro proyecto, primero hay que "añadir" el control a la barra de herramientas de Visual Basic, para ello, selecciona la opción

Page 27: Bases de Datos en Visual Basic 6.0

Componentes del menú Proyecto y del cuadro de diálogo que te muestra, selecciona Microsoft Windows Common Controls, (pude que a continuación de este nombre te muestre la versión de Visual Basic, en mi caso, me muestra 6.0, pero también la 5.0 (SP2), ya que tengo instalado esas dos versiones de VB.Una vez que has pulsado en Aceptar, verás que se han añadido nuevos controles a la barra de herramientas (ToolBox), selecciona el que representa al Listview y añadelo al formulario, mediante código configuraremos la apariencia.Si quieres puedes crearte un nuevo proyecto para esta "segunda" prueba, ya que, además de añadir el ListView, también vamos a quitar los botones de búsqueda, porque no tiene sentido tenerlos... al menos para el propósito de este ejemplo.El aspecto del formulario sería el siguiente:

El aspecto, en tiempo de diseño, del segundo formulario

El código para configurar el ListView en tiempo de ejecución para mostrar la información de la tabla Authors de la base de datos Biblio.mdb lo pondremos en el evento Form_Load y es el siguiente:

With ListView1 ' El tipo de Listview que queremos es del tipo "reporte" .View = lvwReport ' Que muestre las líneas de separación entre datos .GridLines = True ' Que no se puedan modificar los datos del listview .LabelEdit = lvwManual ' Añadimos las cabeceras .ColumnHeaders.Add , , "Au_ID", 900 .ColumnHeaders.Add , , "Autor", 2700 .ColumnHeaders.Add , , "Año nacimiento", 1500, lvwColumnRight End With

Page 28: Bases de Datos en Visual Basic 6.0

Ahora la búsqueda sólo se hará por el nombre del autor y se mostrarán en la lista todos los autores que coincidan con los datos que queremos buscar. El código del botón Buscar sería el siguiente:

Private Sub cmdBuscar_Click() ' Mostrar los datos en el listview Dim sBuscar As String Dim tRs As Recordset Dim tLi As ListItem ' ' Formar la cadena de la consulta: ' Se busca por el nombre del autor y se muestran clasificados por el nombre sBuscar = "SELECT * FROM Authors WHERE Author LIKE '" & Text2 & "' ORDER BY Author" ' Creamos un recordset del tipo "estático", el cual no es modificable ' para poder modificarlo, tendría que ser del tipo dbOpenDynamic Set tRs = db.OpenRecordset(sBuscar, dbOpenSnapshot) ' Comprobar que hay datos en el recordset With tRs ' Si no hay datos... If (.BOF And .EOF) Then MsgBox "No se han encontrado los datos buscados" Else ' Mostrar los datos hallados ListView1.ListItems.Clear .MoveFirst Do While Not .EOF Set tLi = ListView1.ListItems.Add(, , .Fields("Au_ID") & "") tLi.SubItems(1) = .Fields("Author") & "" tLi.SubItems(2) = .Fields("Year Born") & "" .MoveNext Loop End If End WithEnd Sub

En otra ocasión veremos cómo "diseñar" un formulario para consultas con distintas opciones de búsqueda, así como para búsqueda en múltiples campos.