Está en la página 1de 29

BASES DE DATOS EN VISUAL BASIC 6.

0
Las bases de datos
Aunque empezaremos de forma muy bsica, aunque en entregas posteriores veremos
cosas ms avanzadas, todo se andar, as que no pierdas la esperanza de que algn
siglo de estos (el que viene?) acabe con el dichoso Curso Bsico de Programacin
en Visual Basic...
La verdad es que tengo que darme prisa, ya que, si me descuido, la nueva versin del
VB (VB.NET) estar en la calle y muchas de las cosas dichas hasta ahora no sean
vlidas... aunque los conceptos "bsicos" seguirn siendo vlidos, 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 versin que cambie "radicalmente" la forma de "pensar" del Visual Basic actual.
Los ejemplos que voy a utilizar, est hechos con la versin 6.0 del VB, aunque
funcionarn, (o al menos deberan funcionar), perfectamente con las versiones 4.0 y
superiores... confiemos en ello.
Y ya, sin ms dilacin, 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, necesitars un poco de imaginacin, espero que eso
no sea un problema.

El diseo del formulario


Hay quin se queja de que no explico de forma "simplona" cmo crear los formularios
y aadir los controles que se usan, en esta ocasin, "intentar" hacerlo... a ver si lo
consigo.
Crea un nuevo proyecto normal, automticamente se aadir 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, vers que en la barra de "caption" del formulario
se muestra lo escrito.
Ahora vamos a aadir 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 versin inglesa del Visual Basic, as que si las traducciones son errneas... chale
un poco de imaginacin...)
En el men Ver (View), pulsa en la opcin Barra de Herramientas (Toolbox).
Para aadir cualquiera de los controles que estn en la mencionada barra de
herramientas, simplemente tienes que hacer una doble pulsacin (doble-click) en el
icono deseado y se aadir al formulario. En este caso, se aadir un Data Control
llamado Data1 y el aspecto en el formulario ser este:
Seleccinalo (aunque ya debe estar seleccionado) y arrstralo, (es decir: deja pulsado
el botn derecho mientras lo mueves), hasta la parte superior del formulario, (para
dejar espacio libre al resto de controles que aadiremos a continuacin)
Configurando el Data Control (o Control Data)

Ahora vamos a indicarle al Data1 dnde est la base de datos que queremos usar.
Selecciona el Data1 que hemos aadido al formulario, simplemente haz un "click" en
dicho control, (debera seguir seleccionado, salvo que hayas pulsado con el ratn 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 botn
con los tres puntos suspensivos que indican que se mostrar un dilogo, (esto ltimo
es una "convencin", que nos indica que cuando se seleccione esa opcin, en este
caso al hacer click en el botn, se mostrar un cuadro de dilogo), 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, tendrs 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 conexin, 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, vers que en la cuadrcula 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 aadir otros controles con los cuales
poder mostrar la informacin contenida en dicha tabla de autores.
Vamos a aadir 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 ratn sobre dicho "icono", vers que te muestra un ToolTip
con el texto Label), se aadir 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 operacin dos veces ms, (posiciona cada una de las etiquetas
debajo de la anterior), para obtener un total de tres etiquetas: Label1, Label2 y Label3
respectivamente.
Para aadir las tres cajas de texto que necesitamos, repite la operacin, pero en este
caso el control que debes elegir de la barra de herramientas es:
(TextBox).
Alinalos a la derecha de cada una de las etiquetas anteriores. Ahora tendremos
tambin estos tres controles: Text1, Text2 y Text3, el aspecto del formulario sera el
siguiente:

Vamos a cambiar el tamao 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 ratn, arrastra hacia arriba desde la parte inferior del control (al
seleccionar se muestran unos cuadros que indican que puedes cambiar el tamao
arrastrando en cualquiera de ellos, segn la posicin de dicho "cuadro" servir para el
ancho, alto o ambos)
2.) Escribiendo dicho tamao en la ventana de propiedades, en este caso en la
propiedad Height.
Para que las tres etiquetas tengan el mismo tamao, podemos hacerlo tambin de dos
formas, para que se cambien de tamao 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 tamao 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 ratn), abre el men Formato (Format) y
selecciona la opcin Hacer del mismo tamao (Make same size), de dicho men,
selecciona Altura (Height). En este procedimiento, es importante que el ltimo control
seleccionado sea el que indique el tamao con el que queremos igualar el resto de los
controles.
Seguramente todo esto ya lo sabrs, pero... (de alguna forma hay que hacer que esta
entrega sea ms larga, verdad Guille?)
A continuacin vamos a cambiar el tamao de las cajas de texto:
Selecciona Text1 y haz que el ancho sea: 2895.
Selecciona los otros dos controles e igulalos en el ancho... imagnate cmo...

