Vous êtes sur la page 1sur 27

VISUAL BASIC: ACCESO A DATOS

Casi todas las aplicaciones necesitan algún tipo de almacenamiento y manipulación 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. Manipulación de datos con código
5. Control de transacciones
6. Procesamiento de archivos

Aplicaciones de ejemplo: Biblio.vbp y Visdata.exe


Muchos de los ejemplos están tomados de la aplicación de base datos de ejemplo Biblio.vbp. Encontrará esta
aplicación 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 también sirve como bibliografía de libros actuales sobre bases de datos.
Visual Basic incluye Visdata (Visdata.exe), una aplicación de ejemplo que le permite crear y modificar bases
de datos que puede utilizar con el control Data. Visdata se suministra con el código de origen completo e
ilustra todas las funciones de acceso a datos disponibles. Por esta razón es una fuente de ideas excelente, así
como de ejemplos de código para "cortar y pegar". Puede tener acceso a Visdata a través del menú
Complementos. Encontrará esta aplicación 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 información de
muchos de los tipos existentes de bases de datos, incluyendo Access. También puede utilizarlo para tener
acceso a Excel y archivos de texto ASCII estándar como si fueran auténticas bases de datos. Además, 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 tecnología le proporciona acceso transparente a muchos formatos estándar de
bases de datos y le permite crear aplicaciones relacionadas con datos sin escribir código.

Qué puede hacer con el control Data


Puede usar el control Data para crear aplicaciones sencillas de bases de datos sin escribir código. También
puede utilizarlo junto con código de Visual Basic para crear aplicaciones con todas las funciones que le dan
un alto grado de control de programación sobre el comportamiento de los datos de su aplicación. Este tema
presenta un planteamiento sencillo sin código. Los siguientes temas presentarán ejemplos de programación
más complejos.

El control Data puede llevar a cabo las siguientes tareas sin utilizar código:
• Conectar con una base de datos local o remota.
• Abrir una tabla de base de datos específica 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 aplicación de base de datos, agregue el control Data a sus formularios de la misma manera
que lo haría con cualquier otro control de Visual Basic. Puede tener tantos controles de datos en el formulario

1
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
información.
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 aplicación, estos controles enlazados mostrarán automáticamente 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 diseño. Muchas de estas propiedades también se pueden establecer
en tiempo de ejecución en el código de Visual Basic.

Para usar el control Data, debe establecer como mínimo 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), también 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 válido para la propiedad DataField de cada uno de los controles enlazados.

También puede establecer o cambiar en tiempo de ejecución las propiedades de los controles enlazados y del
control Data. Cuando estén establecidas las propiedades correctas, puede usar el método 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.

Creación de una aplicación simple de base de datos


El siguiente procedimiento le ofrece una breve introducción sobre cómo usar el control Data en una
aplicación 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 botón de control de datos tiene esta apariencia:

Después de dibujar el control en el formulario y ajustar su tamaño correcto, aparecerá el título 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.

2
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
diseño, necesitará rellenar las propiedades DatabaseName y RecordSource en tiempo de ejecución. 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 información de la base de datos.


Este control se utilizará para mostrar y modificar un campo seleccionado de la base de datos. También
puede usar otros controles enlazados a datos, incluyendo casillas de verificación, cuadros de imagen,
etiquetas, cuadros de lista, cuadros combinados y controles de cuadrícula.

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.

3
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.

10Ahora ejecute la aplicación. Puede usar los cuatro botones de dirección del control Data para ir al
principio de los datos, al final de los mismos o de registro en registro a través de los datos.

Puede modificar la información de la base de datos si cambia el valor que se muestra en cualquiera de los
controles enlazados. Cuando haga clic en un botón del control Data para ir a un registro nuevo, Visual Basic
guardará automáticamente todos los cambios que haya realizado a los datos.

Por supuesto, puede agregar código a su aplicación para mejorarla. El resto de este capítulo muestra cómo
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.

Descripción del diseño y la estructura de las bases de datos


El control Data proporciona una interfaz relacional con los archivos de las bases de datos. Básicamente, 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 físico 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 términos relacionales.

4
Tablas: Una tabla es una agrupación lógica de información organizada en columnas y filas, similar a una
tabla de hoja de cálculo. Por ejemplo, una tabla podría contener una lista de información sobre autores, como
sus nombres, fechas de nacimiento, direcciones y fotografías.

Campos: Cada columna de una tabla de base de datos se llama campo. Las tablas están 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 máxima y otros atributos. Los campos pueden contener
caracteres, números o incluso gráficos. Por ejemplo, la tabla Authors podría tener campos con el nombre y la
dirección como el tipo de datos carácter, la fecha de nacimiento como el tipo de datos fecha y la fotografía
del autor como el tipo de datos gráfico.

Registros: La información 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 tendría dos autores con el mismo apellido en la misma dirección y con la misma
fecha de nacimiento.

Índices: Para que el acceso a los datos sea más rápido, la mayoría de las bases de datos usan índices. Los
índices de las tablas de bases de datos son listas ordenadas en las que es más rápido 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 búsquedas) puede examinar un índice cuando empieza a buscar registros
(llevar a cabo una consulta), su trabajo se facilita y los datos se devuelven más rápidamente. Cuando usa
conjuntos de registros de tipo table con el control Data, el índice principal de la tabla se utiliza para acelerar
la recuperación.

Lenguaje de consulta estructurado (SQL)


