Sie sind auf Seite 1von 24

CURSO DE VB

CAPTULO 101

ndice de contenido
OBJETOS DE ACCESO A DATOS (I)................................................................................................2
OBJETOS DE ACCESO A DATOS: DAO Y ADO........................................................................2
DAO............................................................................................................................................2
Un poco de teora...................................................................................................................2
Registro de la librera DAO....................................................................................................4
Un poco de prctica................................................................................................................5
Base de datos actual...........................................................................................................5
Referencia al espacio de trabajo: Workspace....................................................................5
Referencia a las tablas.......................................................................................................7
Referencia a las consultas..................................................................................................9
Referencia a los campos..................................................................................................10
Otros objetos que existen y que no vamos a ver aqu......................................................12
ALGUNOS CDIGOS INTERESANTES SOBRE LO QUE HEMOS VISTO.................12
Creacin de una tabla.......................................................................................................13
Variacin sobre el tema...............................................................................................18
Creacin de una tabla: sistema rpido.............................................................................20
Creacin de una consulta.................................................................................................22
PARA FINALIZAR ESTE CAPTULO........................................................................................24

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 (I)
Vamos a ver en este captulo lo que se denominan objetos
de acceso a datos, que son DAO y ADO.

Segn cmo se mire este es un tema complicado; segn


cmo se mire, si se pillan los fundamentos, pues tampoco
es tan difcil operar con estos sistemas. Con ello quiero
decir que mi consejo, si segus este captulo, es que
analicis con detenimiento lo que en l se explica y los
cdigos de ejemplo, no tanto para aprender lo que hace el
cdigo sino para captar la mecnica de cmo se utilizan
los distintos elementos que nos van a aparecer.

Para empezar este captulo vamos a realizar una cosa inicial muy simple:

1.- Vamos, en una nueva base de datos, a crear una tabla, que llamaremos TTrabajadores.
Incluiremos dos campos, de la siguiente manera:

[DNI] Numrico y clave principal


[Nombre] Texto

Introducimos manualmente tres registros a lo rpido, como estos:

2.- Creamos un formulario sobre nuestra tabla TTrabajadores.


Vamos a llamarlo FTrabajadores.

3.- Insertamos, en la cabecera del formulario, un botn de


comando. Vamos a programar dicho botn con posterioridad.

Y, por ahora, lo dejamos aqu. Ya lo iremos utilizando a


medida que vayamos avanzando en el captulo.

Y sin ms prembulos, os presento a...

OBJETOS DE ACCESO A DATOS: DAO Y ADO


Para poder manipular datos (y cuando digo manipular datos me refiero a buscar datos,
actualizar datos, aadir datos, modificar datos...) en tablas y consultas nos servimos de lo que
se denominan objetos de acceso a datos.

Tenemos dos modelos de objetos de acceso a datos: DAO y ADO. Vamos a ver en qu
consisten:

DAO

Un poco de teora
Vamos con un poco de teora, para aquellos a los que les guste esto de fardar de siglas en
conversaciones sobre Access (pronto entenderis por qu digo esto de las siglas... ji, ji...) La
biblioteca de objetos DAO (Data Access Objects) se enmarca en lo que podramos denominar
dos bloques, a los que se les suele llamar espacios de trabajo.

Pensad en todo momento que la idea es acceder a datos, ya sea en una base de datos local o
una base de datos remota. Y claro, cuando empezamos a hablar de estas cosas aparece no

2
Vistame en http://siliconproject.com.ar/neckkito/
slo la figura de Access, sino que tambin se suman a la fiesta diferentes sistemas gestores de
bases de datos.

El primero de esos marcos es el espacio de trabajo


ODBCDirect. El utilizar este espacio hace que sea posible
acceder a servidores de bases ODBC sin tener que pasar el
motor de la base de datos de Microsoft Office.

Por si puede clarificaros algo os copio lo que dice la ayuda


del propio Windows (como SO -Sistema Operativo-) sobre
utilizar orgenes de datos:

<<Puede utilizar la Conectividad abierta de base de datos de orgenes de datos (ODBC) para
tener acceso a datos desde una gran variedad de sistemas de administracin de bases de datos. Por
ejemplo, si tiene un programa que obtiene acceso a los datos de una base de datos de SQL,
Orgenes de datos (ODBC) le permitir usar el mismo programa para tener acceso a los datos de
una base de datos de Visual FoxPro. Para ello, debe agregar componentes de software al sistema,
llamados controladores. Orgenes de datos (ODBC) le ayuda a agregar y a configurar estos
controladores.>>

En definitiva, este espacio de trabajo estara recomendado para ejecutar consultas, ejecutar
procedimientos (Sub) o funciones (Function) almacenados o funciones especficas de ODBC en
un servidor remoto.

Por cierto, ODBC significa Open DataBase Connectivity.

El segundo marco es el espacio de trabajo Microsoft Jet. A travs de un controlador ISAM


nos permite acceder a bases de datos como Access, tambin a servidores de bases de datos
ODBC y a otras fuentes de datos externas que pueden ser tratadas como bases de datos,
como por ejemplo Excel, dBase, Paradox, etc.

Y, por cierto, ISAM significa Indexed Sequential Access Method.

Existe lo que se denomina una Jerarqua de los objetos DAO, donde se puede apreciar la
estructura de este modelo DAO. No entraremos en sus detalles (porque eso s que sera teora
pura y dura). Slo nos vamos a quedar con un par de ideas:

Existe un padre del que penden el resto de elementos. Es el objeto DBEngine. Este
objeto es nico (no puede haber varios).
Bajo DBEngine encontramos dos objetos: Error y Workspace)
Bajo DBEngine podemos encontrar toda una serie de colecciones, que a su vez incluyen
todos los objetos de la coleccin
Existe una coleccin que se denomina Properties (menos los objetos Error). Estas
colecciones Properties se refieren a todos los objetos DAO.
Podemos encontrar propiedades y mtodos en los objetos DAO

Como veis, la cosa es un poco confusa porque estos trminos se entrecruzan, y resulta un
poco difcil explicarlo (y que conste que intento hacerlo lo mejor posible!).