El aspecto final ser este otro:

Una vez diseado el "aspecto" del formulario, (eres libre de adecuarlo a tus gustos
particulares), vamos a indicarle al Visual Basic que nos muestre informacin 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 Ao nacimiento: para el Label3.
Y ya est!
Pulsa F5 para ejecutar el proyecto y vers que se muestra el primer registro,
(seguramente en el ao 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, tambin se modificar en la base de
datos.
Fjate que no hemos usado ni una lnea de cdigo, entre otras cosas porque todo lo
hemos realizado en tiempo de diseo.
Pero ahora vamos a ver cmo hacer que todo esto funcione igual, pero en lugar de
hacerlo en tiempo de diseo, lo haremos en tiempo de ejecucin, es decir: al ejecutar
el proyecto, aunque la asignacin de la propiedad DataSource de las cajas de
texto hay que hacerlo en tiempo de diseo, ya que no se puede hacer en tiempo

de ejecucin.
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, aade un formulario, en ste aade 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, adems de asignar el tamao,
tanto de las cajas de texto como de las etiquetas.
Ya deberas saber que cuando se ejecuta una aplicacin 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 cdigo, para poder introducir este cdigo, 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 vers que tambin funciona.
Para ir abriendo boca de lo que seguir, vamos a aadir una caja de texto en la cual
se podr escribir un nmero y al pulsar INTRO se mostrar el autor que tenga ese
nmero como Au_ID, para ello aade una nueva caja de texto, no asignes el
DataSource, ya que este texbox no estar ligado a la base de datos.
La posicin y el tamao 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 nmero y se har una bsqueda en el contenido del Data1, aqu
te muestro el cdigo:
'
Private Sub Text4_KeyPress(KeyAscii As Integer)
' Se buscar slo 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 asignacin evita que suene un BEEP
KeyAscii = 0
' Convertir el contenido de TextBox en un nmero
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 bsqueda 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 nmero 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 numrico y slo buscamos una coincidencia
"exacta", el campo Autor es del tipo String y en l podramos 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 habrs comprobado, la informacin del autor se muestra en el formato
Apellido, Nombre, por tanto si queremos buscar el nombre sera ms bien complicado,
ya que lo que buscamos est al final...
Para ello podemos usar los signos de comodines ? (interrogacin) y * (asterisco).
-El primero de ellos sirve para indicarle que no tenga en cuenta el caracter que est en
la posicin indicada por la interrogacin, 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
despus.
Cuando busquemos datos exactos la comparacin la haremos con el signo igual (=),
pero si queremos usar la bsqueda con comodines no nos servir el signo igual, ya
que hay que indicarle que queremos usar una comparacin ms verstil, en este caso
usaremos LIKE.
Hay que saber que al buscar en campos del tipo String (cadenas de caracteres), hay
que usar los apstrofes para indicar el principio y final de la cadena buscada, si no lo
hiciramos, se producira un error.
Despus de lo dicho, el cdigo de bsqueda quedara de la siguiente forma:
'
Private Sub Text4_KeyPress(KeyAscii As Integer)
' Se buscar slo 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 asignacin evita que suene un BEEP
KeyAscii = 0
' Convertir el contenido de TextBox en un nmero
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
Fjate que no he usado ningn comodn, por tanto tendrs que escribirlos t, por
ejemplo, para buscar la primera Jane, tendrs 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 vers que se muestra el registro nmero 1242, (Baer, J)
para terminar estas pruebas, escribe J* y en esta ocasin se mostrar el registro 1,
(Jacobs, Russell)
Y ahora un ejercicio:
Aade dos controles Options para que podamos buscar tanto por el nmero del ID
como por el nombre del Autor, el aspecto del formulario sera 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 slo 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 asignacin evita que suene un BEEP

KeyAscii = 0
' Convertir el contenido de TextBox en un nmero
nReg = Val(Text4)
' Buscar la primera coincidencia en el recordset del Data1
If Option1.Value Then
' en el campo Au_ID
Data1.Recordset.FindFirst "Au_ID = " & nReg
End If
If Option2.Value Then
' en el campo Author
Data1.Recordset.FindFirst "Author Like '" & Text4.Text &
"'"

End If
End If
End Sub
Se que hay muchos programadores de VB a los que no les gusta usar el Datacontol
para acceder a las bases de datos; pero tambin se que usar este control es ms
fcil que usar cdigo directo, aunque esto ltimo tambin lo vamos a ver a lo largo
de este curso bsico, 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
aadirle algunas opciones nuevas, para aadir 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. Tambin vamos
a usar la opcin de buscar que puse como ejercicio, por tanto, si no te has ledo las
soluciones de la entrega 34, es conveniente de que le eches un vistazo.
Vamos a empezar por mejorar la bsqueda en la base de datos:

Buscar en una base de datos.


En esta ocasin vamos a aadir un botn 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, segn el parmetro recibido,
buscar la primera coincidencia o seguir buscando desde el ltimo dato hallado.
Antes de aadir un nuevo botn, vamos a modificar el cdigo actual para usar el
nuevo procedimiento Buscar.
Crea un nuevo procedimiento, en el men Herramientas (Tools), selecciona Aadir
procedimiento..., llmalo Buscar y haz que sea privado, ya que no tiene ningn
sentido que sea pblico, porque slo se usar desde el formulario.
Tambin puedes copiar y pegar el siguiente cdigo:
'
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 nmero
nReg = Val(Text4)
'

Data1.Recordset.FindFirst "Au_ID = " & nReg


End If
If Option2.Value Then
' en el campo Author
'
Data1.Recordset.FindFirst "Author Like '" & Text4.Text & "'"
End If
End Sub
Ahora hay que modificar el evento KeyPress del control Text4, para que llame al
nuevo procedimiento.
Borra el cdigo que haba anteriormente en ese evento y sustityelo por este otro:
'
Private Sub Text4_KeyPress(KeyAscii As Integer)
' Se buscar slo cuando pulsemos INTRO
'
' Comprobar si la tecla pulsada es Intro: vbKeyReturn o 13 que es
lo mismo
If KeyAscii = vbKeyReturn Then
' Esta asignacin evita que suene un BEEP
KeyAscii = 0
' Llamamos al procedimiento Buscar:
Buscar
End If
End Sub
Prubalo, para que veas que todo funciona como antes.

Ahora, vamos a aadir un botn 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 ms lgico que el hecho de tener que pulsar Intro.
Por tanto, aade un nuevo botn, (no te preocupes por ahora dnde colocarlo en el
formulario, ya lo haremos dentro de poco), cmbiale el nombre a cmdBuscar y el
Caption a Buscar, (por defecto ser Command1) y escribe o aade este cdigo
(tambin puedes hacerlo copiando y pegando):
'
Private Sub cmdBuscar_Click()
' Simplemente llamamos al procedimiento Buscar:
Buscar
End 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 aadir un botn para seguir buscando a partir del ltimo dato hallado:
Aade un nuevo botn, llmalo cmdBuscarSig y en el Caption pones: Buscar
siguiente, (seguramente el texto lo escribir en dos lneas, pero no te preocupes).
El cdigo a usar en el evento Click de ese nuevo botn sera prcticamente el
mismo que en el de Buscar, aunque antes debemos aadir 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
'
' 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 nmero
nReg = Val(Text4)
'
Data1.Recordset.FindNext "Au_ID = " & nReg
End If
If Option2.Value Then
' en el campo Author
'
Data1.Recordset.FindNext "Author Like '" & Text4.Text & "'"
End If
End Sub
Si te fijas, el cdigo es prcticamente 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 quedara ese evento:
Private Sub cmdBuscarSig_Click()
' Buscar el siguiente registro
BuscarSiguiente
End Sub

Como hemos visto, el cdigo usado en los dos procedimientos de bsqueda son
prcticamente iguales, as que vamos a unificarlos para crear un slo procedimiento
de bsqueda, de esta forma, refrescars tu memoria y sabrs algo ms de
parmetros en procedimientos, as como parmetros opcionales.

Parmetros opcionales.
Como sabrs, (y si no lo sabes, te lo cuento yo ahora), a partir de la versin 4 de
Visual Basic se pueden usar parmetros opcionales en los procedimientos y
funciones.
Esto quiere decir que podemos usar el procedimiento de varias formas, indicando
todos los parmetros o slo los que realmente son necesarios.
Por ejemplo, en el caso en que estamos ahora, el procedimiento Buscar podra
tener un parmetro opcional para indicarle si es la primera bsqueda o la siguiente.
No voy a entrar en demasiadas explicaciones, ya que este tema lo veremos de
forma ms 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 ocasin voy a usar el formato de las versiones 5 y 6, en estas versiones los
parmetros opcionales pueden ser de un tipo de datos diferente a Variant y tambin
pueden indicrsele un valor por defecto, para que, si no se especifica, tenga el valor
indicado; por supuesto, si no le indicamos el valor, tendrn 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 parmetros con tipo, a diferencia de los parmetros del tipo
Variant, no se puede usar IsMissing para comprobar si el parmetro se ha
especificado o no, pero, eso es otro tema...
Este es el cdigo del procedimiento Buscar y a continuacin te indico cmo llamarlo
desde el evento Click del botn 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 nmero
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 If
End Sub

Private Sub cmdBuscarSig_Click()


' Buscar el siguiente registro
Buscar True
End Sub

Puedes borrar el procedimiento BuscarSiguiente, ya que no es necesario. Tampoco


es necesario modificar el cdigo 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 cdigo, te dars 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 posicin 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 prximo registro, desde el ltimo hallado, que contenga dicho texto,
(estas pruebas hay que hacerlas en el campo Author, ya que no tienen ningn
sentido hacerlo en el ID del autor). Para buscar el resto de autores con el nuevo
texto, tendrs que pulsar en Buscar para que empiece a buscar desde el principio.
Fjate en el cdigo, 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 parmetros)
Esto ltimo: lo de no especificarse o si se especifica con el valor False, es algo que
hay que tener en cuenta si el parmetro fuese de tipo Variant (cosa obligatoria si
usas VB4), ya que IsMissing slo nos informa si el parmetro no se ha especificado,
pero si se especifica, puede hacerse con un valor False o True, por tanto, tambin
habra que tenerlo en cuenta...
Ya s que dije que lo iba a dejar para otra entrega... pero, que haces si ests
usando VB4 dejar aqu el curso?
As que vamos a ver el cdigo 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 parmetro 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 parmetro
Dim Siguiente As Boolean
'
Dim nReg As Long
'
' Asignar correctamente el valor del parmetro 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 cdigo 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 nmero
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 If
End Sub
Fjate que he cambiado el nombre del parmetro 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 parmetro, la comprobacin de
IsMissing se cumple, por tanto aqu le indicaremos el valor que queramos que tenga
por defecto, en nuestro ejemplo no es necesario asignar ningn valor, ya que False
es el valor que tendr la variable Siguiente si no le asignamos ningn valor.
Por tanto en este ejemplo, podramos haber hecho slo 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 bsqueda, vamos a aadir dos nuevos botones
para Aadir 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.
Aade dos nuevos botones y asignales los nombres cmdAdd y cmdBorrar, as como
los captions Aadir y Eliminar, el cdigo ser el siguiente:
'
Private Sub cmdAdd_Click()
' Aadir un nuevo registro
Data1.Recordset.AddNew
End Sub
Private Sub cmdBorrar_Click()
' Eliminar el registro actual
Data1.Recordset.Delete
End Sub