Cuando se almacenan los datos en la base de datos, es más fácil recuperarlos mediante un lenguaje parecido
al inglés llamado SQL. SQL se ha convertido en el medio más generalizado para "conversar" con una base de
datos. Básicamente, 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 búsqueda. Por ejemplo, una consulta SQL en nuestra tabla Authors podría tener esta apariencia:
"Select Name, Picture from Authors where Date_of_Birth = #2/7/1947# "

Esta consulta SQL devolvería el nombre y la fotografía de todos los autores cuya fecha de nacimiento fuera
el 7 de febrero de 1.947. Si devolviera alguna fila, podría usar controles enlazados para ver los valores.

Puesto que muchas de las bases externas que Visual Basic reconoce no tienen un diseño relacional, Visual
Basic necesita convertir las estructuras de las bases de datos externas a un modelo relacional. Su código no
tendrá que proporcionar ninguna lógica específica para permitir esta traducción; una vez que se ha abierto la
base de datos, todo esto se hace automáticamente.

Para comprender mejor el diseño y la estructura de una base de datos, puede ejecutar la aplicación 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 títulos adicionales sobre el diseño,
creación 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).

Descripción 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 Descripción

5
Recordset de tipo table (dbOpenTable) Un conjunto de registros que representa una única tabla de
base de datos que puede utilizar para agregar, cambiar o eliminar registros.
Recordset de tipo dynaset (dbOpenDynaset) Un conjunto de registros dinámico que representa una tabla
de base de datos o los resultados de una consulta que contiene campos de una
o más tablas. Puede agregar, cambiar o eliminar registros de un objeto
Recordset de tipo dynaset y los cambios se reflejarán en las tablas
subyacentes.
Recordset de tipo snapshot (dbOpenSnapshot) Una copia estática 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 más 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
aplicación seleccione campos de más de una tabla y está trabajando con un origen que no sea ODBC, el
objeto Recordset de tipo table puede ser el más 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 código (no disponibles en la Edición de aprendizaje de Visual Basic)
se pueden asignar a la propiedad Recordset del control Data, mediante la instrucción 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 ejecución.

El motor de base de datos Jet proporciona un gran número de métodos y propiedades de bases de datos y
conjuntos de registros. Puede usar directamente estas propiedades y métodos 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 través de los cuales se tiene acceso a la
información 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
automáticamente 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 explicación completa de los controles enlazados, consulte "Uso del cuadro de lista y el cuadro
combinado enlazados a datos", más adelante en este mismo capítulo. Esta sección utiliza el cuadro de texto
para ilustrar los principios básicos del uso de controles enlazados.

La mayoría de los controles enlazados se caracterizan por tres propiedades relacionadas con datos:
DataChanged, DataField y DataSource.

Propiedad Descripción
DataChanged Indica si un valor que se muestra en un control enlazado ha cambiado.
DataField Especifica el nombre de un campo del conjunto de registros creado por el control Data.
DataSource Especifica el nombre del control Data al que se enlaza el control.

Los pasos para agregar controles enlazados a su aplicación 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 válido en el conjunto de registros del control Data.

6
Si la base de datos está disponible en tiempo de diseño, aparecerá una lista de campos válidos en el cuadro
Valores de DataField en la ventana Propiedades. Si la base de datos no está disponible en tiempo de diseño,
necesitará proporcionar un nombre de campo válido en tiempo de ejecución antes de que los valores de los
datos se envíen al control desde la base de datos.

Puede tener más 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 diseñe si
manipula el control Data con el código de Visual Basic.

Cuando ejecute su aplicación, 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 dirección 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 botón del control Data, Visual Basic actualiza automáticamente los
cambios que ha realizado al conjunto de registros.

Con el código de Visual Basic también es posible usar controles enlazados a datos sin enlazarlos a un control
de datos, usando para ello la colección DataBindings del control dependiente.

Tipos de controles enlazados


Visual Basic admite varios controles integrados (intrínsecos) que puede enlazar al control de datos, así como
varios controles ActiveX (.ocx) enlazados a datos (anteriormente llamados controles personalizados o
controles OLE).

Controles intrínsecos: Los controles enlazados estándar que puede usar con el control Data son los
siguientes:
• Casilla de verificación
• Imagen
• Etiqueta
• Cuadro de imagen
• Cuadro de texto
• Cuadro de lista
• Cuadro combinado
• Control contenedor OLE

Controles ActiveX: Además de los controles enlazados intrínsecos, Visual Basic también 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.

Además, hay tres controles especiales que le permiten llevar a cabo tareas complejas de presentación y
actualización de bases de datos con múltiples 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 diálogo Referencias del menú Proyecto. También debe registrar la biblioteca de
Objetos de acceso a datos (DAO) mediante el cuadro de diálogo Referencias.

7
Agregar, actualizar y eliminar registros
Puede agregar, actualizar y eliminar automáticamente registros mediante el control Data y los controles
enlazados a datos. Para mayor flexibilidad y control, también puede escribir código de Visual Basic para
llevar a cabo estas operaciones, usando métodos del objeto Recordset del control Data.

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
más 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:

Opción Valor Acción


vbEOFActionMoveLast 0 Se usó un método MoveLast, situando el registro actual en el último
registro del conjunto de registros y evitando que el usuario se desplace
más allá del final del conjunto de registros.
vbEOFActionEOF 1 Sitúa el registro actual en el registro no válido (EOF) y desactiva el
botón IrAlSiguiente del control Data.
vbEOFActionAddNew 2 Valida el último registro e invoca automáticamente el método AddNew;
a continuación sitúa el control Data en el registro nuevo.

