Вы находитесь на странице: 1из 19

CURSO DE VB

CAPTULO 121

ndice de contenido
OBJETOS DE ACCESO A DATOS (III).............................................................................................2
CONFESIONES NTIMAS.............................................................................................................2
UN POCO DE TEORA..................................................................................................................2
REGISTRANDO LIBRERAS........................................................................................................4
PREPARANDO NUESTRA BD.....................................................................................................4
CDIGOS BSICOS INICIALES.................................................................................................6
INICIANDO LAS CONEXIONES............................................................................................6
USO DEL NEW PARA NUEVAS CONEXIONES................................................................7
FINALIZANDO LAS CONEXIONES......................................................................................8
CONTROLANDO LAS TRANSACCIONES................................................................................8
LOS RECORDSET........................................................................................................................10
RECORDSET SOBRE UNA TABLA......................................................................................11
RECORDSET SOBRE UNA CONSULTA SQL......................................................................12
EL OBJETO COMMAND.............................................................................................................13
ALGUNOS CDIGOS DE EJEMPLO.........................................................................................15
Separacin de datos...................................................................................................................15
Bsqueda de registro: mtodo SEEK........................................................................................17
Investigando los campos de nuestras tablas..............................................................................18
Y PARA FINALIZAR...................................................................................................................19

1 La BD donde estn los ejemplos de este captulo os la podis bajar aqu.

1
Vistame en http://siliconproject.com.ar/neckkito/
OBJETOS DE ACCESO A DATOS (III)
En el captulo anterior realizamos una amplia incursin
sobre DAO. En este captulo vamos a echar una ojeada a
ADO.

La mecnica de este captulo, para ser originales, va a ser


muy parecida a lo que venimos realizando en este curso.
Nos vamos a preparar una BD en blanco con una serie de
objetos para ir desarrollando teora y prctica al mismo
tiempo. As, iremos asimilando conceptos, funciones y
mtodos al tiempo que vemos cmo se aplican en la
prctica.

Aunque este captulo se podra estudiar de forma independiente y saltndose los captulos 10
y 11 yo os recomiendo haber examinado estos dos captulos con anterioridad, por los motivos
que apuntar en el apartado siguiente.

CONFESIONES NTIMAS
Ha llegado este tierno momento donde debo desnudar mi alma y confesaros un par de
cosas. Antes de que alguien, al llegar al final de este captulo, diga y eso es todo?, os
comentar un par de cosas que creo son importantes:

Yo, prcticamente, no utilizo ADO en mis programaciones, sino que utilizo DAO. Y eso, qu
significa? Que mis conocimientos sobre ADO son menores que sobre DAO. Lgicamente, al no
utilizarlo con asiduidad mis pulsaciones sobre la tecla F1 son ms habituales (de hecho,
buscando informacin por aqu y por all para poder escribir este captulo estoy aprendiendo
cosillas que desconoca... je, je...).

En el fondo (y supongo que alguien que sepa sobre el tema me tachar de sacrlego) DAO y
ADO son lo mismo, pero con distinta nomenclatura (ojo, esto debis tomarlo como una opinin
muy general). S es posible establecer, en la mayora de casos, una gran analoga entre ambos
procedimientos. Por ello os deca unas lneas ms arriba lo de examinar antes los captulos
10 y 11. Si los habis estudiado veris esas analogas que os comentaba.

Podramos decir que si exista una relacin entre SQL y DAO dicha relacin es an ms
estrecha entre SQL y ADO. Es decir, que vamos a tener que conocer un poquito ms de
lenguaje SQL para poder extraer el jugo a nuestros cdigos.

Finalmente, y por todo lo anterior, este captulo no ser tan extenso como los anteriores, en
el sentido en que me centrar en las operaciones que pienso son ms usuales (segn mi
criterio, claro), dejando las profundidades del tema a un lado. Para quien quiera saber ms le
animo a leerse la ayuda que proporciona Access y, si tan grande es su entusiasmo por ADO, a
la compra de un buen manual sobre este modelo de acceso a datos.

UN POCO DE TEORA
Las siglas ADO significan ActiveX Data Objects. A travs de ADO podemos acceder a datos
situados en un servidor de bases de datos (ojo, no slo Access) y manipular a nuestro antojo
dichos datos a travs de lo que se denomina un proveedor OLE DB.

Nuestro amigo Microsoft, de hecho, recomienda el uso de ADO antes que DAO (ser por eso

2
Vistame en http://siliconproject.com.ar/neckkito/
por lo que no lo utilizo? ;) ). Entre las ventajas que destaca de ADO tenemos:

Es fcil de usar
Utiliza poca memoria
Utiliza poco espacio en el disco
Tiene un buen rendimiento
Ofrece funcionalidades bsicas que permiten crear
aplicaciones cliente/servidor y aplicaciones web.

