Está en la página 1de 27

VISUAL BASIC: ACCESO A DATOS

Casi todas las aplicaciones necesitan algn tipo de almacenamiento y manipulacin de datos, y Visual Basic proporciona varias herramientas para satisfacer estas necesidades, incluyendo el control Data, los controles enlazados a datos, el objeto DBGrid, etc. 1. El control Data 2. Cuadros de lista y Cuadros combinados enlazados a datos 3. El contro DBGrid 4. Manipulacin de datos con cdigo 5. Control de transacciones 6. Procesamiento de archivos Aplicaciones de ejemplo: Biblio.vbp y Visdata.exe Muchos de los ejemplos estn tomados de la aplicacin de base datos de ejemplo Biblio.vbp. Encontrar esta aplicacin en el subdirectorio \Biblio del directorio de ejemplos de Visual Basic. La base de datos de ejemplo Biblio.mdb que se utiliza en este ejemplo se encuentra en el directorio principal de Visual Basic (\Vb). Esta base de datos tambin sirve como bibliografa de libros actuales sobre bases de datos. Visual Basic incluye Visdata (Visdata.exe), una aplicacin de ejemplo que le permite crear y modificar bases de datos que puede utilizar con el control Data. Visdata se suministra con el cdigo de origen completo e ilustra todas las funciones de acceso a datos disponibles. Por esta razn es una fuente de ideas excelente, as como de ejemplos de cdigo para "cortar y pegar". Puede tener acceso a Visdata a travs del men Complementos. Encontrar esta aplicacin en el subdirectorio \Visdata del directorio de ejemplos de Visual Basic. Para tener acceso a la Ayuda para Visdata, ejecute Visdata.exe y presione F1. 1. El control Data Puede utilizar el control Data para crear aplicaciones que presentan, modifican y actualizan informacin de muchos de los tipos existentes de bases de datos, incluyendo Access. Tambin puede utilizarlo para tener acceso a Excel y archivos de texto ASCII estndar como si fueran autnticas bases de datos. Adems, el control Data le permite tener acceso y manipular bases de datos remotas de Open Database Connectivity (ODBC, Conectividad abierta de bases de datos), como SQL Server y Oracle. El control Data implementa el acceso a datos mediante el motor de base de datos Microsoft Jet, el mismo que hace funcionar a Access. Esta tecnologa le proporciona acceso transparente a muchos formatos estndar de bases de datos y le permite crear aplicaciones relacionadas con datos sin escribir cdigo. Qu puede hacer con el control Data Puede usar el control Data para crear aplicaciones sencillas de bases de datos sin escribir cdigo. Tambin puede utilizarlo junto con cdigo de Visual Basic para crear aplicaciones con todas las funciones que le dan un alto grado de control de programacin sobre el comportamiento de los datos de su aplicacin. Este tema presenta un planteamiento sencillo sin cdigo. Los siguientes temas presentarn ejemplos de programacin ms complejos. El control Data puede llevar a cabo las siguientes tareas sin utilizar cdigo: Conectar con una base de datos local o remota. Abrir una tabla de base de datos especfica o definir un conjunto de registros en base a una consulta SQL de las tablas de esa base de datos. Pasar campos de datos a controles enlazados, donde puede ver o cambiar los valores. Agregar registros nuevos o actualizar una base de datos en base a los cambios que realiza a los datos mostrados en los controles enlazados. Interceptar los errores que se producen cuando se tiene acceso a los datos. Cerrar la base de datos. Para crear una aplicacin de base de datos, agregue el control Data a sus formularios de la misma manera que lo hara con cualquier otro control de Visual Basic. Puede tener tantos controles de datos en el
1

formulario como necesite. Como regla general, usar un control de datos por cada tabla de base de datos que necesite manipular: 1 Agregue el control Data a un formulario. 2 Establezca sus propiedades para indicar la base de datos y la tabla desde la que desea obtener informacin. 3 Agregue controles enlazados (como cuadros de texto, cuadros de lista y otros controles que se "enlazan" al control de datos). 4 Establezca las propiedades de los controles enlazados para indicar el origen de datos y el campo de datos que se va a mostrar. Cuando ejecute la aplicacin, estos controles enlazados mostrarn automticamente los campos del registro actual de la base de datos. Propiedades del control Data Como todos los controles de Visual Basic, el control Data tiene algunas propiedades que se deben establecer en la ventana Propiedades en tiempo de diseo. Muchas de estas propiedades tambin se pueden establecer en tiempo de ejecucin en el cdigo de Visual Basic. Para usar el control Data, debe establecer como mnimo las propiedades DatabaseName y RecordSource. Cuando haya establecido la propiedad DatabaseName, Visual Basic recuperar los nombres de todas las tablas y las consultas disponibles en la base de datos y los mostrar en la lista desplegable para la propiedad RecordSource. Si desea abrir una base de datos externa (Excel, texto u ODBC), tambin debe establecer la propiedad Connect en la ventana Propiedades. Una vez que haya elegido una tabla o una consulta de la lista, podr usar la ventana Propiedades para seleccionar un valor vlido para la propiedad DataField de cada uno de los controles enlazados. Tambin puede establecer o cambiar en tiempo de ejecucin las propiedades de los controles enlazados y del control Data. Cuando estn establecidas las propiedades correctas, puede usar el mtodo Refresh del control Data para volver a abrir la base de datos (si es necesario) y volver a crear el conjunto de registros con los nuevos valores de las propiedades. Creacin de una aplicacin simple de base de datos El siguiente procedimiento le ofrece una breve introduccin sobre cmo usar el control Data en una aplicacin de Visual Basic. El ejemplo usa la base de datos Biblio.mdb suministrada con Visual Basic.
1 Seleccione el control Data en el cuadro de herramientas y dibuje un control de datos en un formulario.

El botn de control de datos tiene esta apariencia:

Despus de dibujar el control en el formulario y ajustar su tamao correcto, aparecer el ttulo como se muestra. El nombre predeterminado del control es Data1.

2 En la ventana Propiedades, establezca la propiedad Connect al tipo de base de datos que desee usar.

3 En la ventana Propiedades, establezca la propiedad DatabaseName al nombre del archivo o del directorio

de la base de datos con la que se quiere conectar. Si su base de datos no est disponible en tiempo de diseo, necesitar rellenar las propiedades DatabaseName y RecordSource en tiempo de ejecucin. Este ejemplo usa la base de datos Biblio.mdb.

4 Establezca la propiedad RecordSource al nombre de la tabla de base de datos a la que quiere tener

acceso.Si la base de datos est disponible actualmente, puede seleccionar una tabla de la lista desplegable en la ventana Propiedades. Si no se puede encontrar su base de datos, esta no aparecer en el cuadro RecordSource y se mostrar un mensaje de error. Este ejemplo usa la tabla Titles.

5 Dibuje un cuadro de texto en el formulario para mostrar la informacin de la base de datos.

Este control se utilizar para mostrar y modificar un campo seleccionado de la base de datos. Tambin puede usar otros controles enlazados a datos, incluyendo casillas de verificacin, cuadros de imagen, etiquetas, cuadros de lista, cuadros combinados y controles de cuadrcula.

6 En la ventana Propiedades, establezca la propiedad DataSource para Text1 al nombre del control Data

(Data1). Esto enlaza el cuadro de texto al control de datos.

7 Agregue una etiqueta y establezca su propiedad Caption al nombre del campo de la base de datos que

expondr este cuadro de texto.

8 Establezca la propiedad DataField para Text1 al nombre del campo en la tabla de base de datos que quiere

ver o modificar. Este ejemplo usa el campo Title de la tabla Titles.

9 Repita los pasos 5, 6, 7 y 8 para cada campo adicional al que quiera tener acceso. En el siguiente ejemplo

se han seleccionado los campos Title, ISBN y Year Publisher de la tabla Titles.

10 Ahora ejecute la aplicacin. Puede usar los cuatro botones de direccin del control Data para ir al

principio de los datos, al final de los mismos o de registro en registro a travs de los datos. Puede modificar la informacin de la base de datos si cambia el valor que se muestra en cualquiera de los controles enlazados. Cuando haga clic en un botn del control Data para ir a un registro nuevo, Visual Basic guardar automticamente todos los cambios que haya realizado a los datos. Por supuesto, puede agregar cdigo a su aplicacin para mejorarla. El resto de este captulo muestra cmo usar el control Data con controles enlazados para manipular datos, examinar la estructura de la base de datos y escribir procedimientos de evento que controlen los eventos que tienen lugar cuando se tiene acceso a los datos o se actualizan. Descripcin del diseo y la estructura de las bases de datos El control Data proporciona una interfaz relacional con los archivos de las bases de datos. Bsicamente, una base de datos relacional es aquella que almacena datos de tablas, compuestas por columnas y filas de datos. En Visual Basic las columnas se llaman campos y las filas se llaman registros. El motor de base de datos Microsoft Jet que hace funcionar al control de datos ve todas las bases de datos como un conjunto de tablas relacionales, cualquiera que sea su formato fsico de archivo. Esto significa que, cuando se usan datos de una base de datos externa (como FoxPro,,,, Microsoft Excel,, texto u ODBC), se pueden usar los mismos trminos relacionales.