Con la propiedad EOFAction establecida a vbEOFActionAddNew, cuando el usuario se desplaza más allá del
último registro, el control Data crea automáticamente un registro nuevo y permite al usuario escribir datos. Si
se introducen nuevos datos, al desplazarse fuera del registro actual (nuevo) se producirá automáticamente
una actualización 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 método proporciona una forma cómoda de introducir varios registros nuevos de manera consecutiva.
Los usuarios sólo tienen que ir al final de la base de datos y usar el botón IrAlSiguiente para ir un registro
más allá del último registro del archivo. Luego pueden empezar a agregar registros nuevos, desplazando
hacia delante el conjunto de registros después de introducir cada registro. El control Data controla
automáticamente la inserción y actualización de los registros.

Actualización o eliminación de un registro


Para actualizar o eliminar un registro con el control Data, sólo 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 automáticamente la actualización o eliminación 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 estándar 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 automáticamente desde un campo de una base de datos del control Data al
que están enlazados. Además pueden pasar, de manera opcional, un campo seleccionado a un segundo
control de datos, por lo que resultan ideales para aplicaciones de "tablas de búsqueda". Este tipo de
aplicaciones ofrecen al usuario la capacidad de limitar una búsqueda seleccionando un criterio en una lista
desplegable. Por ejemplo, una aplicación de base de datos de informes de ventas podría usar un cuadro de
lista enlazado a datos para permitir al usuario elegir una provincia o una región de ventas. Cuando se haya
hecho una selección, ésta se pasa automáticamente al segundo control de datos que se coloca en los registros
de ventas de la región seleccionada.

8
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 mayoría 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 Descripción
DataSource El nombre del control Data al que están enlazados el cuadro de lista o el cuadro
combinado enlazado a datos.
DataField 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 selección, es este campo el que se actualizará cuando se desplace a un registro
nuevo.
RowSource El nombre del control Data que se usará para llenar la lista.
BoundColumn 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.
ListField El nombre de un campo del conjunto de registros especificado por RowSource que se
usará para llenar la lista.

Nota También 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á automáticamente al campo ListField.

Un uso común 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 títulos nuevos y
asignarlos a los editores existentes, proporcionando una tabla de búsqueda 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).
9
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.

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

Los campos DataField y BoundColumn deben ser idénticos, pero en diferentes tablas; es decir, estos campos
deben reflejar una relación 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 título se muestra en la parte de cuadro de texto del cuadro
combinado enlazado a datos. A continuación, cambie el nombre haciendo una nueva selección 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 código para hacer referencia a la fila del conjunto de registros
que contiene el elemento seleccionado.

MatchEntry
La propiedad MatchEntry activa el modo de búsqueda extendida de forma que pueda encontrar fácilmente
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 búsqueda. 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 búsqueda se borra cuando
el control cambia de enfoque o cuando el usuario presiona RETROCESO. Si MatchEntry está establecida a
False, el argumento de búsqueda está limitado a un carácter.

IntegralHeight y VisibleCount
Si el número de elementos excede el número de elementos que se pueden mostrar, se agrega
automáticamente al control una barra de desplazamiento. Puede evitar que se muestren filas parciales si
establece la propiedad IntegralHeight, que automáticamente fija el tamaño del cuadro de lista enlazado a
datos o el cuadro combinado enlazado a datos para que muestren un número exacto de filas completas. Puede
determinar el número de elementos visibles en la lista si examina la propiedad VisibleCount.
10
3. El control DBGrid

El control Apex Data-Bound Grid (DBGrid) es un control dependiente parecido a una hoja de cálculo 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
automáticamente y sus encabezados de columna se establecen automáticamente 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.
También 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 diseño 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 ejecución.

El control DBGrid depende de otros dos objetos:


• El objeto Recordset del control de datos
• La colección Columns del control DBGrid propiamente dicho

DBGrid es realmente una colección de objetos Column, cada uno con un número 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 colección Columns del control determina el número de columnas y la
propiedad RecordCount del objeto Recordset del control de datos determina el número de filas.

Durante la operación, las propiedades Row y Col especifican la celda actual de una cuadrícula. Puede
especificar la celda actual en el código o el usuario puede cambiarla en tiempo de ejecución mediante el
mouse (ratón) o las teclas de dirección. Cuando el usuario cambia la celda actual, los datos subyacentes se
vuelven a colocar automáticamente 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 rápida 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 código.

Antes de usar DBGrid, debe asegurarse de que el control está disponible para el proyecto. Si es necesario,
agréguelo en la ficha Controles del cuadro de diálogo Componentes, disponible a través 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 aplicación.

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. Además,
puede modificar cualquier celda de la tabla y ésta se actualizará automáticamente 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


Además de las operaciones enlazadas a datos descritas en esta sección, el control Apex Data-Bound Grid
(DBGrid) también puede funcionar en modo independiente.
11
En modo enlazado, los datos se recuperan y actualizan automáticamente 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 través de los eventos independientes se le pida que lo haga.

El modo independiente se puede usar para mostrar datos que están 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 programación
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 través de la propiedad DataMode del control DBGrid. Esta propiedad
sólo está disponible en tiempo de diseño. Los valores permitidos para la propiedad DataMode son:

Opción Valor Descripción


dbgBound 0 Establece que DBGrid muestre datos del origen de datos enlazado.
DbgUnbound 1 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 ningún tipo de origen de datos en particular. La sincronización entre el origen de datos y los datos
mostrados en el DBGrid la debe llevar a cabo la aplicación. El DBGrid pasa de administrar automáticamente
sus datos a enviarle mensajes de notificación a través de eventos especiales independientes para que, de esta
forma, la aplicación 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 automáticamente del
origen de datos subyacente. Sin embargo, cuando elimina una fila de un DBGrid independiente, se notifica a
su aplicación a través de un evento (en este caso el evento UnboundDeleteRow). El evento alerta a la
aplicación de que el usuario ha eliminado una fila de la cuadrícula 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 diseño del control DBGrid