Vamos a ver un ejemplo: vamos a manipular un mtodo de un objeto DAO. El objeto ser
DBEngine, y el mtodo ser CompactDatabase (no hace falta que os diga qu significa eso).
Una vez tenemos claro qu es cada cosa podemos escribir:

Private Sub...
DBEngine.CompactDatabase c:\MisBDs\miSuperBD.accdb

3
Vistame en http://siliconproject.com.ar/neckkito/
End Sub
.

Si lo que queremos es utilizar una propiedad la sistemtica


sera similar: objeto.propiedad. Por ejemplo:


Private Sub...
MsgBox Mi versin del motor Microsoft Jet es &
DBEngine.Version
End Sub

Cmo distinguirlos? Afortunadamente el editor de VB nos lo pone fcil. Si nos situamos en


dicho editor y escribimos DBEngine. veremos que automticamente nos aparece un chivato
que nos muestra los mtodos y propiedades aceptados para ese objeto. Es decir, que nos
debera aparecer una cosa as:

La manita con la tarjeta (por llamarlo de una manera) indica que nos estamos refiriendo a
una propiedad; la goma de borrar que corre (tambin por llamarlo de alguna manera) nos
indica que estamos ante un mtodo2.

Registro de la librera DAO


Si bien a partir de Access 2007 no es necesario indicar, en el cdigo, que nos estamos
refiriendo a un objeto DAO, en Access 2003 s es necesario indicrselo. Y para poder
indicrselo al cdigo es necesario aadir la librera DAO.

Para ello, en el editor de VB, debemos irnos a Men Herramientas Referencias... y buscar la
referencia Microsoft DAO 3.6 Object Library. Marcamos el check y aceptamos. Ya tenemos as
la biblioteca registrada.

Si en el peor de los casos no nos apareciera esta referencia deberamos buscarla en nuestro PC
(o bajrnosla de Internet y aadirla a nuestro sistema). El archivo se llama DAO360.dll.
Usualmente suele estar en <C:\Archivos de programa\ Archivos comunes\Microsoft
Shared\DAO>

Si tenemos ganas de leer podemos acudir al archivo DAO360.chm, que es el archivo de ayuda
de esta librera. Su ubicacin depende de nuestra versin de Office, pero en mi caso est en la
direccin <C:\Archivos de programa\Archivos comunes\Microsoft Shared\OFFICE12\3082>

2 No es objetivo de este curso explicar todas las propiedades y todos los mtodos de todas las colecciones. Si estis
interesados en algn elemento en particular os recomiendo que en el editor de VB escribis, con esta ayuda
contextual, el que os interese y, una vez escrito, os situis sobre lo escrito (o lo seleccionis todo). Tras eso pulsad
F1 y la ayuda de Access os dar una explicacin de lo que es, lo que puede hacer y, con suerte, os mostrar un
ejemplo. Yo slo os explicar los que, a mi criterio, pienso que os podran ser ms tiles.

4
Vistame en http://siliconproject.com.ar/neckkito/
Un poco de prctica

Base de datos actual


Debemos tener presente que cuando nos queremos referir a
la BD en la que estamos debemos utilizar la palabra
<CurrentDB>.

Normalmente se suele referenciar la base de datos a travs de la


variable dbs. Su declaracin suele ser de la siguiente manera:

Dim dbs as Database

o tambin

Dim dbs as DAO.Database

Para asignarle valor utilizamos el SET, de la siguiente manera:

Set dbs = CurrentDb

Al acabar nuestro cdigo es buena idea cerrar la conexin y liberar memoria. Esto se hace de
la siguiente manera:

dbs.Close
Set dbs = Nothing

Vaymonos a nuestra base de datos de ejemplo. Vamos a crear un formulario en blanco y lo


llamaremos FDAO. En un botn de comando insertamos el siguiente cdigo:

Private Sub cmdIDBD_Click()


Dim dbs As DAO.Database
Set dbs = CurrentDb
MsgBox "Mi base de datos est en/se llama " & dbs.Name, vbInformation, "BD DNI"
dbs.Close
Set dbs = Nothing
End Sub

Si ejecutamos el cdigo veremos como dbs nos devuelve, a travs de un MsgBox, la ruta,
nombre y extensin de la base de datos.

Referencia al espacio de trabajo: Workspace


Cuando trabajamos en Access trabajamos en un espacio de trabajo. Y como tal, podemos
identificarlo y manipularlo.

Vamos a ver cmo saber cmo se llama nuestro Workspace (no os ilusionis, puesto que la
respuesta puede ser un poco decepcionante).

Para ello creamos el siguiente cdigo:

Private Sub cmdWrkSce_Click()


Dim wrk As DAO.Workspace

5
Vistame en http://siliconproject.com.ar/neckkito/
Dim miWrk As String
Set wrk = DBEngine.Workspaces(0)
miWrk = wrk.Name
MsgBox "Mi espacio de trabajo se llama: " & miWrk,
vbInformation, "WORKSPACE"
End Sub

Si lo ejecutamos sabremos el nombre tan inspirado y original de


nuestro espacio de trabajo.

Vamos a crear otra BD en blanco, y la llamaremos Workspace.mdb (o Workspace.accdb).


Deberemos respetar la extensin con que la hayamos creado en el cdigo que os indicar a
continuacin, simplemente. La pondremos en el mismo directorio donde tengamos nuestra BD
de pruebas.

Lo que vamos a hacer es abrir la BD Workspace en un nuevo espacio de trabajo activo, al que
llamaremos SuperYo, situando dicha base en modo de apertura exclusivo (con lo que
bloquearemos su acceso a otros hipotticos usuarios). Tened en cuenta que cuando digo
abrir no estoy diciendo que se nos va a abrir la BD Workspace en pantalla, sino que se va a
abrir inmaterialmente (por llamarlo algo). De esta manera podemos acceder en silencio a la
nueva BD, operar sobre ella para lo que necesitemos y cerrarla.

Pondremos un pequeo MsgBox para que nos informe sobre qu Workspace y sobre qu BD
estamos operando en ese momento.

El cdigo sera:

Private Sub cmdAbreBDWrkSpce_Click()


Dim wrk As Workspace
Dim dbs As Database
Dim miBd As String
miBd = Application.CurrentProject.Path & "\Workspace.mdb"
Set wrk = CreateWorkspace("SuperYo", "admin", "", dbUseJet)
Set dbs = wrk.OpenDatabase(miBd, True)
MsgBox "Ahora tengo abierta, en mi nuevo espacio de trabajo " & wrk.Name & _
", la BD: " & dbs.Name
dbs.Close
wrk.Close
Set dbs = Nothing
Set wrk = Nothing
End Sub

An no tenemos suficientes conocimientos para poder operar sobre esa BD a distancia, pero
ms adelante vamos a reutilizar este cdigo para poder manipular la BD Workspace.mdb

Tened en cuenta que el anterior cdigo lo que hace son dos cosas:

Crea un nuevo espacio de trabajo


Abre la BD en ese nuevo espacio de trabajo

Podramos decir, hablando muy en general, que los Workspaces nos permiten administrar la
BD. Es un tema un tanto complejo y quizs, a nuestro nivel, poco til. El cdigo anterior utiliza
un Workspace de manera puntual, sin aadirlo a la coleccin de Workspaces de la BD en la que

6
Vistame en http://siliconproject.com.ar/neckkito/
estamos operando. Si alguien est interesado en profundizar sobre este elemento debe hacer
lo siguiente:

En el editor de VB, escribir la palabra Workspace


Situarse sobre ella y pulsar F1
De las opciones de ayuda, seleccionar el link
<Workspace (objeto)>

Ah podr encontrar informacin ms detallada sobre el espacio de


trabajo.

Aprovecho para comentaros que podemos abrir una BD a distancia utilizando el Workspace
actual, sin usar uno adicional. De hecho, ni siquiera tenemos que hacer referencia al
Workspace. Para hacer lo anterior simplemente nuestro cdigo podra ser:

Private Sub cmdAbreBDSinWrkSpc_Click()


Dim dbsExterna As DAO.Database
Dim BDExterna As String
BDExterna = Application.CurrentProject.Path & "\Workspace.mdb"
Set dbsExterna = DBEngine.OpenDatabase(BDExterna)
MsgBox "Acabo de abrir la BD: " & dbsExterna.Name, vbInformation, "BD EXTERNA"
dbsExterna.Close
Set dbsExterna = Nothing
End Sub

Referencia a las tablas


Para referenciar las tablas podemos utilizar la coleccin TableDefs. A su vez, podemos
manipular esta coleccin a travs de sus mtodos y propiedades.

Por ejemplo, para saber cuntas tablas tengo en mi base de datos podramos utilizar este
cdigo:

Private Sub cmdNumTablas_Click()


Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
i = dbs.TableDefs.Count
i=i-9
MsgBox "Tengo " & i & " tablas en mi base de datos", vbInformation, "MIS TABLAS"
dbs.Close
Set dbs = Nothing
End Sub

Y ahora alguien me dir: por qu a la variable i le restas un 9? Buena pregunta...

Cuando creamos una BD nueva automticamentese nos crean lo que se denominan Objetos
del sistema. Es decir, que se nos crean, usualmente, 9 tablas que contienen informacin sobre
el sistema. Estas tablas son manipulables a travs de cdigo. Si, nos situamos sobre el panel
de exploracin (Access 2007) y hacemos click con el botn derecho del ratn Opciones de
exploracin, y marcamos el check Mostrar objetos del sistema, veremos como nos aparecen
nuestras tablas de sistema.

7
Vistame en http://siliconproject.com.ar/neckkito/
Se caracterizan porque su nombre empieza por MSys.

Podemos crear tablas de sistema propias. Para ello


deberamos guardar la tabla con un nombre que comenzara
por USys. Hablaremos de esto en captulos posteriores.

Y cules son los nombres de nuestras tablas? Un simple


cdigo nos lo dir:

Private Sub cmdNomTablas_Click()


Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
For i = 0 To dbs.TableDefs.Count - 1
MsgBox dbs.TableDefs(i).Name
Next
dbs.Close
Set dbs = Nothing
End Sub

Fijaos que hemos hecho: For i = 0 Por qu cero? Porque los miembros de una coleccin
empiezan siempre su numeracin por cero, y por ello debemos empezar por dicho nmero.
Como consecuencia, en el conteo total debemos restar una unidad, de ah lo de

For i = 0 To dbs.TableDefs.Count - 1

Ahora os pido que abris vuestra mente y recordis lo que hemos visto en captulos
anteriores. En realidad, si os sirve de gua, el fondo del asunto es que disponemos de un
conjunto de piezas de un mecano y debemos organizarlas a nuestra manera. Por qu digo
esto? Porque el cdigo anterior nos muestra todas las tablas de nuestra BD (las nuestras y las
del sistema), lo cual es un autntico rollo.

Mi pregunta es: a alguien se le ocurre cmo podemos arreglar esto? Os aseguro que ya
sabis hacerlo...

Bueno. Si no se ha encendido la bombilla no pasa nada, pues todo es cuestin de prctica.


Acabamos de decir que las tablas de sistema empiezan su nombre por MSys, verdad? Pues
vamos a crear un cdigo que nos salte las tablas que empiezan por estas letras. Un posible
cdigo sera el siguiente:

Private Sub cmdTablasNoStma_Click()


Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
For i = 0 To dbs.TableDefs.Count - 1
If Left(dbs.TableDefs(i).Name, 4) <> "MSys" Then
MsgBox dbs.TableDefs(i).Name
End If
Next
dbs.Close
Set dbs = Nothing
End Sub

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

Le vamos cogiendo el truquillo?

Referencia a las consultas

Igual que hemos hecho, en el epgrafe anterior, referencia a


las tablas, podemos hacer referencia a las consultas.

Pero, antes de que alguien me diga: Y despus referencia a los formularios, a los informes...
os dir que, si repasamos la definicin del modelo, veremos que estamos hablando de acceso
a objetos que contienen datos, como son las tablas y consultas. Los formularios y los informes
son una interface para mostrarlos, y, por tanto, no entran. Hay otros sistemas para acceder a
este tipo de objetos (que ya veremos en captulos posteriores).