Tablas: Una tabla es una agrupacin lgica de informacin organizada en columnas y filas, similar a una tabla de hoja de clculo. Por ejemplo, una tabla podra contener una lista de informacin sobre autores, como sus nombres, fechas de nacimiento, direcciones y fotografas. Campos: Cada columna de una tabla de base de datos se llama campo. Las tablas estn definidas por los campos que contienen y cada campo describe los datos que va a contener. Al crear una base de datos se asignan a cada campo el tipo de datos, la longitud mxima y otros atributos. Los campos pueden contener caracteres, nmeros o incluso grficos. Por ejemplo, la tabla Authors podra tener campos con el nombre y la direccin como el tipo de datos carcter, la fecha de nacimiento como el tipo de datos fecha y la fotografa del autor como el tipo de datos grfico. Registros: La informacin individual acerca de los autores se guarda en las filas de la tabla, llamadas registros. Por lo general, los registros de las tablas de bases de datos se crean de manera que no haya dos filas iguales. Es decir, no tendra dos autores con el mismo apellido en la misma direccin y con la misma fecha de nacimiento. ndices: Para que el acceso a los datos sea ms rpido, la mayora de las bases de datos usan ndices. Los ndices de las tablas de bases de datos son listas ordenadas en las que es ms rpido buscar que en las tablas. Cada entrada del ndice indica la fila de la base de datos a la que hace referencia. Si la base de datos (que es la que se encarga de todas las bsquedas) puede examinar un ndice cuando empieza a buscar registros (llevar a cabo una consulta), su trabajo se facilita y los datos se devuelven ms rpidamente. Cuando usa conjuntos de registros de tipo table con el control Data, el ndice principal de la tabla se utiliza para acelerar la recuperacin. Lenguaje de consulta estructurado (SQL) Cuando se almacenan los datos en la base de datos, es ms fcil recuperarlos mediante un lenguaje parecido al ingls llamado SQL. SQL se ha convertido en el medio ms generalizado para "conversar" con una base de datos. Bsicamente, el usuario plantea preguntas en lenguaje SQL; esta pregunta se llama una consulta. El motor de la base de datos "contesta" devolviendo todas las filas de la base de datos que cumplen con los requisitos de la consulta. La consulta normalmente contiene los nombres de las tablas en las que tiene que buscar, los nombres de las columnas que tiene que devolver y otras informaciones que establecen el alcance de la bsqueda. Por ejemplo, una consulta SQL en nuestra tabla Authors podra tener esta apariencia: "Select Name, Picture from Authors where Date_of_Birth = #2/7/1947# " Esta consulta SQL devolvera el nombre y la fotografa de todos los autores cuya fecha de nacimiento fuera el 7 de febrero de 1.947. Si devolviera alguna fila, podra usar controles enlazados para ver los valores. Puesto que muchas de las bases externas que Visual Basic reconoce no tienen un diseo relacional, Visual Basic necesita convertir las estructuras de las bases de datos externas a un modelo relacional. Su cdigo no tendr que proporcionar ninguna lgica especfica para permitir esta traduccin; una vez que se ha abierto la base de datos, todo esto se hace automticamente. Para comprender mejor el diseo y la estructura de una base de datos, puede ejecutar la aplicacin Visdata (en el men Complementos) para examinar la estructura de bases de datos existentes y experimentar creando la suya propia.. Nota La base de datos de ejemplo Biblio.mdb, se compone de una lista de libros que explican el modelo de bases de datos relacionales. Puede estudiar esta lista para encontrar ttulos adicionales sobre el diseo, creacin y ajuste de las bases de datos relacionales y el uso de SQL para tener acceso a ellas. Esta base de datos se encuentra en el directorio principal de Visual Basic (\Vb). Descripcin de los conjuntos de resultados Visual Basic recupera y muestra registros de bases de datos mediante el objeto Recordset proporcionado por el motor de base de datos Microsoft Jet. Un objeto Recordset representa los registros de una tabla de base o los registros que resultan de ejecutar una consulta. La siguiente tabla muestra los tres tipos de objetos Recordset disponibles en el control Data. Tipo de Recordset Recordset de tipo table Descripcin (dbOpenTable) Un conjunto de registros que representa una nica tabla de
5

Recordset de tipo dynaset

Recordset de tipo snapshot

base de datos que puede utilizar para agregar, cambiar o eliminar registros. (dbOpenDynaset) Un conjunto de registros dinmico que representa una tabla de base de datos o los resultados de una consulta que contiene campos de una o ms tablas. Puede agregar, cambiar o eliminar registros de un objeto Recordset de tipo dynaset y los cambios se reflejarn en las tablas subyacentes. (dbOpenSnapshot) Una copia esttica de un conjunto de registros que puede usar para encontrar datos o generar informes. Un objeto Recordset de tipo snapshot puede contener campos de una o ms tablas de una base de datos, pero no se puede actualizar.

Mediante la propiedad RecordsetType puede elegir el tipo de objeto Recordset que quiera que cree el control Data. El valor predeterminado es vbDynasetType. Los objetos Recordset de tipo dynaset y snapshot se almacenan en la memoria local. Si no necesita que su aplicacin seleccione campos de ms de una tabla y est trabajando con un origen que no sea ODBC, el objeto Recordset de tipo table puede ser el ms eficaz en cuanto a velocidad y uso de memoria y de espacio de disco en el disco temporal local. Los objetos Recordset creados desde el cdigo (no disponibles en la Edicin de aprendizaje de Visual Basic) se pueden asignar a la propiedad Recordset del control Data, mediante la instruccin Set: Set Data1.Recordset = MiRecordset De manera parecida, un objeto Recordset creado por un control de datos se puede asignar a otro control de datos en tiempo de ejecucin. El motor de base de datos Jet proporciona un gran nmero de mtodos y propiedades de bases de datos y conjuntos de registros. Puede usar directamente estas propiedades y mtodos con el control Data, haciendo referencia a las propiedades Database y Recordset del control Data. Uso de los controles enlazados Los controles enlazados a datos son los controles de datos a travs de los cuales se tiene acceso a la informacin de una base de datos. Cuando un control est enlazado al control de datos, Visual Basic aplica a ese control valores de campo del registro actual de la base de datos. A su vez, el control le muestra los datos y acepta sus cambios. Si cambia datos en un control enlazado, esos cambios se pueden escribir automticamente en la base de datos cuando se desplace a otro registro. Visual Basic admite varios controles integrados que puede enlazar al control de datos. En las ediciones Profesional y Empresarial de Visual Basic hay disponibles otros controles de datos de terceros. Para ver una explicacin completa de los controles enlazados, consulte "Uso del cuadro de lista y el cuadro combinado enlazados a datos", ms adelante en este mismo captulo. Esta seccin utiliza el cuadro de texto para ilustrar los principios bsicos del uso de controles enlazados. La mayora de los controles enlazados se caracterizan por tres propiedades relacionadas con datos: DataChanged, DataField y DataSource. Propiedad DataChanged DataField DataSource Descripcin Indica si un valor que se muestra en un control enlazado ha cambiado. Especifica el nombre de un campo del conjunto de registros creado por el control Data. Especifica el nombre del control Data al que se enlaza el control.

Los pasos para agregar controles enlazados a su aplicacin son los siguientes: 1. Dibujar el control enlazado en el mismo formulario que el control Data al que se enlazar. 2. Establecer la propiedad DataSource para especificar el control Data al que se enlazar. 3. Establecer la propiedad DataField a un campo vlido en el conjunto de registros del control Data. Si la base de datos est disponible en tiempo de diseo, aparecer una lista de campos vlidos en el cuadro Valores de DataField en la ventana Propiedades. Si la base de datos no est disponible en tiempo de diseo,
6

necesitar proporcionar un nombre de campo vlido en tiempo de ejecucin antes de que los valores de los datos se enven al control desde la base de datos. Puede tener ms de un control enlazado para un campo en particular, pero no necesita proporcionar un control enlazado para cada campo de la tabla. Ni el control Data ni los controles enlazados necesitan ser visibles, por lo que puede incorporar capacidades de acceso a datos a cualquier formulario que disee si manipula el control Data con el cdigo de Visual Basic. Cuando ejecute su aplicacin, el control Data funcionar junto con base de datos para proporcionarle acceso al conjunto de registros actual, o recordset, con el que est trabajando. Mediante los botones de direccin del control Data puede ir de registro en registro y con los controles enlazados puede ver o modificar los datos de cada campo. Siempre que hace clic en un botn del control Data, Visual Basic actualiza automticamente los cambios que ha realizado al conjunto de registros. Con el cdigo de Visual Basic tambin es posible usar controles enlazados a datos sin enlazarlos a un control de datos, usando para ello la coleccin DataBindings del control dependiente. Tipos de controles enlazados Visual Basic admite varios controles integrados (intrnsecos) que puede enlazar al control de datos, as como varios controles ActiveX (.ocx) enlazados a datos (anteriormente llamados controles personalizados o controles OLE). Controles intrnsecos: Los controles enlazados estndar que puede usar con el control Data son los siguientes: Casilla de verificacin Imagen Etiqueta Cuadro de imagen Cuadro de texto Cuadro de lista Cuadro combinado Control contenedor OLE Controles ActiveX: Adems de los controles enlazados intrnsecos, Visual Basic tambin proporciona los siguientes controles ActiveX que se pueden agregar a su proyecto: Cuadro de lista enlazado a datos Cuadro combinado enlazado a datos MSFlexGrid Apex Data-Bound Grid (DBGrid) MaskedEdit Para interfaces complejas, varios de estos controles ActiveX proporcionan funcionalidad adicional que le permite ver grupos enteros de registros, como listas, tablas o conjuntos de registros. Estos incluyen los controles de cuadro de lista, cuadro combinado y MSFlexGrid. Adems, hay tres controles especiales que le permiten llevar a cabo tareas complejas de presentacin y actualizacin de bases de datos con mltiples conjuntos de registros y campos. Estos son los controles de cuadro de lista enlazado a datos y cuadro combinado enlazado a datos y el control DBGrid. Nota Antes de que pueda usar ninguno de los controles ActiveX, necesita agregar el control al proyecto mediante el cuadro de dilogo Referencias del men Proyecto. Tambin debe registrar la biblioteca de Objetos de acceso a datos (DAO) mediante el cuadro de dilogo Referencias. Agregar, actualizar y eliminar registros Puede agregar, actualizar y eliminar automticamente registros mediante el control Data y los controles enlazados a datos. Para mayor flexibilidad y control, tambin puede escribir cdigo de Visual Basic para llevar a cabo estas operaciones, usando mtodos del objeto Recordset del control Data.
7

Agregar un registro nuevo Para agregar un registro nuevo a la base de datos con el control Data, debe establecer la propiedad EOFAction a 2, lo que permite agregar un registro nuevo al final del conjunto de registros. EOFAction y BOFAction son propiedades del control Data que determinan lo que ocurre cuando se desplaza ms all del principio o del final del conjunto de resultados del control Data. Los valores posibles para la propiedad EOFAction se muestran en la siguiente tabla: Opcin vbEOFActionMoveLast vbEOFActionEOF vbEOFActionAddNew Valor 0 1 2 Accin Se us un mtodo MoveLast, situando el registro actual en el ltimo registro del conjunto de registros y evitando que el usuario se desplace ms all del final del conjunto de registros. Sita el registro actual en el registro no vlido (EOF) y desactiva el botn IrAlSiguiente del control Data. Valida el ltimo registro e invoca automticamente el mtodo AddNew; a continuacin sita el control Data en el registro nuevo.