Cuando se crea por primera vez, el control Apex Data-Bound Grid (DBGrid) tiene una única columna y una
única fila. También contiene una fila vacía (designada por un asterisco (*) en tiempo de ejecución) que se usa
para agregar nuevos registros. Puede cambiar cualquiera de los atributos visibles del control DBGrid a través
de las preferencias en la ventana Propiedades.

Al establecer la propiedad DataSource, el control DBGrid se enlaza automáticamente al conjunto de registros


creado por el control de datos; luego establece el número 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 tamaño. 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 botón secundario del mouse (ratón) 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.

12
Nota Si establece cualquiera de las propiedades de columna de DBGrid en tiempo de diseño, necesitará
establecerlas todas para mantener los valores actuales.

Cada control DBGrid tiene una única página de propiedades; sin embargo, cada objeto Column tiene su
propia página. Puede usar estas páginas de propiedades para establecer de forma interactiva las propiedades
del control DBGrid como un todo o para las columnas seleccionadas individualmente.

La página de propiedades General muestra las propiedades que son aplicables a todo el control DBGrid y se
pueden evaluar en tiempo de diseño. Estas propiedades también está disponibles en la ventana Propiedades
estándar.

La página de propiedades del objeto Column muestra las propiedades para una columna individual. Si se
seleccionan múltiples columnas, está seleccionada la columna que está más a la izquierda en la página de
propiedades Columnas. Establecer las propiedades del objeto Column no afecta a las propiedades generales
del control DBGrid.

La página de propiedades Colores permite seleccionar los colores generales del control DBGrid. Los colores
del objeto Column no se ven afectados por estos valores.

La página 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 demás columnas. En tiempo de diseño, puede establecer el
ancho de las columnas y el alto de las filas y establecer columnas que no sean visibles para el usuario.
También puede evitar que los usuarios cambien el formato en tiempo de ejecución.

Si el texto de una celda es demasiado largo para mostrarlo en la celda, se ajustará automáticamente a la
siguiente línea 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 diseño puede
cambiar el ancho de la columna de manera interactiva si cambia el tamaño de la columna o cambia el ancho
de ésta con la página de propiedades del objeto Column.

Operaciones en tiempo de ejecución del control DBGrid


El control Apex Data-Bound Grid (DBGrid) muestra registros del objeto Recordset subyacente en tiempo de
ejecución. Siempre hay un único registro actual en el control DBGrid, incluso si hay seleccionadas múltiples
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.

Selección 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
cálculo. No obstante, no proporciona ninguna funcionalidad automática para trabajar con rangos (como

13
copiar, eliminar o mover "bloques" enteros de campos o registros). Si desea implementar esa capacidad,
tendrá que hacerlo en el código.

La información sobre los rangos seleccionados se devuelve de dos modos:


• Las columnas inicial y final de la sección se devuelven en las propiedades SelStartCol y SelEndCol.
• Los marcadores de las filas seleccionadas están disponibles en la colección proporcionada por la
propiedad SelBookmarks.

Por ejemplo, para eliminar un rango seleccionado de registros:


1. Recorra la colección SelBookmarks, usando la propiedad Count para detectar los límites de la colección.
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 colección SelBookmarks y elimine el registro.
Estos pasos se ilustran en el siguiente ejemplo de código:
Private Sub DeleteRows_Click ()
Do While DataGrid1.SelBookmarks.Count <> 0
Data1.Recordset.Bookmark _
= DataGrid1.SelBookmarks(0)
Data1.Recordset.Delete
Loop
End Sub

Presentación 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 sería mostrar una columna de "impuestos de ventas" cuando
la base de datos sólo contiene un campo "precio". Si los impuestos de ventas en su localidad son del 7%, el
cálculo para el impuesto de ventas sería "precio x ,07."
1 Agregue un campo independiente al control DBGrid.
2 En el evento RowLoaded, lleve a cabo el cálculo y asigne el resultado a la propiedad Value del objeto
Column.

4. Manipulación de registros con código

El control de datos ofrece un alto grado de funcionalidad que puede usar sin escribir código, con sólo
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 código 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 código para ir al último registro del conjunto de registros, puede tratar el
conjunto de registros como un objeto y después aplicarle el método MoveLast:
Datos1.Recordset.MoveLast

O bien, si quiere comprobar el valor de un campo específico en el registro actual, podría escribir:
MiCadena = Datos1.Recordset.Fields("Título").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
básicos del trabajo con objetos" en el capítulo 5, "Fundamentos de programación".

Desplazamiento por un conjunto de registros


Desplazarse se refiere a moverse o cambiar el registro actual de un conjunto de registros. Ya ha visto cómo
moverse de un registro a otro mediante los botones de dirección del control de datos. Las flechas de los
botones se corresponden con los métodos del objeto Recordset que puede usar para llevar a cabo las mismas
acciones en código.

Las flechas sencillas del control de datos se corresponden con los métodos MoveNext y MovePrevious,
mientras que las flechas dobles se corresponden con los métodos 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, sólo 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 capítulo, le dan cierto control sobre este estado; también puede escribir código para
comprobar las propiedades BOF y EOF. El estado de estas dos propiedades determina la posición del registro
actual, tal y como se muestra en la siguiente tabla:

Estados de BOF/EOF Significado