Siguiendo con nuestro hilo explicativo, para acceder a consultas utilizamos la coleccin
Querydefs

Vamos a crear, en nuestra BD, una consulta, que llamaremos CTrabajadores. Creamos pues
una simple consulta de seleccin sobre los datos de TTrabajadores.

Para saber cuntas consultas tenemos creadas utilizaramos el siguiente cdigo:

Private Sub cmdNumQueries_Click()


Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
i = dbs.QueryDefs.Count
MsgBox "Tenemos " & i & " consultas en la BD", vbInformation, "CONSULTAS"
dbs.Close
Set dbs = Nothing
End Sub

Ejecutamos el cdigo y... 2 consultas? Dnde est la otra?

Pues la otra est en el formulario FTrabajadores. Recordamos que creamos este formulario
basado en la tabla TTrabajadores? En realidad es como si el formulario consultara los datos
de TTrabajadores a travs de una consulta, y la coleccin Querydefs entiende que eso es
tambin una consulta.

A esa consulta del formulario Access le asigna el nombre, en nuestro caso,


~sq_fFTrabajadores3

Vaya... qu listo es Access! Vamos a arreglar un poco el cdigo:

Private Sub cmdNumQueriesSinForm_Click()


Dim dbs As DAO.Database
Dim i As Integer, j As Integer
Set dbs = CurrentDb

3 Para conseguir el signo ~ podemos:


- Pulsar la combinacin de teclas en el teclado numrico: ALT+126
- Pulsar la combinacin de teclas ALT GR+4, y a continuacin pulsamos la barra espaciadora

9
Vistame en http://siliconproject.com.ar/neckkito/
i = dbs.QueryDefs.Count
For j = 0 To dbs.QueryDefs.Count - 1
If Left(dbs.QueryDefs(j).Name, 1) = "~" Then
i=i-1
End If
Next j
MsgBox "Tenemos " & i & " consultas en la BD",
vbInformation, "CONSULTAS"
dbs.Close
Set dbs = Nothing
End Sub

Un par de comentarios:

Como hablamos de una coleccin recordad que la numeracin debe empezar por cero
hasta el recuento de elementos de la coleccin menos uno:
(For j = 0 To dbs.QueryDefs.Count 1)
Hemos echado mano a una variable auxiliar, j, para el bucle For...Next, ya que la
variable i estaba cumpliendo otra misin.
Hemos utilizado el mismo sistema de descarte que en el epgrafe anterior, solo que
filtrando por la primera letra de la consulta.

Si hubiramos creado un informe tambin nos lo hubiera contado, porque, como sabemos, un
informe basado en una tabla o consulta tiene su origen, desde este punto de vista, en una
consulta sobre dicha tabla o consulta. En este caso el nombre que le hubiera asignado,
suponiendo que hubiramos creado el informe RTrabajadores, sera: ~sq_rRTrabajadores

Finalmente, el cdigo para saber los nombres de las consultas (eliminando las consultas de
formularios e informes) sera el siguiente:

Private Sub cmdNombreQueries_Click()


Dim dbs As DAO.Database
Dim i As Integer
Set dbs = CurrentDb
For i = 0 To dbs.QueryDefs.Count - 1
If Left(dbs.QueryDefs(i).Name, 1) <> "~" Then
MsgBox dbs.QueryDefs(i).Name
End If
Next
dbs.Close
Set dbs = Nothing
End Sub

Recordad que si podemos pillar un objeto lo podemos manipular.

Referencia a los campos


Los campos de una tabla pertenecen a una coleccin. Dicha coleccin se conoce con el nombre
de Fields.

Si ahondamos ms en la parte terica, podemos decir que un objeto Field representa un


campo de:
Una tabla

10
Vistame en http://siliconproject.com.ar/neckkito/
Una relacin
Una consulta
Una relacin de registros
Un ndice

Aunque me repita como la cebolla, recordad que como es


un objeto implica que tiene propiedades y mtodos, y, por
tanto, es manipulable.

Por ejemplo, vamos a escribir un cdigo que nos diga los nombres
de los campos de nuestra tabla TTrabajadores. El cdigo sera:

Private Sub cmdCamposTTrab_Click()


Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
Set dbs = CurrentDb
Set tbl = dbs.TableDefs("TTrabajadores")
For Each fld In tbl.Fields
MsgBox "Nombre del campo: " & fld.Name, vbInformation, "CAMPOS"
Next fld
End Sub

Si os sirve de referencia pensad en lo que en ocasiones he comentado: Access es tonto.


Basndome en esta premisa en el cdigo debemos indicar con qu vamos a trabajar (bueno,
esto entendedlo como algo general y meramente abstracto). Es decir:

Private Sub...
Voy a trabajar con una base de datos
Voy a trabajar con las tablas
Voy a trabajar con los campos
La base de datos es la que tengo abierta actualmente
La tabla es TTrabajadores
Para cada campo de los campos de la tabla TTrabajadores...
etc.
End sub

Cuando vamos a operar con las propiedades de los campos es como si abriramos la tabla en
vista diseo y, al situarnos sobre uno de los campos, manipulramos manualmente las
propiedades (algunas ms otras extras).

Voy a comentar unas pocas (no todas) para que podamos ver las equivalencias:

PROPIEDAD DEL CAMPO PROPIEDAD VBA


