Visual Basic Guía del estudiante Cap.

12
Objetos DAO ACCESO A BASES DE DATOS SIN UTILIZAR EL CONTROL DATA En el capítulo anterior hemos visto los controles capaces de acceder a un Base de Datos, enlazados mediante un control Data. Se comenzó a exponer que no es necesario usar un control Data para acceder a leer datos, añadir registros o cambiar su contenido. Y es más. Comenzaremos ahora a ver que el control Data pese a que puede evitarnos gran cantidad de líneas de código, nos hace perder el control respecto al programa. Es normal. El control Data se ha desarrollado para realizar un trabajo muy estándar. Si nuestra aplicación se separa un poco de lo normal, lo mas probable es que necesitemos realizar las operaciones mediante código. Esto no quiere decir que el Data haya que dejarlo en desuso. Será necesario en aquellas aplicaciones en las que se va a usar un control DBGrid, pues como se recordará, mediante el uso de un control Data metemos en memoria RAM todo el contenido de la base de datos relativo al Recordset que hemos creado. El control Data será necesario en aquellas aplicaciones donde utilicemos un DBGrid, un DBList o un DBCombo. Veremos mas adelante que también será necesario cuando queramos guardar imágenes en una Base de Datos. El control Data también permite consultas más rápidas a la BD. El hecho de guardar el contenido completo del Recordset en la memoria hace que cualquier consulta sea más rápida. Eso sí, estamos empleando mucha más memoria RAM. Pero en este capítulo vamos a ver como se pueden manejar bases de datos utilizando otros objetos de acceso a datos. Concretamente los objetos DAO.- (Data Access Objet). Los objetos DAO utilizan el Motor de Bases de Datos Jet de Microsoft y trabajan directamente sobre el fichero que contiene la base de datos. Existen otros objetos de acceso a datos, como ha podido ver en el capítulo anterior, que no trabajan directamente sobre el fichero, sino sobre una conexión ODBC que enlaza con la base de datos. Son los objetos RDO y ADO, cuyo estudio se realizará en capítulos posteriores. Estos últimos tipos son mas modernos, pero no tienen algunas prestaciones que tienen los DAO, debido precisamente a que no trabajan directamente sobre el fichero. Centrémonos sobre los objetos DAO Estos objetos, pese a que no tienen representación en la interface gráfica, son objetos Visual Basic como los demás, y nos podremos referir a ellos por su nombre como hacíamos con todos los controles. Eso sí, debemos declararlos como se declaran las variables, y siguen siendo válidos los criterios de declaración de variables en cuanto al ámbito de aplicación. Si declaramos un DAO en un procedimiento, no nos podremos referir a él fuera de ese procedimiento. Si queremos que sea válido en toda la aplicación deberemos declararlo en la sección de declaraciones de un módulo, o en la sección de declaraciones de un formulario si fuese suficiente ese ámbito para nuestra aplicación. La primera sorpresa suele ocurrir a la hora de declarar un objeto. Por ejemplo, para declarar un objeto tipo DataBase debemos hacerlo con la siguiente declaración: Dim MiBaseDatos As DataBase Y al ejecutar el programa puede ocurrirle el siguiente error: Error de compilación. No se ha definido el tipo definido por el usuario. Lo que le está ocurriendo es que su programa no conoce el tipo de variable DataBase. Para que la conozca, debe agregarle una referencia. Vaya a Proyecto | Referencias … de la barra de menú y seleccione Microsoft DAO 3.51 Objet Library Haga click en Aceptar y ya tiene agregada esa referencia a su programa. Agregar una referencia significa que le ha dicho a su programa que puede hacer uso de una colección de DLLs donde podrá encontrar la definición del objeto o la variable que no encuentra. Ahora ya no le dará el error anterior, pues en esa Visual Basic - Guía del Estudiante Capítulo 12 Página 1

LSB

DLL que acaba de agregarle a su programa está la explicación al secreto de lo que es un objeto DataBase. Verá que hay mas referencias parecidas a Microsoft DAO 3.51. (Las versiones 2.0, 2.1, 2.5/3.5, y si ha instalado Access2000 tendrá la 3.6) Existen tantas versiones distintas como versiones de Access. En realidad esta DLL no es mas que un componente de Access que podemos usar, al igual que lo hace Access, para gestionar una base de datos. Debe elegir la versión mas alta, pero con cuidado. La versión 3.5 corresponde a la versión de Access 97. Cuando cree con su programa una base de datos con esta versión, no podrá abrirla con Access 2.0 No se olvide de la teoría de la compatibilidad de Microsoft, que dice que cualquier versión que Microsoft considere obsoleta no debe reconocer los datos guardados por versiones más modernas del mismo programa. Piense si es posible que alguien que vaya a abrir una base de datos guardada con su aplicación dispone de una versión anterior de Access. Por ejemplo, cuando se está escribiendo este libro, está recién aparecido Access 2000. ¿Cree que es oportuno en estos momentos, en los que todavía se está introduciendo en muchos usuarios Access 97 usar una DLL que nos cree bases de datos que solamente puedan ser abiertas por Access 2000?. La versión Microsoft DAO 3.6 corresponde a Access 2000. Si ha instalado este programa le aparecerá esa referencia en la lista de referencias. No se sorprenda si antes de instalar Access 2000 no tenía esa referencia y después de la instalación sí. Si crea una BD con la versión 3.6 no podrá abrirla con Access 97 ¡Esta es la compatibilidad hacia delante de Microsoft!

Objetos DAO de acceso a datos
Son muchos y tienen estructura jerárquica. Es importante resaltar lo de su estructura jerárquica, ya que como verá, un objeto DAO crea los objetos DAO inmediatamente inferiores en jerarquía. Hay que señalar que las colecciones de estos objetos DAO son a su vez objetos de acceso a datos. Esto hay que explicarlo un poco mejor. Por ejemplo, un objeto Database es un objeto DAO que representa una base de datos abierta. Al objeto que agrupa a todas las bases de datos abiertas en ese momento le llamamos Objeto Databases. Si tenemos dos bases de datos abiertas en un determinado momento, el objeto Databases contendrá dos elementos. Todos los objetos DAO excepto el dbEngine tienen colecciones. Es lógico. El dbEngine, como verá mas adelante, es precisamente el Motor de Bases de Datos Jet y solamente existe uno. Comenzaremos precisamente por él la explicación de los objetos DAO. El dbEngine es el motor Jet. Y como vimos en el capítulo anterior, la versión 3.5 puede trabajar directamente sobre el fichero de la base de datos o a través de una conexión ODBC. En el primer caso decimos que está trabajando en el espacio de trabajo Microsoft Jet Si le hacemos trabajar a través de ODBC decimos que estamos trabajando en el espacio de trabajo ODBCDirect Los objetos que emplea en cada uno de los espacios de trabajo pueden verse en las figuras 20.1 y 20.2. Puede observarse que tiene muchos mas objetos en el espacio de trabajo Microsoft Jet que en el de ODBCDirect. Es lógico. Con el primero nos permite CREAR bases de datos, y por lo tanto necesita tener objetos tales como el Tabledef, Index o Relation. Lo verá un poco mas adelante. El objeto dbEngine tiene los siguientes métodos, propiedades y colecciones Métodos CreateWorkspace, CompactDatabase, RepairDatabase, Idle, RegisterDatabase Propiedades DefaultPassword, DefaultUser, IniPath, LoginTimeout, Version Colecciones Errors, Properties, Workspaces

LSB

Visual Basic - Guía del Estudiante

Capítulo 12

Página 2

Veremos estos métodos y propiedades según vayamos avanzando en el capítulo

LSB

Visual Basic - Guía del Estudiante

Capítulo 12

Página 3

Fig. 20.1 Objetos DAO para el espacio de trabajo Microsoft Jet

En esta figura pueden verse los objetos y sus colecciones. Las colecciones llevan el nombre en plural. Parece un poco complicado, y posiblemente lo será. Lo cierto es que para el trabajo que se hace normalmente con bases de datos este diagrama queda bastante reducido. No se extrañe tampoco de ver que objetos como el Fields y el Field existen en varios niveles. Lo verá mucho mejor mas adelante.

LSB

Visual Basic - Guía del Estudiante

Capítulo 12

Página 4

Fig. 20.2 Objetos DAO para el espacio de trabajo ODBCDirect

Este modelo parece un poco mas asequible. La razón es que no hace todo lo que hace el espacio de trabajo Microsoft Jet.

Objeto Workspace
Un objeto Workspace define una sesión de trabajo para un usuario específico. Una sesión de trabajo es precisamente eso, una sesión de trabajo en el más puro estilo informático. Pueden existir varias sesiones de trabajo, pero en la mayoría de los casos eso no es lo normal. Será necesario crear varias sesiones cuando necesitemos imponer restricciones de acceso a una base de datos, cuando tengamos que usar Transacciones (*) en un sistema multiusuario, y en algún caso más. Las sesiones de trabajo tienen dueño (Usuario) y una palabra clave para acceder a ellas. Pero lo normal es tener solamente una sesión abierta. Y visual Basic nos facilita este caso abriendo una sesión de trabajo automáticamente. Cuando se inicia Visual Basic, se crea un Workspace con palabra clave y nombre de usuario Admin. Este Workspace es precisamente el que ocupa el número cero de la colección de Workspaces. Es decir, es el Workspaces(0). No se preocupe de que ahora mismo no lo entienda. Ya lo entenderá. Pero hay que exponerlo ahora. El objeto Workspace contiene: Para el espacio de trabajo Microsoft Jet: Grupos de trabajo, que es un grupo de usuarios de un entorno multiusuario que comparten datos y el mismo sistema de base de datos. Grupos de usuarios, que es una colección de cuentas de usuario. Estos objetos, que no son objetos de acceso a datos, sino de explotación de los recursos del sistema, están enfocados a la seguridad respecto al acceso a las bases de datos que se trabajan conjuntamente. No tendría sentido hablar aquí de ellos si no fuese porque encontrará referencias a estos objetos continuamente en la ayuda de Visual Basic. Bases de Datos (Databases). Este el objeto que ahora nos interesa del objeto Workspace. Un objeto Database es una base de datos abierta. Para el espacio de trabajo ODBCDirect: Visual Basic - Guía del Estudiante Capítulo 12 Página 5

LSB

. La única respuesta para ello es que deseo que Vd.. se crea automáticamente un Workspace. Ya podemos comenzar a comprender una diferencia entre ambos espacios de trabajo.Método ( Aquí .. pero la estructura Set DAOInferior = DAOSuperior. Se verá al final del capítulo. El número 0 A este Workspace no podemos ponerle ningún tipo de palabra de acceso.Conexión... que representa una conexión con una base de datos a través de ODBC Bases de Datos (Databases). Para que pueda usarse en toda la aplicación deberemos declararla en un Módulo con la sentencia Public Public Misesion as Workspace Esta advertencia es válida para la declaración de todos los objetos DAO.. En el espacio ODBCDirect no los tenemos. hay que crearlo. ya que el permiso o denegación de acceso de uno u otro usuario a una base de datos se establece cuando se crea (en Windows) la conexión ODBC. En realidad. y tal como citábamos mas atrás. sea programador. En el Microsoft Jet tenemos Usuarios y Grupos de Usuarios. usemos el método CreateWorkspace.. alguna cosa ) Logicamente el término Aquí . quiera hacer. Ese nombre habrá que declararlo como nombre de una variable objeto Workspace : Dim Misesion as Workspace La declaración de la variable Objeto tiene las mismas características que cualquier variable en cuanto al ámbito en el que se puede usar. Utilicemos este Workspace. no usuario de ofimática. Esta pregunta me la han hecho los alumnos durante todos mis años de docencia. Al objeto Workspace se le puede dar un nombre definido por el usuario.. En el espacio ODBCDirect tenemos un objeto llamado Connection. ¿Para que se van a crear bases de datos mediante un programa si puedo hacerlo directamente con Access? . No necesitamos ninguna conexión establecida previamente. alguna cosa va a depender de cada método y de lo que Vd... LSB Visual Basic . Creación de Objetos DAO Para crear un objeto DAO (Cualquiera que sea) debemos usar una forma que se va a repetir a lo largo de toda su vida profesional. mientras trabaje con Visual Basic y Bases de Datos: Set ObjetoDAOInferior = ObjetoDAOSuperior. cada vez que se inicia una sesión de Visual Basic. el número 0 de la colección Workspaces.. ya que se la ha puesto VB : Admin.Guía del Estudiante Capítulo 12 Página 6 ...Método ( . Para hacer que Misesion sea ese Workspace que crea automáticamente VB basta con ejecutar la siguiente línea de código Set Misesion = Workspaces(0) Pero si no queremos aprovechar este Workspace creado automáticamente por Visual Basic.. Posiblemente hasta ahora le haya parecido muy difícil y haya optado por usar el control Data para todas sus aplicaciones..) se mantendrá en todas las operaciones de creación y manipulación de objetos DAO. Una vez declarado el nombre del objeto Workspace. para comenzar a trabajar. Esta sintaxis es tan simple que un profesor de Visual Basic decía que es como un “juego de niños” No lo olvide y se le quitará el miedo al manejo de bases de datos mediante código. Tiempo tendremos mas adelante de ver como se crea un Workspace. y queremos usar otro. objeto que no tenemos en el Microsoft Jet ya que con este sistema accedemos directamente al fichero de la base de datos. Comenzaremos a explicar la operación de bases de datos mediante DAO explicando como se crean bases de datos Access mediante Visual Basic. Si recuerda este Juego de niños verá que es más sencillo crear objetos DAO que poner un control Data en un formulario.

bien porque hemos creado una base de datos mediante el procedimiento CreateDataBase. Una colección Databases contiene todos los objetos Database abiertos en un objeto Workspace del motor de bases de datos Microsoft Jet.Guía del Estudiante Capítulo 12 Página 7 . La sintaxis del método CreateDataBase es el “juego de niños” citado antes: Set ObjetoDAOInferior = ObjetoDAOSuperior. el nombre del objeto Database es MiBaseDatos y el nombre del fichero es MiBase. el objeto Database existe hasta que lo cerremos (mediante el método Close) o hasta que cerremos la aplicación.Método ( Parámetros ) En nuestro caso el Objeto DAO superior es el Workspace Misesion. o porque hemos abierto una base de datos existente mediante el procedimiento OpenDatabase. El fichero se creará posteriormente cuando cerremos el objeto Database. y los parámetros que hay que pasar en este caso son: LSB Visual Basic . Crear una Base de Datos ACCESS.Objeto Database Un objeto Database representa una base de datos abierta. Previamente debemos declarar el nombre que queremos dar al objeto DataBase que se va a crear como un objeto Database : Dim MiBaseDatos as Database Si tenemos declarado un Workspace llamado Misesion mediante la declaración : Dim Misesion as Workspace Y hacemos que Misesion sea el Workspace creado automáticamente por VB Set Misesion = Workspaces (0) podremos usar el método del Workspace CreateDatabase para crear ese objeto Database. Un objeto Database puede crearse. El objeto DataBase es la base de datos que creamos en la memoria RAM del ordenador. Colección Databases Es el conjunto de Objetos Database existentes. Eso sí. Al objeto Database se le debe dar un nombre definido por el usuario. La colección Databases pertenece al Workspace. El nombre del objeto Database tampoco tiene porque coincidir con el nombre del fichero que se va a crear. En el ejemplo que veremos mas adelante.Mdb. En cualquiera de los dos casos. Método CreateDatabase Para crear una base de datos deberemos utilizar el método CreateDatabase. hay que declararlo como una variable objeto Database Dim MiDataBase As Database El nombre que le demos al objeto DataBase no tiene nada que ver con el nombre del fichero que alberga esa base de datos. Recuerde que el objeto Database NO es el fichero que va a contener la base de datos sino que es una estructura de base de datos que está de momento en la memoria RAM del ordenador.