Tanto cuando se aade como cuando se borra, se debera mover el registro actual
para que los cambios tengan efecto en la base de datos, ya que si se aade un
nuevo registro y el mismo no se actualiza, se pierde.
Para probarlo, ejecuta el proyecto, pulsa en Aadir y directamente sin hacer nada
ms cierra el ejecutable, (pulsando en la x del formulario o ventana).
Ejecuta de nuevo el proyecto y si pulsas en el botn de ir al ltimo registro del
Datacontrol, vers que no hay ningn registro nuevo.

Ahora vuelve a pulsar en Aadir y escribe lo que quieras en las cajas de texto del
Nombre y Ao de nacimiento y pulsa en el botn de ir al primer registro y despus
al ltimo (ya sabes que me refiero a los botones del Datacontrol), vers que ahora
si se muestra dicho registro y si pulsas en el botn de ir al anterior, vers que se
salta un nmero... ese es el que haba reservado para nosotros, pero al no
actualizar los datos, se perdi en el limbo...
Ser por estos detalles que algunos programadores prefieran usar cdigo 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 ms 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 perdera)
En el caso de Eliminar, vamos a movernos al primer registro, para que el registro
activo sea uno con informacin.
Este sera el cdigo de los eventos Click de los dos botones:
'
Private Sub cmdAdd_Click()
' Aadir un nuevo registro
Data1.Recordset.AddNew
' Aadimos algn 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.MoveLast
End Sub
Private Sub cmdBorrar_Click()
' Eliminar el registro actual
Data1.Recordset.Delete
' Movemos al primer registro para que los cambios se hagan
permanentes
' (tambin podriamos haberlo movido al ltimo registro)
Data1.Recordset.MoveFirst
End Sub
Toma nota de la forma en que se hara para mover al primer o al ltimo registro del
Recordset.
Tambin habra que tener en cuenta si hemos sobrepasado el principio o el final de
los registros, cosa que ocurre cuando no hay ms 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 slo habra que hacerlo al eliminar registros, ya que al aadir se supone que
habr al menos el que aadimos...
'
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
' (tambin podriamos haberlo movido al ltimo registro)
Data1.Recordset.MoveFirst
End If
End Sub
En esta entrega veremos cmo 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
pequeos cambios, para usar el tipo de acceso a bases de datos ADO, en lugar de
DAO.
Me imagino que habrs ledo por ah las diferencias entre ADO y DAO, cosa que
aqu no voy a hacer... porque si lo hiciera, seguramente acabara aburriendo
hasta... a mi mismo. As que pasar a las explicaciones bsicas de cmo usarlo, que
es la intencin de este curso bsico, aunque, cuando lo crea conveniente,
profundizar en los temas que crea conveniente, as que... vamos al tema y
veamos...