Con la propiedad EOFAction establecida a vbEOFActionAddNew, cuando el usuario se desplaza ms all del ltimo registro, el control Data crea automticamente un registro nuevo y permite al usuario escribir datos. Si se introducen nuevos datos, al desplazarse fuera del registro actual (nuevo) se producir automticamente una actualizacin que guarda el registro nuevo en la base de datos. Si el usuario se va del registro nuevo sin haber escrito datos, el registro nuevo se descarta. Este mtodo proporciona una forma cmoda de introducir varios registros nuevos de manera consecutiva. Los usuarios slo tienen que ir al final de la base de datos y usar el botn IrAlSiguiente para ir un registro ms all del ltimo registro del archivo. Luego pueden empezar a agregar registros nuevos, desplazando hacia delante el conjunto de registros despus de introducir cada registro. El control Data controla automticamente la insercin y actualizacin de los registros. Actualizacin o eliminacin de un registro Para actualizar o eliminar un registro con el control Data, slo tiene que situar el control en el registro deseado y modificarlo o eliminarlo en cualquier control enlazado a datos en el que se muestre. Una vez cambiado o eliminado el registro, use el control Data para desplazar hacia delante el conjunto de registros. El control Data controla automticamente la actualizacin o eliminacin de los registros. 2. Cuadros de lista y Cuadros Combinados enlazados a datos Los controles de cuadro de lista enlazado a datos y cuadro combinado enlazado a datos son muy similares a los controles estndar de cuadro de lista y cuadro combinado descritos en "Tipos de controles enlazados", pero hay algunas diferencias importantes que les dan gran flexibilidad y utilidad en aplicaciones de bases de datos. Ambos controles se pueden llenar automticamente desde un campo de una base de datos del control Data al que estn enlazados. Adems pueden pasar, de manera opcional, un campo seleccionado a un segundo control de datos, por lo que resultan ideales para aplicaciones de "tablas de bsqueda". Este tipo de aplicaciones ofrecen al usuario la capacidad de limitar una bsqueda seleccionando un criterio en una lista desplegable. Por ejemplo, una aplicacin de base de datos de informes de ventas podra usar un cuadro de lista enlazado a datos para permitir al usuario elegir una provincia o una regin de ventas. Cuando se haya hecho una seleccin, sta se pasa automticamente al segundo control de datos que se coloca en los registros de ventas de la regin seleccionada. Como en el caso de sus equivalentes integrados, la principal diferencia entre el cuadro de lista enlazado a datos y el cuadro combinado enlazado a datos es que este ltimo proporciona un cuadro de texto en el que se copia el campo seleccionado y que se puede modificar.

Propiedades de enlace para el cuadro de lista y el cuadro combinado enlazados a datos A diferencia de la mayora de los otros controles enlazados, el cuadro de lista y el cuadro combinado enlazados a datos tienen cinco propiedades especiales que determinan su enlace con los datos. stas se enumeran en la siguiente tabla: Propiedad DataSource DataField Descripcin El nombre del control Data al que estn enlazados el cuadro de lista o el cuadro combinado enlazado a datos. El nombre del campo del conjunto de registros especificado por la propiedad DataSource. Este campo se usar para determinar qu elemento de la lista est resaltado. Si se hace una nueva seleccin, es este campo el que se actualizar cuando se desplace a un registro nuevo. El nombre del control Data que se usar para llenar la lista. El nombre de un campo del conjunto de registros especificado por la propiedad RowSource. Este campo debe ser del mismo tipo que la propiedad DataField que se usar para actualizar la lista. El nombre de un campo del conjunto de registros especificado por RowSource que se usar para llenar la lista.

RowSource BoundColumn ListField

Nota Tambin puede usar el cuadro de lista enlazado a datos y el cuadro combinado enlazado a datos con un nico control de datos. Para ello, establezca las propiedades DataSource y RowSource al mismo control de datos y establezca las propiedades DataField y BoundColumn al mismo campo del conjunto de registros del control Data. En este caso, la lista se llenar con los valores de ListField del mismo conjunto de registros que se actualiza. Si se especifica la propiedad ListField, pero no se establece la propiedad BoundColumn, esta se establecer automticamente al campo ListField. Un uso comn de estos controles es el de crear una lista de elementos basada en una consulta de una base de datos desde la que el usuario puede seleccionar o introducir un valor o, en el caso de un cuadro combinado enlazados a datos, editar el campo seleccionado. Cuando se selecciona un elemento de la lista, su valor asociado de la propiedad BoundColumn est disponible para el control Data especificado por la propiedad DataSource. Cuando el control Data se desplaza a otro registro o se actualiza, se actualiza el conjunto de registros con el texto seleccionado o modificado. Ejemplo de cuadro combinado enlazado a datos El siguiente ejemplo usa el cuadro combinado enlazado a datos para crear una pantalla de entrada de datos para la tabla Titles de la base de datos de ejemplo Biblio.mdb. Permite al usuario introducir ttulos nuevos y asignarlos a los editores existentes, proporcionando una tabla de bsqueda con todos los nombres de los editores. Cuando los usuarios llegan al campo Publisher en el formulario de entrada, pueden elegir un editor de un cuadro de lista. Cuando han seleccionado un editor, el campo PubID de ese editor se copia al campo PubID de la tabla Titles. 1 Agregue un control de cuadro combinado enlazado a datos y dos controles de datos de su formulario. 2 En la ventana Propiedades, establezca las propiedades del primer control de datos (Data1) para crear un conjunto de registros de tipo table de la tabla Titles. 3 Establezca las propiedades del segundo control de datos (Data2) para crear un objeto Recordset de tipo snapshot de la tabla Publishers, usando la siguiente consulta SQL: SELECT PubID, Name FROM Publishers ORDER BY PubID 4 Establezca la propiedad DataSource del cuadro combinado enlazado a datos al primer control de datos (Data1). La propiedad DataField debe estar establecida al campo PubID de la tabla Titles. Esto enlaza el control de cuadro combinado para actualizar el conjunto de registros Titles. 5 Establezca la propiedad RowSource del cuadro combinado enlazado a datos al segundo control de datos (Data2). 6 Establezca la propiedad BoundColumn del cuadro combinado enlazado a datos al campo PubID de la tabla Publishers. Esto establece el control de cuadro combinado enlazado a datos a que use el campo PubID del conjunto de registros del segundo control de datos (Publishers) cuando actualice la propiedad DataField del conjunto de registros del primer control de datos (Titles). 7 Establezca la propiedad ListField al campo Name de la tabla Publishers. Observe que el men desplegable de la propiedad ListField se deriva del control Data especificado por la propiedad RowSource. Esto especifica que el campo Name se usar para llenar la lista del cuadro combinado enlazado a datos.
9

La figura muestra los orgenes de las propiedades del cuadro combinado enlazado a datos de este ejemplo.

Los campos DataField y BoundColumn deben ser idnticos, pero en diferentes tablas; es decir, estos campos deben reflejar una relacin entre las dos tablas. Cuando ejecuta este programa, el control de cuadro combinado enlazado a datos se llena con una lista de nombres de editores. Cuando seleccione uno de los registros de la tabla Titles usando el primer control de datos, observar que el nombre del editor de ese ttulo se muestra en la parte de cuadro de texto del cuadro combinado enlazado a datos. A continuacin, cambie el nombre haciendo una nueva seleccin en los nombres del cuadro combinado enlazado a datos. Vuelva a colocar el primer control de datos en un registro diferente y luego vuelva al registro original. Observe que el nombre que se muestra se ha actualizado, indicando que el campo PubID de la tabla Titles contiene ahora el campo PubID del editor seleccionado en el control de cuadro combinado enlazado a datos. Si escribe en el cuadro de texto un nombre que no est en la lista, el control Data no tiene forma de saber qu valor de PubID corresponde al nombre nuevo, por lo que el campo PubID se guardar como Null. Otras propiedades del cuadro de lista y el cuadro combinado enlazados a datos Algunas propiedades importantes del cuadro de lista y del cuadro combinado enlazados a datos incluyen: SelectedItem MatchEntry IntegralHeight VisibleCount SelectedItem Una vez que se ha seleccionado un elemento, la propiedad SelectedItem devuelve un marcador a esa fila. El marcador se puede usar posteriormente en el cdigo para hacer referencia a la fila del conjunto de registros que contiene el elemento seleccionado. MatchEntry La propiedad MatchEntry activa el modo de bsqueda extendida de forma que pueda encontrar fcilmente elementos en la lista generada por el control de cuadro combinado enlazado a datos. Esto es especialmente til para listas largas. Con MatchEntry establecida a True, cada tecla que el usuario presiona se agregar al argumento de bsqueda. Por ejemplo, si el usuario escribe "N", el control resaltar el primer elemento de la lista que empiece por "N". Si posteriormente el usuario escribe "E", se repite el proceso y el control se desplazar al primer elemento que empiece con las letras "NE". El argumento de bsqueda se borra cuando el control cambia de enfoque o cuando el usuario presiona RETROCESO. Si MatchEntry est establecida a False, el argumento de bsqueda est limitado a un carcter. IntegralHeight y VisibleCount Si el nmero de elementos excede el nmero de elementos que se pueden mostrar, se agrega automticamente al control una barra de desplazamiento. Puede evitar que se muestren filas parciales si establece la propiedad IntegralHeight, que automticamente fija el tamao del cuadro de lista enlazado a datos o el cuadro combinado enlazado a datos para que muestren un nmero exacto de filas completas. Puede determinar el nmero de elementos visibles en la lista si examina la propiedad VisibleCount. 3. El control DBGrid
10