BOF y EOF son ambas False El puntero de registro actual es válido, a menos que no se haya movido
después de eliminar el último registro del conjunto de registros.
BOF = True El registro actual se coloca por delante del primer registro de datos. El
puntero de registro actual no es válido.
EOF = True El registro actual se coloca por detrás del último registro de datos. El
puntero de registro actual no es válido.
BOF y EOF son ambas True No hay ninguna fila en el conjunto de resultados. El registro actual no es
válido.

Ir al primer o al último registro


Para ir al principio del conjunto de registros, use el método MoveFirst: Data1.Recordset.MoveFirst
Para ir al final del conjunto de registros, use el método MoveLast: Data1.Recordset.MoveLast

Ir al siguiente registro
El método 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 más 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 están establecidas a 1 ("BOF" y
"EOF" respectivamente), en este punto ya no tendrá un registro actual válido y se borrarán los controles
enlazados. Si usa un método Move que se desplace más allá de BOF o EOF, Visual Basic generar un error
interceptable. Debido a este diseño, 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 código para trabajar con el registro
' actual...
Loop
Al final de este bucle, el puntero de registro actual no es válido y debe usar el método MoveLast para volver
a situarlo.

Ir al registro anterior
El método MovePrevious hace que el registro anterior sea el actual. Este método funciona como el método
MoveNext, excepto en que mueve el puntero de registro actual hacia el principio del conjunto de registros.

Otros métodos para moverse por el conjunto de registros


Además de los métodos Move descritos anteriormente, puede usar el método Move con un argumento entero
para moverse un número específico de filas hacia delante o hacia atrás del registro actual. También puede
usar las propiedades AbsolutePosition y PercentPosition del objeto Recordset para moverse por el conjunto
de registros.

Búsqueda de un registro específico


Los métodos Move le permiten desplazarse por un conjunto de registros de registro en registro. No obstante,
en muchos casos puede que desee buscar un registro específico. Parar encontrar registros específicos puede
15
usar los métodos Find con objetos Recordset de tipo dynaset y snapshot y el método Seek con objetos
Recordset de tipo table.

Uso de los métodos Find


Puede usar los siguientes métodos 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 método Seek, que se
describe en la siguiente sección). Visual Basic admite cuatro métodos Find:
• El método FindFirst encuentra el primer registro que satisface los criterios especificados.
• El método FindLast encuentra el último registro que satisface los criterios especificados.
• El método FindNext encuentra el siguiente registro que satisface los criterios especificados.
• El método FindPrevious encuentra el registro anterior que satisface los criterios especificados.

Al usar los métodos Find se especifican los criterios de búsqueda; normalmente una expresión que iguala el
nombre de un campo con un valor específico. Por ejemplo, el siguiente código ilustra cómo 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 método
FindLast y luego usa FindPrevious en vez del método FindNext.

Uso del método Seek


Puede usar el método Seek para encontrar un registro en un Recordset de tipo table. El método Seek sólo
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 método Seek es:
tabla.Seek comparación, clave1, clave2 ...

donde tabla es una variable del conjunto de registros que hace referencia a la tabla en la que está buscando,
comparación es una cadena que determina el tipo de comparación 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 comparación que puede utilizar con Seek.

Cadena de comparación Descripción


"=" 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 múltiples, los valores clave de la derecha se pueden omitir y se
tratan como Null. Es decir, puede no escribir cualquier número de valores clave desde el final de los
argumentos clave de un método Seek, pero no desde el principio o la mitad.

Si usa el método Seek en un objeto Recordset de tipo table sin haber establecido primero el índice actual, se
produce un error de tiempo de ejecución.

El siguiente ejemplo usa un control de datos cuyo conjunto de registros es una tabla llamada Productos y usa
el método 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 método Update. Los pases posteriores
por el bucle encuentran el siguiente registro que satisface la condición.
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 ningún registro.
' Activa la edición.
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 específico


Los marcadores le permiten guardar un puntero de registro actual y volverlo a colocar directamente en un
registro específico. 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 código 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 ubicación guardada.

Si no conoce el número de orden físico 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.

Actualización de un conjunto de registros mediante código


Para actualizar la información 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.

Además debe abrir el control de datos con la propiedad ReadOnly establecida a False. El siguiente código
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 método 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 método Update. El puntero de registro actual se restaura a su valor
original (el valor del puntero de registro antes de usar el método AddNew).

El siguiente código agrega un título 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 código anterior, el campo PubID se refiere al campo PubID de la tabla Publishers. Su
código debe comprobar que éste es un valor correcto para que mantenga la integridad referencial de la base
de datos.

Modificación 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 después hacer todos los cambios necesarios en los controles enlazados. Para guardar los
cambios, sólo tiene que desplazar el puntero de registro actual a otro registro o usar el método Update como
se muestra en el ejemplo de código 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 método Update o cualquiera de los métodos Move, Find o Seek
– o bien –
haga clic en uno de los botones de dirección del control Data para guardar los cambios y reemplazar los
valores existentes del campo.

El siguiente código muestra cómo 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.

Modificación del valor de un campo específico


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
colección Fields. El siguiente código muestra varias formas de hacer referencia a la propiedad Value de un
campo en particular dentro de una colección. Como método abreviado, puede omitir las notaciones .Field y
.Value, ya que son propiedades predeterminadas. Por lo general, encontrará que las dos últimas formas son
las más fáciles de usar.

Data1.Recordset.Fields(0).Value ' Hace referencia al valor del primer campo.


n=0 ' Referencia indirecta por el número de índice del campo.
Data1.Recordset.Fields(n) ' Hace referencia al valor del primer campo.
Data1.Recordset.Fields("FName") ' Hace referencia al valor del campo Fname.
cadena$ = "FName" ' Referencia indirecta por el nombre del campo.
Data1.Recordset.Fields(cadena$) ' Hace referencia al valor del campo FName.
Data1.Recordset("FName") ' Fields es la colección predeterminada del objeto Recordset y, por tanto,
se puede omitir.
Data1.Recordset(n) ' También puede hacer referencia a los miembros de la colección Fields
por el número.