En fin... Vosotros, al final del captulo, os habris podido


formar un criterio (o eso espero) de qu sistema es el que
ms os gusta.

Hemos hablado de un proveedor OLE DB. Y qu es esto? Pues no es ms que una tecnologa
que nos permite tener acceso a prcticamente cualquier fuente de informacin. Y cuando digo
prcticamente a cualquier fuente de informacin me refiero a una acepcin amplia del
trmino: cualquier lugar donde haya datos... ah llega ADO. No me centro, pues, slo en
bases de datos, sino que debemos pensar a lo grande: bases de datos (relacionales o no),
sistemas de archivos, correo electrnico, etc.

Hasta donde yo s, podramos acceder a los siguientes elementos a travs de ADO, ya que
estn basados en la tecnologa OLE DB (no entrar en explicaciones porque no le veo mucho
sentido. Simplemente os lo apuntar para que veis el elenco de posibilidades):

Bases ODBD PDOLEDB2: MSADSQL


SQL Server PDOLDB: SQLOLE DB
Bases Oracle PDOLDB:MSDAORA
Bases de Access 2007 PDOLDB: Microsoft Office 12.0 OLE DB (14.0 para Access
2010. Para versiones anteriores tenemos Microsoft Jet 4.0 OLE DB Provider)
Index Server PDOLDB:MSIDXS
Active Directory PDOLDB: Objeto ADSDSO
AS 400 IMS-CICS VSAM PDOLDB: SNA Server

Si tuviramos que jerarquizar el modelo ADO podramos obtener una cosa as:

OBJETO COLECCIN
CONNECTION
................................................... ERRORS
................................................... PROPERTIES
COMMAND
................................................... PARAMETERS
................................................... PROPERTIES
RECORDSET
................................................... FIELDS
................................................... PROPERTIES
RECORD
................................................... FIELDS
STREAM

2 PDOLEDB: Proveedor de datos OLE DB

3
Vistame en http://siliconproject.com.ar/neckkito/
Finalmente, si tuviramos que esquematizar las cosas que hace ADO, podramos hablar de
que ADO nos permite (en trminos generales):

Establecer una conexin (lgico, puesto que necesitamos


conectar con los datos) a bases de datos ODBC u OLE DB
Esa conexin la establecemos a travs del objeto
Connection
Es habitual utilizar la palabra transaccin para referirnos a
la actividad que ADO est realizando. ADO nos permite,
iniciada una transaccin, la posibilidad de aceptar o
rechazar las operaciones que se han realizado durante
dicha transaccin.
Como DAO, y una vez se ha accedido a los datos, podemos utilizar SQL para
modificarlos, actualizarlos, aadir nuevos, consultarlos... Y todo ello enviando
comandos, manipulando las propiedades de los objetos, utilizando funciones y
mtodos...

En fin, que ya podis haceros una primera idea de vida y milagros de ADO

REGISTRANDO LIBRERAS
Para poder utilizar ADO debemos registrar la librera correspondiente. Tenemos dos libreras
disponibles para ello: la hermana rica y la hermana pobre... ji, ji...

La hermana rica es la librera Microsoft ADO Ext 2.x for DLL and Security. El archivo dll que
se corresponde con esa librera se llama MSADOX.DLL. Y por qu es rica? Porque, adems
de funcionalidades ADO, esta librera permite acceder a objetos complementarios, como, por
ejemplo, users, views, catalogs..., que tambin son manipulables a travs de ADO.

La hermana pobre es la librera Microsoft ActiveX Data Objects 2.x Library, que contiene los
elementos imprescindibles para poder trabajar con ADO.

En ambos casos esas DLL's, en mi ordenador, estn en <C:\Archivos de programa\Archivos


comunes\System\ado>. En los vuestros no creo que se hayan ido demasiado lejos.

Por si alguien se ha despistado recordad que para registrar la librera debemos, en el VBE,
irnos a Men Herramientas Referencias..., buscar una de esas bibliotecas, marcar su check y
aceptar.

PREPARANDO NUESTRA BD
Llegados a este punto vamos a prepararnos el terreno para este captulo. Vamos a crear una
BD en blanco y vamos a crear:

Una tabla, que llamaremos TAerop, que tendr la siguiente estructura.

Rellenamos con algunos datos la siguiente tabla. Pero, ojo, vamos a cometer unos errores a

4
Vistame en http://siliconproject.com.ar/neckkito/
propsito: vamos a escribir mal el nombre de dos aeropuertos. Por ejemplo, escribiremos
Madri en lugar de Madrid y Barselona en lugar de Barcelona. Yo he puesto los siguientes
valores:

Vamos a crear una segunda tabla, que llamaremos TCias, con la siguiente estructura.
Adems, la rellenamos con algunos valores (no tengo ni idea de si las abreviaturas que
he puesto se corresponden con la realidad, puesto que tengo escasos conocimientos
del tema de aeropuertos).