Cmo 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 acompaado de la versin del control, en mi caso me indica que
es 6.0 (SP4) (OLEDB)Cuando pulses en aceptar, para cerrar el cuadro de dilogo de aadir componentes,
te mostrar un nuevo objeto en la barra de herramientas. Asegrate de que tienes
abierto el formulario y haz doble-click en dicho control, de esta forma se aadir 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 cdigo, as que no voy a explicarte cmo
hacerlo desde el IDE de Visual Basic.
Aade el siguiente cdigo 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 conexin 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 estn realizadas con el Visual Basic 6.0 y el Service Pack 4 (SP4). Si el
cdigo anterior te produjera un error, primero comprueba que est escrito
correctamente (hay que empezar por lo ms simple), si sigue sin funcionar, prueba
a cambiar el 4.0 que est entre comillas por 3.51, si an as tampoco funciona...
prueba a instalar el ADO, creo que se instala automticamente 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 tambin que pases de esta entrega...
Te explico un poco el cdigo anterior.
La constante es para que sea fcil 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 mtodo .ConnectioString, segn dice la ayuda del Visual Basic: Contiene la
informacin que se utiliza para establecer una conexin a un origen de datos. Osea,
es lo que le dice al ADO datacontrol de que base de datos obtener los datos y
tambin 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 cuestin, (fjate 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 tambin
podramos haberle indicado una consulta, pero esto ltimo lo veremos en otra
ocasin.
Ahora vamos a aadir unos cuantos controles al formulario, para poder trabajar con
los datos manejados por el ADO datacontrol.
Los controles que usaremos sern 3 etiquetas y 3 cajas de texto, pero ambos sern
un array de controles, (en el ejemplo de las entregas 34 y 35 usamos controles
independientes, pero creo que es ms cmodo usar array de controles).

Cmo crear un array de controles.


A estas alturas ya deberas saber cmo hacerlo, pero te voy a refrescar la memoria.
Aade una etiqueta al formulario (se crear Label1).
Seleccinala, (simplemente haz click en ella)
Del men Edicin, selecciona Copiar, (tambin puedes hacerlo con el botn derecho
del ratn).
Del men Edicin, selecciona Pegar, se mostrar un mensaje preguntando si quieres
crear un array de Label1, contesta que si.
Vuelve a pegar (Edicin/Pegar)
Y ya tienes tres etiquetas con ndices que van desde cero a dos.
Aade un TextBox y haz la misma operacin que con la etiqueta: Seleccinalo;
cpialo; pgalo, contesta que SI al mensaje de que quieres crear un array; vuelve a
pegar. Al final tendrs tres cajas de Texto llamados Text1 con ndices de cero a dos.
Posiciona los controles de forma que las etiquetas estn alineadas con las cajas de
texto, no te preocupes por el Caption de las etiquetas, ya que lo modificaremos
desde cdigo.
Aade unos cuantos controles ms, para que podamos hacer bsqueda, etc. tal y
como se hizo en las dos entregas anteriores.
Al final deberamos tener los siguientes controles:
Control

ndices del array (o ninguno si no

Label1
Text1
Label2
Text2
Option1
Option2
cmdBuscar
cmdBuscarSig
cmdSalir
cmdAdd
cmdBorrar
Adodc1

es un array)
0a2
0a2
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no
Ninguno (no

es
es
es
es
es
es
es
es
es
es

un
un
un
un
un
un
un
un
un
un

array)
array)
array)
array)
array)
array)
array)
array)
array)
array)