El control Apex Data-Bound Grid (DBGrid) es un control dependiente parecido a una hoja de clculo que presenta una serie de filas y columnas que representan registros y campos de un objeto Recordset. Cuando establece la propiedad DataSource del control DBGrid a un control de datos, el control se llena automticamente y sus encabezados de columna se establecen automticamente con el conjunto de registros del control de datos. Esto le proporciona una gran funcionalidad "confeccionada" que permite a sus usuarios examinar y modificar tablas completas de bases de datos o resultados de consultas. Los usuarios pueden establecer el enfoque a celdas individuales y modificar datos directamente en la celda. Tambin pueden seleccionar filas enteras o celdas por columnas. Cada columna tiene su propia fuente, borde, ajuste de texto, color y otros atributos que se pueden establecer independientemente de los de las otras columnas. En tiempo de diseo se puede establecer el ancho de la columna y el alto de una fila, as como columnas "ocultas". Es posible evitar que los usuarios cambien el formato en tiempo de ejecucin. El control DBGrid depende de otros dos objetos: El objeto Recordset del control de datos La coleccin Columns del control DBGrid propiamente dicho DBGrid es realmente una coleccin de objetos Column, cada uno con un nmero variable de filas. Cada columna corresponde a un campo de la tabla de la base de datos, mientras que cada fila corresponde a un registro. La propiedad Count de la coleccin Columns del control determina el nmero de columnas y la propiedad RecordCount del objeto Recordset del control de datos determina el nmero de filas. Durante la operacin, las propiedades Row y Col especifican la celda actual de una cuadrcula. Puede especificar la celda actual en el cdigo o el usuario puede cambiarla en tiempo de ejecucin mediante el mouse (ratn) o las teclas de direccin. Cuando el usuario cambia la celda actual, los datos subyacentes se vuelven a colocar automticamente en el registro que contiene la celda seleccionada. Las celdas se pueden modificar de manera interactiva, ya sea escribiendo en la celda o mediante programa, si cambia la propiedad Value del objeto Column seleccionado actualmente. Examen de una base de datos con DBGrid Puede usar el control Apex Data-Bound Grid (DBGrid) para mostrar y examinar de manera rpida y sencilla todos los registros de una tabla de base de datos. Esto se puede llevar a cabo en unos minutos y sin tener que escribir cdigo. Antes de usar DBGrid, debe asegurarse de que el control est disponible para el proyecto. Si es necesario, agrguelo en la ficha Controles del cuadro de dilogo Componentes, disponible a travs del men Proyecto. 1 Agregue un control de datos a un formulario nuevo y establezca sus propiedades DatabaseName y RecordSource a la base de datos y la tabla que quiere mostrar. 2 Agregue un control DBGrid al formulario y establezca su propiedad DataSource al control de datos que acaba de crear. 3 Ejecute la aplicacin. Cuando ejecute su programa, la tabla de base de datos que ha especificado se muestra en el control DBGrid, completa con encabezados de columnas (del conjunto de registros del control de datos) y barras de desplazamiento. Puede desplazarse inmediatamente por todos los registros y campos de la tabla. Adems, puede modificar cualquier celda de la tabla y sta se actualizar automticamente cuando se desplace a una fila nueva (dando por hecho que el conjunto de registros subyacente es actualizable y la propiedad AllowUpdate del control DBGrid est establecida a True). Con las propiedades AllowAddNew y AllowDelete establecidas a True, puede eliminar registros si selecciona y elimina la fila entera. Modo independiente del control DBGrid Adems de las operaciones enlazadas a datos descritas en esta seccin, el control Apex Data-Bound Grid (DBGrid) tambin puede funcionar en modo independiente. En modo enlazado, los datos se recuperan y actualizan automticamente mediante el conjunto de registros del control del datos. En modo independiente, usted es responsable de mantener los datos y suministrar al control DBGrid los datos adecuados, cuando a travs de los eventos independientes se le pida que lo haga.
11

El modo independiente se puede usar para mostrar datos que estn almacenados en una base de datos no accesible para el control de datos o cuando necesita mayor flexibilidad en la manera en que se almacenan, modifican y actualizan los datos. En el modo independiente dispone de un control total de programacin sobre el contenido y el comportamiento del control DBGrid. Por ejemplo, puede usarlo para mostrar datos de un formato propietario de base de datos o usarlo para administrar datos de los que se hace un seguimiento en un archivo de texto. Es decir, un control DBGrid no enlazado sirve como interfaz de usuario para mostrar y modificar datos, a la vez que le ofrece un control completo sobre la manera en que se administran los datos internamente. El modo independiente se establece a travs de la propiedad DataMode del control DBGrid. Esta propiedad slo est disponible en tiempo de diseo. Los valores permitidos para la propiedad DataMode son: Opcin dbgBound DbgUnbound Valor 0 1 Descripcin Establece que DBGrid muestre datos del origen de datos enlazado. Establece que DBGrid use los eventos del control independientes para recuperar y actualizar los datos mostrados.

Cuando la propiedad DataMode del DBGrid est establecida a 1, o modo independiente, el control no est enlazado a ningn tipo de origen de datos en particular. La sincronizacin entre el origen de datos y los datos mostrados en el DBGrid la debe llevar a cabo la aplicacin. El DBGrid pasa de administrar automticamente sus datos a enviarle mensajes de notificacin a travs de eventos especiales independientes para que, de esta forma, la aplicacin pueda administrar los datos. Entre los eventos independientes del control DBGrid se incluyen: UnboundAddData UnboundDeleteRow UnboundReadData UnboundWriteData Por ejemplo, cuando elimina una fila de un DBGrid enlazado, los datos se eliminan automticamente del origen de datos subyacente. Sin embargo, cuando elimina una fila de un DBGrid independiente, se notifica a su aplicacin a travs de un evento (en este caso el evento UnboundDeleteRow). El evento alerta a la aplicacin de que el usuario ha eliminado una fila de la cuadrcula y le notifica qu fila se ha eliminado. Ahora depende de usted quitar realmente la fila de datos del origen de datos subyacente de la manera que prefiera. Operaciones en tiempo de diseo del control DBGrid Cuando se crea por primera vez, el control Apex Data-Bound Grid (DBGrid) tiene una nica columna y una nica fila. Tambin contiene una fila vaca (designada por un asterisco (*) en tiempo de ejecucin) que se usa para agregar nuevos registros. Puede cambiar cualquiera de los atributos visibles del control DBGrid a travs de las preferencias en la ventana Propiedades. Al establecer la propiedad DataSource, el control DBGrid se enlaza automticamente al conjunto de registros creado por el control de datos; luego establece el nmero de columnas y otras propiedades de las columnas a partir de las propiedades correspondientes del objeto Field en el conjunto de registros del control de datos. La ventana Propiedades muestra las propiedades de todo el control DBGrid; el control se puede mover y cambiar su tamao. Para establecer las propiedades de los objetos Column por separado, debe hacer que el control DBGrid sea activo para la interfaz de usuario: presione el botn secundario del mouse (ratn) y elija Editar del men contextual del control. Use dicho men para insertar o eliminar columnas, o para cortar y pegar columnas desde o al Portapapeles. Nota Si establece cualquiera de las propiedades de columna de DBGrid en tiempo de diseo, necesitar establecerlas todas para mantener los valores actuales.

12

Cada control DBGrid tiene una nica pgina de propiedades; sin embargo, cada objeto Column tiene su propia pgina. Puede usar estas pginas de propiedades para establecer de forma interactiva las propiedades del control DBGrid como un todo o para las columnas seleccionadas individualmente. La pgina de propiedades General muestra las propiedades que son aplicables a todo el control DBGrid y se pueden evaluar en tiempo de diseo. Estas propiedades tambin est disponibles en la ventana Propiedades estndar. La pgina de propiedades del objeto Column muestra las propiedades para una columna individual. Si se seleccionan mltiples columnas, est seleccionada la columna que est ms a la izquierda en la pgina de propiedades Columnas. Establecer las propiedades del objeto Column no afecta a las propiedades generales del control DBGrid. La pgina de propiedades Colores permite seleccionar los colores generales del control DBGrid. Los colores del objeto Column no se ven afectados por estos valores. La pgina de propiedades Fuentes permite elegir las fuentes generales del control DBGrid y del encabezado. Las fuentes del objeto Column no se ven afectadas por estos valores. Dar formato Cada columna del control DBGrid tiene su propia fuente, borde, ajuste de texto, color y otros atributos que se pueden establecer independientemente de las dems columnas. En tiempo de diseo, puede establecer el ancho de las columnas y el alto de las filas y establecer columnas que no sean visibles para el usuario. Tambin puede evitar que los usuarios cambien el formato en tiempo de ejecucin. Si el texto de una celda es demasiado largo para mostrarlo en la celda, se ajustar automticamente a la siguiente lnea dentro de la misma celda. Para ver el texto ajustado, puede aumentar la propiedad Width del objeto Column de la celda o la propiedad RowHeight del propio control DBGrid. En tiempo de diseo puede cambiar el ancho de la columna de manera interactiva si cambia el tamao de la columna o cambia el ancho de sta con la pgina de propiedades del objeto Column. Operaciones en tiempo de ejecucin del control DBGrid El control Apex Data-Bound Grid (DBGrid) muestra registros del objeto Recordset subyacente en tiempo de ejecucin. Siempre hay un nico registro actual en el control DBGrid, incluso si hay seleccionadas mltiples filas en el control. El registro actual corresponde al registro actual del control de datos y se puede establecer o recuperar con la propiedad Bookmark del control DBGrid. Como ocurre con el resto de los controles enlazados a datos, cuando cambia un registro (o cualquier campo de un registro) en el DBGrid, el conjunto de registros subyacente se actualiza cuando se desplace a un registro nuevo (fila), dando por hecho que es actualizable y que la propiedad AllowUpdate del control DBGrid est establecida a True. De lo contrario, se producir un error interceptable. Si la propiedad RecordSelectors es True, el usuario puede seleccionar una fila entera si hace clic en el icono de selector de registros para esa fila. Seleccin de celdas, columnas, filas y rangos Cuando selecciona una celda se establecen las propiedades Col y Row. Las propiedades Text y Value del objeto Column hacen referencia al contenido de la celda actual. Se puede tener acceso a los datos de la fila seleccionada actualmente si usa la propiedad Bookmark, que proporciona acceso al registro actual del objeto Recordset subyacente. Trabajo con rangos en DBGrid El control Apex Data-Bound Grid (DBGrid) le permite seleccionar rangos de celdas como en una hoja de clculo. No obstante, no proporciona ninguna funcionalidad automtica para trabajar con rangos (como copiar, eliminar o mover "bloques" enteros de campos o registros). Si desea implementar esa capacidad, tendr que hacerlo en el cdigo. La informacin sobre los rangos seleccionados se devuelve de dos modos:
13