Finalmente, vamos a crear la ltima tabla, que tendr por nombre TVuelos, que tendr la
siguiente estructura:

Teniendo en cuenta lo siguiente:

Campo [Cia]: hemos utilizado, como tipo de datos, el asistente para bsqueda, que nos
ha buscado la informacin en la tabla TCias. Por tanto, el valor que almacena es el
identificador la compaa.
Campos [AeOr] y [AeDest]: hemos utilizado, como tipo de datos, el asistente para
bsqueda, que nos ha buscado la informacin en el tabla TAerop. Por tanto, el valor que
almacena es el identificador del aeropuerto.

Rellenamos la tabla con los datos que queramos. Por ejemplo, yo he utilizado los siguientes
datos:

5
Vistame en http://siliconproject.com.ar/neckkito/
Y ya tenemos nuestro abono preparado. Vamos a meternos de lleno ya en ADO.

CDIGOS BSICOS INICIALES

INICIANDO LAS CONEXIONES


Lo primero que debemos hacer, como es habitual, es declarar las variables. Vamos a ver cmo
sera la declaracin de variables en ADO. Ya os avanzo que los nombres de las variables que
vamos a utilizar son las que normalmente se utilizan con ADO, y que son las que yo tambin
voy a utilizar. Os pongo las Dim ms habituales, pero no significa que en cada cdigo las
necesitemos todas:

...
Dim cnn as ADODB.Connection Nos servir para establecer la conexin con la fuente de
datos.

Dim cmd as ADODB.Command Nos servir para asignar un comando que podamos crear.

Dim rs as ADOB.Recordset Nos servir para asignar un recordset.

Ahora debemos definir las variables. Aqu nos encontramos con dos situaciones posibles:

1: queremos establecer una conexin con la base de datos en la que estamos trabajando
2: queremos establecer una conexin con una fuente de datos externa (es decir, con un
proveedor de OLE DB).

Vamos a ver cmo conectaramos con la base de datos actual:

Set cnn = CurrentProject.Connection

Y la conexin a una fuente externa sera (ojo, que esto no es estndar: depender de las
caractersticas del proveedor OLE al que queramos conectarnos):

...
Set cnn = NEW ADOB.Connection

6
Vistame en http://siliconproject.com.ar/neckkito/
cnn.Open Provider=<NombreDelProveedorOLE>;<Argumentos(siLosHay)>;<OrigenDatos>;<Otros>;

Como lo anterior quiz pueda ser un poco lioso vamos a


poner tres ejemplos, simplemente para que podis ver la
mecnica de la conexin:

Ejemplo 1: nos queremos conectar a un proveedor SQL


Server, cuya fuente de datos est en el servidor miSVR y los
datos estn en la tabla DatosFin

Dim cnn As ADODB.Connection


Set cnn = NEW ADODB.Connection
cnn.Open Provider=SQLOLEDB.1; Data Source= miSVR; Initial Catalog=DatosFin _
& Integrated Security=SSPI; Persist Security Info=False;

Ejemplo 2: nos queremos conectar a una base de datos Access llamada Cafes.mdb, versin
2003, que est en local, en el directorio C:\Productos\.

...
Dim cnn As ADODB.Connection
Set cnn = NEW ADODB.Connection
cnn.Open Provider=Microsoft.Jet.OLEDB.4.0.; Data Source=C:\Productos\Cafes.mdb;

Fijaos que en esta conexin, por ejemplo, no he manipulado elementos opcionales.

Ejemplo 3: y si queremos abrir la misma BD que en ejemplo 2, pero el archivo es


Cafes.accdb (es decir, Access 2007)? Pues la abriramos as:

Dim cnn As ADODB.Connection


Set cnn = NEW ADODB.Connection
cnn.Open Provider=Microsoft.ACE.OLEDB.12.0.; Data Source=C:\Productos\Cafes.accdb; _
& Persist Security Info=False;
...

Y, en este caso, por ejemplo, s que he utilizado elementos opcionales.

Fijaos en que es muy importante no olvidarse de los punto y coma (;) en la declaracin de
apertura de la conexin.

USO DEL NEW PARA NUEVAS CONEXIONES


Si os habis fijado en los cdigos anteriores hemos indicado que la conexin es una nueva
conexin a travs de la palabra NEW.

Tenemos dos posibilidades para utilizar la palabra NEW: en la declaracin de variables o en la


definicin de variables. O utilizamos una o utilizamos otra, pero nunca las dos a la vez.

Aunque ya lo hemos visto, para mayor claridad vamos a ver las estructuras:

1 manera: seguira la estructura siguiente:

7
Vistame en http://siliconproject.com.ar/neckkito/
La variable cnn es una conexin ADO
Establecemos cnn como una nueva conexin

Lo anterior, traducido a cdigo, sera:


