Академический Документы
Профессиональный Документы
Культура Документы
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
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.
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.
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):
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
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):
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.
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:
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:
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.
...
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.
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).
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>;
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 en que es muy importante no olvidarse de los punto y coma (;) en la declaracin de
apertura de la conexin.
Aunque ya lo hemos visto, para mayor claridad vamos a ver las estructuras:
7
Vistame en http://siliconproject.com.ar/neckkito/
La variable cnn es una conexin ADO
Establecemos cnn como una nueva conexin
Dim cnn As ADODB.Connection
Set cnn = NEW ADODB.Connection
2 manera: declaracin directa de que la conexin es ADO y que adems es una nueva
conexin:
rs.Close
cnn.Close
Set rs = Nothing
Set cnn = nothing
Sin ms problemas.
8
Vistame en http://siliconproject.com.ar/neckkito/
CommitTrans Guarda la transaccin
RollbackTrans Cancela la transaccin
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>
LOS RECORDSET
Para abrir un recordset de una tabla o consulta, entendida la consulta como objeto de Access,
debemos, en el cdigo:
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:
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
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).
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:
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
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.
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.
15
Vistame en http://siliconproject.com.ar/neckkito/
Vamos a ver cmo conseguirlo:
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!
17
Vistame en http://siliconproject.com.ar/neckkito/
Set cnn = Nothing
End Sub
Por ejemplo, vamos a echarle un vistazo a las entraas de nuestra tabla TVuelos sin abrirla.
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:
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.
Suerte!
19
Vistame en http://siliconproject.com.ar/neckkito/