Las columnas inicial y final de la seccin se devuelven en las propiedades SelStartCol y SelEndCol. Los marcadores de las filas seleccionadas estn disponibles en la coleccin proporcionada por la propiedad SelBookmarks. Por ejemplo, para eliminar un rango seleccionado de registros: 1. Recorra la coleccin SelBookmarks, usando la propiedad Count para detectar los lmites de la coleccin. 2. Cada vez que pase por el bucle, establezca la propiedad Bookmark del objeto Recordset del control de datos a la propiedad Bookmark en la coleccin SelBookmarks y elimine el registro. Estos pasos se ilustran en el siguiente ejemplo de cdigo: Private Sub DeleteRows_Click () Do While DataGrid1.SelBookmarks.Count <> 0 Data1.Recordset.Bookmark _ = DataGrid1.SelBookmarks(0) Data1.Recordset.Delete Loop End Sub Presentacin de campos calculados en DBGrid Es posible usar el control Apex Data-Bound Grid (DBGrid) para mostrar campos calculados; los campos calculados no aparecen realmente en la base de datos, sino que se calculan a partir de los datos de campos almacenados. Un ejemplo de campo calculado sera mostrar una columna de "impuestos de ventas" cuando la base de datos slo contiene un campo "precio". Si los impuestos de ventas en su localidad son del 7%, el clculo para el impuesto de ventas sera "precio x ,07." 1 Agregue un campo independiente al control DBGrid. 2 En el evento RowLoaded, lleve a cabo el clculo y asigne el resultado a la propiedad Value del objeto Column. 4. Manipulacin de registros con cdigo El control de datos ofrece un alto grado de funcionalidad que puede usar sin escribir cdigo, con slo establecer y manipular sus propiedades e incorporar controles enlazados a datos para proporcionar una interfaz de usuario. No obstante, habr ocasiones en las que quiera ampliar la funcionalidad del control de datos en el cdigo de Visual Basic escrito por usted. Visual Basic proporciona esta funcionalidad al permitirle manipular el control de datos y los objetos Recordset que crea. Por ejemplo, si quiere escribir cdigo para ir al ltimo registro del conjunto de registros, puede tratar el conjunto de registros como un objeto y despus aplicarle el mtodo MoveLast: Datos1.Recordset.MoveLast O bien, si quiere comprobar el valor de un campo especfico en el registro actual, podra escribir: MiCadena = Datos1.Recordset.Fields("Ttulo").Value Observar que la sintaxis que se usa para controlar el objeto de base de datos DAO es la misma que se usa para manipular otros tipos de objetos en Visual Basic. La sintaxis de los objetos se trata en "Fundamentos bsicos del trabajo con objetos" en el captulo 5, "Fundamentos de programacin". Desplazamiento por un conjunto de registros Desplazarse se refiere a moverse o cambiar el registro actual de un conjunto de registros. Ya ha visto cmo moverse de un registro a otro mediante los botones de direccin del control de datos. Las flechas de los botones se corresponden con los mtodos del objeto Recordset que puede usar para llevar a cabo las mismas acciones en cdigo. Las flechas sencillas del control de datos se corresponden con los mtodos MoveNext y MovePrevious, mientras que las flechas dobles se corresponden con los mtodos MoveFirst y MoveLast.

14

El registro actual El control de datos utiliza el concepto registro actual para determinar qu registro del conjunto de registros es accesible actualmente. En un momento dado, slo un registro es el registro actual y es ste el que se muestra en cualquier control que est enlazado al control de datos. Las propiedades BOFAction y EOFAction expuestas en "Agregar, actualizar y eliminar registros", anteriormente en este captulo, le dan cierto control sobre este estado; tambin puede escribir cdigo para comprobar las propiedades BOF y EOF. El estado de estas dos propiedades determina la posicin del registro actual, tal y como se muestra en la siguiente tabla: Estados de BOF/EOF BOF y EOF son ambas False BOF = True EOF = True BOF y EOF son ambas True Significado El puntero de registro actual es vlido, a menos que no se haya movido despus de eliminar el ltimo registro del conjunto de registros. El registro actual se coloca por delante del primer registro de datos. El puntero de registro actual no es vlido. El registro actual se coloca por detrs del ltimo registro de datos. El puntero de registro actual no es vlido. No hay ninguna fila en el conjunto de resultados. El registro actual no es vlido.

Ir al primer o al ltimo registro Para ir al principio del conjunto de registros, use el mtodo MoveFirst: Data1.Recordset.MoveFirst Para ir al final del conjunto de registros, use el mtodo MoveLast: Data1.Recordset.MoveLast Ir al siguiente registro El mtodo MoveNext hace que el siguiente registro del conjunto de registros sea el actual. Por lo general, MoveNext se usa para ir paso a paso por las filas de un conjunto de registros para extraer datos de registro en registro. Si el control de datos se coloca en el primer o en el ltimo registro del conjunto de registros, cualquier movimiento ms all del principio o del final establecer los indicadores BOF (inicio del archivo) o EOF (final del archivo) a True. Si las propiedades BOFAction y EOFAction estn establecidas a 1 ("BOF" y "EOF" respectivamente), en este punto ya no tendr un registro actual vlido y se borrarn los controles enlazados. Si usa un mtodo Move que se desplace ms all de BOF o EOF, Visual Basic generar un error interceptable. Debido a este diseo, puede codificar la siguiente rutina que recorre de forma segura la base de datos desde cualquier punto hasta el final. ' Suponiendo EOFAction = 1 Do While Data1.Recordset.EOF = False Data1.Recordset.MoveNext ' Insertar cdigo para trabajar con el registro ' actual... Loop Al final de este bucle, el puntero de registro actual no es vlido y debe usar el mtodo MoveLast para volver a situarlo. Ir al registro anterior El mtodo MovePrevious hace que el registro anterior sea el actual. Este mtodo funciona como el mtodo MoveNext, excepto en que mueve el puntero de registro actual hacia el principio del conjunto de registros. Otros mtodos para moverse por el conjunto de registros Adems de los mtodos Move descritos anteriormente, puede usar el mtodo Move con un argumento entero para moverse un nmero especfico de filas hacia delante o hacia atrs del registro actual. Tambin puede usar las propiedades AbsolutePosition y PercentPosition del objeto Recordset para moverse por el conjunto de registros. Bsqueda de un registro especfico Los mtodos Move le permiten desplazarse por un conjunto de registros de registro en registro. No obstante, en muchos casos puede que desee buscar un registro especfico. Parar encontrar registros especficos puede
15

usar los mtodos Find con objetos Recordset de tipo dynaset y snapshot y el mtodo Seek con objetos Recordset de tipo table. Uso de los mtodos Find Puede usar los siguientes mtodos para encontrar un registro en un objeto Recordset de tipo dynaset o snapshot. (Para encontrar un registro en un objeto Recordset de tipo table, use el mtodo Seek, que se describe en la siguiente seccin). Visual Basic admite cuatro mtodos Find: El mtodo FindFirst encuentra el primer registro que satisface los criterios especificados. El mtodo FindLast encuentra el ltimo registro que satisface los criterios especificados. El mtodo FindNext encuentra el siguiente registro que satisface los criterios especificados. El mtodo FindPrevious encuentra el registro anterior que satisface los criterios especificados. Al usar los mtodos Find se especifican los criterios de bsqueda; normalmente una expresin que iguala el nombre de un campo con un valor especfico. Por ejemplo, el siguiente cdigo ilustra cmo encontrar el primer registro en la tabla Titles donde el campo Au_ID es igual a 5. Data1.Recordset.FindFirst "Au_ID = 5" Puede encontrar los registros coincidentes en orden inverso, si busca la ltima coincidencia con el mtodo FindLast y luego usa FindPrevious en vez del mtodo FindNext. Uso del mtodo Seek Puede usar el mtodo Seek para encontrar un registro en un Recordset de tipo table. El mtodo Seek slo funciona con conjuntos de registros de tipo table, ya que Visual Basic usa el ndice actual de la tabla, tal y como est definido por la propiedad Index. La sintaxis para el mtodo Seek es: tabla.Seek comparacin, clave1, clave2 ... donde tabla es una variable del conjunto de registros que hace referencia a la tabla en la que est buscando, comparacin es una cadena que determina el tipo de comparacin que se est llevando a cabo y los argumentos claven son valores de los campos de clave en el ndice actual. La siguiente tabla enumera las cadenas de comparacin que puede utilizar con Seek. Cadena de comparacin "=" ">=" ">" "<=" "<" Descripcin Igual a los valores clave especificados Mayor o igual que los valores clave especificados Mayor que los valores clave especificados Menor o igual que los valores clave especificados Menor que los valores clave especificados

Si el ndice actual es un ndice de campos mltiples, los valores clave de la derecha se pueden omitir y se tratan como Null. Es decir, puede no escribir cualquier nmero de valores clave desde el final de los argumentos clave de un mtodo Seek, pero no desde el principio o la mitad. Si usa el mtodo Seek en un objeto Recordset de tipo table sin haber establecido primero el ndice actual, se produce un error de tiempo de ejecucin. El siguiente ejemplo usa un control de datos cuyo conjunto de registros es una tabla llamada Productos y usa el mtodo Seek para encontrar el primer registro que contenga un valor 1 en el campo Id. proveedor (que es un campo de ndice no nico). Cambia 1 a 2 y guarda el cambio con el mtodo Update. Los pases posteriores por el bucle encuentran el siguiente registro que satisface la condicin. Dim MiTabla As Recordset ' Establecer variable Recordset de tipo table. Set MiTabla = Data1.Recordset ' Define ndice actual. MiTabla.Index = "Id. proveedor" ' Busca registro. MiTabla.Seek "=", 1 Do Until MiTabla.NoMatch ' Hasta que no se encuentre ningn registro. ' Activa la edicin.
16

MiTabla.Edit ' Cambia Id. proveedor. MiTabla("Id. proveedor") = 2 ' Guardar cambios. MiTabla.Update ' Busca siguiente registro. MiTabla.Seek "=", 1 Loop Uso de un marcador para ir a un registro especfico Los marcadores le permiten guardar un puntero de registro actual y volverlo a colocar directamente en un registro especfico. La propiedad Bookmark contiene un puntero a un registro que usted especifica; puede saltar a ese registro si establece la propiedad Bookmark al valor de ese puntero. Este valor se puede guardar en una variable Variant o String. El siguiente cdigo vuelve a colocar el registro actual en un marcador guardado anteriormente: Dim MiMarcador as Variant MiMarcador = Data1.Recordset.Bookmark ' Guardar puntero del registro actual. Data1.Recordset.MoveFirst ' Sale del registro. Data1.Recordset.Bookmark = MiMarcador ' Vuelve a la ubicacin guardada. Si no conoce el nmero de orden fsico o el marcador del registro al que quiere tener acceso, puede buscarlo empezando por el primer registro y recorriendo en bucle el conjunto de registros, comparando los datos de cada registro con el elemento que desea encontrar. Actualizacin de un conjunto de registros mediante cdigo Para actualizar la informacin de una base de datos, la base de datos y su conjunto de registros deben ser actualizables. Para determinarlo, examine la propiedad Updatable de la base de datos y del conjunto de registros. Si est usando un objeto Recordset de tipo snapshot, por ejemplo, los registros no son actualizables. Adems debe abrir el control de datos con la propiedad ReadOnly establecida a False. El siguiente cdigo comprueba si se puede actualizar una base de datos: If data1.readonly=True or data1.database.updatable=False or data1.recordset.updatable=False Then MsgBox "Estos datos no se pueden modificar." End If Para comprobar la capacidad de un campo para aceptar cambios, necesitar examinar la propiedad Attributes y probar el bit dbUpdatableField. Por ejemplo: If Data1.Recordset.Fields("Name").Attributes And dbUpdatableField = 0 Then MsgBox "Este campo no se puede modificar." End If Agregar registros nuevos Una vez que haya determinado que la base de datos y el conjunto de registros admiten cambios, ya puede agregar registros. 1 Cree un registro nuevo (en blanco) con el mtodo AddNew. Se guardar el puntero de registro actual y se desplaza al siguiente registro. 2 Asigne valores nuevos a los campos del registro nuevo. 3 Guarde el registro nuevo con el mtodo Update. El puntero de registro actual se restaura a su valor original (el valor del puntero de registro antes de usar el mtodo AddNew). El siguiente cdigo agrega un ttulo nuevo a la tabla Titles de la base de datos Biblio.mdb. Data1.DatabaseName = "Biblio.mdb" Data1.RecordSource = "Titles" Data1.Refresh ' Crea un registro nuevo. Data1.Recordset.AddNew ' Establece valores del campo. Data1.Recordset("Title") = "The Data Control"
17