Dim cnn As ADODB.Connection
Set cnn = NEW ADODB.Connection

Y lo mismo podramos hacer para establecer el resto de


variables.

2 manera: declaracin directa de que la conexin es ADO y que adems es una nueva
conexin:

Seguira la siguiente estructura:

La variable es una nueva conexin ADO

Y traducido a cdigo sera:

Dim cnn As NEW ADODB.Connection

Qu sistema es el mejor? Pues, realmente, yo no lo s. Si me preguntis qu uso yo, pues os


dir que generalmente utilizo la primera estructura, pero simplemente por preferencias
personales. Quiz alguien que siga el curso y encuentre en algn sitio alguna explicacin
sobre este tema pueda escribirme y darme algn tipo de explicacin ;)

FINALIZANDO LAS CONEXIONES


Como ya vimos en DAO, podemos finalizar las conexiones y liberar memoria. El cdigo para
realizar eso ya nos es conocido, y sera:

rs.Close
cnn.Close
Set rs = Nothing
Set cnn = nothing

Sin ms problemas.

CONTROLANDO LAS TRANSACCIONES


Si estamos seguros de que las acciones que vamos a realizar sobre los datos, a travs de
nuestro cdigo deben realizarse imperativamente no es necesario un control de transacciones.
Sin embargo, si queremos controlar, en el momento final, que se apliquen los cambios que
hemos estado efectuando o no, podemos establecer un control de transacciones.

Las palabras mgicas para ello son:

BeginTrans Inicia la transaccin

8
Vistame en http://siliconproject.com.ar/neckkito/
CommitTrans Guarda la transaccin
RollbackTrans Cancela la transaccin

Vamos a realizar un ejemplo sobre nuestra BD.


Recordamos que en la tabla TAerop escribimos Madri en
vez de Madrid, y Barselona en lugar de Barcelona? En
este caso hablamos de dos registros, pero imaginemos que
tenemos 2.000 registros con errores tipogrficos. Vamos a
ver cmo podemos cambiarlos todos de golpe.

Si creamos un formulario en blanco en nuestra BD y aadimos un


botn de comando podramos asignar el siguiente cdigo:

Private Sub cmdMadri_Click()


'Declaramos las variables
Dim cnn As ADODB.Connection
Dim miSql As String, resp As String
'Realizamos la conexin con la BD actual
Set cnn = CurrentProject.Connection
'Controlamos el inicio de la transaccin
cnn.BeginTrans
'Creamos la SQL para actualizar "Barselona"
miSql = "UPDATE TAerop SET Aerop = 'Barcelona' WHERE Aerop = 'Barselona'"
'Ejecutamos la SQL
cnn.Execute miSql
'Creamos la segunda SQL para actualizar "Madri"
miSql = "UPDATE TAerop SET Aerop = 'Madrid' WHERE Aerop = 'Madri'"
'Ejecutamos la SQL
cnn.Execute miSql
'Solicitamos confirmacin para validar las actualizaciones. Si responde que S
'aplicamos los cambios; si responde que NO no los aplicamos
resp = MsgBox("Actualizaciones correctas. Desea aplicarlas?", vbQuestion + vbYesNo,
"AVISO")
If resp = vbYes Then
cnn.CommitTrans
Else
cnn.RollbackTrans
End If
'Cerramos conexiones y liberamos memoria
cnn.Close
Set cnn = Nothing
End Sub

Destacar los siguientes detalles:

Hemos establecido la conexin a travs de la variable cnn. Si os fijis veris que en el


resto del cdigo continuamente hacemos referencia a la conexin a travs de cnn. +
mtodo/propiedad (por ejemplo, cnn.BeginTrans, cnn.Execute, ).
Para manipular los datos hemos utilizado una SQL que se correspondera con una
consulta de actualizacin. En el captulo anterior ya os expliqu cmo utilizar las
consultas de Access para que nos diera una pista de cmo podra ser la SQL. A ese
truquillo os remito.
Una vez establecida la conexin con la base de datos actual, y a continuacin,
empezamos a controlar las acciones que se realizarn en el cdigo a travs de

9
Vistame en http://siliconproject.com.ar/neckkito/
<cnn.BeginTrans>
Realizadas ya las operaciones nos quedamos a punto de
aplicarlas. Es cuando solicitamos al usuario que d su
conformidad o no. Si acepta utilizamos
<cnn.CommitTrans>; si no acepta utilizamos
<cnn.RollbackTrans>
Para ejecutar una SQL ved que utilizamos cnn.Execute
<nombreSQL>

Creo que, a travs de este ejemplo, vemos que ADO tiene


sus peculiaridades, pero la similitud con DAO empieza a ser
un poco evidente. Lo veremos sobre todo con el tema de
los recordset... y por qu esperar ms? Vamos a por los
recordset.