MDB”. portugués.MDB.Workspaces(0) – e incluso.MDB. francés. ¡Ya Existe! Pero observará que está completamente vacía. Una Base de Datos ACCESS tiene tablas. Puede ser una ruta completa y un nombre de archivo. Es un argumento obligatorio.51. guarda la base de datos en disco y devuelve un objeto Database abierto.MDB. (ACCESS) escenario es una expresión de cadena utilizada para especificar dos cosas: el orden alfabético que se va a usar en esta base de datos. el nombre del archivo en el disco. si no se pone nada.Guía del Estudiante Capítulo 12 Página 8 . Si se omite este argumento. escenario. Este Password es opcional. que le permite elegir la versión de la base de datos a crear (Equivalente a la versión de Access) y si deseamos crear una base de datos cifrada. Opciones. Para los idiomas Inglés. Si la red lo admite. inglés y francés debe usar dbLangGeneral. En el argumento Opciones puede combinar varias opciones. NO el nombre del archivo con el que quedará guardada en el disco. según se especifica a mas adelante. Verá que la sintaxis de este método es: Set MiBaseDatos = Misesion. y de la última versión que le permite la referencia elegida para el motor de bases de datos (Microsoft DAO 3. se agregará . también puede especificar una ruta de red. Vamos a seguir creando esta base de datos. Consulte la tabla de constantes para inf_local incluida más adelante en este tema. como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD".CreateDatabase (nombre_base. se utilizará el objeto Workspace predeterminado . Y de momento no hemos escrito ningún código para crear esas tablas. italiano y español moderno se usa la siguiente constante : LSB Visual Basic . para permitir la ordenación alfabética de los datos. usará ese Workspace predeterminado. como por ejemplo "C:\MiCarpeta\MiBase. Para los idiomas español. Si no se indica una extensión. alemán. Si no pone nada en este parámetro le crea una base de datos sin cifrar. Debe especificar el argumento inf_local o se producirá un error. opciones) MiBaseDatos es el nombre del objeto Database por el cual nos referiremos a esa base de datos. Misesion es el nombre del objeto Workspace existente que contendrá la base de datos. Puede combinar varias opciones sumando las constantes correspondientes. dbLangGeneral) Si ahora cierra el programa le creará la Base en el disco. nombre_base es el nombre del archivo de base de datos que se va a crear. Valores de los parámetros En el argumento inf_local se suministra información de la lengua empleada para especificar la propiedad CollatingOrder del texto para las comparaciones entre cadenas.Nombre (y Path) del fichero de la base de datos Idioma. (Obligatorio) que denominaremos inf_local y el Password o palabra clave que quiere usar para restringir su uso. al tiempo que explicamos el resto de los procedimientos que hay que usar para ello. Es normal. Con este método sólo pueden crearse archivos de base de datos . Es decir. Ejecute Access y abra la BD C:\MiCarpeta\MiBase. El Método CreateDataBase Crea un nuevo objeto Database.CreateDatabase (“C:\MiCarpeta\MiBase. por ejemplo) Vayamos al ejemplo: Set MiBaseDatos = Misesion.MDB". Vaya a la ayuda de VB.

Hay que poner pwd antes de la contraseña dbLangGeneral & ". Relation). Verá mas adelante que también hay objetos Field en otros objetos DAO (Index. El Password vale para proteger la BD de usuarios no “piratas”. Field. Para hacer las cosas poco a poco nos fijaremos solamente en las tablas y los campos. pues no hace nada especial respecto a dbLangGeneral Este parámetro es obligatorio. pero de momento vamos a fijarnos solamente en las tablas. Pero tampoco se fíe mucho. Objetos DAO para introducir en una base de datos Estos objetos que se pueden añadir son : Objetos TableDef. se creará una base de datos no codificada. No piense que al codificar la base de datos va a mantener sus datos confidenciales en secreto. debe indicarlo a continuación. El Objeto TableDefs es la colección que contiene todas las tablas de la base de datos Un objeto Field representa un campo dentro de una tabla Access.1 del motor de base de datos Microsoft Jet. La colección Fields contiene todos los campos de una tabla.0 del motor de base de datos Microsoft Jet. Recordset. Piense que una vez creada la Base de Datos. pero que de momento está en la memoria RAM del ordenador. Cuando esa estructura se pase LSB Visual Basic . Crea una base de datos que utiliza la versión 1. Opciones se pueden usar las siguientes constantes : Constante dbEncrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Descripción Crea una base de datos codificada. cuya estructura y contenido deberá completar utilizando objetos de acceso a datos adicionales. Deberá concatenarlo con la inf_local mediante el signo & y separarlo mediante punto y coma. QueryDefs. Es decir. QueryDef. pero se los va a presentar de forma clara. Access se los guardará codificados.5 del motor de base de datos Microsoft Jet.5 Si se omite la constante de codificación. ya que no podrá abrir la base si no se conoce ese Password. El método CreateDataBase abre esta nueva base de datos y devuelve un objeto Database.0 del motor de base de datos Microsoft Jet. Esta Versión es compatible con la 3.Guía del Estudiante Capítulo 12 Página 9 . Crea un objeto Tabledef. que no es ni más ni menos que la estructura de una tabla Access. Crea una base de datos que utiliza la versión 1. crea una Base de Datos sin nada que deberá rellenarla posteriormente con tablas.dbLangGeneral No use dbLangSpanish. TableDefs. (Advertencia sobre las bases de datos codificadas. Crea una base de datos que utiliza la versión 3. Existen infinidad de craqueadores de contraseñas de Access. No emplee este procedimiento en aplicaciones en las que necesite verdadera confidencialidad. alguna vez le pedirá que le obtenga un Recordset con los datos ordenados alfabéticamente ( acuérdese de la sentencia SQL ORDER BY Nombredelcampo ) Si desea introducir una palabra clave para restringir el acceso a la base de datos. Fields. Método CreateTableDef. Crea una base de datos que utiliza la versión 2. Utilice para ello el Password. (Objetos Tabledef y Field) El Objeto TableDef es una tabla de una base de datos ACCESS. QueryDef.pwd=NuevaContraseña" Para el último parámetro. Crear una Tabla.