El siguiente ejemplo ilustra cómo 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

Eliminación de registros
Para eliminar un registro entero, coloque el puntero de registro actual en el registro que quiere quitar y use el
método Delete. Para eliminar múltiples registros debe usar MoveNext para cambiar el registro actual después
18
de cada eliminación, porque un registro eliminado ya no contiene datos válidos y si intenta tener acceso a
estos datos se producirá un error.

Un método más eficaz para eliminar múltiples registros es usar una consulta SQL DELETE, como:
"DELETE from Titles where [Year Published] < #1/1/1889#"

Cierre un conjunto de registros


El método Close cierra el conjunto de registros y libera los recursos que tenía asignados. Si se intenta usar un
método o tener acceso a un elemento de un conjunto de registros cerrado, el resultado es un error
interceptable en tiempo de ejecución. Por ejemplo, el siguiente código cierra un conjunto de registros:
Data1.Recordset.Close

Las bases de datos y sus respectivos conjuntos de registros se cierran automáticamente cuando:
• Usa el método Close en un conjunto de registros específico.
• Se descarga el formulario que contiene el control de datos.
• El programa ejecuta una instrucción End.

El evento Validate se produce cuando se usa el método 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 transacción 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 información 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 código para empezar de manera explícita una transacción. Mientras una transacción 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 transacción pendiente, el estado de la
transacción es de confirmación automática, 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 cuándo tendrán 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 también admitir transacciones o se
pasarán por alto estos comandos. Asegúrese 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 transacción, ésta
es aplicable a todas las bases de datos del espacio de trabajo, incluso bases de datos que se abren después de
que haya empezado la transacción. 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 métodos del objeto Workspace. El control
de datos incorpora esta funcionalidad de forma transparente y las instrucciones se asignan automáticamente a
los métodos 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 métodos del objeto Workspace (por ejemplo,
Workspace.BeginTrans) de manera explícita para una mayor compatibilidad en el futuro.

Comienzo de una transacción


La instrucción BeginTrans marca el comienzo de una transacción y hace que la siguiente secuencia de
operaciones no esté en modo de confirmación automática. Una vez haya empezado una transacción, debe
usar CommitTrans o Rollback antes de cerrar la base de datos o finalizar el programa. Las transacciones no
19
confirmadas se deshacen automáticamente cuando finaliza el programa. Si intenta cerrar una base de datos
mientras hay una transacción 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 transacción
se abrió con BeginTrans. Cuando ejecuta CommitTrans, todos los cambios se hacen permanentes, la
transacción actual finaliza y el estado de la transacción vuelve al modo de automática.
Deshacer cambios

Rollback invierte o deshace todos los cambios realizados en los datos durante la transacción actual. También
finaliza la transacción y la devuelve al estado de confirmación automática. El siguiente ejemplo comienza
una transacción y cambia todos los registros de PubID = 5 a PubID = 6 si el usuario confirma la acción. Si
no, finaliza la transacción 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 transacción.
MiWorkspace.BeginTrans

Do Until MiTabla.EOF
If MiTabla![PubID] = 5 Then
MiTabla.Edit 'Activa la edición.
MiTabla![PubID] = 6 'Cambia el título.
MiTabla.Update 'Guarda los cambios.
End If
MiTabla.MoveNext 'Va al siguiente registro.
Loop

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 múltiples transacciones


Los comandos de transacción siempre son aplicables a todos los conjuntos de registros abiertos en el mismo
espacio de trabajo. Como muestra el ejemplo de código anterior, esto le permite que simplemente tenga que
especificar el comando de transacción que desea (como BeginTrans) sin referencia al control de datos. No
obstante, si está trabajando con múltiples transacciones, necesitará prestar atención a la secuencia de los
comandos de transacción que emite.

Cuando se emite un comando BeginTrans, hay una transacción pendiente y todos los demás comandos de
transacción son aplicables a esa transacción pendiente. Si entonces comienza una nueva transacción 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 están más en
el interior antes de continuar con las que están más al exterior.

Validación 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 información nueva en la base de datos. También le permite especificar
qué registro será el actual después de que haya concluido el evento Validate. Validate se produce cuando se
cambia la fila actual, excepto cuando se cambia con el método 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 ningún método que produzca otro evento Validate. Por ejemplo,
no podrá llamar a AddNew o a cualquier otro método 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 Determina
guardar Si el método Update se llevará a cabo o no para guardar los cambios actuales.
acción Qué acción produjo el evento; también le permite especificar qué operación tiene lugar
después 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 automáticamente la propiedad Changed de cada control
enlazado para ver si su valor ha cambiado desde que la última acción de la base de datos lo estableció. Si ha
cambiado algún 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 acción
El argumento acción 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 después de que el evento Validate haya terminado. En el evento Validate,
Visual Basic establece el argumento acción a un valor que indica qué acción produjo inicialmente el evento.
Puede encontrar las constantes de los datos para el argumento acción en el Explorador de objetos. La
siguiente tabla resume los valores del argumento acción y las acciones producidas por el evento Validate.

Constante Valor Descripción