Y en esta imagen tienes una idea de cmo estn dispuestos:

El formulario de prueba de la entrega 36

Aqu te muestro el cdigo usado para que funcione este invento, como
comprobars, es prcticamente el mismo que el usado en las entregas anteriores,
con unas cuantas aadiduras para que funcione correctamente con el ADO
datacontrol. Por tanto creo que no necesita ms explicaciones que las que se
incluyen en el propio cdigo.
El cdigo del procedimiento Buscar es el que tiene ms 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 slo existe Find.
Tambin 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 cdigo.
'
'-----------------------------------------------------------------------------

' 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 parmetro
Adodc1.Caption = "Registro actual: " & pRecordset.AbsolutePosition
' Si da error, indicarlo
(20/Sep/99)
If Err Or pRecordset.BOF Or pRecordset.EOF Then
Adodc1.Caption = "Ningn registro activo"
' Habra que moverlo a un registro con informacin
' *** Dejarlo comentado ***
' para que el procedimiento de bsqueda avise si no hay datos
activos
'Adodc1.Recordset.MoveFirst
End If
Err = 0
End Sub
Private Sub cmdAdd_Click()
' Aadir un nuevo registro
Adodc1.Recordset.AddNew
' Aadimos algn 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 algn 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 = "Ningn registro activo"
Else
' Eliminar el registro actual