LOS RECORDSET
Para abrir un recordset de una tabla o consulta, entendida la consulta como objeto de Access,
debemos, en el cdigo:

Declarar el recordset, como ya hemos visto a travs de Dim rs As ADODB.Recordset


Crear el recorset mediante Set rs = NEW ADODB.Recordset
Abrir el recorset mediante rs.Open
Y ya podemos realizar las operaciones necesarias.

La estructura de rs.Open sera la siguiente:

rs.Open <Origen>, <conexin activa>, <tipo de cursor>, <tipo de bloqueo>, <opciones>

Vamos a ver algunos de estos argumentos (todos menos las <opciones>):

Origen: se correspondera con el nombre de la tabla o consulta de las cuales queremos


crear el recordset
Conexin activa: sera la conexin activa que hemos definido; es decir, nuestro cnn
Tipo de cursor: nos indicara cmo debe comportarse el puntero que recorre el
recordset. Tenemos diferentes opciones (no vamos a entrar en demasiados
tecnicismos):
adOpenDynamic: es decir, un cursor dinmico. Para que nos entendamos, podemos
ir adelante y atrs en el recordset, y adems ver los registros que se han aadido,
modificado o eliminado por otros usuarios
adOpenKeyset: es igual que el dinmico, con la excepcin que no se pueden ver los
registros que otros usuarios han agregado. Se denomina Keyset porque utiliza un
conjunto de claves.
adOpenStatic: se correspondera con la idea de Snapshot que veamos en
captulos anteriores.
adOpenForwardOnly: igual al esttico, pero slo permite el movimiento hacia
adelante. Es el valor predeterminado si no se especifica este argumento.
Tipo de bloqueo: se refiere al bloqueo que se aplica a los registros cuando utilizamos el
recordset. Tenemos varios tipos de bloqueo:
adLockOptimistic: indica un bloqueo optimista.
adLockPessimistic: indica un bloqueo pesimista.
adLockReadOnly: slo lectura, lo que implica que no es posible modificar datos.
adLockBatchOptimistic: bloqueo optimista, pero por lotes.

Y ahora me pediris: qu es un bloqueo? Os copio lo que dice Access sobre el tema de los
bloqueos, porque est ms o menos claro. De todas maneras debis quedaros con la idea de

10
Vistame en http://siliconproject.com.ar/neckkito/
que un bloqueo es una accin que se establece sobre un registro o conjunto de registros para
evitar que dos o ms usuarios puedan modificar o actualizar, a la vez, el mismo registro (o
conjunto de registros). Ah va lo que opina Access sobre el tema:

<<El bloqueo es el proceso mediante el cual un sistema de


administracin de bases de datos (DBMS) restringe el
acceso a una fila en un entorno multiusuario. Cuando una
fila o una columna se bloquean de forma exclusiva, el
acceso a los datos bloqueados queda cerrado mientras no
se libere el bloqueo. De este modo, se garantiza que dos
usuarios no puedan actualizar simultneamente la misma
columna de una fila.
Los bloqueos pueden ser muy costosos en cuanto a recursos y, por tanto, slo se deben
utilizar cuando sea necesario para preservar la integridad de los datos. En una base de datos
en la que cientos o miles de usuarios podran estar intentando obtener acceso a un registro
cada segundo (por ejemplo, una base de datos en Internet), el uso de bloqueos innecesarios
podra reducir el rendimiento de la aplicacin.
La forma en que el origen de datos y la biblioteca de cursores ADO supervisan la concurrencia
se puede controlar si elige la opcin de bloqueo apropiada.
Establezca la propiedad LockType antes de abrir un objeto Recordset para especificar qu
tipo de bloqueo debe utilizar el proveedor al abrirlo. Lea la propiedad para obtener el tipo de
bloqueo utilizado en un objeto abierto de este tipo.
Puede que los proveedores no admitan todos los tipos de bloqueo. Si un proveedor no admite
la opcin LockType solicitada, la sustituir por otro tipo de bloqueo. Utilice el mtodo
Supports con adUpdate y adUpdateBatch para determinar la funcionalidad real de bloqueo
disponible en un objeto Recordset.
El valor adLockPessimistic no se admite si la propiedad CursorLocation se establece en
adUseClient. Si se establece un valor no admitido, no se producir ningn error; en su lugar,
se utilizar el LockType admitido ms prximo.
La propiedad LockType es de lectura y escritura cuando el objeto Recordset est cerrado, y
de slo lectura cuando est abierto.>>

RECORDSET SOBRE UNA TABLA


Vamos pues a crear un recordset que nos recorrer los registros de la tabla TCias y nos dir
qu compaas tenemos de alta. El cdigo sera el siguiente:

Private Sub cmdVerCias_Click()


