Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
13
copiar, eliminar o mover "bloques" enteros de campos o registros). Si desea implementar esa capacidad,
tendrá que hacerlo en el 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".
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.
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.
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.
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.
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
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.
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
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.
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.
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#"
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.
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
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.
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.
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é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.
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.
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
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.
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.
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)
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.
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.
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.
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.
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.
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.
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