Adodc1.Recordset.Delete
'
' Movemos al primer registro para que los cambios se hagan
permanentes
' (tambin 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 conexin 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 ejecucin
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 slo 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 asignacin 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 deteccin 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 nmero
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 posicin 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 ms datos que
mostrar."
' Posicionar el recordset en la posicin guardada
Adodc1.Recordset.Bookmark = vBookmark
End If
End Sub
Confo 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 ocasin
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
programacin, habr que hacerles caso... as que tambin ve preparando el cuerpo,
ya que a partir del 2002 la "nueva ola" ser .NET y habr que ir "conciencindose"
de la nueva tecnologa... pero no te preocupes que tambin podrs aprenderla...
para que no te quedes atrs, aunque eso ser en un futuro... talvez no muy
lejano...

Cmo acceder a bases de datos DAO, sin el datacontrol.


Empecemos desde el principio... para que te vayas acostumbrando... aunque ya
deberas saber crear tus propios formularios y aadir los controles que te indique...
aunque prcticamente no te lo haya explicado en el curso, es algo que te ensean
en prcticamente cualquier libro e incluso en los "tutoriales" que incluye el Visual
Basic.
Slo decirte que usando la versin 5CCE de Visual Basic no se pueden acceder a
datos, as que tendrs que usar la versin Profesional o la Empresarial... pero si de
verdad te quieres dedicar a esto de la programacin... esa sern las versiones de
las que deberas disponer... y no me preguntes dnde conseguirlas... ya que las
venden en cualquier "tienda" de informtica 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 bsico... hum!
Crea un nuevo proyecto, se crear un proyecto con un formulario.
Aade los siguientes controles para que el formulario quede con el aspecto que te
muestro a continuacin, (que es parecido al usado en las entregas anteriores de
acceso a datos):