Pero como siempre. Date.OpenDatabase (“C:\MiCarpeta\MiBase.CreateTableDef (“Alumnos”) Si queremos crear más Tabladefs: Set Mitabla2 = MiBaseDatos. pero de momento nos quedamos únicamente con el primero: Nombre. MiCampo21 as Field (El Campo11 es el primer campo que meteremos en el Tabledef Tabla1. le adelanto el método para abrir una base de datos existente en el disco: Set MiBaseDatos = Misesion. etc. Apellidos. conexión]]]]) Se explicará para que sirven todos ellos. origen[.e. simplemente) para poder ver con Access la base de datos que acaba de crear. Puede volver a crear el objeto DataBase abriendo la base de datos. Los parámetros que vamos a pasar en este método son: Nombre Tipo Tamaño Será el nombre de ese campo. que es la estructura de lo que mas tarde será un Campo de una tabla de la BD. MiTabla3 as Tabledef. Puede ser perfectamente el objeto Database creado anteriormente. Previamente declararemos los nombres de los Objetos Field a introducir. Una tabla tiene campos. vacíos. será una Tabla que podemos ver cuando abramos la BD con Access. El objeto Tabledef debe crearlo un objeto DataBase. Método CreateField Crea un objeto Field.CreateTableDef (“Profesores”) Set Mitabla3 = MiBaseDatos. etc Sólo para los campos String. el Campo21 será el primer campo del Tabledef Tabla2. Un objeto Tabledef tiene Fields. atributos[. El objeto Field solamente está en la memoria RAM del ordenador. que es el nombre que podrá ver en Access como nombre de la tabla que va a crear. NombreAlumno. Cuando pase a formar parte de una tabla será un campo de esa tabla. etc Tipo de dato. El Campo12 el segundo. Dim MiCampo11 as Field.CreateTableDef (Nombre) Ejemplo: Set Mitabla1 = MiBaseDatos. …… y crearemos las tablas necesarias mediante el método CreateTableDef Si acude a la información de VB para ver los parámetros que hay que pasar en el método CreateTableDef verá que son muchos: ([nombre[.Guía del Estudiante Capítulo 12 Página 10 LSB . numérico. MiCampo121 as Field. Indicará el número de caracteres de ese campo.MDB”) Declaremos ahora el nombre que quiere ponerle al objeto Tabledef que va a crear: (MiTabla1) Dim Mitabla1 As Tabledef Si queremos introducir varias tablas en la BD deberemos declarar tantos objetos Tabledef como tablas necesitemos: Dim MiTabla2 as Tabledef. Set Mitabla1 = MiBaseDatos. Aunque se le explicará mas tarde.al fichero de la base de datos en el disco. Pero seguramente lo ha cerrado (cerrando el programa. El objeto Field debe crearlo el objeto DAO superior a él: el Tabledef. Debemos crear objetos Field (Campos) para poder meterlos en los objetos Tabledef que acabamos de crear. String. P.CreateTableDef (“Asignaturas”) De momento solamente hemos creado uno o varios objetos Tabledef. Creamos el objeto Field con la siguiente sintaxis Visual Basic . Crear campos.

Se añade mediante el método Append.Append Micampo11 MiTabla1. dbText. el Campo11 (ID_Alumno) queremos que sea un índice. (MiTabla1 crea todos sus campos.CreateField (“NombreProfesor”. pero todavía no están metidos en las tablas. Puede servir también para evitar que dos registros tengan el mismo valor para un determinado campo. Pero puede que le falte algo respecto a una base creada directamente con Access: los Indices y las Relaciones.CreateField (“ID_Alumno”.Append Micampo21 Ya tenemos campos formando parte de la colección Fields de las tablas. 20) Set MiCampo13 = Mitabla1. tipo [. para ordenar los registros de la BD por ese campo.Append Mitabla2 Si ahora cerramos la base de datos mediante el método Close: MiBaseDatos. Pero antes de seguir reflexionemos y recordemos lo que hemos hecho hasta ahora. Un índice es una marca que le podemos poner a cada uno de los registros en un campo. MiTabla2 los suyos. Tenemos que añadirlos a la colección de campos de la tabla que los creó.Tabledefs. y además que no se pueda repetir el mismo valor para dos registros distintos. El método correspondiente para crear un objeto DAO pertenece Visual Basic . En Access se puede establecer una relación de una forma muy sencilla.TableDefs.Fields.Close Ya tenemos la base de datos creada en el disco de la misma forma que lo hubiera hecho Access. Esa colección de campos es el Objeto Fields de la tabla. Una Relación es una correspondencia entre un campo de una tabla y otro campo de características similares en otra tabla.Append Micampo13 MiTabla1. MiTabla1. Esto nos lleva al concepto de Base de Datos Relacional que seguramente ya sabe de que se trata. 8) Set MiCampo12 = Mitabla1.CreateField (“Fecha_Ingreso”. Observe que. En Visual Basic también.Guía del Estudiante Capítulo 12 Página 11 LSB . cada vez que creamos un objetos (DataBase. dbInteger) Set MiCampo15 = Mitabla1. dbText. 20) Se crean todos los campos que se quieren introducir en las tablas. Esa colección de tablas es el objeto Tabledefs de la base de datos. dbText.Append Mitabla1 MiBaseDatos. Ahora debemos añadir las tablas a la colección de tablas de la base de datos.Set MiCampo11 = Mitabla1.Fields. Field) usamos el mencionado “juego de niños”.CreateField (“Apellidos”. 25) Set MiCampo14 = Mitabla1.Append Micampo15 MiTabla2.CreateField ([nombre[.CreateField (“Edad”.CreateField (“NombreAlumno”. de forma que no puedan existir dos registros con el mismo valor en ese campo. tamaño]]]) (Vea el Anexo 1 Propiedades de los campos al final de este capítulo) Ejemplos Set MiCampo11 = Mitabla1.Fields.Append Micampo12 MiTabla1. etc) Ya están todos los campos creados. dbText. Tabledef. Esa marca puede servir por ejemplo. del objeto DataBase. En el ejemplo que estamos preparando. dbDate) Set MiCampo21 = Mitabla2.Append Micampo14 MiTabla1.Fields. Lo haremos también mediante el método Append MiBaseDatos.Fields. es decir. Observe que cada objeto Field debe ser creado por el objeto Tabledef que lo va a contener.Fields.

abre la función Ver | Indices de la barra de menú. como por ejemplo volver a usar el procedimiento CreateField para crear un campo que ya existe. en MiTabla1) Set MiCampo11 = MiIndice. y la colección Databases (Objeto Databases) pertenece a un objeto Workspace. CreateField es un método del objetos TableDef. Ahora. Pero ese campo ya debe existir en el objeto Tabledef con el que hemos creado el índice (en este caso. La colección Fields (Objeto Fields) pertenece a un objeto TableDef..Método ( . Las colecciones pertenecen también al objeto inmediatamente superior en jerarquía al tipo de objetos que forman la colección. Método CreateIndex Para crear un índice debe estar creado el campo al que se le va a aplicar el índice. Crear Indices para los campos. Recordemos ese “juego de niños” : Set DAOInferior = DAOSuperior. La colección Workspaces pertenece al DBEngine. Primer debemos crear el Objeto Index. Tendremos que decir que pertenece al sistema. La sintaxis de CreateIndex es: Set NombreIndice = NombreTabledef. CreateTableDef es un método del objeto Database. El índice debe crearlo el Tabledef al que pertenece el campo que queremos que sea índice. CreateIndex. al ejemplo que ilustra esta Guía del Estudiante como colofón a este capítulo.Guía del Estudiante Capítulo 12 Página 12 LSB . En nuestro ejemplo: Declaramos el objeto Index Dim MiIndice as Index Creamos el índice Set MiIndice = MiTabla1.CreateField (“ID_Alumno”. El procedimiento es siempre el mismo : Objeto superior. Vamos a ver como se crea un Indice. que en este caso es exacta y concisa.CreateIndex([Nombre]) Donde NombreIndice es el nombre de una variable declarada como tipo de dato objeto Index.Append Objeto a añadir Sigamos ahora perfeccionando la base de datos. Este nombre lo puede ver si abre la base de datos con Access y en la vista de Diseño de la tabla.. 8) Visual Basic .. Son las incongruencias que tiene a veces Visual Basic. CreateDatabase es un método del objeto Workspace. recurra a la ayuda de VB. la colección TableDefs (objeto TableDefs) pertenece a un objeto Database.CreateIndex (“Indice1”) Ya tenemos creado el Objeto Index. Le recomiendo que si no se acuerda bien de cómo se hace. debemos añadirlo a la colección a la que debe pertenecer con el método Append..Colección. Nombre es una variable de tipo String que da un nombre único al nuevo objeto Index.al objeto DAO inmediatamente superior en jerarquía. NombreTabledef es el nombre de variable del objeto TableDef que se desea usar para crear el nuevo objeto Index. (y aquí empieza la incongruencia citada) este objeto Index debe crear el campo que queremos que sea índice. Se hace mediante el método del objeto Tabledef.-) Hemos visto que después de crear un objeto. y el DBEngine ya no podemos asignarlo a ningún objeto DAO. Puede que le parezca un poco extraño alguno de los métodos que vamos a usar para crear un índice. O si lo prefiere. dbText. es decir.

Indica que todos los campos del objeto Index deben rellenarse.Append MiIndice Lo confieso. piense en el código de un objeto en un inventario.Append MiCampo11 Si fuesen dos los campos MiIndice. tipo y tamaño deben coincidir con los datos que sirvieron para crear el campo en el objeto Tabledef. Pero un índice puede tener varios campos. IgnoreNulls . pero todas ellas tienen un número distinto (una tiene el 001.Indica si permite valores Nulos en los campos del índice. DistinctCount que no se explican para no complicar mas el tema. Un objeto inventariable (por ejemplo una mesa) tiene un código de grupo (por ejemplo. Cuando los necesite no tendrá inconveniente en estudiarlos partiendo de la ayuda de VB) Para introducir el valor de una de estas propiedades se procede con la siguiente sintaxis: MiIndice.Append MiCampo11 MiIndice. (Existen además las propiedades Clustered.No permite repetición de valores en ese campo Required . pero alguna vez se terminará aprendiendo. Otras propiedades son: Primary .Primary = True Ya está creado el índice y tiene ya metido uno o mas campos y todas sus propiedades. Una de ellas ya la hemos visto sin querer.Indexes. dbText. Por ejemplo. Ahora debemos añadirlo (o añadirlos) a la colección Fields del objeto Index recién creado. Ahora debemos añadir ese índice a la colección Indexes del Objeto Tabledef. la propiedad Name (nombre del índice. el 123) Hay muchas mesas dentro de un inventario. Ese índice estará formado entonces por dos campos. otra el 002. Indice1). El código es el número que identifica de forma unívoca a un objeto. 3) Ya tenemos el campo o los campos creados por el índice. En este caso deberemos crear los dos campos: Set MiCampo11 = MiIndice. MiTabla1. Ya tenemos la base de datos completamente creada. Foreign.Fields.Fields.El objeto Index representa la clave primaria de la tabla. Lo hacemos mediante el método Append MiIndice.CreateField (“Numero”.El nombre del campo.Uniuqe = True MiIndice. Un objeto Index tiene propiedades. 3) Set MiCampo12 = MiIndice. Es complicado. Unique . dbText.Append MiCampo12 No crea que ya hemos terminado.Fields. Sin embargo alguien dirá que le falta algo: Relacionar dos tablas LSB Visual Basic .CreateField (“C_Grupo”. en nuestro ejemplo. etc) La combinación de código de grupo más el número del objeto dentro de ese grupo queremos que sea un índice.Guía del Estudiante Capítulo 12 Página 13 . Cada vez que hago esto en la vida real tengo que volver a leer este procedimiento en la Guía del Estudiante.

ese campo debe ser clave primaria. Una vez creada la relación.MDB") Creamos el objeto Relation. A la tabla que contiene a este campo se le llama Tabla Principal.Guía del Estudiante Capítulo 12 Página 14 . para que. Supongamos que queremos crear una relación en la base de datos creada en el ejemplo anterior. Le ponemos los atributos a la relación. Si no lo está. MiRelación. paciencia. pero este nombre NO debe confundirse con el nombre del objeto DAO Relation. NO los nombres de los objetos Tabledef. podrá comprobarlo visualizándola con el visor de relaciones del Access Suponemos que la base de datos está abierta. la relación debe pertenecer al objeto DAO superior jerárquicamente a las tablas: el Objeto Database. pero le advertimos lo mismo que para los índices. es necesario declararlo : Dim MiRelacion as Relation Para crear la relación deberemos usar el método CreateRelation Set MiRelacion = MiBaseDatos. Como para cualquier otro objeto DAO. deberemos hacer una cosa similar a la que hacíamos para el método CreateIndex. una relación se establece entre dos tablas.Relaciones entre tablas Método CreateRelation Una Relación es una asociación establecida entre dos campos del mismo tipo ubicados en dos tablas distintas. Para crear una relación usaremos el Método CreateRelation. Set MiBaseDatos = Workspaces(0). A la tabla que contiene el campo (o los campos) relacionados se le llama Tabla Relacionada. Por lo tanto. Una relación debe tener campos.CreateRelation ("RelacionUno") Una vez creada.OpenDatabase("MIBD. usaremos un nuevo objeto DAO : El objeto Relation.Attributes = dbRelationUpdateCascade LSB Visual Basic . Pero esos campos ya deben estar creados en las tablas que se van a relacionar. Por lo tanto.CreateRelation ("RelacionUno") Una relación se hace entre dos campos. que es un método del objeto Database. crear los campos mediante el Objeto Relation que acabamos de crear.ForeignTable = "MiTabla2" ‘Nombre de la tabla relacionada 'Nombre de la tabla principal.Table = "MiTabla1" Le decimos cual es el nombre de la tabla relacionada MiRelación. que tendrá por nombre RelacionUno. con el campo Campo21 de MiTabla2. que es MiRelacion Set MiRelacion = MiBaseDatos. Este objeto forma parte de una colección. le decimos a MiRelacion cual es la Tabla principal MiRelación. Para relacionar un campo con otros. Se pueden establecer relaciones uno a uno ó uno a varios. ese cambio se refleje en el campo o los campos relacionados con el. MiTabla1 y MiTabla2 son los nombres reales de las tablas. (Lógico. Para crear una relación. que es a su ves otro objeto DAO : el objeto Relations. y queremos relacionar el campo Campo11 que está en MiTabla1 y que lo habíamos hecho clave primaria. En este caso dbRelationUpdateCascade. la abrimos. si hacemos un cambio en el valor del campo de la tabla principal. El ejemplo que trae la ayuda de VB puede ser muy aclaratorio.

Precisamente con un objeto QueryDef Consultas. Puede que sea así o que le falte alguna cosa. La relación no es impuesta (no hay integridad referencial). mediante el método CreateField. declarándolos como Variables Objeto tipo QueryDef .Append MiCampo Y ahora añadimos el objeto Relation recién creado a la colección Relations del objeto Database MiBaseDatos. Las actualizaciones se realizarán en cascada. El Objeto QueryDef Pero habrá observado que una base de datos ACCESS puede contener.CreateField("Campo11") Le recordamos lo de antes. con sus datos exactamente igual que si se tratase de los registros de una tabla.Guía del Estudiante Capítulo 12 Página 15 . lo que estamos presentando son los datos almacenados en la tabla o las tablas que componen esa consulta. las consultas no contienen el dato. Pero aunque podemos ver esos registros como tales. Las eliminaciones se realizarán en cascada. CONSULTAS. Campo11 debe estar ya creado en la tabla Tabla1. Método CreateQueryDef Un objeto QueryDef representa una consulta de la base de datos. Puede faltarle una o varias consultas. Las consultas no contienen datos. Crear una consulta. Ahora ya casi podemos decir que tenemos la base de datos creada. La relación existe en una base de datos no activa que contiene las dos tablas vinculadas. La consulta tiene dentro una referencia al lugar de las tablas donde se encuentran los datos. A la hora de presentar los datos de una consulta. Le decimos ahora cual es el nombre del campo en la tabla relacionada MiCampo. Deberemos declarar el nombre del objeto Field que vamos a crear para la relación Dim MiCampo as Field Set MiCampo = MiRelación.ForeignName = "Campo21" Añadimos el campo creado a la colección Fields del objeto Relation MiRelación. El objeto QueryDefs es la colección de objetos QueryDef. sino el número del registro dentro de la tabla que lo contiene. Las consultas también se pueden crear mediante objetos DAO. Parece un poco ilógico usar el método CreateField para un campo que ya está creado. El ámbito es igual que para cualquier variable: LSB Visual Basic .Le decimos cual es el nombre del campo de la tabla principal que vamos a relacionar.Relations. esas tablas deben estar relacionadas) que cumplen unas determinadas condiciones. La diferencia entre una consulta (Un QueryDef) y una tabla (Un TableDef) es que la Tabla tiene dentro de sí los datos. Contienen una referencia a los registros de las tablas que los contienen. Una consulta podríamos decir que son conjuntos de registros tomados de una o varias tablas (en este último caso. Antes de utilizar el método CreateQueryDef debe declarar el nombre de los objetos a crear. además de tablas.Fields.Append MiRelación Solamente nos falta ver que valores puede tener la propiedad Attributes del objeto Relation dbRelationUnique dbRelationDontEnforce dbRelationInherited dbRelationUpdateCascade dbRelationDeleteCascade La relación es uno a uno.

Será el nombre por el que llamemos al Objeto QueryDef en el código de nuestra aplicación. (Sin haber puesto el parámetro Nombre. Apellido2 From Alumnos Where Apellido1 = ‘Fernandez’ ) Ahora ya tenemos la base de datos creada con todas las posibilidades. Un autonumérico es un Long –numérico.CreateQueryDef ([Nombre][. según se comentó mas atrás). Ejemplo práctico de creación de una base de datos. ya que no pueden existir dos clientes con el mismo ID_Cliente. Cada cliente tiene un ID_Cliente y ese ID_Cliente es único para él. MiBaseDatos es el nombre del objeto Database abierto en el que vamos a introducir el nuevo objeto QueryDef. Otra tabla necesaria será la tabla Peliculas.Guía del Estudiante Capítulo 12 Página 16 . Este nombre será el que veamos al abrir la base de datos con Access en la pestaña Consultas. Una vez creado el objeto QueryDef. Apellido1. resumen. donde introduciremos todos los datos relativos a las películas (existentes o no en el videoclub).Public MiConsulta1 as QueryDef Public MiConsulta2 as QueryDef Ahora podemos utilizar el método CreateQueryDef para crear el nuevo objeto QueryDef en la base de datos. de nombre Clientes donde figuran los nombres y dirección de los clientes. pero personalmente no me gusta usar autonuméricos. Nombre es una expresión de cadena que representa el nombre de la nueva consulta que vamos a crear. Un videoclub tiene una base de datos en la que tenemos una tabla. Sintaxis Con la fórmula de siempre : Set MiConsulta1 = MiBaseDatos. Texto_sql es una expresión de cadena (instrucción SQL válida) que define el objeto QueryDef. LSB Visual Basic . excepto que hayamos creado el objeto QueryDef sin nombre. Texto_sql]) Donde MiConsulta1 es una variable del tipo QueryDef que previamente se ha declarado como tal. El famoso ejercicio del Videoclub Vayamos a un ejemplo típico en cualquier curso de Visual Basic: el famoso Videoclub. Ha llegado el momento de crear una base real para comprobar todo lo expuesto. director. artistas. Texto_sql es precisamente el filtro de esos datos (expresado mediante una cláusula SQL).QueryDefs. (Este campo podría ser un autonumérico. tal como título. “Select Nombre. que albergará un número que se incrementará en 1 cada vez que se hace un nuevo cliente. podemos tener Set MiConsulta1 = MiBaseDatos.y quiero ser coherente con lo expuesto en el capítulo 1 donde se decía que solamente se usarían campos numéricos en aquellos datos con los que se hagan operaciones matemáticas) El campo ID_Cliente será clave primaria.Append MiConsulta1 Como caso práctico de creación de una consulta. así como el número de su cuenta bancaria. Lógicamente una consulta nos debe suministrar una serie de datos de una o mas tablas. Tiene un campo (ID_Cliente) que es el que define al cliente. Esos datos no tienen porqué ser todos los datos de las tablas. Para añadirlo a la colección QueryDefs : MiBaseDatos. Será un campo tipo texto.CreateQueryDef (“Fernandez”. pero deberá añadirselo posteriormente. Puede omitirlo a la hora de crear la consulta. no es necesario añadirlo a la colección QueryDefs de la Base de Datos.

etc. etc. Tendrá un campo. En este ejercicio haremos que sea así. crearla y salir) y un TextBox donde se ha puesto el nombre del fichero de la base de datos en su propiedad Text. (Se ha puesto el nombre de Pelicula al campo relacionado con ID_Pelicula para que se vea que dos campos relacionados no tienen porqué tener el mismo nombre. (Si cree que hay campos que no tienen sentido en esta tabla (Idioma). Para llevar a cabo este ejercicio se ha partido de una interface gráfica en la que pueden verse tres botones (Borrar la base de datos. que relacionará al cliente con la cinta que ha alquilado. Para darle más alegría al ejercicio le pondremos una relación entre los campos ID_Pelicula e Idioma de las tablas Peliculas y Cintas. También le pondremos el campo Idioma. ID_Pelicula que identificará a esa película. precio de esta copia. como fecha de alta. crearemos una consulta en la que utilizaremos todas las relaciones. Podemos añadirle mas campos a nivel administrativo. Eso sí. El conjunto de esos dos campos será la clave primaria. existirá otro campo Idioma de tipo texto. le facilitará la operación de alquiler y devolución. una película deberemos definirla por el conjunto formado por su ID_Pelicula y por su Idioma. Alquileres. por lo tanto.Guía del Estudiante Capítulo 12 Página 17 LSB . uno que nos indique la película que tiene grabada esa cinta (Será la combinación de los campos ID_Pelicula e Idioma) y de un número secuencial que indicará el número de la copia. Para poder relacionarla con la tabla Peliculas. entre el campo ID_Cliente de la tabla Clientes y el campo ID_Clientes de la tabla alquileres (Será uno a infinito) y otra relación. entre el campo ID_Cinta de la tabla Cintas y el campo ID_Cinta de la tabla Alquileres (Relación 1 a 1 ya que solamente existe una cinta con esa ID_Cinta). sobre el que no haremos ningún tipo de relación.calificación. fecha de alquiler y fecha de devolución. La base de datos deberá tener dos relaciones. Si le pone imaginación y este conjunto de datos puede meterse en un código de barras. precio. Por lo tanto. deben tener las mismas características) Como colofón a todo esto. piense que esto es un ejemplo para poder explicar de la forma más didáctica todas las posibles variaciones de una instrucción) Existe otra tabla denominada Cintas. Existirá una tercera tabla. Pero puede haber versiones en varios idiomas. dándole a este campo un tamaño de 13 dígitos para poder meterlo en un código EAN-13. Tendrá un campo ID_Cinta que será la combinación de varios datos. para introducir ese dato.3 Interface gráfica de la parte de crear bases de datos para la aplicación del Videoclub CODIGO Private Sub BSalir_Click() Unload Me End Sub Private Sub BBorrar_Click() On Error GoTo RutErr Dim HayDir As String HayDir = Dir(TBNombreBase) If HayDir <> "" Then Visual Basic . donde figurarán todas las cintas existentes en el videoclub. Tendrá un campo llamado ID_Cliente y otro ID_Cinta. fecha de baja. Veamos el código de cada uno de los botones (por orden inverso de complejidad del código) Fig. 20. le ponemos un campo llamado ID_Pelicula que en esta tabla no será clave primaria. una. Aparte tendrá otros dos campos.

CreateField("Pelicula". MiCampo31 As Field. MiCampo42 As Field Dim MiCampo43 As Field. dbText. dbText. dbText. MiCampo24 As Field Dim MiCampo25 As Field. dbText.CreateField("Direccion".Kill TBNombreBase End If RutErr: If Err = 75 Then MsgBox "Tiene la Base de Datos abierta por otro programa" End If End Sub Creación de la base de datos Private Sub BCrear_Click() On Error GoTo RutErr Dim HayDir As String ‘Se comprueba que existe la BD y se invita a borrarla HayDir = Dir(TBNombreBase) If HayDir <> "" Then MsgBox "Ya existe el fichero con la base de datos. MiCampo12 As Field. Debe borrarlo previamente" Exit Sub End If ‘ Se declaran todas las variables tipo objeto Dim MiBaseDatos As Database Dim MiTabla1 As TableDef.Guía del Estudiante Capítulo 12 Página 18 . 13) Set MiCampo32 = MiTabla3. MiCampo23 As Field. dbText.CreateField("Fecha_Baja". dbText. dbText. 50) Set MiCampo14 = MiTabla1. MiTabla3 As TableDef Dim MiTabla4 As TableDef Dim MiCampo11 As Field.CreateTableDef("Peliculas") Set MiTabla3 = MiBaseDatos. MiCampo34 As Field. 20) Set MiCampo13 = MiTabla1.CreateField("ID_Cliente". 25) Set MiCampo25 = MiTabla2. 255) Set MiCampo31 = MiTabla3. dbText. dbText. 1) Set MiCampo24 = MiTabla2.CreateTableDef("Clientes") Set MiTabla2 = MiBaseDatos.CreateField("Apellidos".CreateTableDef("Cintas") Set MiTabla4 = MiBaseDatos. dbText. MiCampo41 As Field. 15) Set MiCampo21 = MiTabla2. MiCampo32 As Field Dim MiCampo33 As Field.CreateField("Precio". 8) Set MiCampo22 = MiTabla2. dbSingle) Set MiCampo35 = MiTabla3.CreateField("ID_Cinta".CreateTableDef("Alquileres") ‘Cada Tabledef crea sus propios Objetos Field Set MiCampo11 = MiTabla1.CreateField("Idioma". 50) Set MiCampo15 = MiTabla1.CreateDatabase(TBNombreBase.CreateField("Fecha_Alta". MiCampo35 As Field Dim MiCampo36 As Field.CreateField("Telefono". dbDate) Set MiCampo36 = MiTabla3. MiCampo15 As Field.CreateField("Nombre". 1) Set MiCampo34 = MiTabla3. 20) Set MiCampo23 = MiTabla2. MiTabla2 As TableDef.CreateField("Director". 20) Set MiCampo33 = MiTabla3.CreateField("Resumen". MiCampo21 As Field Dim MiCampo22 As Field. dbText.CreateField("ID_Pelicula". 8) Set MiCampo12 = MiTabla1. MiCampo13 As Field Dim MiCampo14 As Field. dbDate) LSB Visual Basic . dbLangGeneral) ‘Se crean los Objetos Tabledef Set MiTabla1 = MiBaseDatos.CreateField("Titulo". dbText. dbText.CreateField("Idioma". MiCampo44 As Field ‘Se crea el Objeto DataBase (Se toma el nombre del fichero del TextBox TBNombreBase Set MiBaseDatos = Workspaces(0).

circunstancia que le va a crear problemas.AllowZeroLength = False MiCampo14.CreateField("Fecha_Alq".Append MiCampo21 MiTabla2.Append MiCampo14 MiTabla1.Fields.TableDefs.Append MiCampo43 MiTabla4.Fields.CreateField("ID_Cinta". MiIndice2 As Index. Nota Tenga presente que por defecto le ‘va a dejar el campo que NO permite valores nulos.Primary = True ‘Se añade el objeto Index recién creado a la colección Index del objeto tabledef Visual Basic .Fields.Fields. dbText.Fields.AllowZeroLength = True ‘Se añaden los campos a la colección Fields de las tablas MiTabla1.Fields.CreateField("Fecha_Dev".Append MiCampo13 MiTabla1.Fields. dbDate) Set MiCampo44 = MiTabla4.CreateField("ID_Cliente".Append MiCampo41 MiTabla4.Append MiCampo15 MiTabla2.Append MiCampo31 MiTabla3. 8) ‘Se añade el campo a la colección Fields del Index MiIndice1.Append CampoIndiceA ‘Se le dice que es un índice primario (Clave primaria) MiIndice1.AllowZeroLength = True MiCampo15.Fields. MiIndice3 As Index Dim CampoIndiceA As Field Dim CampoIndiceB As Field ‘Se crea el primer objeto Index Set MiIndice1 = MiTabla1.Append MiCampo32 MiTabla3.Append MiCampo36 MiTabla4.Fields.TableDefs.Append MiCampo34 MiTabla3. dbText.Guía del Estudiante Capítulo 12 Página 19 LSB .Fields. 13) Set MiCampo43 = MiTabla4.Append MiCampo22 MiTabla2.Fields.Append MiTabla1 MiBaseDatos.TableDefs. dbText.Append MiCampo11 MiTabla1.Fields.Fields.Append MiCampo25 MiTabla3.Append MiCampo42 MiTabla4.Fields.Fields.CreateField("ID_Cliente".TableDefs.Fields.Fields.Fields.Append MiTabla2 MiBaseDatos. MiCampo12.Append MiCampo12 MiTabla1.AllowZeroLength = True MiCampo13.Fields.Append MiCampo23 MiTabla2. se ha puesto la propiedad AllowZeroLength (Permitir valores nulos en ese ‘campo) a lo que interesa en cada uno de los campos.Fields.Set MiCampo41 = MiTabla4.Append MiCampo33 MiTabla3.Fields. con los mismos datos que el ‘campo MiCampo11 Set CampoIndiceA = MiIndice1.Append MiTabla4 ‘Se declaran las variables tipo objeto Index y tipo objeto Field para crear los índices Dim MiIndice1 As Index.Append MiTabla3 MiBaseDatos.CreateIndex("IndiceCliente") ‘Este objeto Index crea el campo que va a ser índice.Append MiCampo44 ‘Se añaden las tablas a la colección Tabledefs del objeto Database MiBaseDatos.Append MiCampo24 MiTabla2. 8) Set MiCampo42 = MiTabla4.Append MiCampo35 MiTabla3. dbDate) ‘Una vez creados los campos se les ponen las peopiedades que se estime oportuno ‘En este caso.

Relations. pero podrían haber sido los mismos Dim MiRelacion1 As Relation. Alquileres. MiRelacion3 As Relation Dim CampoRelacionA As Field Dim CampoRelacionB As Field ‘Se crea la primera relación entre el campo ID_Clientes de la tabla Clientes (Tabla ‘primaria) y el campo ID_Cliente de la tabla Alquileres (Tabla relacionada) Set MiRelacion1 = MiBaseDatos.Guía del Estudiante Capítulo 12 Página 20 . 1) MiIndice2.Apellidos. dbText.Titulo. dbText.ForeignName = "ID_Cinta" MiRelacion2.Fields. 13) MiIndice3. El signo  indica que esa línea continúa en la siguiente Dim MiConsulta1 As QueryDef Set MiConsulta1 = MiBaseDatos.Fields.Relations.ID_Cinta) " & _ LSB Visual Basic .Fields.CreateField("ID_Cinta".Indexes. "Peliculas".Append CampoIndiceA MiIndice3.ForeignName = "Idioma" MiRelacion3.CreateField("Idioma". 8) CampoRelacionA.Primary = True MiTabla2.Telefono.Append MiIndice2 Set MiIndice3 = MiTabla3.CreateIndex("IndiceCintas") Set CampoIndiceA = MiIndice3. "Alquileres") Set CampoRelacionA = MiRelacion1. 13) CampoRelacionA.Primary = True MiTabla3.Append CampoRelacionA MiRelacion3. "Clientes". 8) Set CampoRelacionB = MiRelacion1. Clientes.Fields.Append MiRelacion1 ‘Se crea la segunda relación Set MiRelacion2 = MiBaseDatos.Relations.Fields.Append MiIndice3 ‘Se declaran los objetos Relation y un par de objetos Field para crear las relaciones.Append CampoRelacionB MiBaseDatos. "Alquileres") MiRelacion2.Append CampoRelacionA MiBaseDatos. MiRelacion2 As Relation.Fields.CreateRelation("RelClientes".MiTabla1.Indexes.CreateField("ID_Cliente".CreateIndex("IndicePeliculas") ‘Aquí se meten dos campos en el mismo índice Set CampoIndiceA = MiIndice2.Append MiRelacion2 ‘La tercera relación “relaciona” dos campos. Peliculas.CreateQueryDef("Pelis".Attributes = dbRelationUnique Set CampoRelacionA = MiRelacion1. "Cintas".Indexes.ForeignName = "Pelicula" CampoRelacionB.Nombre.Fields. "Cintas") Set CampoRelacionA = MiRelacion1.Append CampoIndiceB MiIndice2.CreateField("ID_Cinta". 8) CampoRelacionA.CreateRelation("RelCintas".ID_Cinta " & _ " FROM Peliculas INNER JOIN (Clientes INNER JOIN (Cintas INNER JOIN Alquileres ON  Cintas.Append MiIndice1 ‘Se procede de igual forma con el segundo objeto Index Set MiIndice2 = MiTabla2.  Clientes. dbText.CreateField("ID_Pelicula".CreateField("Idioma".Append CampoRelacionA MiBaseDatos. dbText. dbText. "SELECT Clientes.CreateRelation("RelCintasPelis". 10) Set CampoIndiceB = MiIndice2.Append CampoIndiceA MiIndice2.ID_Cinta = Alquileres. Película e Idioma Set MiRelacion3 = MiBaseDatos.ForeignName = "ID_Cliente" MiRelacion1.CreateField("ID_Pelicula". dbText. Por ‘claridad se han declarado objetos Field distintos para la creación de los índices y de las ‘relaciones.Append MiRelacion3 ‘Se comienza a crear una consulta (La sentencia SQL está cortada dado que no cabe en ‘una línea. dbText.

pasó a Vista SQL y la copió. No crea que el autor ha escrito la sentencia SQL que ha visto.Idioma = Cintas. Se puede ser muy experto en SQL y tener miedo a crear una consulta SQL debido a la complejidad que puede tener." ON Clientes.Pelicula)" & _ " WHERE (((Alquileres. conoce. Es muy bueno hacer prácticas con SQL. 20.Guía del Estudiante Capítulo 12 Página 21 . ha comprobado que era eso lo que quería. para que no se olvide. 20. MiBaseDatos.ID_Cliente = Alquileres. El resultado de todo esto podemos verlo si abrimos la base de datos con Access Fig.ID_Cliente) ON (Peliculas. Pero en algunos casos es preferible acudir a los trucos que nos proporcionan nuestras herramientas.") ‘Se cierra la el objeto database. " & Err. En este momento es cuando se crea el fichero.4 Tablas de la BD de Videoclub creada con el código descrito Fig.Close ‘se comunica al usuario la buena nueva de que la base ha sido creada. MsgBox "La base de datos se ha creado con éxito" ‘Aquí comienza la rutina de error Exit Sub RutErr: MsgBox "Ha ocurrido el error " & Err & ". de la forma gráfica que seguro que Vd.Idioma) AND  (Peliculas.Description End Sub Nota acerca de la sentencia SQL para crear la consulta.ID_Pelicula = Cintas.5 Y la consulta LSB Visual Basic . Ha utilizado el truco de crear primero la consulta con Access.ID_Cinta)='0000000000001')).