vbDataActionCancel 0 Cancela la acción que produjo el evento.
VbDataActionMoveFirst 1 Método MoveFirst.
VbDataActionMovePrevious 2 Método MovePrevious.
VbDataActionMoveNext 3 Método MoveNext.
VbDataActionMoveLast 4 Método MoveLast.
vbDataActionAddNew 5 Método AddNew.
vbDataActionUpdate 6 Update (no UpdateRecord).
vbDataActionDelete 7 Método Delete.
vbDataActionFind 8 Método Find.
vbDataActionBookmark 9 Se ha establecido la propiedad Bookmark.
vbDataActionClose 10 Método Close.
vbDataActionUnload 11 Se descarga el formulario.

En algunos casos puede establecer el argumento acción para especificar la manera en que Visual Basic
volverá a colocar el puntero de fila actual después de que haya terminado el evento. Esto es posible si el
evento Validate está producido por AddNew o uno de los métodos Move.

Por ejemplo, suponga que el evento Validate se ha producido porque hizo clic en el botón IrAlSiguiente del
control de datos. Cuando Visual Basic entra en el evento Validate, establece el argumento acción a 3, lo que
indica MoveNext. Después de completarse la validación, 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 acción a 2, lo que
indica MovePrevious. La rutina para volver a situar el puntero de registro actual usará el argumento acción
que ha especificado para indicar qué fila se debe establecer como la fila actual después de la transacción.

Puede especificar cualquiera de los métodos Move o AddNew para que se lleven a cabo en lugar de cualquier
otro conjunto de los métodos Move o AddNew. Si intenta cambiar cualquier acción que no sea una de los
métodos Move o AddNew, Visual Basic pasará por alto su intento y seguirá adelante con la operación que se
pretendía en primer lugar.
21
Cancelación de la acción
Si no quiere que el evento Validate vuelva a colocar el puntero de registro actual en otro registro, puede
establecer el argumento acción a 0. Establecer el argumento acción a 0 no afecta a si se guardan o no los
datos en la base de datos; solamente cancela la operación 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.

Métodos Update especiales para el acceso a datos


El método Update se usa principalmente para actualizar la información del conjunto de registros, en base a
los cambios realizados a través de los controles enlazados o mediante código. En esta sección conocerá tres
métodos adicionales que puede usar para actualizar información: UpdateRecord, UpdateControls y Refresh.
La siguiente tabla resume las acciones de estos tres métodos:

Método Descripción
UpdateRecord Actualiza la base de datos (conjunto de registros) con datos de los controles enlazados.
UpdateControls Actualiza los cambios de la base de datos (conjunto de registros) en los controles
enlazados.
Refresh Crea un nuevo conjunto de registros basado en las propiedades del control de datos.

El método UpdateRecord
El método UpdateRecord del control de datos actualiza el conjunto de registros especificado con datos de los
controles enlazados. El método 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 método no se produce ningún
evento (incluyendo Validate) y no afecta al puntero de fila actual.

El método UpdateControls
El método UpdateControls del control de datos actualiza los controles enlazados usando los valores de la fila
actual del conjunto de registros. Este método se utiliza cuando la fila actual ha cambiado, pero los controles
enlazados no se han actualizado automáticamente con los datos de la fila actual.

6. Procesamiento de archivos

Si puede diseñar su aplicación para que use archivos de base de datos, no necesitará proporcionar a su
aplicación 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 más fácil que usar técnicas 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 cómo procesar directamente archivos para crear, manipular y almacenar texto y otros datos.

Tipos de acceso a archivos