Data1.Recordset("Year Published") = "1993" Data1.Recordset("AU_ID") = 37 Data1.Recordset("ISBN") = "2344456533" Data1.Recordset("PubID") = 43 ' Agrega registro nuevo. Data1.Recordset.Update En el ejemplo de cdigo anterior, el campo PubID se refiere al campo PubID de la tabla Publishers. Su cdigo debe comprobar que ste es un valor correcto para que mantenga la integridad referencial de la base de datos. Modificacin del registro actual Para cambiar datos en la base de datos, primero debe hacer que el registro que quiere modificar sea el registro actual y despus hacer todos los cambios necesarios en los controles enlazados. Para guardar los cambios, slo tiene que desplazar el puntero de registro actual a otro registro o usar el mtodo Update como se muestra en el ejemplo de cdigo anterior. 1 Coloque el registro actual en el registro que desee modificar. 2 Asigne nuevos valores a los campos que quiere cambiar. 3 Use el mtodo Update o cualquiera de los mtodos Move, Find o Seek o bien haga clic en uno de los botones de direccin del control Data para guardar los cambios y reemplazar los valores existentes del campo. El siguiente cdigo muestra cmo modificar el valor del campo PubID en el primer registro. Data1.DatabaseName = "Biblio.mdb" Data1.RecordSource = "Titles" Data1.Refresh ' Abre la base de datos. Data1.Recordset("PubID") = "12345" ' Cambia el valor. Data1.Recordset.Update ' Guarda los cambios. Modificacin del valor de un campo especfico Un conjunto de registros se puede dividir en campos, donde cada campo representa un campo de la tabla de la base de datos. El conjunto de todos los objetos Field de un conjunto de registros se conoce como la coleccin Fields. El siguiente cdigo muestra varias formas de hacer referencia a la propiedad Value de un campo en particular dentro de una coleccin. Como mtodo abreviado, puede omitir las notaciones .Field y .Value, ya que son propiedades predeterminadas. Por lo general, encontrar que las dos ltimas formas son las ms fciles de usar. Data1.Recordset.Fields(0).Value n=0 Data1.Recordset.Fields(n) Data1.Recordset.Fields("FName") cadena$ = "FName" Data1.Recordset.Fields(cadena$) Data1.Recordset("FName") Data1.Recordset(n) ' Hace referencia al valor del primer campo. ' Referencia indirecta por el nmero de ndice del campo. ' Hace referencia al valor del primer campo. ' Hace referencia al valor del campo Fname. ' Referencia indirecta por el nombre del campo. ' Hace referencia al valor del campo FName. ' Fields es la coleccin predeterminada del objeto Recordset y, por tanto, se puede omitir. ' Tambin puede hacer referencia a los miembros de la coleccin Fields por el nmero.

El siguiente ejemplo ilustra cmo puede mostrar los valores de todos los campos en el conjunto de registros seleccionado. Dim Fld As Field For Each Fld In Data1.Recordset.Fields MiLista.AddItem Fld ' Agrega el campo a la lista. Next Fld Eliminacin de registros Para eliminar un registro entero, coloque el puntero de registro actual en el registro que quiere quitar y use el mtodo Delete. Para eliminar mltiples registros debe usar MoveNext para cambiar el registro actual despus
18

de cada eliminacin, porque un registro eliminado ya no contiene datos vlidos y si intenta tener acceso a estos datos se producir un error. Un mtodo ms eficaz para eliminar mltiples registros es usar una consulta SQL DELETE, como: "DELETE from Titles where [Year Published] < #1/1/1889#" Cierre un conjunto de registros El mtodo Close cierra el conjunto de registros y libera los recursos que tena asignados. Si se intenta usar un mtodo o tener acceso a un elemento de un conjunto de registros cerrado, el resultado es un error interceptable en tiempo de ejecucin. Por ejemplo, el siguiente cdigo cierra un conjunto de registros: Data1.Recordset.Close Las bases de datos y sus respectivos conjuntos de registros se cierran automticamente cuando: Usa el mtodo Close en un conjunto de registros especfico. Se descarga el formulario que contiene el control de datos. El programa ejecuta una instruccin End. El evento Validate se produce cuando se usa el mtodo Close o cuando se descarga el formulario. Las operaciones de limpieza de ltima hora se pueden llevar a cabo en el evento Validate. 5. Control de transacciones Una transaccin es una serie recuperable de cambios que se hacen a un conjunto de registros. Las transacciones se usan cuando quiere comprobar cualquier cambio que haya hecho antes de confirmar la nueva informacin en la base de datos. Por ejemplo, si est tratando con una serie larga de transacciones financieras, puede que desee cancelar los cambios si los totales finales no cuadran. Se usa cdigo para empezar de manera explcita una transaccin. Mientras una transaccin est abierta, todos los cambios que realiza en los datos se pueden deshacer. Cuando decida que ha terminado su trabajo, puede guardar o confirmar los cambios en la base de datos. Cuando abre por primera vez una base de datos y no hay ninguna transaccin pendiente, el estado de la transaccin es de confirmacin automtica, lo que significa que todos los cambios realizados en un conjunto de resultados se realizan inmediatamente en la tabla subyacente y son irreversibles. Para situaciones en las que esto no es lo que quiere hacer, puede usar las transacciones para controlar cundo tendrn lugar los cambios. Visual Basic tiene tres instrucciones que admiten el procesamiento de transacciones: BeginTrans, CommitTrans y Rollback. No obstante, la propia base de datos debe tambin admitir transacciones o se pasarn por alto estos comandos. Asegrese de que la propiedad Transactions de la base de datos est establecida a True antes de usar estas instrucciones. Las transacciones abarcan bases de datos. Es decir, cuando usa una de las instrucciones de transaccin, sta es aplicable a todas las bases de datos del espacio de trabajo, incluso bases de datos que se abren despus de que haya empezado la transaccin. Cuando usa CommitTrans o Rollback, todas las transacciones pendientes, independientemente de la base de datos, quedan confirmadas o deshechas. Nota: Las instrucciones BeginTrans, CommitTrans y Rollback son mtodos del objeto Workspace. El control de datos incorpora esta funcionalidad de forma transparente y las instrucciones se asignan automticamente a los mtodos Workspace del espacio de trabajo predeterminado que se abre al usar el control de datos. El control de datos siempre usa Workspaces(0), excepto si el conjunto de registros que tiene asignado se cre en otro espacio de trabajo. Se recomienda a los usuarios que usen mtodos del objeto Workspace (por ejemplo, Workspace.BeginTrans) de manera explcita para una mayor compatibilidad en el futuro. Comienzo de una transaccin La instruccin BeginTrans marca el comienzo de una transaccin y hace que la siguiente secuencia de operaciones no est en modo de confirmacin automtica. Una vez haya empezado una transaccin, debe usar CommitTrans o Rollback antes de cerrar la base de datos o finalizar el programa. Las transacciones no
19

confirmadas se deshacen automticamente cuando finaliza el programa. Si intenta cerrar una base de datos mientras hay una transaccin en curso, se producir un error. Guardar los cambios de una tabla CommitTrans guarda todos los cambios del conjunto de registros que se han hecho desde que la transaccin se abri con BeginTrans. Cuando ejecuta CommitTrans, todos los cambios se hacen permanentes, la transaccin actual finaliza y el estado de la transaccin vuelve al modo de automtica. Deshacer cambios Rollback invierte o deshace todos los cambios realizados en los datos durante la transaccin actual. Tambin finaliza la transaccin y la devuelve al estado de confirmacin automtica. El siguiente ejemplo comienza una transaccin y cambia todos los registros de PubID = 5 a PubID = 6 si el usuario confirma la accin. Si no, finaliza la transaccin y se deshacen todos cambios. Dim MiTabla As Recordset, MiWorkspace As Workspace ' Establece variable de Workspace. Set MiWorkspace = Workspaces(0) ' Establece variable de Recordset. Set MiTabla = Data1.Recordset ' Inicia la transaccin. MiWorkspace.BeginTrans Do Until MiTabla.EOF If MiTabla![PubID] = 5 Then MiTabla.Edit MiTabla![PubID] = MiTabla.Update End If MiTabla.MoveNext Loop

'Activa la edicin. 'Cambia el ttulo. 'Guarda los cambios. 'Va al siguiente registro.

If MsgBox("Guardar todos los cambios?", vbQuestion + vbYesNo, "Guardar") = vbYes Then ' Confirma los cambios. MiWorkspace.CommitTrans Else ' Deshace los cambios. MiWorkspace.Rollback End If Trabajo con mltiples transacciones Los comandos de transaccin siempre son aplicables a todos los conjuntos de registros abiertos en el mismo espacio de trabajo. Como muestra el ejemplo de cdigo anterior, esto le permite que simplemente tenga que especificar el comando de transaccin que desea (como BeginTrans) sin referencia al control de datos. No obstante, si est trabajando con mltiples transacciones, necesitar prestar atencin a la secuencia de los comandos de transaccin que emite. Cuando se emite un comando BeginTrans, hay una transaccin pendiente y todos los dems comandos de transaccin son aplicables a esa transaccin pendiente. Si entonces comienza una nueva transaccin sin haber concluido la primera, se empieza a crear una serie de transacciones anidadas. Este modelo es muy parecido a las estructuras de control anidadas, donde necesita cerrar las instrucciones (o transacciones) que estn ms en el interior antes de continuar con las que estn ms al exterior. Validacin de cambios en la base de datos El evento Validate del control de datos le permite comprobar todos los cambios realizados a un conjunto de registros antes de que se escriba la informacin nueva en la base de datos. Tambin le permite especificar qu registro ser el actual despus de que haya concluido el evento Validate. Validate se produce cuando se cambia la fila actual, excepto cuando se cambia con el mtodo UpdateRecord. Esto significa que Validate se puede producir independientemente de si ha cambiado o no datos en los controles enlazados.