Aspecto del formulario en tiempo de diseo


Los controles usados son:
En la parte superior:

cmdMover, un array de 0 a 3
Label1, un array de 0 a 2, Text1, un array de 0 a 2
cmdAdd, cmdActualizar, cmdBorrar
El segundo grupo:
Label2, Text2, Option1, Option2, cmdBuscar, cmdBuscarSig
Elbotn de salir es: cmdSalir
En el men Proyecto/Referencias... selecciona Microsoft DAO 3.51 Object
Library -aunque tambin puedes seleccionar cualquier otra que empiece por
Microsoft DAO... cualquiera de ellas vale... puede que tambin tengas la 3.6 e
incluso la 2.5/3.51 Compatibility Library, todo depender de la versin de DAO que
tengas instaladaA diferencia de cuando seleccionas un componente, despus de cerrar el cuadro de
dilogo no vers nada nuevo en la ventana de herramientas, ya que las referencias
no aaden nuevos controles, pero si que aaden nuevas libreras que exponen
objetos que podemos usar en nuestra aplicacin...
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
permitirn, 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?
Segn 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 bsqueda avanzada, en la que podemos
indicar varios criterios de bsqueda... aunque tambin, como vers pronto, es algo
ms 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 seccin de declaraciones del formulario
(General/Declaraciones), aade estas lneas:
Option Explicit
Private db As Database
Private 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 tendrs 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 continuacin abrimos la base de datos usando la funcin OpenDatabase, la cual
devuelve un objeto de la base de datos recin abierta, uno de los parmetros que
espera recibir dicha funcin 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 datos


Set db = OpenDatabase(sPathBase)
A continuacin 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 manipular
Set rs = db.OpenRecordset("SELECT * FROM Authors", dbOpenDynaset)
La constante dbOpenDynaset le indica al mtodo 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; adems de este tipo de recordset, existen otros los cuales slo se
pueden usar para "recorrer" los datos o mostrarlos, si as lo prefieres, pero no
permiten modificarlos, ese tipo de recordset tambin 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
idea, rs tendr el mismo funcionamiento que el que tena 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 permita movernos por los diferentes
registros de la tabla, en el formulario hay cuatro botones, que se usarn para esa
tarea: movernos tanto al primero, anterior, siguiente o ltimo registro, el cdigo
para hacerlo es el que te muestro a continuacin:

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 segn el botn 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 despus 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 = 0
End 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 despus del final de los registros. Cuando
estas dos propiedades devuelven un valor verdadero, es que no hay datos
en el recordset.
A continuacin movemos el "puntero" del recordset al registro indicado, segn el
valor de Index sabremos que botn se ha pulsado y por tanto que "accin" tenemos
que elegir. En los comentarios puedes ver qu valor corresponde con cada
movimiento.
Como es posible que el usuario pulse en el botn anterior o siguiente despus 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 cdigo 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 With
End Sub
Si le echas un vistazo al cdigo de las pruebas con el control Data, notars 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
informacin en los controles que tena "enlazados", pero ahora no tenemos un
control que "automatice" esta tarea, as que, tenemos que hacerlo por nuestros
medios... por suerte no es tan difcil.
Ahora vamos a ver los procedimientos de Aadir un nuevo registro, actualizar uno
ya existente y eliminar el registro actual. En el propio cdigo encontrars la
explicacin de que es lo que hace cada lnea usada.
El cdigo de Aadir un nuevo registro:
Private Sub cmdAdd_Click()
' Aadir un nuevo registro
With rs
.AddNew
' Aadimos algn texto, para saber que es un nuevo dato

.Fields("Author") = "Nuevo Autor"