'Declaramos las variables
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
'Realizamos la conexin
Set cnn = CurrentProject.Connection
'Creamos el recordset
Set rs = New ADODB.Recordset
'Abrimos el recordset
rs.Open "TCias", cnn, adOpenKeyset, adLockReadOnly, adCmdTableDirect
'Inicamos el recorrido de registros
rs.MoveFirst
Do Until rs.EOF
MsgBox rs(2).Value, vbInformation, "COMPAA"
rs.MoveNext

11
Vistame en http://siliconproject.com.ar/neckkito/
Loop
'Cerramos conexiones y liberamos memoria
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

Como podemos ver, el comportamiento es muy similar a lo que ya


conocamos, evidentemente con las peculiaridades propias de ADO.

RECORDSET SOBRE UNA CONSULTA SQL


Vamos a ver una variacin sobre el tema: vamos a abrir un recordset sobre una SQL que
habremos creado previamente.

Por ejemplo, el procedimiento, muy parecido al anterior, nos va a decir cuntos pasajeros
volaron entre los das 5 y 6 de febrero (ojo, segn los datos que yo he utilizado en la BD de
ejemplo. Si vosotros habis utilizado otros deberis ajustar las fechas a vuestros datos).

El cdigo podra ser el siguiente:

Private Sub cmdOrigYDest_Click()


'Declaramos las variables
Dim miSQL As String
Dim numPas As Long
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
'Establecemos la conexion con la base activa. Creamos el recordset
Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
'Inicializamos la variable numPas
numPas = 0
'Creamos la SQL
miSQL = "SELECT TVuelos.NPas FROM TVuelos"
miSQL = miSQL & " WHERE TVuelos.Fecha BETWEEN #02/05/12# AND #02/06/12#"
'Abrimos el recordset
rs.Open miSQL, cnn, adOpenDynamic, adLockReadOnly
'Iniciamos el recorrido de registros
Do Until rs.EOF
numPas = numPas + rs(0).Value
rs.MoveNext
Loop
'Mostramos el resultado
MsgBox "Entre el 5 y el 6 de febrero volaron " & numPas & " personas", vbInformation,
"DATOS"
'Cerramos conexiones y liberamos memoria
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

12
Vistame en http://siliconproject.com.ar/neckkito/
Fijaos que, en la construccin de la SQL, hemos tenido que
utilizar las fechas en formato ingls (mm/dd/aa). Tened
esto en cuenta cuando vayis a trabajar con fechas dentro
de un recordset.

EL OBJETO COMMAND
Vamos a aprovechar este apartado para abrir una conexin con
una base de datos externa. Para ello vamos a tener que:

Creamos una BD, que llamaremos DatosIB.xxx, donde xxx ser o bien la extensin mdb
o accdb (yo lo har sobre mdb por compatibilidad). Guardaremos esa BD en el mismo
directorio donde tenemos nuestra BD de pruebas.
En esa BD creamos una tabla, que llamaremos TCargos, con la estructura siguiente:

Construida la tabla vamos a meter algunos datos. Por ejemplo, yo he introducido los
siguientes:

Vamos a crear una tabla en nuestra BD de pruebas con los comandantes de la compaa IB.
Esa tabla se llamar TComandIB. Veamos cmo sera el cdigo, que estructuraremos en
diversas fases3:

Private Sub cmdCreaTComandIB_Click()


'-----FASE 1--------------------------------------------
'Eliminamos la tabla si existiera
'Declaramos las variables de esta fase
Const nomTbl As String = "TComandIB"
Dim tbl As Object
'Eliminamos la tabla, si existiera
For Each tbl In CurrentData.AllTables
If tbl.Name = nomTbl Then
DoCmd.DeleteObject acTable, nomTbl
Exit For
End If

3 Para usuarios de Access 2003: si no os funciona el cdigo deberis registrar la librera Microsoft DAO 3.6 Object Library