20

Durante un evento Validate no podr invocar ningn mtodo que produzca otro evento Validate. Por ejemplo, no podr llamar a AddNew o a cualquier otro mtodo para volver a situar el puntero de registros (Move, Find y Seek). El evento Validate se invoca justo antes de que Visual Basic escriba los cambios de los controles enlazados en la base de datos y vuelva a colocar el puntero de registro actual en otra fila de la base de datos. La siguiente tabla resume los argumentos que puede usar con el evento Validate: Argumento guardar accin Determina Si el mtodo Update se llevar a cabo o no para guardar los cambios actuales. Qu accin produjo el evento; tambin le permite especificar qu operacin tiene lugar despus del evento Validate.

El argumento guardar En el evento Validate, puede determinar si alguno de los controles enlazados han cambiado examinando el argumento guardar. Visual Basic comprueba automticamente la propiedad Changed de cada control enlazado para ver si su valor ha cambiado desde que la ltima accin de la base de datos lo estableci. Si ha cambiado algn valor, Visual Basic establece el argumento guardar a True. Si el argumento guardar es True, Visual Basic guardar todos los cambios de los controles enlazados en la base de datos. Si no desea guardar los cambios, puede establecer el argumento guardar a False. El argumento accin El argumento accin le dice qu es lo que ha hecho que se produjera el evento Validate y le permite volver a colocar el puntero de registro actual despus de que el evento Validate haya terminado. En el evento Validate, Visual Basic establece el argumento accin a un valor que indica qu accin produjo inicialmente el evento. Puede encontrar las constantes de los datos para el argumento accin en el Explorador de objetos. La siguiente tabla resume los valores del argumento accin y las acciones producidas por el evento Validate. Constante vbDataActionCancel VbDataActionMoveFirst VbDataActionMovePrevious VbDataActionMoveNext VbDataActionMoveLast vbDataActionAddNew vbDataActionUpdate vbDataActionDelete vbDataActionFind vbDataActionBookmark vbDataActionClose vbDataActionUnload Valor 0 1 2 3 4 5 6 7 8 9 10 11 Descripcin Cancela la accin que produjo el evento. Mtodo MoveFirst. Mtodo MovePrevious. Mtodo MoveNext. Mtodo MoveLast. Mtodo AddNew. Update (no UpdateRecord). Mtodo Delete. Mtodo Find. Se ha establecido la propiedad Bookmark. Mtodo Close. Se descarga el formulario.

En algunos casos puede establecer el argumento accin para especificar la manera en que Visual Basic volver a colocar el puntero de fila actual despus de que haya terminado el evento. Esto es posible si el evento Validate est producido por AddNew o uno de los mtodos Move. Por ejemplo, suponga que el evento Validate se ha producido porque hizo clic en el botn IrAlSiguiente del control de datos. Cuando Visual Basic entra en el evento Validate, establece el argumento accin a 3, lo que indica MoveNext. Despus de completarse la validacin, quiere volver a colocar el puntero de registro actual en el registro anterior en vez de en el registro siguiente. Para ello, establezca el argumento accin a 2, lo que indica MovePrevious. La rutina para volver a situar el puntero de registro actual usar el argumento accin que ha especificado para indicar qu fila se debe establecer como la fila actual despus de la transaccin. Puede especificar cualquiera de los mtodos Move o AddNew para que se lleven a cabo en lugar de cualquier otro conjunto de los mtodos Move o AddNew. Si intenta cambiar cualquier accin que no sea una de los mtodos Move o AddNew, Visual Basic pasar por alto su intento y seguir adelante con la operacin que se pretenda en primer lugar.
21

Cancelacin de la accin Si no quiere que el evento Validate vuelva a colocar el puntero de registro actual en otro registro, puede establecer el argumento accin a 0. Establecer el argumento accin a 0 no afecta a si se guardan o no los datos en la base de datos; solamente cancela la operacin para volver a colocar el puntero y deja el registro actual activo. Si no se vuelve a colocar el puntero, los valores que se muestran en los controles enlazados y el puntero de registro actual no cambian. Mtodos Update especiales para el acceso a datos El mtodo Update se usa principalmente para actualizar la informacin del conjunto de registros, en base a los cambios realizados a travs de los controles enlazados o mediante cdigo. En esta seccin conocer tres mtodos adicionales que puede usar para actualizar informacin: UpdateRecord, UpdateControls y Refresh. La siguiente tabla resume las acciones de estos tres mtodos: Mtodo UpdateRecord UpdateControls Refresh Descripcin Actualiza la base de datos (conjunto de registros) con datos de los controles enlazados. Actualiza los cambios de la base de datos (conjunto de registros) en los controles enlazados. Crea un nuevo conjunto de registros basado en las propiedades del control de datos.

El mtodo UpdateRecord El mtodo UpdateRecord del control de datos actualiza el conjunto de registros especificado con datos de los controles enlazados. El mtodo UpdateRecord se utiliza en situaciones en las que actualmente el conjunto de registros no refleja los datos de los controles enlazados. Cuando se llama a este mtodo no se produce ningn evento (incluyendo Validate) y no afecta al puntero de fila actual. El mtodo UpdateControls El mtodo UpdateControls del control de datos actualiza los controles enlazados usando los valores de la fila actual del conjunto de registros. Este mtodo se utiliza cuando la fila actual ha cambiado, pero los controles enlazados no se han actualizado automticamente con los datos de la fila actual. 6. Procesamiento de archivos Si puede disear su aplicacin para que use archivos de base de datos, no necesitar proporcionar a su aplicacin acceso directo a los archivos. El control de datos y los controles enlazados le permiten leer datos de bases de datos y escribir datos en ellas, que es mucho ms fcil que usar tcnicas de acceso directo. No obstante, hay veces en que necesita leer y escribir archivos que no son de bases de datos. Esta serie de temas le muestra cmo procesar directamente archivos para crear, manipular y almacenar texto y otros datos. Tipos de acceso a archivos Por s mismo, un archivo no es ms que una serie de bytes relacionados ubicados en un disco. Cuando su aplicacin tiene acceso a un archivo, debe asumir qu se supone que representan los bytes (caracteres, registros de datos, enteros, cadenas, etc.) Dependiendo del tipo de datos que contiene el archivo, se usa el tipo de acceso apropiado. En Visual Basic hay tres tipos de acceso a archivos: Secuencial: para leer y escribir archivos de texto en bloques continuos. Aleatorio: para leer y escribir archivos binarios de texto o estructurados como registros de longitud fija. Binario: para leer y escribir archivos estructurados de forma arbitraria. El acceso secuencial est diseado para usarlo con archivos de texto normales. Se supone que cada carcter del archivo representa un carcter de texto o una secuencia de formato de texto, como un carcter de nueva lnea (NL). Los datos se almacenan como caracteres ANSI. Se supone que un archivo abierto para acceso aleatorio se compone de un conjunto de registros de longitud idntica. Puede usar tipos definidos por el usuario para crear registros compuestos de varios campos, en los que cada uno puede tener tipos de datos diferentes. Los datos se almacenan como informacin binaria.
22

El acceso binario le permite usar archivos para almacenar datos de la manera que desee. Es similar al acceso aleatorio, excepto porque no se hacen suposiciones sobre los tipos de datos o la longitud del registro. No obstante, debe saber de manera precisa cmo se escribieron los datos en el archivo para poder recuperarlo correctamente. Instrucciones y funciones de acceso a datos Las siguientes funciones se usan con los tres tipos de acceso a datos: Dir FileLen LOF EOF FreeFile Seek FileCopy GetAttr SetAttr FileDateTime Loc La siguiente tabla muestra todas las instrucciones de acceso a archivos y las funciones disponibles para cada uno de los tipos de acceso directo a archivos. Instrucciones y funciones Secuencial Aleatorio Binario Close X X X Get X X Input( ) X X Input # X Line Input # X Open X X X Print # X Put X X Type...End Type X Write # X Uso del acceso secuencial a archivos El acceso secuencial funciona mejor cuando quiere procesar archivos que slo constan de texto, como los archivos creados con un editor de textos tpico; es decir, archivos en los que los datos no estn divididos en una serie de registros. El acceso secuencial puede que no sea el adecuado para almacenar series largas de nmeros, ya que cada nmero se almacena como una cadena de caracteres. Un nmero de cuatro dgitos requerira 4 bytes de almacenamiento en vez de los 2 bytes que requiere almacenar el mismo nmero como un entero. Apertura de archivos para acceso secuencial Cuando abre un archivo para acceso secuencial, lo abre para que realice una de las siguientes operaciones: Caracteres de entrada desde un archivo (Input) Caracteres de salida de un archivo (Output) Anexar caracteres a un archivo (Append) Para abrir un archivo para acceso secuencial, use la siguiente sintaxis para la instruccin Open: Open nombre-ruta-acceso For [Input | Output | Append] As nmero-archivo [Len = tamao-bfer] Cuando abre un archivo secuencial para Input, el archivo ya debe existir; de lo contrario se produce un error. Sin embargo, cuando intenta abrir un archivo que no existe para Output o Append, la instruccin Open primero crea el archivo y luego lo abre. El argumento Len opcional especifica el nmero de caracteres que se deben incluir en el bfer cuando se copian datos entre el archivo y su programa. Despus de haber abierto un archivo para una operacin Input, Output o Append, debe cerrarlo mediante la instruccin Close antes de volverlo a abrir para otro tipo de operacin. Modificacin de archivos abiertos para acceso secuencial Si desea modificar un archivo, lea primero su contenido en variables del programa, luego cambie las variables y, finalmente, vuelva a escribir las variables en el archivo. Las siguientes secciones tratan de cmo modificar registros que se han abierto para acceso secuencial.

23