Por sí mismo, un archivo no es más que una serie de bytes relacionados ubicados en un disco. Cuando su
aplicación 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á diseñado para usarlo con archivos de texto normales. Se supone que cada carácter
del archivo representa un carácter de texto o una secuencia de formato de texto, como un carácter de nueva
línea (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 idéntica. 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 información 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 cómo 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 sólo constan de texto, como los
archivos creados con un editor de textos típico; es decir, archivos en los que los datos no están divididos en
una serie de registros. El acceso secuencial puede que no sea el adecuado para almacenar series largas de
números, ya que cada número se almacena como una cadena de caracteres. Un número de cuatro dígitos
requeriría 4 bytes de almacenamiento en vez de los 2 bytes que requiere almacenar el mismo número 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 instrucción Open:
Open nombre-ruta-acceso For [Input | Output | Append] As número-archivo [Len = tamaño-búfer]

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 instrucción Open
primero crea el archivo y luego lo abre. El argumento Len opcional especifica el número de caracteres que se
deben incluir en el búfer cuando se copian datos entre el archivo y su programa.

Después de haber abierto un archivo para una operación Input, Output o Append, debe cerrarlo mediante la
instrucción Close antes de volverlo a abrir para otro tipo de operación.

Modificación 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 cómo
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 continuación
use la instrucción 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 carácter a carácter
o línea a línea.

Por ejemplo, el siguiente fragmento de código lee un archivo de línea en línea:


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 línea cuando llega a la secuencia retorno de carro y
avance de línea, no lo incluye cuando lee la línea en la variable. Si quiere conservar el retorno de carro y el
avance de línea, el código debe agregarlo.

También puede usar la instrucción Input #, que lee una lista de números o expresiones de cadena escritas en
el archivo. Por ejemplo, para leer una línea de un archivo de lista de correo, podría usar la siguiente
instrucción:
Input # FileNum, nombre, calle, ciudad, provincia, código_postal

También puede usar la función Input para copiar cualquier número de caracteres de un archivo a una
variable, siempre y cuando la variable sea lo suficientemente grande. Por ejemplo, el siguiente código 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 continuación, use la instrucción Print#. Por ejemplo, un editor de texto podría usar la
siguiente línea de código para copiar el contenido de un cuadro de texto a un archivo:
Print# FileNum, TheBox.Text

Visual Basic también admite la instrucción Write #, que escribe una lista de números o expresiones de
cadena en un archivo. Separa automáticamente cada expresión 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 código escribe dos expresiones en el archivo especificado por FileNum. La primera
contiene una cadena y la segunda contiene el número 23445. Por tanto, Visual Basic escribe los siguientes
caracteres (incluyendo todos los signo de puntuación) 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 más adecuados para datos orientados a registros.

Uso del acceso aleatorio a archivos


Los bytes en los archivos de acceso aleatorio forman registros idénticos, cada uno de los cuales contiene uno
o más campos. Un registro con un campo corresponde a cualquier tipo estándar, como un entero o una
cadena de longitud fija. Un registro con más de un campo corresponde a un tipo definido por el usuario. Por
ejemplo, el tipo Trabajador definido a continuación crea registros de19 bytes que se componen de tres
campos:
Type Trabajador
Apellido As String * 10
Puesto As String * 7
24
Rango As String * 2
End Type

Declaración de variables
Antes de que su aplicación 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 estándar para otras variables que contienen datos relacionados con el
procesamiento de un archivo abierto para acceso aleatorio.

Definición 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 podría declarar un tipo de datos
definidos por el usuario llamado Persona como sigue:
Type Persona
ID As Integer
SueldoMensual As Currency
FechaÚltimaRevisión As Long
Nombre As String * 15
Apellido As String * 15
Puesto As String * 15
ComentariosRevisión As String * 150
End Type

Declaración de variables de campo en una definición 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 declaración 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 (código de carácter 32). Por
otra parte, si la cadena es más larga que el tamaño del campo, ésta se trunca. Si usa cadenas de longitud
variable, el tamaño total de cualquier registro almacenado con Put o recuperado con Get no debe exceder la
longitud del registro especificado en la cláusula Len de la instrucción Open.

Declaración de otras variables


Después de haber definido un tipo que corresponde a un registro típico, declare cualquier otra variable que
necesite su aplicación para procesar un archivo abierto para acceso aleatorio. Por ejemplo:
' Una variable de registro.
Public Empleado As Persona
' Hace un seguimiento de la posición actual.
Public Posición As Long
' El número 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 instrucción Open:
Open nombre-ruta-acceso [For Random] As número-archivo Len = longitud-reg
Como Random es el tipo de acceso predeterminado, las palabras clave For Random son opcionales.

La expresión Len = longitud-reg especifica el tamaño 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.

Podría usar el siguiente código para abrir un archivo:


Dim NúmArch As Integer, LongitudReg As Long, Empleado As Persona
' Calcula la longitud de cada registro.
LongitudReg = Len(Empleado)
' Obtiene el siguiente número de archivo disponible.
25
NúmArch = FreeFile
' Abre el archivo nuevo con la instrucción Open.
Open "MIARCH.FIL" For Random As NúmArch Len = LongitudReg

Modificación 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 cómo modificar los archivos abiertos para acceso aleatorio.

Lectura de registros en variables


Use la instrucción Get para copiar los registros en las variables. Por ejemplo, para copiar un registro del
archivo Registro de empleado en la variable Empleado, podría usar el siguiente código:
Get NúmArch, Posición, Empleado
En esta línea de código, NúmArch contiene el número que la instrucción Open usó para abrir el archivo,
Posición contiene el número 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 instrucción Put para agregar o reemplazar registros en los archivos abiertos para acceso aleatorio.

Reemplazo de registros
Para reemplazar registros, use una instrucción Put, especificando la posición del registro que quiere
reemplazar; por ejemplo:
Put #NúmArch, Posición, Empleado
Este código reemplazará el número de registro especificado por Posición con los datos de la variable
Empleado.

Agregar registros
Para agregar registros al final de un archivo abierto para acceso aleatorio, use la instrucción Put que se
muestra en el fragmento de código anterior. Establezca el valor de la variable Posición a uno más que el
número de registros del archivo. Por ejemplo, para agregar un registro a un archivo que contiene cinco
registros, establezca Posición a 6.
La siguiente instrucción agrega un registro al final del archivo:
ÚltimoRegistro = ÚltimoRegistro + 1
Put #NúmArch, ÚltimoRegistro, Empleado

Eliminación de registros
Podría eliminar un registro si borra sus campos, pero el registro todavía existiría en el archivo. Normalmente
no querrá tener registros vacíos 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 válidos del archivo original al archivo nuevo.
3 Cierre el archivo original y use la instrucción Kill para eliminarlo.
4 Use la instrucción 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 tamaño de un archivo sea pequeño.
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 instrucción Open:
Open nombre-ruta-acceso For Binary As número-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 instrucción Open para acceso
binario, esta se pasa por alto.

Almacenamiento de información en registros de longitud variable


Para apreciar mejor el acceso binario, considere el archivo hipotético Registro de empleados. Este archivo
usa registros de longitud fija para
Type Persona
ID As Integer
SueldoMensual As Currency
FechaÚltimaRevisión As Long
Nombre As String * 15
Apellido As String * 15
Puesto As String * 15
ComentariosRevisión 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 declaración del tipo puede omitir los parámetros de longitud de cadena.
Type Persona
ID As Integer
SueldoMensual As Currency
FechaÚltimaRevisión As Long
Nombre As String
Apellido As String
Puesto As String
ComentariosRevisión As String
End Type
Public Empleado As Persona ' Define un registro.

El registro de cada empleado en el archivo Registro de empleados ahora sólo almacena el número 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 posición de byte especificada en un archivo, pero no hay un modo directo de saber qué
registro está en cada posición si los registros son de longitud variable.

27

Vous aimerez peut-être aussi