13
Vistame en http://siliconproject.com.ar/neckkito/
Next tbl
'-----FASE 2--------------------------------------------
'Creamos la estructura de la tabla a travs de una
SQL
'Declaramos y definimos las variables de esta fase
Dim creaTbl As String
Dim dbs As Database
Set dbs = CurrentDb
creaTbl = "CREATE TABLE " & nomTbl & " (Nom
STRING(25), Cargo STRING(15), Cia STRING(2))"
'Ejecutamos la SQL para que se nos cree la tabla
dbs.Execute creaTbl
dbs.Close
Set dbs = Nothing
'-----FASE 3--------------------------------------------
'Creamos las conexiones y comandos para rellenar la tabla
'Declaramos las variables de esta fase
Const Comp As String = "IB"
Dim cnnExt As New ADODB.Connection
Dim cnn As ADODB.Connection
Dim cmd As New ADODB.Command
Dim rsExt As New ADODB.Recordset
Dim rs As New ADODB.Recordset
Dim ruta As String
'Definimos la ruta a la BD DatosIB
ruta = Application.CurrentProject.Path & "\DatosIB.mdb"
'Abrimos las conexiones
cnnExt.Open "Provider=Microsoft.Jet.OLEDB.4.0.;" _
& "Data Source=" & ruta & ";"
Set cnn = CurrentProject.Connection
'Definimos la conexin del Command y sus propiedades
Set cmd.ActiveConnection = cnnExt
cmd.CommandType = adCmdText
cmd.CommandText = "SELECT * FROM TCargos WHERE TCargos.Cargo='Comandante'"
'Creamos el recordset sobre la SQL definida en Command
Set rsExt = cmd.Execute
'Creamos el recordset que actuar sobre la tabla TCargosIB
rs.Open nomTbl, cnn, adOpenDynamic, adLockOptimistic
'Si no hubiera registros salimos del proceso
If rsExt.RecordCount = 0 Then Exit Sub
'Nos movemos al primer registro
With rsExt
.MoveFirst
Do Until .EOF
rs.AddNew
rs.Fields(0) = .Fields(1)
rs.Fields(1) = .Fields(2)
rs.Fields(2) = Comp
rs.Update
.MoveNext
Loop
End With
'Cerramos conexiones y liberamos memoria
rsExt.Close
rs.Close
cnn.Close

14
Vistame en http://siliconproject.com.ar/neckkito/
Set rsExt = Nothing
Set rs = Nothing
Set cmd = Nothing
Set cnn = Nothing
End Sub

Como podis ver en el cdigo, el proceso de utilizacin del


command (en este ejemplo) pasa por:

Declarar el Command (Dim cmd As New ADODB.Command)