Lectura de cadenas desde archivos Para recuperar el contenido de un archivo de texto, abra el archivo para entrada secuencial. A continuacin use la instruccin Line Input #, Input() o Input # para copiar el archivo en las variables del programa. Visual Basic proporciona instrucciones y funciones que leen y escriben en archivos secuenciales carcter a carcter o lnea a lnea. Por ejemplo, el siguiente fragmento de cdigo lee un archivo de lnea en lnea: Dim LinesFromFile, NextLine As String Do Until EOF(FileNum) Line Input #FileNum, NextLine LinesFromFile = LinesFromFile + NextLine + Chr(13) + Chr(10) Loop A pesar de que Line Input # reconoce el final de una lnea cuando llega a la secuencia retorno de carro y avance de lnea, no lo incluye cuando lee la lnea en la variable. Si quiere conservar el retorno de carro y el avance de lnea, el cdigo debe agregarlo. Tambin puede usar la instruccin Input #, que lee una lista de nmeros o expresiones de cadena escritas en el archivo. Por ejemplo, para leer una lnea de un archivo de lista de correo, podra usar la siguiente instruccin: Input # FileNum, nombre, calle, ciudad, provincia, cdigo_postal Tambin puede usar la funcin Input para copiar cualquier nmero de caracteres de un archivo a una variable, siempre y cuando la variable sea lo suficientemente grande. Por ejemplo, el siguiente cdigo usa Input para copiar de una vez un archivo entero a una variable: LinesFromFile = Input(LOF(FileNum), FileNum) Escritura de cadenas en archivos Para almacenar el contenido de las variables en un archivo secuencial, bralo para Output o Append secuencial y, a continuacin, use la instruccin Print#. Por ejemplo, un editor de texto podra usar la siguiente lnea de cdigo para copiar el contenido de un cuadro de texto a un archivo: Print# FileNum, TheBox.Text Visual Basic tambin admite la instruccin Write #, que escribe una lista de nmeros o expresiones de cadena en un archivo. Separa automticamente cada expresin con una coma y pone comillas alrededor de las expresiones de cadena: Dim AnyString As String, AnyNumber As Integer AnyString = "AnyCharacters" AnyNumber = 23445 Write #FileNum, AnyString, AnyNumber Este fragmento de cdigo escribe dos expresiones en el archivo especificado por FileNum. La primera contiene una cadena y la segunda contiene el nmero 23445. Por tanto, Visual Basic escribe los siguientes caracteres (incluyendo todos los signo de puntuacin) en el archivo: "AnyCharacters",23445 Nota Si est usando Write # e Input # con acceso secuencial, considere la posibilidad de usar acceso aleatorio o binario, ya que son ms adecuados para datos orientados a registros. Uso del acceso aleatorio a archivos Los bytes en los archivos de acceso aleatorio forman registros idnticos, cada uno de los cuales contiene uno o ms campos. Un registro con un campo corresponde a cualquier tipo estndar, como un entero o una cadena de longitud fija. Un registro con ms de un campo corresponde a un tipo definido por el usuario. Por ejemplo, el tipo Trabajador definido a continuacin crea registros de19 bytes que se componen de tres campos: Type Trabajador Apellido As String * 10 Puesto As String * 7
24

Rango End Type

As String * 2

Declaracin de variables Antes de que su aplicacin abra un archivo para acceso aleatorio, debe declarar todas las variables necesarias para controlar los datos del archivo. Esto incluye los tipos definidos por el usuario, que corresponden a registros del archivo, as como los tipos estndar para otras variables que contienen datos relacionados con el procesamiento de un archivo abierto para acceso aleatorio. Definicin de tipos de registros Antes de abrir un archivo para acceso aleatorio, defina un tipo que corresponda a los registros que contiene o contendr el archivo. Por ejemplo, un archivo Registro de empleados podra declarar un tipo de datos definidos por el usuario llamado Persona como sigue: Type Persona ID As Integer SueldoMensual As Currency FechaltimaRevisin As Long Nombre As String * 15 Apellido As String * 15 Puesto As String * 15 ComentariosRevisin As String * 150 End Type Declaracin de variables de campo en una definicin de tipo Puesto que todos los registros de un archivo de acceso aleatorio deben tener la misma longitud, a veces es til tener una longitud fija para los elementos de cadena en un tipo definido por el usuario, como se muestra en la declaracin del tipo Persona, donde por ejemplo, Nombre y Apellido tienen una longitud fija de 15 caracteres. Si la cadena contiene menos caracteres que la longitud fija del elemento de cadena en el que est escrito, Visual Basic llena los espacios a la derecha del registro con espacios en blanco (cdigo de carcter 32). Por otra parte, si la cadena es ms larga que el tamao del campo, sta se trunca. Si usa cadenas de longitud variable, el tamao total de cualquier registro almacenado con Put o recuperado con Get no debe exceder la longitud del registro especificado en la clusula Len de la instruccin Open. Declaracin de otras variables Despus de haber definido un tipo que corresponde a un registro tpico, declare cualquier otra variable que necesite su aplicacin para procesar un archivo abierto para acceso aleatorio. Por ejemplo: ' Una variable de registro. Public Empleado As Persona ' Hace un seguimiento de la posicin actual. Public Posicin As Long ' El nmero del ltimo registro en el archivo. Public ltimoRegistro As Long Apertura de archivos para acceso aleatorio Para abrir un archivo para acceso aleatorio, use la siguiente sintaxis para la instruccin Open: Open nombre-ruta-acceso [For Random] As nmero-archivo Len = longitud-reg Como Random es el tipo de acceso predeterminado, las palabras clave For Random son opcionales. La expresin Len = longitud-reg especifica el tamao de cada registro. Si longitud-reg es menor que la longitud real del registro escrito en el archivo, se produce un error. Si longitud-reg es mayor que la longitud real del registro, se escribe el registro, aunque puede que se desperdicie espacio en el disco. Podra usar el siguiente cdigo para abrir un archivo: Dim NmArch As Integer, LongitudReg As Long, Empleado As Persona ' Calcula la longitud de cada registro. LongitudReg = Len(Empleado) ' Obtiene el siguiente nmero de archivo disponible.
25

NmArch = FreeFile ' Abre el archivo nuevo con la instruccin Open. Open "MIARCH.FIL" For Random As NmArch Len = LongitudReg Modificacin de archivos abiertos para acceso aleatorio Si quiere modificar un archivo de acceso aleatorio, primero lea los registros del archivo en las variables del programa, luego cambie los valores en las variables y, finalmente, escriba las variables otra vez en el archivo. Las siguientes secciones tratan de cmo modificar los archivos abiertos para acceso aleatorio. Lectura de registros en variables Use la instruccin Get para copiar los registros en las variables. Por ejemplo, para copiar un registro del archivo Registro de empleado en la variable Empleado, podra usar el siguiente cdigo: Get NmArch, Posicin, Empleado En esta lnea de cdigo, NmArch contiene el nmero que la instruccin Open us para abrir el archivo, Posicin contiene el nmero de registro del registro que se va a copiar y Empleado, declarado como el tipo definido por el usuario Persona, recibe el contenido del registro. Escritura de variables en registros Use la instruccin Put para agregar o reemplazar registros en los archivos abiertos para acceso aleatorio. Reemplazo de registros Para reemplazar registros, use una instruccin Put, especificando la posicin del registro que quiere reemplazar; por ejemplo: Put #NmArch, Posicin, Empleado Este cdigo reemplazar el nmero de registro especificado por Posicin con los datos de la variable Empleado. Agregar registros Para agregar registros al final de un archivo abierto para acceso aleatorio, use la instruccin Put que se muestra en el fragmento de cdigo anterior. Establezca el valor de la variable Posicin a uno ms que el nmero de registros del archivo. Por ejemplo, para agregar un registro a un archivo que contiene cinco registros, establezca Posicin a 6. La siguiente instruccin agrega un registro al final del archivo: ltimoRegistro = ltimoRegistro + 1 Put #NmArch, ltimoRegistro, Empleado Eliminacin de registros Podra eliminar un registro si borra sus campos, pero el registro todava existira en el archivo. Normalmente no querr tener registros vacos en el archivo, ya que desperdician espacio e interfieren en las operaciones secuenciales. Es mejor copiar los registros restantes a un archivo nuevo y eliminar el archivo antiguo. 1 Cree un archivo nuevo. 2 Copie todos los registros vlidos del archivo original al archivo nuevo. 3 Cierre el archivo original y use la instruccin Kill para eliminarlo. 4 Use la instruccin Name para cambiar el nombre del archivo nuevo por el nombre del archivo antiguo. Uso del acceso binario a archivos El acceso binario le ofrece el control total sobre un archivo, ya que los bytes del archivo pueden representar cualquier cosa. Por ejemplo, puede ahorrar espacio de disco si crea registros de longitud variable. Use el acceso binario cuando sea importante que el tamao de un archivo sea pequeo. Nota: Cuando escriba datos binarios a un archivo, use una variable que sea una matriz de tipo de datos Byte, en vez de una variable String. Se supone que las cadenas contienen caracteres y los datos binarios puede que no se almacenen correctamente en variables String. Apertura de un archivo para acceso binario Para abrir un archivo para acceso binario, use la siguiente sintaxis para la instruccin Open: Open nombre-ruta-acceso For Binary As nmero-archivo

26

Como puede ver, el uso de Open para acceso binario se diferencia del acceso aleatorio en que no se especifica Len = longitud-reg. Si incluye una longitud de registro en una instruccin Open para acceso binario, esta se pasa por alto. Almacenamiento de informacin en registros de longitud variable Para apreciar mejor el acceso binario, considere el archivo hipottico Registro de empleados. Este archivo usa registros de longitud fija para Type Persona ID As Integer SueldoMensual As Currency FechaltimaRevisin As Long Nombre As String * 15 Apellido As String * 15 Puesto As String * 15 ComentariosRevisin As String * 150 End Type Independientemente del contenido real de los campos, cada registro de ese archivo ocupa 209 bytes. Puede minimizar el uso del espacio de disco si usa el acceso binario. Puesto que no requiere campos de longitud fija, la declaracin del tipo puede omitir los parmetros de longitud de cadena. Type Persona ID As Integer SueldoMensual As Currency FechaltimaRevisin As Long Nombre As String Apellido As String Puesto As String ComentariosRevisin As String End Type Public Empleado As Persona ' Define un registro. El registro de cada empleado en el archivo Registro de empleados ahora slo almacena el nmero exacto de bytes necesarios, ya que los campos son de longitud variable. El inconveniente de las entradas y salidas binarias con campos de longitud variable es que no puede tener acceso a los registros aleatoriamente; debe tener acceso a los registros de forma secuencial para saber la longitud de cada registro. Puede buscar directamente una posicin de byte especificada en un archivo, pero no hay un modo directo de saber qu registro est en cada posicin si los registros son de longitud variable.

27

También podría gustarte