Nombre del campo Name
Tipo de datos Type
Tamao del campo Size
Tamao del campo (para memos y OLE's) FieldSize
Valor predeterminado DefaultValue
Requerido Required
Permitir longitud cero AllowZeroLenght

11
Vistame en http://siliconproject.com.ar/neckkito/
Regla de validacin ValidationRule

Texto de validacin ValidationText


OTRAS INTERESANTES
Para indicar que el campo puede actualizarse DataUpdatable
Para indicar el campo origen de los datos SourceField
Para indicar la tabla origen de los datos SourceTable
Para establecer una validacin ValidateOnSet
inmediatamente despus de actualizar su
valor

Otros objetos que existen y que no vamos a ver aqu


Existen otros objetos que no vamos a tratar en este captulo, bsicamente porque, desde mi
punto de vista, para un administrador normal de una BD, no son elementos que se utilicen
de manera imprescindible. Evidentemente es mi criterio y supongo que alguien habr que est
en desacuerdo. En fin...

Sin embargo creo necesario, como mnimo, comentarlos. De esta manera sabremos que
existen y, gracias a nuestro fantstico F1, podremos buscar ms informacin sobre ellos.

Esos objetos son:

Parameter
Index
Relation
Container
Document
User
Group
Property

Pues ah quedan, para la memoria histrica de todos.

ALGUNOS CDIGOS INTERESANTES SOBRE LO QUE HEMOS VISTO


Vamos a ver algunas acciones interesantes que podemos realizar sobre nuestra BD en base a
los cdigos, o, en plan purista, la esencia de los cdigos que hemos visto hasta ahora.
Aprovecharemos para ver cmo se manipulan algunos mtodos y propiedades y cmo se
plasman en un cdigo.

Los cdigos los voy a comentar para que sepis en todo momento qu es lo que estn
haciendo. No tomis estos ejemplos como bloques inamovibles de cdigo, sino que vedlos
como pequeos cdigos que unimos para conseguir un efecto mayor. Es decir, que una

12
Vistame en http://siliconproject.com.ar/neckkito/
parte del cdigo, si le vemos su utilidad, podra ser aplicada en otra situacin para sacarnos de
un aprieto (sin necesidad de tener que coger todas las lneas de cdigo). Evidentemente lo
anterior es un consejo de estudio.

Ah vamos con los ejemplos:

Creacin de una tabla


Vamos a crear una tabla para recoger los trabajos realizados. Por
qu no creamos la tabla a mano? Pongamos el supuesto que los
datos nos van a llegar a travs de un Excel, y no nos interesa
tener esa tabla permanentemente en nuestra BD. Queremos slo
que aparezca cuando a nosotros nos interese. En definitiva, el
proceso sera:

Creo la tabla
Importo el Excel
Trabajo con la tabla
Borro la tabla

Lgicamente es un supuesto que podramos resolver de distintas maneras, pero nosotros lo


haremos a travs de lo explicado hasta ahora (s, ya s que an no se ha explicado cmo
importar desde un Excel, pero digamos que aprovecharemos este cdigo para una primera
aproximacin).

Ante todo, debemos tener una tabla de caractersticas similares al Excel que vamos a importar.
Supongamos que tenemos un Excel llamado ExcelTrabajos.xls con los siguientes datos:

Si analizamos ese Excel veremos que necesitamos:

Un [Num] numrico, para la lnea


Un [Trabajador] numrico, para el identificador del trabajador
Un [Trabajo] texto, para la descripcin del trabajo
Un [Fecha] fecha/hora, para la fecha del trabajo
Un [Coste] moneda, para el coste del trabajo.

Fijaos que la columna <Trabajador> nos est proporcionando el DNI del trabajador.

Pues manos a la obra. La primera fase del cdigo sera as (ojo, que no est acabado an):

Private Sub cmdCreaTTrabajos_Click()


'Declaramos las variables
Const nomTbl As String = "TTrabajos"
Dim i As Integer
Dim miExcel As String
Dim dbs As DAO.Database

13
Vistame en http://siliconproject.com.ar/neckkito/
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
'Definimos la variable dbs
Set dbs = CurrentDb
'-----FASE 1: ELIMINACION DE LA TABLA
'Primero debemos examinar si la tabla existe. Si
intentamos crearla
'y la tabla existe nos dar error de cdigo. En teora la
habremos
'eliminado, pero por si acaso...
For i = 0 To dbs.TableDefs.Count - 1
If dbs.TableDefs(i).Name = nomTbl Then
dbs.TableDefs.Delete nomTbl
Exit For
End If
Next i
'-----FASE 2: CREAMOS LA TABLA
'La creamos como un nuevo objeto y despus le asignamos el nombre
Set tbl = New DAO.TableDef
tbl.Name = nomTbl
'La tabla est creada ahora, pero no se muestra an en la BD. Antes
'debemos crear los campos.
'-----FASE 3: CREAMOS LOS CAMPOS
'Creamos los campos como nuevos elementos de la tabla, a la vez que
'definimos las propiedades que nos interesan
Set fld = New DAO.Field
With fld
.Name = "Num"
.Type = dbLong 'Entero largo
End With
'Incluimos el campo creado en la tabla
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Trabajador"
.Type = dbLong
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Trabajo"
.Type = dbText 'Texto
.Size = 50
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Fecha"
.Type = dbDate
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Coste"
.Type = dbCurrency 'Moneda
End With

14
Vistame en http://siliconproject.com.ar/neckkito/
tbl.Fields.Append fld
'-----FASE 4: AADIMOS LA TABLA A LA BD ACTUAL
dbs.TableDefs.Append tbl
'-----FASE 5: IMPORTAMOS LOS DATOS DEL EXCEL
'Definimos la ruta donde est el Excel. En este caso lo
tenemos
'situado en el mismo directorio de la BD
miExcel = Application.CurrentProject.Path 'Nos da la ruta
del directorio
miExcel = miExcel & "\ExcelTrabajos.xls" 'Nos da la
ruta+archivo+extensin
'Importamos el Excel a la tabla recin creada
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, nomTbl, miExcel, True
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Vayamos por partes:

Fase 1: con lo visto, no deberamos tener ningn problema para entender esta fase. Debemos
quedarnos con la idea de que si el objeto tabla ya existe nos dar un error de cdigo. Para ello
se hace imprescindible verificar que no existe y, si existe, borrarlo.
La sentencia que borra la tabla es, evidentemente: dbs.TableDefs.Delete nomTbl
Si ya ha encontrado la tabla no tiene sentido seguir ejecutando el bucle. Por eso le
indicamos que salga de l a travs de: Exit For

FASE 2: Con esta fase creamos la tabla de manera inmaterial, por decirlo de alguna manera.
Si no lo hiciramos as, dnde crearamos los campos?

FASE 3: Creamos los campos. En el cdigo hemos creado los campos con los atributos
indispensables. Os recuerdo que podemos establecer ms propiedades a travs de las
propiedades que os mostraba en la tabla de equivalencias unas pginas antes.

El proceso, como habris visto, es:


Creamos el campo como un nuevo campo: Set fld = New DAO.Field
Establecemos las propiedades (a travs de un bloque With...End With)
Anexamos el campo a la tabla: tbl.Fields.Append fld

FASE 4: Aadimos la tabla a la BD, ya como objeto visible.

FASE 5: Importamos el Excel. No me entretendr en esta lnea de cdigo porque explicaremos


en un captulo posterior la importacin/exportacin de datos. Si alguien est interesado en
saber ms sobre los elementos que componen dicha lnea ya sabe que slo debe ponerse
encima de ellos y pulsar F1.

Muy bien... Ya tenemos nuestra BD creada. Sigamos con el supuesto. Imaginemos que el jefe
quiere hacer un seguimiento de un trabajador en concreto. Qu hacemos? Pues como
tenemos nuestra tabla TTrabajos creada (porque habremos ejecutado el proceso al menos una
vez) lo que vamos a hacer es una consulta parametrizada sobre esa tabla, que llamaremos
CParaElJefe. La consulta ser simplemente la siguiente:

15
Vistame en http://siliconproject.com.ar/neckkito/
Ojo! La relacin entre los campos [DNI] y [Trabajador] la deberemos realizar manualmente.

Y como la informacin es para el jefe vamos a realizar un informe sobre dicha consulta, que
llamaremos RParaElJefe.

Mi informe me ha quedado as. Destacar (si hay algo que destacar) el campo calculado en el
pie del informe.

OK. Ahora ya podemos continuar con nuestro cdigo. Para que os ubiquis contino a partir de
la FASE 5

'-----FASE 5: IMPORTAMOS LOS DATOS DEL EXCEL


'Definimos la ruta donde est el Excel. En este caso lo tenemos
'situado en el mismo directorio de la BD
miExcel = Application.CurrentProject.Path 'Nos da la ruta del directorio
miExcel = miExcel & "\ExcelTrabajos.xls" 'Nos da la ruta+archivo+extensin
'Importamos el Excel a la tabla recin creada
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, nomTbl, miExcel, True
'-----FASE 6: LANZAMOS EL INFORME DIRECTAMENTE A LA IMPRESORA

16
Vistame en http://siliconproject.com.ar/neckkito/
DoCmd.OpenReport "RParaElJefe"
'-----FASE 7: BORRAMOS LA TABLA CON LOS DATOS
dbs.TableDefs.Delete nomTbl
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Si ejecutamos el proceso una vez (como lo sera en un uso normal de la BD) veremos que el
informe se enva correctamente a la impresora. Pero, qu hemos conseguido?

Pues que si por casualidad algn trabajador listillo se salta los bloqueos de la BD (o,
simplemente, no hemos asegurado nuestra BD) y ve que hay un informe para el jefe, si
intenta abrirlo pues... su gozo en un pozo. Intentad abrir ese informe (o la consulta de
origen) a ver qu obtenis (dando por supuesto que habis ejecutado el cdigo y que la tabla
TTrabajos se ha borrado, claro)... je, je...

El cdigo entero nos quedara as:

Private Sub cmdCreaTTrabajos2_Click()


'Declaramos las variables
Const nomTbl As String = "TTrabajos"
Dim i As Integer
Dim miExcel As String
Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
'Definimos la variable dbs
Set dbs = CurrentDb
'-----FASE 1: ELIMINACION DE LA TABLA
'Primero debemos examinar si la tabla existe. Si intentamos crearla
'y la tabla existe nos dar error de cdigo. En teora la habremos
'eliminado, pero por si acaso...
For i = 0 To dbs.TableDefs.Count - 1
If dbs.TableDefs(i).Name = nomTbl Then
dbs.TableDefs.Delete nomTbl
Exit For
End If
Next i
'-----FASE 2: CREAMOS LA TABLA
'La creamos como un nuevo objeto y despus le asignamos el nombre
Set tbl = New DAO.TableDef
tbl.Name = nomTbl
'La tabla est creada ahora, pero no se muestra an en la BD. Antes
'debemos crear los campos.
'-----FASE 3: CREAMOS LOS CAMPOS
'Creamos los campos como nuevos elementos de la tabla, a la vez que
'definimos las propiedades que nos interesan
Set fld = New DAO.Field
With fld
.Name = "Num"

17
Vistame en http://siliconproject.com.ar/neckkito/
.Type = dbLong 'Entero largo
End With
'Incluimos el campo creado en la tabla
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Trabajador"
.Type = dbLong
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Trabajo"
.Type = dbText 'Texto
.Size = 50
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Fecha"
.Type = dbDate
End With
tbl.Fields.Append fld
Set fld = New DAO.Field
With fld
.Name = "Coste"
.Type = dbCurrency 'Moneda
End With
tbl.Fields.Append fld
'-----FASE 4: AADIMOS LA TABLA A LA BD ACTUAL
dbs.TableDefs.Append tbl
'-----FASE 5: IMPORTAMOS LOS DATOS DEL EXCEL
'Definimos la ruta donde est el Excel. En este caso lo tenemos
'situado en el mismo directorio de la BD
miExcel = Application.CurrentProject.Path 'Nos da la ruta del directorio
miExcel = miExcel & "\ExcelTrabajos.xls" 'Nos da la ruta+archivo+extensin
'Importamos el Excel a la tabla recin creada
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel8, nomTbl, miExcel, True
'-----FASE 6: LANZAMOS EL INFORME DIRECTAMENTE A LA IMPRESORA
DoCmd.OpenReport "RParaElJefe"
'-----FASE 7: BORRAMOS LA TABLA CON LOS DATOS
dbs.TableDefs.Delete nomTbl
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub
...

Variacin sobre el tema


Ahora viene nuestro jefe y nos dice que quiere una vista preliminar del informe antes de
enviarlo a la impresora. Sin problema: cambiamos la lnea DoCmd.OpenReport "RParaElJefe"
por la lnea DoCmd.OpenReport "RparaElJefe", acViewPreview

18
Vistame en http://siliconproject.com.ar/neckkito/
Qu pasa?

Pues pasa esto:

Es decir, que no nos puede borrar la


tabla porque el informe la est utilizando. Vaya un problemn, verdad? Porque si no
borramos la tabla la informacin estar al alcance de miradas indiscretas. Qu podemos
hacer?

Pues lo que haremos ser dividir la ejecucin del cdigo en dos partes. La primera ser hasta
que se muestre el informe en vista previa. As, utilizaramos todo el cdigo anterior pero lo
finalizaramos de la siguiente manera:

'Todo el cdigo anterior hasta FASE 5


''-----FASE 6: LANZAMOS UN PREVIEW DEL INFORME
DoCmd.OpenReport "RParaElJefe2", acViewPreview
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Ahora vamos a por la segunda parte. Necesitamos un evento que deba producirse
obligatoriamente para asegurarnos que borramos la tabla. El problema que nos encontramos
es que no podemos operar sobre el informe directamente porque la tabla que queremos borrar
es, precisamente, su origen de datos, y obtendramos el error 3211 que antes comentbamos.

Luego debemos buscar en nuestra BD (y eso ya depender de cmo la hayamos estructurado)


algo que nos genere el evento que necesitamos para poder borrar la tabla. Por ejemplo, si
nuestra BD se abre con un formulario de inicio (como es el caso de la BD de ejemplo) podemos
sacar las propiedades de ese formulario y asignar el siguiente cdigo al evento Al abrir de
ese formulario

Private Sub Form_Open(Cancel As Integer)


Dim tbl As Object
For Each tbl In CurrentData.AllTables
If tbl.Name = "TTrabajos" Then
DoCmd.DeleteObject acTable, tbl.Name
Exit For
End If
Next tbl
End Sub

19
Vistame en http://siliconproject.com.ar/neckkito/
Fijaos que en este cdigo hemos utilizado otro sistema para identificar la tabla: no hemos
definido la variable tbl como un DAO.TableDef, sino que lo hemos definido como un objeto de
la base de datos. El proceso ha sido:
Lo definimos como objeto: Dim tbl As Object
Le decimos que ese objeto es una tabla:
CurrentData.AllTables
Miramos si existe a travs del bloque FOR EACH...NEXT e
IF...END IF
Si existe lo borramos a travs de nuestro amigo DoCmd,
con la siguiente estructura:
DoCmd.DeleteObject acTipoObjeto, nombreObjeto

Como no vamos a operar sobre las propiedades de la tabla no tiene sentido crear referencias a
DAO, borrar la tabla y despus tener que cerrar conexiones y liberar memoria. Este sistema
que acabamos de aprender es bastante ms prctico si no necesitamos operar sobre
elementos de la tabla.

Creacin de una tabla: sistema rpido


El cdigo anterior nos daba un control muy grande sobre todos los elementos de nuestra tabla.
Sin embargo, puede ser que queramos crear una tabla de una manera ms rpida (cuando
digo rpida me refiero a no tener que escribir tantas lneas de cdigo). Vamos a verlo.

Supongamos que queremos crear una tabla temporal por los motivos que sean. En nuestro
caso, la tabla ser para guardar los trabajos de un proyecto especial que se repite
espordicamente, pero no nos interesa guardar los datos de manera permanente en la BD.

El cdigo para crear esa tabla sera:

Private Sub cmdCreaTblRapido_Click()


'Declaramos las variables
Const nomTabla As String = "TTrabEsporadico"
Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
Dim tblBorro As Object
'Definimos la BD de trabajo
Set dbs = CurrentDb
'Si la tabla existe, la eliminamos antes
For Each tblBorro In CurrentData.AllTables
If tblBorro.Name = nomTabla Then
dbs.TableDefs.Delete tblBorro.Name
Exit For
End If
Next
'Definimos la tabla crendola directamente
Set tbl = dbs.CreateTableDef(nomTabla)
'Definimos los campos anexndolos directamente a la tabla
With tbl
.Fields.Append .CreateField("Id", dbLong)
.Fields.Append .CreateField("Trabajador", dbLong)
.Fields.Append .CreateField("Fecha", dbDate)
.Fields.Append .CreateField("DescripTrabajo", dbText, 255)
End With
'Aadimos la tabla a la BD actual

20
Vistame en http://siliconproject.com.ar/neckkito/
dbs.TableDefs.Append tbl
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Como vemos en el cdigo,

Recordad que debemos borrar la tabla antes de crearla.


Creamos la tabla al tiempo de definimos la variable:
Set tbl = dbs.CreateTableDef(nomTabla)
Aprovechamos el bloque With...End With para
Manipular los campos a travs de .Fields.Append
Manipular la tabla a travs de .CreateField("Id", dbLong)
Fijaos que hay un espacio entre .Fields.Append y .CreateField. Eso vendra a
significar, si escribiramos el cdigo sin el bloque With:
tbl.Fields.Append
tbl.CreateField(...)

Importante: tened en cuenta que a veces Access tarda en refrescar la informacin en el panel
de exploracin. Eso significa que quiz no veis la tabla, pero est ah. Una manera rpida de
comprobarlo es empezar a crear una consulta en vista diseo, y veremos las tablas que hay
disponibles (cancelamos la creacin de la consulta, a no ser que la necesitemos). Cuando
menos lo esperemos nuestra tabla aparecer en el panel por arte de magia.

Adicin de campos a una tabla existente


Imaginemos que queremos aadir un campo a una tabla existente. Primero deberemos
comprobar que ese campo no existe, y, si efectivamente no existe, lo aadiremos.

Vamos a ejecutar un cdigo que, adems, nos servir para el epgrafe siguiente. Vamos a
aadir un campo a la tabla TTrabajadores, que nos informar del sexo del trabajador.

El cdigo podra ser el siguiente:

Private Sub cmdAadeCampo_Click()


'Declaramos las variables
Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
Dim hayCampo As Boolean
'Definimos las variables
Set dbs = CurrentDb
Set tbl = dbs.TableDefs!TTrabajadores
hayCampo = False
'Recorremos los campos de la tabla para ver si existe
For Each fld In tbl.Fields
If fld.Name = "Sexo" Then
hayCampo = True
Exit For
End If

21
Vistame en http://siliconproject.com.ar/neckkito/
Next fld
'Si no hay campo (es decir, hayCampo es False) lo aadimos
'con el sistema que hemos acabado de aprender
If hayCampo = False Then
With tbl
.Fields.Append .CreateField("Sexo", dbText, 6)
End With
End If
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Destacar una idea nueva que aparece en este cdigo: nos hemos servido, en primer trmino,
de una variable booleana para, primero, definirla con un valor predeterminado y, segundo,
cambiarle ese valor si se cumple una condicin (el campo ya existe). Y, en segundo trmino,
realizar una serie de acciones en funcin de lo que devuelva la booleana. Si queris un consejo
yo tomara nota de este recurso, porque en ocasiones no se puede ejecutar el cdigo
directamente sin haber evaluado antes una condicin, y las variables booleanas se prestan
mucho a facilitarnos el trabajo si fuera el caso.

Para acabar este epgrafe os dir que si lo que quisiramos es lo contrario, es decir, eliminar un
campo que ya existe en la tabla, el cdigo sera:

Private Sub cmdEliminaCampo_Click()


'Declaramos las variables
Dim dbs As DAO.Database
Dim tbl As DAO.TableDef
Dim fld As DAO.Field
'Definimos las variables
Set dbs = CurrentDb
Set tbl = dbs.TableDefs!TTrabajadores
'Recorremos los campos de la tabla para ver si existe. Si existe
'lo eliminamos
For Each fld In tbl.Fields
If fld.Name = "Sexo" Then
tbl.Fields.Delete fld.Name
Exit For
End If
Next fld
'Cerramos conexiones y liberamos memoria
dbs.Close
Set fld = Nothing
Set tbl = Nothing
Set dbs = Nothing
End Sub

Creacin de una consulta


Puede interesarnos tambin crear consultas en tiempo de ejecucin. Y ya sabemos que crear
una consulta es trabajar con SQL. Yo no voy a explicar las SQL que utilicemos aqu (que sern

22
Vistame en http://siliconproject.com.ar/neckkito/
muy fciles), porque ahora interesa centrarnos en la creacin de consultas.

Antes vamos a hacer una pequea modificacin a nuestra


tabla TTrabajadores. Vamos a completar el campo [Sexo]
que hemos creado en el epgrafe anterior en cada uno de
los registros con los valores Hombre o Mujer.

Hecho esto, vamos a ver esto de las consultas.

Supongamos que queremos filtrar por el valor Mujer. El


cdigo con el que conseguiramos lo anterior sera:

Private Sub cmdCreaConsulta_Click()


'Declaramos las variables
Dim dbs As DAO.Database
Dim qry As DAO.QueryDef
Dim qryBorro As Object
Dim miSql As String
'Definimos la variable dbs
Set dbs = CurrentDb
'Miramos si existe la consulta. Si existe la eliminamos
For Each qryBorro In CurrentData.AllQueries
If qryBorro.Name = "CTempSexo" Then
DoCmd.DeleteObject acQuery, qryBorro.Name
Exit For
End If
Next
'Definimos la SQL
miSql = "SELECT TTrabajadores.* FROM TTrabajadores"
miSql = miSql & " WHERE TTrabajadores.Sexo='Mujer'"
'Creamos la consulta
Set qry = dbs.CreateQueryDef("CTempSexo", miSql)
'Ejecutamos la consulta
DoCmd.OpenQuery "CTempSexo"
'Cerramos conexiones y liberamos memoria
qry.Close
dbs.Close
Set qry = Nothing
Set dbs = Nothing
End Sub

Tengamos en cuenta lo siguiente:

Al igual que hacamos con las tablas, debemos comprobar que la consulta no existe y, si
existe, borrarla. As nos evitaremos errores de cdigo
Definimos la SQL a travs de una variable de tipo String
Creamos la SQL a travs de la propia definicin de la consulta, utilizando
CreateQueryDef, con dos argumentos separados por comas: el nombre de la consulta y
la SQL
Set qry = dbs.CreateQueryDef("CTempSexo", miSql)
Recordad que es posible que no veamos inmediatamente la consulta en el panel de
exploracin por tardanza en el refresco de la informacin.

Y por qu la he llamado CTempSexo? Si recordis, podemos utilizar nuestro formulario de

23
Vistame en http://siliconproject.com.ar/neckkito/
inicio para eliminar todo aquello que no nos interese que quede como objeto en la base de
datos. Imaginaos que creamos varias consultas en tiempo de ejecucin. Hay que hacer una
lista de todas ellas para borrarlas?

Pues no: podemos decirle al cdigo que borre slo las que
comienzan por CTemp. As, el cdigo en el evento Al abrir
de nuestro formulario de inicio (o el que nosotros elijamos
para tal accin) sera:

Private Sub Form_Open(Cancel As Integer)


'Borramos las consultas temporales, si existen
Dim qry As Object
For Each qry In CurrentData.AllQueries
If Left(qry.Name, 5) = "CTemp" Then
DoCmd.DeleteObject acQuery, qry.Name
End If
Next qry
End Sub

Fijaos que esta vez no utilizamos el Exit For, dado que necesitamos que el cdigo recorra todas
las consultas porque puede haber ms de una consulta que empiece por CTemp

PARA FINALIZAR ESTE CAPTULO


Hemos visto en este captulo qu sistemas hay para acceso a datos, qu es de manera
terica DAO y cmo podemos, a travs de l, crear tablas y consultas (con las variaciones
sobre el tema oportunas). El tema es realmente extenso y este manual no tiene la
pretensin de ser una biblia de DAO.

Sin embargo, no hemos acabado con DAO todava. En el prximo captulo entraremos en lo
que se conoce con el nombre de... Recordset.

Y as, por finalizar a lo americano, os dir...

To be continued...

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

Das könnte Ihnen auch gefallen