Guía del Estudiante Capítulo 12 Página 22 LSB .6 Clave Primaria formada con los dos campos de la tabla Películas Fig.7 Propiedades de esa clave primaria Fig.8 Las relaciones creadas Crear bases de datos con contraseña Visual Basic . 20. 20.Fig. 20.

Lo que debe hacer es crearla con una contraseña (Password) de forma que cuando la quiera abrir. y no comunica el Password a nadie. dbLangGeneral & ". Solamente le será útil para que no puedan ver el contenido del fichero . MiCampo13.pwd=PaswordElegido" concatenándolo tras el parámetro que especifica la lengua. Además hemos controlado todos los parámetros de los campos de nuestra BD. ya que si se abre con Access.CreateDatabase(TBNombreBase. No tiene aplicación a la hora de crear un campo. Si no lo sabe. Si crea una base de datos con estas características.DefaultValue = “Madrid” LSB Visual Basic .MDB. no se puede abrir. dbLangGeneral) Basta con añadirle ".pwd=LSB". deberá introducir en su instrucción de apertura el Password con el que se creó. (Eso sí. cuando crea un recordset.Imagínese que quiere que su base de datos no se pueda abrir mediante Access. Le reseño aquí las que he considerado mas importantes AllowZeroLength Si/NO Si es Si permite que ese campo tenga valores nulos DataUpdatable Si/No Si es Si permite modificar el dato de ese campo. Anexo1 Propiedades de los campos Ha visto mas atrás que puede ser necesario cambiar las propiedades de los campos una vez creados (Por ejemplo. Hemos creado la base de datos haciendo click en un botón de la aplicación. Existen programas que puede bajarse de Internet que le leen la contraseña con la que ha protegido su base.AllowZeroLength = False) Alargaríamos demasiado este ya largo capítulo si se explican todos los las propiedades que puede tener un campo. Crear bases de datos encriptada Puede encriptar el fichero de su base de datos.dbLangGeneral & ". solamente la podrá abrir mediante el programa. explicaremos cómo se abre una base de datos con contraseña. pero sí suficiente para que un usuario “normal” no se la pueda abrir. le pida el Password. DefaultValue Es el valor que le pone a ese campo si no introduce ninguno.Guía del Estudiante Capítulo 12 Página 23 . No ha sido necesario venderle al cliente Access. le presentará los datos de forma correcta.pwd=LSB") Cuando lleguemos a la parte de abrir bases de datos. Añada un poco de esfuerzo a su estudio y vea las propiedades de los objetos Field en la ayuda. Y no crea que ha conseguido la confidencialidad total de sus datos. dbEncrypt) Ha merecido la pena el trabajo. Para encriptar una base de datos basta con añadir la palabra dbEncrypt en la instrucción donde ha creado la BD Set MiBaseDatos = Workspaces(0). Puede indicar un valor a la hora de crear el campo: Campo14. Sí puede cambiar el valor de esta propiedad por ejemplo. Merece la pena crearse las bases de datos por programa.CreateDatabase(TBNombreBase.CreateDatabase(TBNombreBase. En el ejemplo siguiente hemos usado como Password las iniciales LSB Set MiBaseDatos = = Workspaces(0). ni enviar una base de datos vacía con los discos de distribución. el programa para abrirla. No es una protección total.) Si volvemos a la línea donde creabamos la base de datos del videoclub: Set MiBaseDatos = Workspaces(0).

Le enumero los mas usuales Propiedad Type Constante dbBoolean dbCurrency dbDouble dbLong dbLongBinary dbSingle Propiedad Attributes Constante dbFixedField dbVariableField dbAutoIncrField dbUpdatableField dbDescending Descripción El tamaño del campo es fijo (predeterminado en campos numéricos).Attributes = dbAutoIncrField mitabla01. si hemos creado un campo denominado ID que será el contador de una serie de registros. el campo se ordena ascendentemente (A-Z o 0-100) (predeterminado). y queremos que se incremente en 1 cada vez que añadamos un registro. de la siguiente forma : Set micampo1N = mitabla01. Si se omite esta constante.Fields. 4) micampo1N. (Como puede ver mas atrás.Required Si/No Indica si el dato es requerido. dbDate) Ese tipo coincide con la propiedad Type aplicada a los campos. El valor del campo no puede ser modificado. El valor del campo en los registros nuevos es incrementado automáticamente a un valor Long integer único que no puede ser modificado.e. Es la propiedad por defecto del objeto Field.: CreateField("Fecha_Alq".Append micampo11 Propiedad Size Devuelve o establece un valor que indica el tamaño máximo. Por ejemplo. en bytes.Required = True micampo1N.CreateField("ID". con esta sintaxis p. debemos usar la propiedad Attributes ANTES de añadir ese campo al objeto TableDef correspondiente. Sólo aceptado en tablas bases de datos Jet. Descripción Constante Descripción Campo SI/NO dbByte Campo tipo Byte Tipo moneda dbDate Tipo Date/Time Numérico Doble dbInteger Numérico Integer Entero Long dbMemo Campo Memo Binario largo (Objeto OLE) Numérico Single dbText CampoTexto dbAutoIncrField es la constante a utilizar cuando queremos crear un campo que se vaya incrementando cada vez que se introduce un nuevo registro (Campo Contador). Puede ver la ayuda de VB para mas detalles. La propiedad Size solamente tendrá que aplicarla cuando vaya a crear un campo tipo Texto. El tamaño del campo es variable (Sólo campos de texto). Attributes y Size referidas a los campos En el método CreateField debe introducir el tipo del campo que desea crear.Guía del Estudiante Capítulo 12 Página 24 ‘ Creamos el campo ID ‘ La propiedad Required la veremos ‘ Le damos atributo de contador ‘ Añadimos el campo a la tabla LSB . En caso de que tome el valor SI (True) es necesario introducir un dato en ese campo Value Es justamente el dato que almacena en ese campo. Propiedades Type. El campo está ordenado de forma descendente (Z-A o 100-0) (sólo se aplica a objetos Field de una colección Fields de un objeto Index). de un objeto Field que contiene texto o el tamaño fijo de un objeto Field que contiene texto o valores numéricos Visual Basic .

LSB Visual Basic . 13). No es lo más usual. nombre_bd Expresión de cadena con el nombre de un archivo (y su Path) de una base de datos existente. Pero previamente deberemos declarar el nombre que se le va a dar a ese objeto Database mediante la instrucción Dim si queremos que el ámbito de ese Database sea un formulario. Al especificar nombre_bd hay que tener en cuenta algunas consideraciones: Si se refiere a una base de datos ya abierta por otro usuario con acceso exclusivo. usando el espacio de trabajo Microsoft JET. si queremos abrir una base de datos y poder referirnos a ella en toda la aplicación. Veremos luego como se puede crear un Recordset. borrarlos etc. Vamos a ver como se abre una base de datos mediante DAO. el tamaño va implícito en el tipo de dato. Puede consultar el tamaño ocupado por cualquier campo. Sintaxis Recuerde la expresión general: Set DAOInferior = DAOSuperior. sólo-lectura[. exclusivo[.Guía del Estudiante Capítulo 12 Página 25 .. Para abrir una base de datos existente deberemos usar el método OpenDatabase. Por ejemplo. La base de datos abierta se agrega automáticamente a la colección Databases. como por ejemplo "\\MISERVID\MICOMP\MIDIR\MIBD. leyendo la propiedad Size de un campo: Variable = Micampo11. se producirá un error.Esta propiedad se le debe suministrar en la sintaxis de CreateField solamente cuando creamos un campo tipo texto . también puede especificar una ruta de red.. se producirá un error. Si no se refiere a una base de datos existente o a un origen de datos ODBC válido.. o Global o Public. que es en realidad sobre el que se leen y escriben datos. (en la sección de declaraciones de un Módulo o Formulario) si queremos que el ámbito sea toda la aplicación. Lo veremos en otro capítulo. como se pueden añadir registros. origen]]]) La sintaxis del método OpenDatabase consta de las siguientes partes: MiBaseDatos Variable de tipo de dato objeto Database que representa el objeto DAO Database que se va a abrir. dbText. es necesario especificarla.-) Set MiBaseDatos = Misesion.Método ( . Lo normal es tener la base de datos creada y abrirla cuando queremos extraer datos o introducir datos..CreateField("ID_Cinta". El tamaño de un campo texto puede ser desde 1 a 255 caracteres. Para el resto de los tipos de datos. debemos declararla de esta forma en la sección de declaraciones de un módulo : Public MiBaseDatos as Database Método OpenDatabase Abre la base de datos existente.Size Abrir una Base de Datos ya existente mediante DAO. nombre_bd también puede ser un origen de datos OBDC. Si la red lo admite.OpenDatabase(nombre_bd[.MDB". Si el nombre de archivo tiene extensión. Método OpenDatabase Hasta ahora hemos visto como crear una base de datos. Misesion Variable de tipo de dato objeto Workspace que representa el objeto Workspace existente que va a contener a la base de datos.

El trabajo comienza cuando cree el recordset.MDB”) origen p. abre la base de datos cuyo fichero está en C :\Guia_Est y se llama Videoclub. Al no especificar nada en el parámetro origen entiende que la base es ACCESS Nota para todo este capítulo. en el que el usuario podrá elegir una base de datos.OpenDatabase (“C:\Guia_Est\Videoclub. Se ha limitado a ver si existía el fichero indicado y a “apuntar” el nombre y path de ese fichero que contiene la base de datos. la base se abrirá con acceso compartido. la base se abrirá para lectura/escritura.Guía del Estudiante Capítulo 12 Página 26 .OpenDatabase (“C:\Guia_Est\Videoclub. Expresión de cadena utilizada para abrir la base de datos. Al no expresarle mas parámetros la abre de modo no exclusivo. Si se omite este argumento. Pero no crea que nuestro programa ha hecho trabajo. Consulte la sintaxis en la propiedad Connect. Si Misesion = Workspaces (0).MDB”) El hecho de poner siempre un nombre al Workspace es solamente a efectos didácticos Ya tenemos la base de datos abierta. Set MiBaseDatos = Misesion. Si se omite este argumento.Si es una cadena de longitud cero ("") y origen es "ODBC.e. y de lectura y escritura. la sentencia anterior podemos ponerla también : Set MiBaseDatos = Workspaces(0). Para especificar una cadena de origen deberá especificar también los argumentos exclusivo y sólo_lectura. aparecerá un cuadro de diálogo con todos los nombres de orígenes de datos ODBC registrados. No es necesario cambiar el nombre del Workspace.".MDB. LSB Visual Basic . Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso de sólo lectura o False si se va a abrir con acceso de lectura/escritura. Esta cadena constituye los argumentos de conexión ODBC. exclusivo sólo_lectura Valor de tipo Boolean que es True si la base de datos se va a abrir con acceso exclusivo (no compartido) o False si se va a abrir con acceso compartido.

Guía del Estudiante Capítulo 12 Página 27 . La colección Recordsets contiene todos los objetos Recordset abiertos de un objeto Database. Este tipo de objeto Recordset puede contener campos de una o más tablas de una base de datos. Los datos que tiene el recordset son los que existían cuando se realizó la fotografía. Public Mirecordset As Recordset Una vez declarado. Puede ser que no los contenga todos.OpenRecordset (origen[. LSB Visual Basic . un Recordset es un conjunto de registros. modificar o eliminar registros de una sola tabla de base de datos. opciones]]) Al crear un nuevo objeto Recordset se agrega automáticamente a la colección Recordsets. solamente contendrá los campos que a nosotros nos interese. Un Recordset tipo Tabla contiene todos los campos de una tabla y no puede contener campos que no pertenezcan a esa tabla. No se complique la vida.EL OBJETO RECORDSET (O la mitad de lo que Vd. El objeto Recordset se abre desde un objeto DataBase (que es lo normal). Los objetos Recordset de tipo instantánea pueden contener campos de una o más tablas de una base de datos. Al utilizar objetos de acceso a datos. cosa que viene muy bien algunas veces. En resumen. Y en ese caso. pero no pueden actualizarse. necesita saber de Bases de Datos) Un objeto Recordset contiene los registros de una tabla o de una consulta. Recordset de tipo hoja de respuestas dinámica: Resultado de una consulta que puede tener registros actualizables. De esta forma. el conjunto de registros que tiene ese control Data es la totalidad de los registros de la tabla (o consulta) que poníamos en la propiedad RecordSource. Pero si acude a la información de VB verá que también se puede abrir desde un TableDef. bien de una tabla. Como cualquier objeto DAO. Un Recordset de tipo hoja de respuestas dinámica es un conjunto dinámico de registros que puede utilizarse para agregar. para abrirlo basta con ejecutar la sentencia : Set Mirecordset = base_datos. Recordset de tipo instantánea: Copia estática de un conjunto de registros que puede utilizarse para buscar datos o generar informes. Un Recordset lo crearemos con el método OpenRecordset que estamos estudiando. casi toda la interacción con los datos se produce a través de objetos Recordset. debemos declararlo como variable tipo objeto. Cualquier actualización posterior no se puede ver. tenemos oportunidad de ver que también se puede abrir desde otro recordset. Un recordset de tipo instantánea (Snapshot) es una fotografía que se hace a la tabla o tablas que lo componen. Resumiendo. Pero siempre podemos asignar a la propiedad Recordset de ese control Data un Recordset ya creado mediante código. Recuerde cuando explicábamos en control Data se decía que este control creaba un Recordset a partir de sus propiedades DatabaseName y RecordSource. un QueryDef y desde otro Recordset. bien de un conjunto de tablas (a través de una consulta) También hay una colección Recordsets. Todos los objetos Recordset están formados por registros (filas) y campos (columnas). incluso campos de distintas tablas. pero que en este caso solamente podemos abrirlo para cambiar alguna de sus propiedades. A lo mejor. tipo[. si al crear ese recordset le hemos impuesto que los registros cumplan una determinada condición. modificar o eliminar registros de una o más tablas de una base de datos subyacente. Existen tres tipos de objetos Recordset: Recordset de tipo tabla: Representación en código de una tabla base de datos que puede utilizarse para agregar. un recordset es un objeto de acceso a datos que contiene una colección de registros tomados. Abra directamente los Recordsets desde la base de datos.

que tenga la condición de que sea solo lectura... un nombre de consulta o una instrucción SQL que devuelva registros. Si no se especifica un tipo.base_datos es el nombre del objeto Database que va a crear el recordset. También se eliminan automáticamente cuando creamos otro recordset con el mismo nombre. dbOpenDynaset) En los ejemplos anteriores no se ha establecido ningún parámetro en Opciones...OpenRecordset (“MiTabla”.OpenRecordset (dbReadOnly) Este nuevo Recordset contendrá los mismos campos que el Recordset origen. Tipo es el tipo de Recordset que se quiere crear. Si desde el Recordset anterior. Campo2 y Campo3. dbOpenDynaset para abrir un objeto Recordset de tipo hoja de respuestas dinámica.Guía del Estudiante Capítulo 12 Página 28 LSB .. dbOpenSnapshot para abrir un objeto Recordset de tipo instantánea.OpenRecordset (“SELECT Campo1. el origen sólo puede ser un nombre de tabla. En el caso de los objetos Recordset de tipo tabla. y que sea del tipo de hoja de respuestas dinámica. Veamos lo que decíamos antes. tipo[.) Set Mirecordset = base_datos. usaremos la sentencia : Set Mirecordset1 = Mirecordset. queremos crear un nuevo Recordset denominado MiRecordset1.. El origen puede ser un nombre de tabla. opciones]]) Si tenemos abierta una base de datos llamada MiBaseDatos. Campo2. OpenRecordset creará un objeto Recordset de tipo hoja de respuestas dinámica. El tipo del nuevo objeto Recordset se define mediante una de las siguientes constantes : dbOpenTable para abrir un objeto Recordset de tipo tabla.Método ( . (Cuando especifica como Origen el nombre de una Tabla) Si se especifica una consulta o una tabla adjunta. Crear un Recordset desde otro recordset. Se puede usar solamente para variar sus propiedades. Ejemplo de creación de un Objeto Recordset Decíamos que se puede crear un Recordset con la sentencia : Recuerde la Fórmula general Set DAOinf = DAOsup. dbOpenDynaset) o simplemente sin utilizar la sentencia SQL : Set Mirecordset = MiBaseDatos. Vea la Ayuda de VB para mayor detalle. Visual Basic . de la siguiente forma : Set Mirecordset = MiBaseDatos. Los objetos Recordset se eliminan automáticamente de la colección Recordsets al cerrarlos con el método Close. (La base de datos que acaba de abrir) Origen en la primera expresión es una variable de tipo String que especifica el origen de los registros del nuevo objeto Recordset.OpenRecordset (“SELECT * FROM MiTabla”. pero no podremos cambiar datos en él. Campo3 _ FROM MiTabla”.OpenRecordset (origen[. El parámetro opciones permite especificar las características del nuevo objeto Recordset tales como las restricciones de edición y consulta para otros usuarios. OpenRecordset creará un objeto Recordset de tipo tabla cuando sea posible. dbOpenDynaset) Si deseamos que el Recordset contenga todos los campos de esa misma tabla : Set Mirecordset=MiBaseDatos. podemos crear el objeto MiRecordset eligiendo de la tabla MiTabla de esa base de datos los campos Campo1.

Métodos y Propiedades del recordset que va a necesitar inmediatamente LSB Visual Basic . MoveNext). dbOpenDynaset) Tipo de recordset más práctico ¿Dynaset. en una base con las direcciones de los clientes. ya que el tipo Table debe contener TODOS los registros de una UNICA TABLA.D. Todo dependerá de lo que necesitemos de nuestro recordset y de cómo nos queramos mover por él. ya que no podemos usar ciertos métodos como los Find (FindFirst. buscar registros. o ver registros de varias tablas al mismo tiempo (lo que podemos ver en Access en una consulta). Por ejemplo. Veamos la elección entre Dynaset y Table Si queremos seleccionar parte de los registros de una tabla.) Vamos a abrir un Recordset con todos los clientes de San Sebastián de los Reyes : Set Mirecordset2 = CLIENTES. dbOpenDynaset) El Recordset Mirecordset2 contiene todos los campos de todos los registros de la tabla DIRECCIONES que cumplan la condición de que el código postal (campo COD_POSTAL en el ejemplo) sea igual a 28700. Si estamos en ese caso es el único en el que tendremos dudas respecto al tipo elegido. Y si usa Dynaset dispone de más recursos.. en cuyo caso es indispensable usar recordsets tipo tabla y moverse sobre un índice. Estos Recordsets pueden tener campos comunes. Imaginemos que hemos abierto la base de datos con el nombre CLIENTES (Recuerde que este es el nombre del objeto DAO usado para abrir la B. si queremos seleccionar todos los clientes de Madrid (su código postal comenzará necesariamente por 28 y le seguirán tres cifras) : Set Mirecordset2 = CLIENTES. en el disco). Pero en la mayoría de los casos. Si creamos un recordset tipo Table se nos puede complicar un poco el código a la hora de movernos a lo largo del recordset. sobre todo de búsqueda. podríamos crear dos Recordsets exactamente iguales. Veremos casos de uno y otro tipo.) debiendo utilizar para realizar la misma función los métodos Move (MoveFirst. Podemos introducir cualquier sentencia SQL para determinar qué registros introducimos en el Recordset. MovePrevious. Un recordset Snapshot solamente sirve para realizar informes (leer) de los datos en un instante determinado. FindLast.OpenRecordset (“SELECT * FROM DIRECCIONES WHERE COD_POSTAL = 28700“. Vamos a prescindir del recordset tipo Snapshot si lo que queremos es leer y escribir datos. seleccionando de esos campos unos determinados valores.Guía del Estudiante Capítulo 12 Página 29 . Los desplazamientos a lo largo de un recordset tipo tabla son mucho más rápidos que sobre un recordset tipo Dynaset. necesitaremos crear un Recordset donde se elijan varios campos de una o varias tablas. Es más. (Lo que ganamos con la complicación del Seek es velocidad).D. Observe en esta y anteriores expresiones.OpenRecordset (“SELECT * FROM DIRECCIONES WHERE COD_POSTAL LIKE 28???“. etc. o el método Seek. no el nombre que pueda tener esa B. que la sentencia SQL está entre doble comilla. Esa rapidez se nota fundamentalmente cuando va a manejar miles de registros. un poco más complicado y que exige un índice.D. Por ejemplo. debemos elegir directamente el tipo Dynaset. y esta base de datos tiene una tabla llamada DIRECCIONES (Este sí es el nombre real de la tabla dentro de la B. Cuando decimos movernos por él queremos decir cambiar de un registro a otro.Pueden crearse tantos Recordsets como se necesiten. MoveLast. Si no va a manejar miles de registros. no apreciará mucha diferencia entre uno y otro. etc. a lo mejor queremos seleccionar todas aquellas direcciones en las cuales el código postal sea el 28700 (San Sebastián de los Reyes). Table? A la hora de crear un recordset podemos pensar que tipo es el más adecuado.

y ahí se puede modificar simplemente asignando a cada campo el valor deseado. En la práctica anterior observará tras este proceso que se cambia el contenido del Label al nuevo valor. Método AddNew Crea un nuevo registro en un objeto Recordset de tipo Table o Dynaset. El registro que era actual antes de utilizar el método AddNew continúa siéndolo después. (Dynaset) los registros se insertan al final del conjunto. Por lo tanto no sabe cuantos registros tiene realmente hasta que no los recorre todos. puede establecer en la propiedad Bookmark el marcador identificado por el valor de la propiedad LastModified. debe utilizar el método Update para guardar los cambios y agregarlo al conjunto de registros. y posteriormente agregarlo al conjunto de registros del objeto Recordset. los nuevos registros se agregan al final del conjunto.Guía del Estudiante Capítulo 12 Página 30 . ya le indicará el número correcto de registros existentes.MoveLast NombredeMiRecordset. LSB Visual Basic .AddNew El método AddNew crea un nuevo registro donde puede introducir nuevos datos. Snapshot Table. Si no se ha establecido la propiedad Index. En un objeto Recordset de tipo tabla cuya propiedad Index esté definida. Si desea hacer que el nuevo registro sea el actual. Un recordset tipo Dynaset tiene la ventaja (y el inconveniente) de que solamente guarda en memoria un registro. ¡Parece que solamente tiene un registro! No es así. Para asignar un valor a un campo simplemente tenemos que poner la expresión : MiRecordset ! MiCampo1 = “Dato tipo string” MiRecordset ! MiCampo2 = Dato tipo numérico Una vez que se hayan introducido los datos en el nuevo registro. Este método establece en los campos el valor Null (predeterminado para los objetos Recordset de tipo tabla) o los valores predeterminados.MoveFirst A partir de ese momento. La posición del nuevo registro depende del tipo de objeto Recordset: En un objeto Recordset de tipo hoja de respuestas dinámica. si existen. tiene que acceder previamente al primero y al último.RecordCount Donde NombredeMiRecordset es un objeto Recordset. No se modificará la base de datos hasta que se utilice el método Update. Sintaxis MiRecordset. El valor de esta propiedad es de sólo lectura Sintaxis NombredeMiRecordset. le devolverá el valor 1. Si le pide ese dato a un recordset tipo Dynaset recién creado. Pero en el caso de que sea Dynaset se va a encontrar con una sorpresa. El registro creado queda en la memoria.Propiedad RecordCount Devuelve el número de registros accedidos en un objeto Recordset. independientemente de las reglas de ordenación que pueda haber en vigor al abrir el conjunto de registros. los registros se agregan en el lugar correspondiente al orden. añadir un registro con un valor para ese campo distinto al que está presente en el Label y comprobar que el contenido del Label no se ve afectado por haber introducido un registro nuevo. El valor devuelto por la propiedad RecordCount es un dato numérico Long (NombredeMiRecordset puede ser del tipo Dynaset. Esto puede comprobarlo asignando a un Label el contenido de un campo. Para ello basta con ejecutar estas dos líneas de código: NombredeMiRecordset. Para que el método RecordCount le devuelva el número de registros existentes.

que tomará el marcador de ese registro creado o editado. Para poder usar Edit debe existir un registro actual. bien por haber utilizado el método Update.Update Donde MiRecordset representa el nombre de un objeto Recordset de tipo hoja de respuestas dinámica o tabla. El registro actual después de utilizar Edit es precisamente el registro que acabamos de editar. o cambiados los datos de un registro. abierto y actualizable. Sintaxis MiRecordset. Otro usuario ha bloqueado la página que contiene el registro. debemos utilizar el Método Update para guardar los datos en la BD. Método CancelUpdate LSB Visual Basic . los cambios efectuados en los campos del registro actual se copian en el búfer de copia. mete en la Base de Datos el contenido del registro que estaba en la memoria. se producirá un error. Una vez añadido el registro. Método Update Guarda el contenido del búfer de copia en un objeto Recordset de tipo hoja de respuestas dinámica o tabla especificado. Si no es así o si MiRecordset no se refiere a un objeto Recordset de tipo tabla u hoja de respuestas dinámica. El uso de Edit producirá un error en las condiciones siguientes: No hay registro actual. Ningún campo del registro es actualizable. Otro usuario ha abierto la base de datos o el conjunto de registros para uso exclusivo. Al terminar de realizar los cambios deseados. utilice el método Update para guardarlos. Como en el caso del método AddNew este registro modificado está en la memoria y es necesario introducirlo en la BD. Cierre del conjunto de registros indicado en MiRecordset sin utilizar antes Update. Uso de Edit o AddNew y utilización de nuevo de Edit o AddNew sin especificar antes Update. La base de datos o el conjunto de registros es de sólo lectura. a un objeto Table o a un objeto Dynaset abierto. Cada vez que se crea o edita un registro se cambia el valor de la propiedad LastModified. Establecimiento de otro registro en la propiedad Bookmark. Método Edit Copia el registro actual de un objeto Recordset de tipo hoja de respuestas dinámica o tabla en el búfer de copia para su edición. bien por haber utilizado el método Edit. Sintaxis MiRecordset.Guía del Estudiante Capítulo 12 Página 31 .Vea la propiedad LastModified un poco mas adelante.Edit Donde MiRecordset representa el nombre de un objeto Recordset abierto y actualizable que contiene el registro a editar. Es decir. Los cambios en el registro actual se perderán en las siguientes situaciones: Uso del método Edit o AddNew y desplazamiento a otro registro sin utilizar antes Update. Una vez invocado el método Edit.

Deberemos seguir buscando.CancelUpdateTipo Tipo puede tomar los siguientes valores dbUpdateRegular dbUpdateBatch Comentarios Cancela los cambios pendientes que no están en la memoria caché.Guía del Estudiante Capítulo 12 Página 32 . aunque parezca que para conocer la posición de un registro debería ser un numérico. Para ello forzamos a que el registro cuyo Bookmark sea igual a Variable se convierta en registro actual: MiRecordset. significa el registro en el que estamos actualmente (registro actual) Podemos conocer en que registro estamos mediante la siguiente expresión: Variable = MiRecordset. pero es así). Bookmark en inglés significa ese papel que introducimos en un libro para saber en qué página hemos dejado la lectura. Queremos volver a aquel registro.Bookmark Seguimos buscando moviéndonos por todo el recordset. En Visual Basic. Para eliminar un registro. un máximo del valor de un campo) No sabemos si habrá otro registro que tenga un valor mayor que este. Por lo tanto deberíamos haber declarado la variable previamente como una variable tipo String Dim Variable As String Pero esta propiedad sirve para colocarnos en el registro que deseemos.Bookmark Pero tenemos que tener en cuenta que Variable es una variable tipo String (Sí. debe haber un registro actual en el Recordset antes de utilizar Delete. Eso sí. La utilización del método CancelUpdate tiene el mismo efecto que moverse a otro registro sin utilizar el método Update. Sintaxis recordset. y comprobamos que no hay otro registro con un valor mayor. pero antes anotamos el Bookmark de ese registro Variable = MiRecordset. El método CancelUpdate cancela todas las actualizaciones pendientes a causa de una operación Edit o AddNew. LSB Visual Basic . Cancela los cambios pendientes en la memoria cache actualizada.Cancela todas las actualizaciones pendientes del objeto Recordset.BookMark = Variable Y se colocará en el registro deseado. Una vez eliminado. prueba de que está sobre un registro inexistente. Propiedad Bookmark Devuelve o establece un marcador que identifica de forma única el registro actual de un objeto Recordset o define el registro actual de un Recordset como marcador válido. no se actualizan. como BOF y EOF. Puede observar. Imagínese que se está moviendo a lo largo del recordset y hemos visto un registro donde tenemos un dato importante (por ejemplo. Método Delete Este método elimina el registro actual de un objeto Recordset de tipo hoja de respuestas dinámica o tabla. que si a continuación de Delete utiliza AbsolutePosition para conocer en que registro está. previamente deberíamos haber obtenido el Bookmark de ese registro. string. Esto merece una pequeña aclaración. la respuesta será -1. salvo que el registro activo no cambia y algunas propiedades. pues de lo contrario se producirá un error interceptable. este registro sigue siendo el registro actual.

Guía del Estudiante Capítulo 12 Página 33 .Clone() Marca1 = Rs1. muévase al registro deseado y asigne el valor de la propiedad Bookmark a una variable String que identificará el registro. el Recordset no acepta marcadores. Para asegurarse de que el Recordset acepta marcadores. y el uso de la propiedad Bookmark produce un error interceptable. se producirá un error interceptable. Antes de tener acceso a la propiedad Bookmark.OpenRecordset("Títulos") Set Rs2 = Rs1. MovePrevious Estos métodos son aplicables a todos los tipos de recordset. LSB Visual Basic . el último.LastModified El valor devuelto por esta propiedad es un tipo de datos Variant o String. Si Bookmarkable es False. No hay límite en el número de marcadores que pueden establecerse. el siguiente código compara marcadores en dos objetos Recordset: Dim Marca1 as String. aunque a primera vista parezca igual : If Rs1.. Por ejemplo. MoveLast. Marca2 as String Dim Rs1 as Recordset. copie los valores de los marcadores a variables cadena y efectúe las comparaciones usando dichas variables cadena. La propiedad Bookmark se almacena internamente como matriz de Byte. (Similar al devuelto por Bookmark) LastModified se puede usar para colocarse en el registro más recientemente agregado o actualizado. En un Recordset basado completamente en tablas del motor de base de datos Microsoft Jet. Por esta razón. inspeccione el valor de su propiedad Bookmarkable antes de usar la propiedad Bookmark. Basta para ello igualar la propiedad Bookmark a la propiedad LastModified : NombreRecordset. Esta propiedad puede usarse para volver al último registro que ha sido modificado.Bookmark Marca2 = Rs2. no se pueden usar marcadores en un Recordset basado en una tabla anexa Paradox que no tiene clave principal. si se intenta usar la propiedad Bookmark en una operación de comparación.Bookmark = Rs2. Propiedad LastModified Devuelve un marcador que indica el registro más recientemente agregado o modificado. el siguiente o el anterior registro del objeto Recordset especificado y lo convierten en el registro actual.LastModified Métodos MoveFirst. MoveNext.Bookmark = NombreRecordset.. Para crear un marcador para otro registro distinto del registro actual. Sin embargo. Porque dará error. Se sitúan en el primer. se produce un error interceptable. Sintaxis NombreRecordset.Bookmark Then . Por ejemplo. el valor de la propiedad Bookmarkable es True y pueden usarse marcadores. Rs2 as Recordset Set Rs1 = Db. otros productos de bases de datos pueden no aceptar los marcadores...Bookmark If Marca1 = Marca2 Then Print "Esta comparación es válida " No intente realizar la siguiente comparación. Si la propiedad Bookmark se establece a un valor que corresponda a un registro eliminado.Solamente se puede ver la propiedad Bookmark en aquellos recordsets que tengan la propiedad Bookmarkable a True.

en la propiedad BOF se establecerá True y no habrá registro actual. No es posible utilizar los métodos MoveFirst ni MovePrevious en los Recordset tipo snapshot de desplazamiento hacia delante. se forzará la terminación de la consulta. por ejemplo) LSB Visual Basic . Sintaxis MiRecordset. Para establecer el índice actual puede usar la propiedad Index. el registro actual no varía. Si Recordset hace referencia a un objeto Recordset de tipo tabla o a un objeto Table. utilice el método Move. se producirá un error y BOF continuará con el valor True. la posición se desplaza hacia adelante (hacia el final del archivo).{MoveFirst | MoveLast | MoveNext | MovePrevious} Puede utilizar los métodos Move para desplazarse de un registro a otro sin aplicar una condición.Move filas[. se establecerá en BOF el valor True y no habrá registro actual. se producirá un error y EOF continuará con el valor True. Para desplazar la posición del registro actual en un objeto Recordset un número de registros determinado hacia adelante o hacia atrás. Si el conjunto no contiene ningún registro. Move comenzará por el registro actual. Si no establece un índice actual. el movimiento se hará según el índice actual de la tabla. Si utiliza de nuevo MoveNext. Si utiliza de nuevo MovePrevious. el orden de los registros devueltos no estará definido. Si utiliza MoveLast en un objeto Recordset basado en una consulta SQL o QueryDef. Si el primer o el último registro ya es el actual al utilizar MoveFirst o MoveLast. Si utiliza MovePrevious cuando el registro actual sea el primero. Si se especifica inicio. la posición se desplaza hacia atrás (hacia el principio del archivo). El marcador que debe utilizarse para definir el registro Inicio debe ser un Bookmark o similar (LastModified. Método Move Desplaza la posición del registro actual en un objeto Recordset. inicio] Donde : filas es un valor de tipo Long con signo que especifica el número de filas (de registros) que se desplaza la posición. poblando completamente el objeto Recordset. el primer registro pasa a ser el registro actual y en la propiedad BOF se establece False. Si utiliza MoveNext cuando el registro actual sea el último. Si es menor que 0. Si filas es mayor que 0. en la propiedad EOF se establecerá True y no habrá registro actual. el desplazamiento será relativo al marcador indicado.Guía del Estudiante Capítulo 12 Página 34 . Inicio (opcional) es un valor de tipo String que identifica un marcador.Sintaxis MiRecordset. Si se omite. Al abrir el conjunto de registros indicado en Recordset.

La propiedad NoMatch tomará en este caso el valor False. la operación forzará la ejecución de la consulta en el número de filas especificado. FindLast. Si el objeto Recordset está basado en una consulta. Si se especifica una posición posterior al último registro. Si Recordset contiene más de un registro que satisfaga el criterio. que satisfaga el criterio especificado y lo convierte en el registro actual. NoMatch se establece a False. FindNext el siguiente y así sucesivamente. Aquí las instrucciones adecuadas End If No es posible utilizar estos métodos en un objeto Recordset de tipo snapshot de desplazamiento hacia delante. Si las propiedades BOF o EOF tienen el valor True y se intenta usar el método Move sin un marcador válido. el puntero de registro actual se situará en el primer registro del objeto Recordset y se establecerá en la propiedad NoMatch el valor True. Si no se encuentra ningún registro que satisfaga el criterio.Bookmark = Estabaaqui Else . el siguiente o el anterior registro de un objeto Recordset de tipo instantánea u hoja de respuestas dinámica. NoMatch se establece a True y el registro actual pasa a ser el primero del objeto Recordset. FindFirst hallará el primero de ellos. Si el objeto Recordset no contiene registros y el valor de su propiedad BOF es True. Visual Basic . FindNext.Guía del Estudiante Capítulo 12 Página 35 LSB . FindPrevious Estos métodos no se pueden aplicar a un recordset tipo Tabla Buscan el primer. Criterio es una expresión de cadena (como la cláusula WHERE de una instrucción SQL. vuelve al que era el ‘registro actual.NoMatch = True Then Recordset. Si ha fracasado. 'Si no se ha encontrado ' Si no se ha encontrado. Métodos FindFirst. la posición del registro actual se situará al principio del archivo (BOF). Compruebe siempre el valor de la propiedad NoMatch para determinar si la operación de búsqueda ha tenido éxito. . Si la búsqueda ha tenido éxito.. la posición del registro actual se situará al final del archivo (EOF). Sintaxis MiRecordset. el último.Bookmark Recordset. se generará un error interceptable. Lo mismo ocurrirá si el valor de la propiedad EOF es True y pretende desplazarse hacia adelante. sin la palabra WHERE) que se utiliza para buscar un registro.Si se especifica una posición anterior al primer registro. el uso de este método para desplazarse hacia atrás producirá un error interceptable en tiempo de ejecución. Por ejemplo: Dim Estabaaqui as String Estabaaqui = Recordset. If Recordset.FindFirst "Nombre = 'Luis' " ' Busca un nombre. Recuerde siempre las comillas dobles para la expresión de búsqueda y las comillas simples si se trata de un dato string. ' Sí se ha encontrado.{FindFirst | FindLast | FindNext | FindPrevious} criterio MiRecordset es el nombre de un objeto Recordset.

Observe lo dicho mas atrás para las comillas dobles en la expresión de búsqueda.Seek comparación. Todo índice tiene un nombre. Recuerde el ejemplo: Set MiIndice2 = MiTabla2. Sólo funciona en espacios de trabajo Microsoft Jet. clave2.clave13 Donde MiRecordset es un recordset de tipo Table que tiene definido un índice en el campo por el que se va a realizar la búsqueda. clave1. Si lo hubiésemos creado directamente en Access.Index = "IndicePelículas" A partir de ahora. <=. aparte de ponerlas en americano. =. Método Seek Este método solo se puede usar con recordsets tipo Tabla Si no podemos usar los métodos Find en un recordset tipo Tabla.. el nombre que le pone por defecto es el mismo que el nombre del campo. Por ejemplo. ese índice será el Indice activo. Una vez que se lo indiquemos. Si hubiese mas de un registro con ese valor. >. el campo (o campos) de ese índice será sobre el que realizaremos la búsqueda mediante Seek.. comparación Es una de esta expresiones de cadena: <. >=. clave1.Guía del Estudiante Capítulo 12 Página 36 . Como podemos tener varios índices en una tabla.7 En este caso habíamos creado el índice mediante código y hemos podido controlar su nombre. el registro actual será el primero que cumpla esa condición LSB Visual Basic . incluso cuando no utilice la versión para este país del motor de base de datos Jet. Sintaxis MiRecordset. "00000012" Ese registro será ahora el registro actual. Habíamos visto cuando creábamos un índice que debía tener un nombre. Puede utilizar la función Format para convertir la fecha. Por ejemplo: Mirecordset. hay que presentarlas entre almohadillas (#).. Ese nombre del índice es el que debemos usar para crear el índice activo.Al buscar campos que contengan fechas.Seek "=". clave2. deberemos indicarle cual es el índice de búsqueda. Antes de usar Seek se debe establecer el índice activo. si quisiéramos que el índice activo fuese el IndicePeliculas lo haríamos índice activo mediante la siguiente instrucción: MiRecordset.CreateIndex("IndicePeliculas") Puede ver el nombre de ese índice en la Fig. Puede utilizar un argumento de hasta 13 claves. pues de lo contrario es posible que no se encuentren los datos buscados. Para encontrar el registro que tenga por valor 00000012 usaremos la expresión MiRecordset. 20. ¿Qué podemos hacer para buscar un dato en un recordset de este tipo? Usar el método Seek El método Seek busca el primer registro de un objeto Recordset indexado de tipo Table que cumple el criterio especificado para el índice activo y lo convierte en el registro activo.FindFirst "fecha > #" & Format(mifecha. deberá utilizar el formato de fecha de los Estados Unidos (mes-día-año).clave13 Son uno o más valores que corresponden a los campos en el índice activo del objeto Recordset.. "mm/dd/yyyy" ) & "#" Observe que las fechas.

"00000012" Pero observe ahora que el 0000012 no es un número. convierte ese registro en activo y la propiedad NoMatch se establece en False. no podrá usar el operador de igual (=) en la comparación. etc. En el ejemplo siguiente se toman los nombres de las calles y otros datos de una tabla llamada Calles_Nombre. la propiedad NoMatch se establece en True y el registro activo es indefinido. Eso sí.En el ejemplo hemos utilizado el comparador = para buscar un registro cuyo valor en el campo indicado por el índice activo sea igual al indicado en el siguiente parámetro (00000012).Seek ">=". Si el método Seek no consigue localizar ninguna coincidencia. el operador de igual sólo funcionará correctamente si tiene un registro que sea Null en su totalidad. excepto la clave que está buscando. El procedimiento BBuscaCalle_Click busca la primera calle cuyo nombre coincida con las letras tecleadas en el TextBox TBBuscaCalle Set BaseDatos = OpenDatabase("C:\Callejero\Calles.mdb") Set RsCalles = BaseDatos. debe compararlo con un valor del mismo tipo.Seek ">". Seek empezará al principio del índice y buscará hacia adelante. Esto se debe a que algunos de los campos de criterio(clave2.mayor o igual (>=) o mayor que (>). y donde podamos llegar con nuestra imaginación. Si comparación es igual (=). etc. Es aconsejable usar el operador mayor que o igual en su lugar. En tal caso. TBBuscaCalle If RsCalles. para trabajarlo con código durante una parte de la ejecución del programa. si el contenido del campo es numérico. Las ocasiones en las que es necesario hacer esto pueden ser variadas. cuyo campo NombreVia esta indexado. si el campo es texto. Seek puede comparar el contenido de un campo numérico. deberemos pasarle un dato tipo texto. Seek empezará al final del índice y buscará hacia atrás.. de un campo Fecha/Hora. Debe especificar valores para todos los campos definidos en el índice. es decir. a menos que haya entradas de índice duplicadas al final. dbOpenTable) Private Sub BBuscaCalle_Click() RsCalles.OpenRecordset("Calles_Nombre". LSB Visual Basic . Si utiliza Seek con un índice de múltiples columnas y no especifica un valor de comparación para cada campo del índice. . No se preocupe.. etc) estarán predeterminados en Null. de un campo texto. El índice tiene el mismo nombre que el campo porque se creó directamente con Access.Index = "NombreVia" RsCalles. es una cadena de caracteres.NoMatch = False Then TBNombreCalle = RsCalles!nombrevia Else TBNombreCalle = "No se encontró la calle" End If End Sub Método Clone En muchas ocasiones es necesario crear un Recordset que sea copia exacta de otro. lo que posiblemente no concordará. Cuando lo encuentra. El método Seek busca en los campos clave especificados y localiza el primer registro que cumpla el criterio especificado por comparación y clave1.Guía del Estudiante Capítulo 12 Página 37 . Si quisiésemos encontrar un registro cuyo valor sea superior a 00000012 usaríamos la expresión MiRecordset. clave3. Si comparación es menor que (<) o mayor o igual que (<=). pero vamos a destacar una : crear un Recordset idéntico al Recordset de un control Data. Otras aplicaciones pueden ser copiar el Recordset de otra máquina a través de la Red de Area Local. en el parámetro Clave1 deberemos pasarle un campo numérico. Por tanto. Seek empezará en una entrada cualquiera entre las entradas duplicadas existentes al final del índice.

Puede modificar un registro desde cualquier Recordset. Cada uno de ellos puede tener su propio registro actual. Este método debe usarse cada vez que se sospeche que los datos de la Base de datos han cambiado. Transacciones Métodos BeginTrans. deben estudiarse conjuntamente. Este método es más rápido y eficiente que crear un nuevo Recordset. o establecer su propiedad Bookmark El hecho de cerrar el Recordset original no afecta al duplicado y viceversa. dadas sus funciones. y se quieran presentar los datos actualizados.Requery [NuevoQueryDef] Donde NombreRecordset es el nombre del Recordset.Clone Donde Duplicado es una variable tipo Recordset.Guía del Estudiante Capítulo 12 Página 38 . puede utilizar cualquiera de los métodos Move. Método Requery El método Requery actualiza los datos de un objeto Recordset. Find o Seek (solo para Recordsets tipo Tabla). y Original es el Recordset que se va a duplicar. bien desde cualquiera de sus copias. Inicialmente. Puede utilizar el método Clone cuando desee realizar en un conjunto de registros una operación que requiera varios registros actuales. la consulta no habrá devuelto ningún registro y el objeto Recordset no contendrá datos. bien desde el que sirvió de original. ni tampoco en los objetos Recordset de tipo Tabla. volviendo a ejecutar la consulta con la que se ha creado ese Recordset. pero debe hacerlo invocando los métodos Edit . y NuevoQueryDef (opcional) es una consulta almacenada No es posible utilizar el método Requery en objetos Recordset tipo Snapshot o en los Dynaset que tengan la propiedad Restartable a False. Con el método Clone puede crear múltiples Recordsets. Puede compartir marcadores entre dos o más Recordsets creados de esta forma. Es un método típico de una BD que se está usando desde varios puestos a través de una Red de Area Local.La sintaxis de Clone es la siguiente : Sintaxis Set Duplicado = Original. un Recordset creado con Clone carece de registro actual. Para hacer que un registro sea el actual antes de utilizar el Recordset copia. Si los valores de las propiedades BOF y EOF del objeto Recordset son ambos True después de utilizar el método Requery. Nota No es posible utilizar este método con snapshots de desplazamiento hacia delante (objetos Recordset de tipo instantánea con la opción dbForwardOnly activada).Update. El uso de Clone no modifica los datos de los registros. LSB Visual Basic . Sintaxis NombreRecordset. CommitTrans y Rollback Estos métodos son métodos del Objeto Workspace Veamos estos tres métodos que.

quedando el Objeto Workspace afectado por las operaciones internas a esa transacción tal y como estaba antes de comenzar dicha operación. en la que le han sacado una cantidad de dinero. Quiere esto decir que una transacción debe iniciarse al comenzar una determinada operación. en el caso del ejemplo). que es una combinación de estos tres métodos. Pero que pasa si. el método Rollback deshará todas las operaciones en todos ellos. (Cuando se utilizan bases de datos SQL ODBC externas no es posible anidar las transacciones). aunque en el siguiente apunte se lo hayan vuelto a introducir. Sintaxis MiSesión. Si desea tener transacciones simultáneas. Pero no sé lo que pensaría el cliente cuando vea un estadillo de su cuenta. Con CommitTrans terminamos la transacción y se guardan los cambios realizados (En ambas cuentas a la vez. Si cierra una transacción anidada mediante CommitTrans. un determinado usuario deberá entrar con un Workspace propio (una sesión de trabajo solo para él). por la razón que sea (cuenta bloqueada. La operación es sencilla : Busca la cuenta origen y crea un nuevo registro.Supongamos un Banco. En estas condiciones podemos crear una transacción. Dado que una transacción pertenece a un Workspace. Y aquí comenzamos a ver la necesidad de crear Workspaces distintos para distintos usuarios.Rollback Dentro de un objeto Workspace. sumándole el importe de la transferencia. bien con CommitTrans o con Rollback. y su saldo no se verá afectado. menos el importe del dinero transferido. realizar esa operación sin realizar ninguna otra durante ese tiempo. Con Rollback se termina la transacción sin llegar a guardar los cambios. una vez sacado el dinero de la cuenta origen.CommitTrans MiSesión. No hay problemas. En este caso. en el campo IMPORTE apunta el valor del dinero a transferir. Debe hacer una transferencia entre dos cuentas corrientes que están en la misma base de datos. fallo de la red de área local) Obviamente la operación no se ha completado. Con el método BeginTrans iniciamos la Transacción.BeginTrans MiSesión. A continuación hace un proceso similar con la cuenta destino. las transacciones son siempre globales y no se limitan sólo a la base de datos o al conjunto de registros. los cambios de la primera transacción NO quedarán guardados. Veremos un poco más adelante como se crean los Workspaces. es decir. en un sistema con varios usuarios que están trabajando simultáneamente sobre una Base de Datos. y posteriormente cierra una transacción que abarque a esta última con Rollback. Si cierra un objeto Workspace sin guardar o deshacer las transacciones pendientes. éstas se desharán automáticamente. Para evitar estas situaciones usamos lo que se denomina una Transacción. Si realiza operaciones en más de una base de datos o conjunto de registros durante una transacción en un objeto Workspace. no se puede ingresar en la cuenta destino. LSB Visual Basic . y en el campo SALDO pone la diferencia entre lo que había en ese campo en la última operación. Apunta en el campo OPERACIÓN una T de Transferencia. y hay que devolver el dinero a la cuenta origen. Es posible tener hasta cinco niveles de transacciones abiertos a un tiempo en un mismo objeto Workspace utilizando múltiples combinaciones anidadas de BeginTrans y CommitTrans o Rollback. pero en este caso. Es decir. deberemos aplicar estos métodos al Workspace que ese usuario tenga abierto. Puede anidar transacciones. se deberá cerrar primero la transacción que esté mas interior dentro del anidamiento.Guía del Estudiante Capítulo 12 Página 39 . el orden de finalización de una transacción debe ser siempre de menor a mayor nivel jerárquico. metiendo la misma cantidad de dinero que se ha extraído anteriormente. terminar la operación y finalizar la transacción. no existe esa cuenta. y así sucesivamente. Podría hacerse un apunte. lo mas indicado es crear varios objetos Workspace para usar uno con cada transacción.

ya que los cambios a introducir se van almacenando en un búfer en la memoria. ahorra accesos al disco (Importantísimo en algunas redes LAN y WAN). LSB Visual Basic .Algunas bases de datos pueden no admitir las transacciones. Lea detenidamente la Ayuda de estos métodos antes de trabajar con ellos. En este caso la propiedad Transactions del objeto Database o Recordset tendrá el valor False. El hecho de usar transacciones. aparte de lo que significa para asegurar la integridad de los datos. y se vuelcan al disco solamente en el momento de terminar la transacción de modo afirmativo con CommitTrans.Guía del Estudiante Capítulo 12 Página 40 .

en orden ascendente de importancia práctica. Establece la contraseña utilizada para crear el Workspace predeterminado cuando se inicializa.e. la propiedad DefaultUser se establece a "administrador" y la propiedad DefaultPassword se establece a una cadena de longitud cero (""). habíamos usado solamente el Workspaces(0) que VB crea automáticamente. Vamos a ver alguna propiedad. El dbEngine. Establece o devuelve el número de segundos que se esperará antes de que se genere un error cuando se intenta conectar a una base de datos de ODBC. El DefaultPassword es un tipo de datos String que puede tener hasta 14 caracteres de longitud en bases de datos Microsoft Jet y cualquier longitud en conexiones ODBCDirect. Hasta ahora. debe establecerla antes de llamar a cualquier método DAO. Establece el nombre de usuario utilizado para crear el Workspace predeterminado cuando se inicializa. 20 segundos. El método para crear Workspaces es el CreateWorkspace. Propiedad IniPath. Propiedad LoginTimeout. La base de datos de sistema. Grupos de Usuarios. El método SetOption le permite sobrescribir los valores del Registro de Windows para el motor de base de datos Microsoft Jet.Guía del Estudiante Capítulo 12 Página 41 . Puede contener cualquier carácter excepto 0 ASCII. Devuelve la ubicación de la información de Registro de Windows de Microsoft Jet. El DefaultUser es un tipo de datos String. (Recuerde que cualquier operación indebida sobre el registro de Windows puede hacerle perder toda la información de su PC) LSB Visual Basic . Tiene como valor predeterminado. método del dbEngine. que puede tener entre 1 y 20 caracteres de longitud en espacios de trabajo Microsoft Jet y cualquier longitud en espacios de trabajo ODBCDirect. No olvide que el dbEngine es el motor de bases de datos Jet. Comencemos con una mirada a este objeto desde el punto de vista de DAO. Propiedad Version Devuelve la versión actual de DAO en uso. Workspaces.. De modo predeterminado. Vamos a entrar ahora en la creación de Usuarios (Users) y Workspaces.5" ) Propiedad DefaultType Establece o devuelve un valor que indica qué tipo de espacio de trabajo (Microsoft Jet u ODBCDirect) utilizará el próximo objeto Workspace que se cree. Para que estas propiedades tenga efecto. Grupos de Trabajo. Puede tomar los valores: dbUseJet dbUseODBC Crea objetos Workspace conectados al motor de base de datos Microsoft Jet. Acabamos de ver que es necesario poder crear Workspaces para cada usuario. Propiedad DefaultUser. inherente a la aplicación. Visión desde DAO El objeto dbEngine es el objeto de nivel más alto en el modelo de objeto DAO. Tiene como cualquier objeto DAO sus propiedades y métodos. Propiedad DefaultPassword. Es el encargado de contener y controlar todos los objetos DAO. Usuarios. Crea objetos Workspace conectados a un origen de datos ODBC. y no se pueden crear más. Hay un solo objeto dbEngine. El tipo de datos es String (p. y para no complicar el estudio de las bases de datos. "3.La protección de accesos a una base de datos Access.

Mdw") Con las siguientes instrucciones se crea un nuevo usuario Dim NuevoUser As User Set NuevoUser = Workspaces(0). En mi PC. lo crea automáticamente Visual Basic. con W98 y VB6. pero cuando pretende abrir una tabla.Clear For I = 0 To Workspaces(0). Identificador de Usuario.Users. no la visualiza. "MiContraseña") Workspaces(0). y con Access98 solamente encuentro System.La ayuda dice que el nombre predeterminado es System. Este archivo es una base de datos Access. Contraseña para el nuevo usuario.CreateUser (Nombre. Para crear un nuevo usuario deberemos suministrar la siguiente información: Nombre del usuario. contraseña) Donde User es la variable tipo objeto User que desea crear. e introduce sus datos en el archivo de información del grupo de trabajo (Base de Datos System. mediante la propiedad SystemDB DBEngine.Mdw o la especificada en la propiedad SystemDB) El método CreateUser corresponde al Workspace o al Objeto Group. debe indicar donde está la base de datos con la información del systema.Mdw) Creación de nuevos usuarios Método CreateUser (Sólo espacios de trabajo Microsoft Jet).Users(I). La contraseña puede tener hasta 14 caracteres de longitud y puede incluir cualquier carácter excepto el carácter ASCII 0 Esto merece algún comentario. (NOTA. Pero puede copiar esta base con otro nombre. Ese era el nombre para versiones antiguas del Motor Jet. aunque la abre como si se tratase de una base de datos ordinaria. "EsteesmiPID".Mdb a la que nos tiene acostumbrados Access) Access usa este fichero y lo guarda generalmente en C:\Windows\System.Append NuevoUser Podemos saber cuantos usuarios tiene el Workspaces(0) y su nombre.Name ListUsers.Users.1 NomUsuario = Workspaces(0).SystemDB = "C:\Windows\System\System. PID.CreateUser("Luis". que normalmente se llama System. Crea un nuevo Usuario. Lo único que tendrá que hacer es indicarle al dbEngine su nombre y ubicación mediante esta propiedad SystemDB En esa base de datos se guarda la información de los usuarios. pero de eso no nos vamos a ocupar por ahora) Lo normal es crear el nuevo usuario con el Workspaces(0) que como sabe. La sintaxis de CreateUser es: Set User = Objeto. . Nombre Nombre del nuevo usuario PID.Mdw (Observe que la extensión es distinta a la . Lógicamente no se puede leer con Access. El nuevo usuario debe crearlo un Workspace (o un Group.Mda.Propiedad SystemDB (Muy importante) Establece o devuelve la ruta de acceso del archivo de información del grupo de trabajo (sólo espacios de trabajo Microsoft Jet). Debe contener de 4 a 20 caracteres alfanuméricos Contraseñal. Se guarda su nombre y su contraseña.AddItem NomUsuario Next I LSB Visual Basic .Count . Con las siguientes instrucciones vamos a introducir los nombres de los usuarios en la lista ListUsers ListUsers. Debe declararse como User) Objeto El nombre del Workspace (o del objeto objeto Group) que quiere utilizar para crear el nuevo objeto User.Guía del Estudiante Capítulo 12 Página 42 . Recuerde que antes de crear un nuevo usuario. PID y contraseña. y colocarla en el directorio que quiera.

Nombre es el nombre del Workspace (P. "MiContraseña") DBEngine. que queda en la base de datos del sistema. Tipo) NuevoWorkSpace es el Workspace que queremos crear. Cuando salimos de la aplicación.Guía del Estudiante Capítulo 12 Página 43 . Si omite tipo.Creación de nuevos Workspaces. Tipo (Opcional). Puede tomar los valores dbUseJet para crear un espacio de trabajo Microsoft Jet. Recuerde que un Workspace es una sesión de trabajo. En las siguientes instrucciones podemos ver el código para listarlos en ListWS ListWS.AddItem NomWS Next I Debe tenerse en cuenta que el objeto Workspace es un objeto que solamente existe mientras está ejecutándose la aplicación. Fig. Contraseña La contraseña del Usuario propietario del Workspace.Name ListWS. No ocurre lo mismo con el Usuario.CreateWorkspace("SesiondeLuis". Usuario. y la contraseña de ese usuario. Es un ejemplo para explicar estos conceptos. Workspaces y DataBases. Método CreateWorkspace Podemos crear cuantos Workspaces necesitemos.9 Aspecto de la interface gráfica del ejercicio para crear Users y Workspaces LSB Visual Basic . Por eso. es este objeto el que debe crearlo. MiSesion) Usuario Nombre de un usuario registrado en la base de datos del sistema (Que lo habremos creado con CreateUser) que será el propietario del nuevo objeto Workspace.e. a la hora de crear un Workspace debemos indicarle para que usuario.Workspaces(I).Clear For I = 0 To DBEngine. ese Workspace desaparece. La sintaxis es la siguiente: Set NuevoWorkSpace = DBEngine.CreateWorkspace (Nombre. No tiene otra finalidad.. es decir.1 NomWS = DBEngine. Las partes de código expuestas se han sacado de un ejemplo creado para ver el número y nombre de los usuarios existentes. la propiedad DefaultType del objeto DBEngine determinará a qué tipo de origen de datos está conectado el Workspace No es necesario añadir el nuevo Workspace a la colección Workspaces Veamos un ejemplo de cómo crear un Workspace para el usuario Luis creado anteriormente: Dim NewWS as Workspace Set NewWS = DBEngine. "Luis".Workspaces. Contraseña. 20. o dbUseODBC para crear un espacio de trabajo ODBCDirect. que habremos declarado como variable tipo objeto Workspace. es un objeto persistente. Y una sesión de trabajo se abre para que trabaje un usuario.Append NewWS Podemos ver todos los Workspaces existentes.Workspaces. Como el objeto Workspace pertenece al dbEngine.Count . Indica el tipo de espacio de trabajo.

Visible = True BAnadirUser. TBNuevoUserPw) Workspaces(0).Visible = False LNuevoUserPID.Visible = True TBNuvoUsePID.Append NuevoUser TBNuevoUserName.Visible = False BBorrarUser.Visible = True BBorrarUser.Visible = False TBNuvoUsePID.Caption = "O.Visible = True LNUserName.Caption = "Añadir" TBNuvoUsePID.Visible = False LNuevoUserPw." Exit Sub End If If BAnadirUser.Visible = True LNuevoUserPID. I As Integer If BAnadirUser.Guía del Estudiante Capítulo 12 Página 44 .Visible = True LNuevoUserPw.Visible = False BAnadirUser.Visible = True BAnularUser.Caption = "Añadir" Then TBNuevoUserName." Then Dim NuevoUser As User Set NuevoUser = Workspaces(0).K.Visible = False TBNuevoUserPw.CreateUser(TBNuevoUserName.Left = 3480 BAnularUser.Visible = False LNUserName.Visible = False BAnularUser.Código de este ejercicio General/Declaraciones Option Explicit Dim VarDrag As String Dim NuevoWS() As Workspace Private Sub BAnadirUser_Click() On Error GoTo RutErr Dim NomUsuario As String. LSB Visual Basic .Visible = True TBNuevoUserPw.Caption = "O.K.Users.

Users. NomWS As String Set NuevoWS(NumWS) = DBEngine.ListUsers.Caption = "Añadir" TBNuevoWorkspace = "" TBNombreUser = "" TBNuevoWSPw = "" TBNuevoWorkspace.Name ListUsers.Guía del Estudiante Capítulo 12 Página 45 .1 NomUsuario = Workspaces(0).K.Visible = True TBNuevoWSPw.Visible = False LUserPw." Exit Sub End If If BAnadirWs.K.Append NuevoWS(NumWS) ListWS. TBNuevoWSPw) DBEngine.Visible = True BEliminarWs.Visible = False TBNombreUser.Name ListWS.Visible = True LNWSName.1 NomWS = DBEngine.Visible = False BAnadirUser.Visible = False LNWSName.Visible = False BAnularWS.Clear For I = 0 To Workspaces(0)." Then Dim NumWS As Integer NumWS = Workspaces.Workspaces.Clear For I = 0 To DBEngine. máximo 20 caracteres)" Exit Sub Else If Err > 0 Then MsgBox "Ha ocurrido el error " & Err & ".Visible = True LUserPw.Visible = True End If RutErr: If Err = 3029 Then LSB Visual Basic .CreateWorkspace(TBNuevoWorkspace.Visible = True End If RutErr: If Err = 3304 Then MsgBox "Debe introducir el PID (Mínimo 5 caracteres. TBNombreUser.Count .Visible = True LNombreUsuario.Visible = False LNombreUsuario.Visible = False TBNuevoWSPw.AddItem NomWS Next I BAnadirWs.Visible = False BEliminarWs.Workspaces.Count .Visible = True BAnularWS.Count ReDim Preserve NuevoWS(NumWS) Dim I As Integer.Visible = False BAnadirWs.Caption = "O.Caption = "Añadir" Then TBNuevoWorkspace.Left = 5520 BAnularWS.Workspaces(I).Visible = True TBNombreUser.Caption = "O.Users(I)." End If End Sub Private Sub BAnadirWs_Click() On Error GoTo RutErr If BAnadirWs.AddItem NomUsuario Next I BAnularUser.

" Then TBNuevoUserName.Visible = True End If If BEliminarWs.ListIndex = -1 End If End Sub Private Sub BAnularWS_Click() If BAnadirWs.Visible = True BAnadirUser.Visible = False TBNuevoUserPw." Then BAnadirWs.Visible = False TBNuvoUsePID.Caption = "Añadir" End If If BBorrarUser.Visible = True BAnularWS.Caption = "O.Text ListUsers.Name ListUsers.Enabled = False BAnadirUser.Visible = False LNuevoUserPID.Enabled = False BAnadirWs.Visible = False BBorrarUser.K.Visible = False BAnularUser.Visible = False LNUserName.Visible = False BEliminarWs.Enabled = True Then BEliminarWs.Guía del Estudiante Capítulo 12 Página 46 .Enabled = True Then BBorrarUser.Users.Visible = False TBNuevoWSPw.Caption = "O.Visible = False TBNombreUser.AddItem NomUsuario Next I BAnularUser.Users(I).Visible = False LNombreUsuario.Visible = False BAnadirUser.Delete ListUsers.Caption = "Añadir" TBNuevoWorkspace = "" TBNombreUser = "" TBNuevoWSPw = "" TBNuevoWorkspace.MsgBox "El Password usado no coincide con el de ese Usuario (User)" Exit Sub End If End Sub Private Sub BAnularUser_Click() If BAnadirUser.K. I As Integer Workspaces(0).Count .Visible = False ListUsers.Visible = False End If End Sub Private Sub BBorrarUser_Click() Dim NomUsuario As String.Visible = False LNWSName.Visible = True End Sub LSB Visual Basic .Clear For I = 0 To Workspaces(0).Users.Visible = False LUserPw.Visible = True BAnularUser.Visible = False BAnularWS.1 NomUsuario = Workspaces(0).Visible = False LNuevoUserPw.

8) If UCase(LineaEntr8) = "PROYCAPT" Then Me.AddItem NomWS Next I BEliminarWs.Users.1 NomWS = DBEngine. Vealo en Ver Ini" End If End Sub Private Sub ListUsers_Click() Visual Basic . NumWS As Integer For I = 0 To DBEngine.Name ListWS.Workspaces.Caption = Right(LineaEntr.Users(I).Count .1 NomUsuario = Workspaces(0).Clear For I = 0 To DBEngine. Len(LineaEntr) .Guía del Estudiante Capítulo 12 Página 47 LSB .AddItem NomUsuario Next I RutErr: If Err = 3028 Then MsgBox "No se puede abrir la base de datos del sistema.Count .Text Then NumWS = I Next I Workspaces(NumWS).Close ListWS. NomWS As String. Compruebe que su Path y nombre son correctos.AddItem NomUsuario Next I For I = 0 To DBEngine.Count .1 NomWS = DBEngine.1 NomUsuario = Workspaces(I).Workspaces(I).SystemDB = PathFichero For I = 0 To Workspaces(0).Workspaces. Len(LineaEntr) .Name If NomWS = ListWS.Visible = False BAnadirWs.Name ListUsers. NomUsuario As String Dim PathFichero As String Open App.Enabled = False BAnularWS. LineaEntr LineaEntr8 = "" LineaEntr8 = Left(LineaEntr.Path & "\Cap20Usr.INI".Path & "\Cap20Usr.9)) Loop Close #1 LBDSys = PathFichero TBTextINI = PathFichero DBEngine.exe " & App.Private Sub BEliminarWs_Click() Dim I As Integer.Count . vbNormalFocus End Sub Private Sub Form_Activate() On Error GoTo RutErr Dim LineaEntr As String Dim LineaEntr8 As String Dim I As Integer.9) If UCase(LineaEntr8) = "DBENGINI" Then PathFichero = Trim(Right(LineaEntr.Workspaces.Workspaces(I).INI" For Input As #1 Do Until EOF(1) Line Input #1.Name ListWS.Visible = True End Sub Private Sub BSalir_Click() End End Sub Private Sub BVerIni_Click() Shell "Notepad.

mdw (Deberá cambiar el Path del fichero System.Mdw de acuerdo a como lo tenga en su ordenador.INI que debe estar necesariamente en la misma carpeta que el programa.Visible = False BBorrarUser.Guía del Estudiante.Visible = True End Sub Private Sub ListWS_Click() BEliminarWs.Guía del Estudiante Capítulo 12 Página 48 .Text Text1.Visible = False BAnularWS. en el caso del PC del autor tiene esta forma REM Visual Basic .) LSB Visual Basic .Left = 4560 BAnularUser. Shift As Integer. Creación de Usuarios y WorkSpaces DBEngINI=C:\WinNT\System32\System.Enabled = True BAnularUser.Visible = True End Sub Private Sub Text1_MouseDown(Button As Integer.BAnadirUser. 20. Y As Single) If Shift = 1 And Button = 1 Then VarDrag = Text1. X As Single.Enabled = True BAnadirWs. Cap.Drag End If End Sub El fichero Cap20Usr.Left = 6600 BAnularWS.

El objeto DAO que debe hacer estas cosas es el Motor de Bases de Datos. BaseDatosNva [.1 del motor Jet Crea una base de datos que utiliza la versión 2. Este método también deberá reorganizar los índices y marcadores internos a esa BD.0 del motor Jet Crea una base de datos que utiliza la versión 1. BaseDatosNva es el nombre del fichero (con su Path completo) de la base de datos nueva. que hace una copia de la base de datos (no borra la BD original) sin copiar los datos inútiles. dbEncrypt dbDecrypt dbVersion10 dbVersion11 dbVersion25 dbVersion30 Codifica la base de datos durante la compactación. El parámetro a introducir es el mismo que para el argumento similar usado en la creación de la Base de Datos (dbLangGeneral para el caso de España).MDB". como por ejemplo "\\MISERVID\MIDIR\MiBase. esta va aumentando su tamaño. Descodifica la base de datos durante la compactación. inf_local es una expresión de cadena utilizada para especificar el alfabeto usado a la hora de ordenar datos de esa Base de Datos. sino marcándolo como borrado. la información local de BaseDatosNva será la misma que la de BaseDatosAnt.5 del motor Jet Crea una base de datos que utiliza la versión 3. que intenta (no siempre lo consigue) reparar los datos internos de una BD que presente datos corruptos (Se generan con bastante facilidad cuando apagamos el ordenador con la base abierta) Método CompactDatabase Copia.0 del motor Jet Se puede usar una constante (solamente) de encriptación y una (solamente) de Versión. el orden de intercalado y la codificación de una base de datos cerrada. verá que tras sucesivas operaciones de escritura / borrado en una BD.MDB) Si el nombre de archivo tiene extensión. Este argumento es opcional. Es decir. Sólo se puede compactar BaseDatosNva con una versión igual o posterior a la de BaseDatosAnt. Sintaxis DBEngine. Puede elegirse entre cifrarla o no cifrarla y cambiar la versión del motor de bases de datos que va a usar la nueva Base de Datos. Opciones nos permite cambiar alguna característica de la Base de Datos. y RepairDatabase. creada al copiar la BaseDatosAnt.Mantenimiento y Copia de Bases de Datos. Método RepairDatabase LSB Visual Basic . inf_local [. Vamos a ver dos métodos del Objeto DBEngine para el mantenimiento y copia de Bases de Datos ACCESS. Debe expresar el Path completo y el nombre del fichero (C :\MiCarpeta\MiBase. Crea una base de datos que utiliza la versión 1. Si se omite. ya compactada. Lea detenidamente la ayuda en línea de este Método.CompactDatabase BaseDatosAnt.Guía del Estudiante Capítulo 12 Página 49 . Se necesita un método que limpie todos los datos inservibles de la BD para disminuir su tamaño. el Objeto DBEngine. Si la red lo admite. No es posible especificar en el argumento BaseDatosNva el mismo archivo de base de datos que en BaseDatosAnt. cuando borramos un dato en realidad no lo estamos borrando. también puede especificar una ruta de red. En una Base de Datos ACCESS. deberá especificarla. Los métodos son CompactDatabase. (No intente recuperar un dato marcado y no borrado porque no se puede. opciones]] BaseDatosAnt es el nombre del fichero de la base de datos a compactar.) Por lo tanto. compacta y da la opción de modificar la versión.

Sugerencia Después de reparar una base de datos. Debido a que las consultas de acciones no devuelven registros. El método RepairDatabase también intenta validar todas las tablas del sistema y todos los índices. Paso a través de SQL. METODOS DEL OBJETO DataBase Método Execute Este Método es para el Objeto DataBase y para el Objeto QueryDef. se producirá un error. Genera un error en tiempo de ejecución si otro usuario modifica los datos que se están editando. cuyo Objeto DataBase se llama BaseDatos.MDB". si está en un entorno multiusuario. que los demás usuarios tampoco pueden tenerla abierta mientras la repara. Puede especificar una ruta de red. El método Execute sólo es válido para las consultas de acciones. Ejecuta una consulta de acciones o una instrucción SQL en el objeto Database especificado. Execute no devuelve un conjunto de registros.Guía del Estudiante Capítulo 12 Página 50 .Intenta reparar una base de datos dañada que accede al motor de base de datos Microsoft Jet. P. Ejemplo.Execute [opciones] Donde NombreQuerydef es el nombre del objeto QueryDef cuya propiedad SQL especifica la instrucción SQL a ejecutar. se introduce el nombre que queremos cambiar en TBNombre2 y el nuevo nombre en TBNombre1 LSB Visual Basic . Para poder “jugar” con el nombre a cambiar y el nombre cambiado. Si utiliza Execute con otro tipo de consultas. Si la base de datos no puede repararse. es aconsejable compactarla con el método CompactDatabase para desfragmentar el archivo y recuperar espacio en disco. Actualizaciones consistentes. Recuerde. En opciones puede utilizar las siguientes constantes: dbDenyWrite dbInconsistent dbConsistent dbSQLPassThrough dbFailOnError dbSeeChanges Deniega el permiso de escritura a los demás usuarios. (Predeterminado) Actualizaciones inconsistentes. usamos EXECUTE para cambiar el campo Nombre en una tabla llamada CLIENTES de una Base de Datos abierta. Opciones igual que para el Objeto Database. según se especifica mas adelante. se producirá un error interceptable. Hace que se pase la instrucción SQL a una base de datos ODBC para su procesamiento. Deshace las actualizaciones en caso de error. : "\\MISERVID\ MIDIR\NombreBase.RepairDatabase NombreBase Donde NombreBase es el nombre (Y path) del fichero que contiene la Base de Datos a reparar. Para un objeto QueryDef NombreQuerydef. Sintaxis DBEngine. Para poder reparar la base debe estar Cerrada. opciones] Donde NombreBD es el nombre del objeto DataBase Origen es una instrucción SQL Opciones es un entero o constante que determina las características de integridad de datos de la consulta.e. Sintaxis Para un objeto DataBase NombreBD.Execute origen[. En el siguiente ejemplo. Los datos que no puedan repararse se pierden.

actualizados o insertados al ejecutar una consulta de acciones. debemos usar un Control Data cuando vayamos a presentar una imagen. tenemos el problema resuelto. por ejemplo. bien mediante sus propiedades DatabaseName y RecordSource. La asociación de la Base de datos al Control Data puede hacerse. bien cambiando el registro actual del Control data.RecordsAffected MsgBox RegistrosCambiados Dada una instrucción SQL sintácticamente correcta y teniendo los permisos adecuados. Por ejemplo. Ambos son controles enlazados a datos. dbFailOnError RegistrosCambiados = BaseDatos. Al utilizar el método Execute para ejecutar un objeto Querydef. el método Execute no fallará. y guardar los datos en la BD.Dim RegistrosCambiados As Long Dim MiSQL As String MiSQL = "UPDATE CLIENTES SET NOMBRE = '" & TBNombre2 & "' WHERE NOMBRE= '" & TBNombre1 & "'" BaseDatos. y el campo que contiene el gráfico a el Control Picture (o Control Image) mediante sus propiedades DataSource = Nombre del Control data. Visual Basic . ¡¡ Imagine una aplicación que sea una agenda de teléfonos y pueda insertar la foto de la persona !! Para introducir una imagen en una BD. complicando el código. DataField = Nombre del Campo. De esta forma se guardarán los cambios en el disco y se liberarán los bloqueos que se hayan podido producir durante la ejecución de la consulta.Execute MiSQL. No merece la pena liarse con esto. bien creando un Recordset con código e igualando la propiedad Recordset del Control Data a ese Recordset. use luego el método Execute y complete la transacción con el método CommitTrans en el objeto Workspace. Para obtener el mejor rendimiento. asociamos el Control Data a la Base de Datos. RecordsAffected contienen el número de registros eliminados. aún cuando no pueda modificarse ni eliminarse una línea. en la propiedad RecordsAffected del Querydef se establece el número de registros afectados. bien mediante el método UpdateRecord de dicho Control Data. Lo mismo que decíamos que necesitamos un Control Data cuando vamos a usar un DBGrid. sin usar el control Data. el campo de esa BD donde se va a introducir la imagen debe ser LongBinary ( si esa versión de ACCESS lo tiene) u Objeto OLE. Eso sí. Si introducimos un Control Data y un Control Picture o Control Image en el Formulario. especialmente en un entorno multiusuario.Guía del Estudiante Capítulo 12 Página 51 LSB . Esta opción generará un error interceptable y deshará todos los cambios realizados con éxito cuando alguno de los registros afectados se encuentre bloqueado y no pueda actualizarse o eliminarse. IMÁGENES EN UNA BASE DE DATOS ACCESS Una imagen (la fotografía de una persona por ejemplo) puede guardarse en una base de datos tipo ACCESS y presentarse en un control Picture. puede anidar el método Execute dentro de una transacción: Utilice el método BeginTrans en el objeto Workspace actual. Para meter un gráfico en la BD basta con introducir ese gráfico en el Picture (o Image) mediante LoadPicture. Por lo tanto. puede utilizar la propiedad RecordsAffected del objeto Database o Querydef. Introducir y presentar un bit-map en una base de datos es necesario hacerlo mediante un Control Data. Propiedad RecordsAffected Para determinar el número de registros afectado por el último método Execute. Un bit-map puede presentarse en un control Picture o en un control Image. debe especificar siempre la opción dbFailOnError cuando utilice el método Execute para ejecutar una consulta de actualización o eliminación. Es posible que se pueda introducir y presentar un bit-map en un control Picture o Image de otra forma.

Guía del Estudiante Capítulo 12 Página 52 .LSB Visual Basic .