7. 1.- TIPOS DE ACCESO A FICHEROS EN VISUAL BASIC.
Los archivos proporcionan una manera de almacenar información a largo plazo. Visual Basic ofrece tres formas de acceder a los datos:
Archivo secuencial. Archivo de texto plano. Se lee una línea cada vez. Cada línea podrá ser tan larga como quiera. Cuando se empieza a leer un archivo secuencial, se empieza por la primera línea y se continúa con la siguiente hasta llegar al final. Este tipo de datos no suele ser el adecuado para almacenar grandes series de números porque se almacenan en forma de cadena de caracteres. Ejemplos: archivos TXT
Archivo aleatorio. Su contenido puede ser leído y escrito en el orden que se necesite. Todas las líneas deben ser del mismo tamaño. Asumiremos que está formado por un conjunto de registros de la misma longitud. Cada registro individual se identifica con un único número y puede ser leído, escrito o actualizado. Ejemplos: archivos que simulen bases de datos.
Archivo binario. Es una colección de bytes o secuencia numerada de caracteres, independientemente de la estructura del mismo. Ofrecen la posibilidad de almacenar los datos como se quiera, aunque para poder acceder a ellos, es necesario conocer cómo fueron escritos. Ejemplos: archivos EXE
7.2.- ARCHIVOS DE ACCESO SECUENCIAL.
ABRIR ARCHIVOS SECUENCIALES
La instrucción Open (abrir) le dice a Visual Basic a qué archivo debe acceder. La sintaxis es:
Open NombreDeArchivo For {Input | Output| Append} As #NúmeroDeArchivo
donde Input indica si se quiere leer del archivo, Output si se quiere escribir de él, Append si se quiere añadir información al final del fichero y, NumeroDeArchivo es un número entre 1 y 255. Si se trata de abrir para lectura un archivo que no existe, se producirá un error. Si se abre para escritura Visual Basic creará un nuevo archivo, reemplazando cualquier archivo con ese nombre. Si no se sabe qué número de archivo está libre, se utilizará el siguiente código:
NumArchivo = FreeFile
Open NomArch For {Input | Output} As #NumArchivo
CERRAR ARCHIVOS SECUENCIALES
Después de trabajar con un archivo, se debe cerrar con la instrucción Close, cuya sintaxis es:
Close #NúmeroDeArchivo
Si la intrucción Close se utiliza sin poner NumeroDeArchivo, se cerrarán todos los ficheros abiertos.
LEER DE ARCHIVOS SECUENCIALES
Para leer de un archivo secuencial se utilizará la instrucción Line Input que permite leer una línea cada vez y que tiene la sintaxis:
Line Input #NúmeroDeArchivo, VariableDeCadena
o bien se utilizarán las órdenes:
Input #NúmeroDeArchivo, VariableDeCadena
VariableDeCadena = Input(NúmCaracteres, #NúmeroDeArchivo)
donde la última instrucción, permite leer un número determinado de caracteres y, está limitado a ficheros de 32.767 bytes máximo.
La función EOF (Fin De Fichero) indica cuándo se acaba un archivo. A esta función hay que facilitarle el número de archivo correspondiente y, devolverá True si se ha leído toda la información del archivo. La función LOF (Longitud De Archivo) indica la longitud de un archivo.
Por tanto, para leer de un archivo de acceso secuencial se seguirán los pasos:
ESCRIBIR EN ARCHIVOS SECUENCIALES
Para escribir en un archivo secuencial, utilizaremos las instrucciones Print o Write con la sintaxis:
Print #NúmeroDeArchivo [, expresión [{ , | ; } expresión] ...] [{ , | ; }]
Write #NúmeroDeArchivo [, expresión [{ , | ; } expresión] ...] [{ , | ; }]
Write y Print son diferentes. Write inserta comas entre los distintos items a escribir en el fichero. Si se desean conservar los valores de un archivo abierto para escritura, se tendrá que abrir en modo Append y no Output.
Por tanto, para escribir en un archivo de acceso secuencial se seguirán los pasos:
EJERCICIOS:
7.3.- ARCHIVOS DE ACCESO ALEATORIO.
ABRIR Y CERRAR ARCHIVOS ALEATORIOS
Modificaremos la instrucción Open (abrir) con la sintaxis:
Open NombreDeArchivo For Random As #NúmeroDeArchivo Len = LongitudDelRegistro
En un archivo de acceso aleatorio, se puede leer o escribir sin tener que cerrar cada vez.. Se debe facilitar el número de bytes que se deben leer o escribir. Para cerrar un archivo aleatorio, se utilizará Close como si fuera un archivo secuencial.
LEER Y ESCRIBIR DE ARCHIVOS ALEATORIOS
Para leer y escribir de un archivo aleatorio, utilizaremos las instrucciones Get y Put respectivamentes, con las sintaxis:
Get #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable
Put #NúmeroDeArchivo, [NúmeroDeRegistro] , Variable
Get lee del archivo y almacena los datos en la variable, mientras que Put escribe el contenido de la variable en el archivo.
Por tanto, para leer / escribir en un archivo de acceso aleatorio, se seguirán los pasos:
UTILIZAR LA INSTRUCCIÓN SEEK #
La intrucción Seek puede ser extremadamente útil porque indica la siguiente posición a leer o escribir de un fichero abierto. La sintaxis es la siguiente:
Seek #NúmeroDeArchivo, posicion
donde posicion indica el siguiente registro a leer o escribir. Por ejemplo la sentencia:
Get #1, QueRegistro, Datos(QueRegistro)
es equivalente a las sentencias:
Seek #1, QueRegistro
Get #1,, Datos(QueRegistro)
7.4.- ARCHIVOS DE ACCESO BINARIO.
ABRIR Y CERRAR ARCHIVOS BINARIOS
En este tipo de ficheros los datos no siguen ningún orden, por lo que acceder a ellos es complejo. Los pasos que se deberán seguir para escribir en un archivo binario son:
7.5.- ACCESO A UNA BASE DE DATOS.
EL CONTROL DATOS
Utilizando un control Data, podremos comunicarnos con una base de datos para editar, visualizar y actualizar uno o más registros. Visual Basic permite comunicarse con bases de datos creadas con Microsoft Access, Microsoft Fox Pro, Borland Paradox, Borland dBase.
Los métodos que se pueden utilizar con un control de datos son: MoveFirst, para posicionarse en el primer registro. MovePrevious, para posicionarse en el registro anterior. MoveLast, para posicionarse en el último registro. MoveNext, para posicionarse en el registro siguiente. Refresh, la base de datos se abre para ser utilizada o, se cierra y se vuelve a abrir si ya estaba abierta. AddNew, añadir un nuevo registro. Update, se escriben todos los campos editados en la base de datos. Delete, elimina el registro actual.
Las propiedades importantes de este control son: Connect (conexión). Esta propiedad especifica el formato de la base de datos. Los valores que se pueden utilizar son: cadena vacía para formato Access, "foxpro 2.5;", "paradox;", y "dbase iv;". DatabaseName (nombre de la base de datos) Sirve para identificar al archivo de base de datos. RecordSource (fuente del registro). Indica de dónde se obtienen los datos. Exclusive (exclusiva). Determina el tipo de acceso, monousuario (True) o multiusuario (False). ReadOnly (solo lectura). Determina el modo de acceso.
Cada vez que se cambie el valor de una propiedad, debe ejecutarse el método Refresh. Otras propiedades que se podrán consultar son: BOF (comienzo del archivo) esta propiedad es True si el registro actual es el primero. EOF (final del archivo) que estará a True cuando el registro actual sea el último.
Un objeto Dynaset es un conjunto dinámico de registros. Cada conjunto de registros tiene asignado una colección Fields por defecto (conjunto de objetos Field, cada uno de los cuales define un campo de la base de datos). La propiedad por defecto para un objeto Field, es Value, que contiene el valor del campo que representa para el registro actual.para acceder a un miembro individual de una colección, puede hacerlo a través de un índice o utilizando el nombre del campo. P.e. la sentencia Print Data1.RecordSet(0) es equivalente, suponiendo que el campo 0 es Título, a las sentencias:
Print Data1.RecordSet.Fields(0)
Print Data1.RecordSet.Fields("Título")
Print Data1.RecordSet.Fields("Título").Value
También tiene asociada una propiedad Count que dice cuántos objetos están contenidos en el objeto Dynaset.
Para poder realizar modificaciones en una base de datos, ésta tiene que ser actualizable, es decir, la propiedad ReadOnly tiene que estar establecida a False y la propiedad Updatable a True. Para saber si una base de datos es actualizable, escribiremos el código:
Actualizable = True
‘Verificar si la base de datos es actualizable
If (Data1.ReadOnly = True Or Data1.Recordset.Updatable = False) Then
Actualizable = False ‘Base de datos no actualizable
End If
Para verificar si un determinado campo es actualizable, el código necesario es:
‘Verificar si el campo(0) es actualizable
If (Data1.Recordset.Fields(0).Attributes And DB_UPDATABLEFIELD) = 0 Then
Actualizable = False ‘Campo de datos no actualizable
End If
La propiedad Attributes indica los atributos de un campo. Para saber si un campo tiene un determinado atributo, se hará un And con el valor del atributo a verificar. Las constantes DB_... están definidas en el fichero ...\vb\dataconstant.txt
Algunos eventos que se producen en un control de datos son:
Reposition. Se produce después de que un determinado registro pase a ser el registro actual. Su sintaxis es Sub Data1_Reposition()
Validate. Se produce justo antes de que un determinado registro pase a ser el registro actual. Ocurre antes de una operación Update, Delete o Close. Su sintaxis es Sub Data1_Validate(Action As Integer, Save As Integer). Para saber la causa que originó el suceso Validate, habrá que examinar el parámetro Action. Este parámetro se corresponde con el tipo de operación que causó este suceso. Los valores que puede tomar se pueden localizar en el fichero ...\vb\constant.txt y empiezan por DATA_ACTION... El parámetro Save toma el valor True si cualquier control ligado al control de datos cambia. Para saber qué control ha cambiado, habrá que evaluar la propiedad DataChanged de cada uno de ellos. Durante este suceso, no se podrán utilizar los métodos Move.... En su lugar se utilizará el parámetro Action.
UTILIZADES ADICIONALES
Las utilidades adicionales que se pueden utilizar en aplicaiones complejas son:
BeginTrans
Criterio = "Título Like ‘*1ª Edición*’"
Data1.Recorset.FindFirst Criterio
Do While Not Data1.Recordset.NoMatch
If Not Data1.Recordset.NoMatch Then
Data1.Recordset.Delete ‘Borrar registro
RegsBorrados = RegsBorrados + 1
End If
Data1.Recorset.FindNext Criterio
Loop
If RegsBorrados = 0 Then
RollBack
Exit Sub
End If
Msg = "¿Está seguro que desea borrar " & RegsBorrados & " registros?"
If MsgBox(Msg, 17, "¿Borrar registros?") <>1 Then
RollBack ‘Deshacer los cambios
Else
CommitTrans ‘Borrar Registros
End If
7.6.- UTILIZACIÓN DE LOS FICHEROS .INI
Muchas veces cuando se escribe una aplicación, se desearía recordar algunas variables de la última vez que se ejecutó la aplicación. Este tipo de información se almacena en los ficheros ini. Afortunadamente, Windows proporciona un editor de texto ASCII para leer y escribir ficheros de este tipo. Existen dos clases de cadenas de perfil: públicas y privadas. Las públicas se almacenan en el archivo Win.ini. las cadenas privadas se incluyen en ficheros con un nombre dado por el programador, con extensión .ini. Nosotros deberíamos introducir cadenas de perfil de tipo privado. Por ejemplo: si escribimos una aplicación MiEjemplo.Exe, podríamos utilizar un archivo privado C:\WINDOWS\MIEJEMPLO.INI.
Para leer y escribir en ficheros ini, se necesita conocer tres cosas:
Por ejemplo, el fichero MiEjemplo.ini se parecerá a:
[Nombre del usuario] ‘Esta es la sección
UltimoNombre = Lopez ‘UltimoNombre es la palabra de acceso
Existen tres funciones que se pueden utilizar en ficheros .ini privados:
Estas funciones son parte de la API de Windows. Son fucniones externas a Visual Basic, por lo que deben ser declaradas en la sección general de declaraciones de un formulario del proyecto Visual, o en la sección de declaraciones de un módulo y declaradas como públicos.