Definir su conexin (Set cmd.ActiveConnection = cnnExt)
Especificar sus propiedades (cmd.CommandType = adCmdText)
Crear el texto de la SQL (cmd.CommandText = "SELECT * FROM TCargos WHERE
TCargos.Cargo='Comandante'")
Ejecutar el recordset basado en el command que hemos definido (Set rsExt =
cmd.Execute)

Recordad que si habis utilizado la extensin .accdb (Access 2007 2010) debis indicar, para
cnnExt, el Proveedor OLEDB correcto. Revisad el apartado, en este captulo, Iniciando las
conexiones.

Yo, personalmente, encuentro el uso del Command particularmente complicado. Os remito a


la ayuda de Access si queris profundizar un poco en el tema.

ALGUNOS CDIGOS DE EJEMPLO


Vamos a ver algunos cdigos de ejemplo para algunas situaciones posibles. Aprovecharemos
para repasar cosillas que hemos visto en captulos anteriores porque as, adems de repasar,
podemos ver utilidades varias que quiz podamos aplicar en nuestras bases de datos.

Separacin de datos
Imaginemos que hemos importado un Excel a una tabla (que yo he llamado TExcel), que nos
recoge pases de origen y destino de los vuelos. Lamentablemente, los datos vienen reflejados
en un solo campo donde se hallan separados por guiones.

Yo me he creado la tabla que recreara esta circunstancia, e introducido, a modo de ejemplo,


los siguientes datos:

Cmo podramos automatizar la separacin de estos datos en dos campos, [Origen] y


[Destino]?

15
Vistame en http://siliconproject.com.ar/neckkito/
Vamos a ver cmo conseguirlo:

1.- Situamos TExcel en vista diseo y aadimos el campo


[Origen] y el campo [Destino], de tipo texto ambos. Para
mayor claridad debera quedarnos as:

2.- En un formulario cualquiera aadimos un


botn de comando, que llamaremos
cmdSepara, y le aadimos el siguiente
cdigo:

Private Sub cmdSepara_Click()


'Declaramos las variables
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim largoPais As Integer, i As Integer
Dim vChar As String
Dim vOr As String, vDest As String
'Definimos las conexiones
Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
'Creamos el recordset
rs.Open "TExcel", cnn, adOpenKeyset, adLockOptimistic, adCmdTableDirect
'Nos movemos al primer registro
rs.MoveFirst
'Iniciamos el recorrido de registros
Do Until rs.EOF
'Cogemos la longitud del campo [Paises]
largoPais = Len(rs.Fields("Paises").Value)
'Recorremos uno a uno los caracteres del valor hasta encontrar el guin
For i = 1 To largoPais
If Mid(rs.Fields("Paises").Value, i, 1) = "-" Then
'Cuando encuentra el guin coge el nmero de caracteres -1 a la izquierda
'para sacar el valor del pas de origen
vOr = Left(rs.Fields("Paises").Value, i - 1)
'Y sacamos el valor para el destino a travs del nmero total de caracteres
'menos los caracteres del valor de origen -1
vDest = Right(rs.Fields("Paises"), largoPais - Len(vOr) - 1)
'Actualizamos los campos origen y destino
With rs
.Fields("Origen").Value = vOr
.Fields("Destino").Value = vDest
.Update
End With
'Salimos el FOR porque ya hemos encontrado el guin
Exit For
End If
Next i
'Nos movemos al siguiente registro
rs.MoveNext

16
Vistame en http://siliconproject.com.ar/neckkito/
Loop
'Cerramos conexiones y liberamos memoria
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

Si habis seguido los captulos anteriores a este, y dado que el cdigo est ampliamente
comentado, no deberas tener problema para entender cada una de las lneas de cdigo
(espero!). Y si se os escapa algo os animo a analizarlo tranquilamente para descubrir el
intringulis...

Os animo a que, partiendo de los campos [Origen] y [Destino], os creis un cdigo para
conseguir, en otro campo llamado [DatosUnidos], el mismo valor que en el campo [Paises]. En
la BD de ejemplo tenis la solucin de cmo podra ser un posible cdigo. nimo!

Bsqueda de registro: mtodo SEEK


Vamos a ver cmo sera el mtodo Seek para la bsqueda de un registro.

Supongamos que nos llega la informacin codificada por nmeros de aeropuerto, y en un


momento determinado queremos saber un nmero a qu aeropuerto pertenece. Podramos
programar un botn que nos diera esa informacin. El cdigo sera:

Private Sub cmdCodAerop_Click()


'Declaramos las variables
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim vAero As Variant
'Efectuamos la conexin
Set cnn = CurrentProject.Connection
'Definimos el recordset
Set rs = New ADODB.Recordset
'Solicitamos la informacin al usuario
vAero = InputBox("Cdigo aeropuerto?", "AEROPUERTOS")
'Abrimos el recordset
rs.Open "TAerop", cnn, adOpenKeyset, adLockReadOnly, adCmdTableDirect
With rs
.Index = "PrimaryKey"
.Seek vAero, adSeekFirstEQ
'Si no encontramos el registro...
If .EOF Then
MsgBox "No existe aeropuerto con ese cdigo", vbCritical, "SIN DATOS"
Else
'Si lo encontramos mostramos la informacin
MsgBox "Aeropuerto: " & .Fields("Aerop"), vbInformation, "RESULTADO BSQUEDA"
End If
End With
'Cerramos conexiones y liberamos memoria
rs.Close
cnn.Close
Set rs = Nothing

17
Vistame en http://siliconproject.com.ar/neckkito/
Set cnn = Nothing
End Sub

El cdigo est comentado y no requiere, creo, ms


explicaciones.

Investigando los campos de nuestras tablas


Supongamos que, como administradores de la base de datos,
queremos hacer una comprobacin rpida de qu campos tiene
una tabla, y de qu tipo son, sin necesidad de abrir la tabla. Para
ello podemos actuar sobre el objeto Field.

Por ejemplo, vamos a echarle un vistazo a las entraas de nuestra tabla TVuelos sin abrirla.

El cdigo sera el siguiente:

Private Sub cmdCamposTVuelos_Click()


'Declaramos las variables
Dim cnn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field
'Realizamos la conexin y creamos el recordset
Set cnn = CurrentProject.Connection
Set rs = New ADODB.Recordset
'Abrimos el recordset
rs.Open "TVuelos", cnn, adOpenKeyset, adLockReadOnly, adCmdTableDirect
'Recorremos los campos y mostramos su informacin
For Each fld In rs.Fields
MsgBox "Nombre campo: " & fld.Name & vbCrLf & vbCrLf _
& "Tipo campo: " & fld.Type, vbInformation, "DATOS"
Next fld
'Cerramos conexiones y liberamos memoria
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = Nothing
End Sub

Hay que tener en cuenta que fld.Type nos devolver un entero, que se corresponde con una
constante de VB, que, lgicamente, se corresponde con un tipo de campo. Os indico aqu los
ms usuales:

CDIGO NUMRICO TIPO DE CAMPO


202 Texto
3 Entero largo (Long)
2 Entero (Integer)
5 Doble (Double)
7 Fecha/hora (Date)
6 Moneda (Currency)

18
Vistame en http://siliconproject.com.ar/neckkito/
11 S/No (Boolean)
203 Memo / Hipervnculo
205 Objeto OLE

Y PARA FINALIZAR...
Y con esto damos por finalizado este captulo. Ya habris podido, espero, captar la mecnica
bsica del funcionamiento de ADO. Como ya os comentaba al principio, yo no estoy muy
habituado a utilizar este sistema, por lo que, si alguno est interesado, le animo a profundizar
por su cuenta en bsqueda de informacin, ya sea a travs de la red o a travs de la compra
de algn manual que machaque este sistema. La idea es que al menos podis entender ms
claramente la base de los cdigos que encontris o intentis poner en prctica.

Espero que os sea til lo explicado en este captulo.

Suerte!

19
Vistame en http://siliconproject.com.ar/neckkito/

Вам также может понравиться