' Actualizamos los datos, para que se graben en el recordset
.Update
End With
End Sub
El cdigo 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 edicin
.Edit
' Este campo es autonumrico, as que no asignarlo
'.Fields("Au_ID") = Text1(0) + 0
' Aadimos una cadena vaca al final
' ya que si Text1(1) est vaco, se asignar un valor NULL y
dar error
.Fields("Author") = Text1(1) & ""
' Idem con el ao de nacimiento, pero como es numrico, se
sumar 0
.Fields("Year Born") = Text1(2) + 0
' Actualizar los datos en el recordset
.Update
End With
End Sub
Y por ltimo el cdigo para eliminar un registro... como siempre, borrar es muy
fcil...
Private Sub cmdBorrar_Click()
' Borrar el registro actual
' Se comprueba que haya algn 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 If
End Sub
Bien, bsicamente estas tareas son prcticamente 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 cdigo usado para buscar los datos, el cual es tambin
prcticamente lo mismo que cuando se tena el datacontrol. Fjate 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 cdigo de buscar y buscar siguiente, para lo cual usamos los mtodos
FindFirst y FindNext respectivamente.

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 Siguiente:=True
Buscar True
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 sBookmark As String
Dim sBuscar As String
'
' Iniciamos la deteccin 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 nmero
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 posicin 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 ms datos
que mostrar."
' Posicionar el recordset en la posicin guardada
.Bookmark = sBookmark
End If
' Mostrar los datos del registro actual
MostrarRegistro
End With
End Sub

Cmo realizar consultas con DAO?


Ya hemos visto cmo introducir y modificar registros, tambin hemos visto cmo
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 bsqueda, incluso a veces nos interesa buscar ms de un dato a la
vez. Eso mismo se puede hacer con FindFirst y FindNext, es decir, podemos buscar
en ms de un campo del mismo registro el dato o datos que nos interesa a un
mismo tiempo. Pero adems de usar recordsets de slo lectura, podemos acelerar
esa tarea de "obtener" la informacin que queramos realizando consultas en lugar
de ir buscando uno por uno los datos. Independientemente de cmo hagamos la
consulta, siempre nos quedar el recurso de poder usar los mtodos 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 cmo funciona todo esto.
Para mostrar el resultado de la "bsqueda" o consulta, vamos a usar un control
ListView.
Para aadir un control ListView a nuestro proyecto, primero hay que "aadir" el
control a la barra de herramientas de Visual Basic, para ello, selecciona la opcin
Componentes del men Proyecto y del cuadro de dilogo que te muestra,
selecciona Microsoft Windows Common Controls, (pude que a continuacin de
este nombre te muestre la versin de Visual Basic, en mi caso, me muestra 6.0,
pero tambin la 5.0 (SP2), ya que tengo instalado esas dos versiones de VB.
Una vez que has pulsado en Aceptar, vers que se han aadido nuevos controles a
la barra de herramientas (ToolBox), selecciona el que representa al Listview y
aadelo al formulario, mediante cdigo configuraremos la apariencia.
Si quieres puedes crearte un nuevo proyecto para esta "segunda" prueba, ya que,
adems de aadir el ListView, tambin vamos a quitar los botones de bsqueda,
porque no tiene sentido tenerlos... al menos para el propsito de este ejemplo.
El aspecto del formulario sera el siguiente:

El aspecto, en tiempo de diseo, del segundo formulario

El cdigo para configurar el ListView en tiempo de ejecucin para mostrar la


informacin 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 lneas de separacin entre datos
.GridLines = True
' Que no se puedan modificar los datos del listview
.LabelEdit = lvwManual
' Aadimos las cabeceras
.ColumnHeaders.Add , , "Au_ID", 900
.ColumnHeaders.Add , , "Autor", 2700
.ColumnHeaders.Add , , "Ao nacimiento", 1500, lvwColumnRight
End With
Ahora la bsqueda slo se har por el nombre del autor y se mostrarn en la lista
todos los autores que coincidan con los datos que queremos buscar. El cdigo del
botn Buscar sera 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 "esttico", el cual no es
modificable
' para poder modificarlo, tendra 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 With
End Sub
En otra ocasin veremos cmo "disear" un formulario para consultas con distintas
opciones de bsqueda, as como para bsqueda en mltiples campos.

También podría gustarte