Вы находитесь на странице: 1из 39

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

  • 1 -Introducción

En esta sección se ve un repaso básico de las tres formas de trabajar con diferentes tipos de archivos en visual basic: Archivos secuenciales, archivos aleatorios y archivos binarios.

Por último en el final de la sección, se describe como utilizar sentencias y funciones propias de visual basic para trabajar con archivos y directorios del sistema operativo, como por ejemplo la sentencia Dir para buscar ficheros, Filecopy para copiar , ChDir, Mkdir para crear carpetas y algunas otras funciones relacionadas.

  • 2 - Sentencia FileOpen

Esta sentencia es la encargada de abrir o crear un archivo, ya sea para leer datos del mismo, sobre escribirlos y/o para agregarle datos.

Esta sentencia tiene una serie de parámetros que varían de acuerdo a lo que queramos hacer.

Por ejemplo :

FileOpen( 1, "c:\prueba.txt", OpenMode.Input)

Este ejemplo abre un archivo para poder acceder a los datos que contenga en su interior. cuando decimos abrir, estamos diciendo que se encuentra actualmente abierto y alojado en la memoria ram para poder manipularlo.

En el primer parámetro indicamos el path del archivo en el que queremos trabajar.

El primer parametro indica

el número

de archivo

que

estamos

utilizando. Este número lo

asignamos nosotros y va desde el rango 1 al 511. El "número de archivo" se utiliza para poder

diferenciar al archivo en el código. Cada archivo que se encuentra abierto no se puede asignar un número de archivo igual, ya que nos daría un error en tiempo de ejecución.

Por ejemplo no podríamos hacer esto:

FileOpen( 1, "archivo1.txt", OpenMode.Input) FileOpen( 1, "otroarchivo1.txt", OpenMode.Input)

Una vez que terminamos de trabajar con un archivo que se encuentra abierto y que no lo vamos a utilizar mas, debemos cerrarlo. para ello se utiliza la sentencia FileClose seguido del número de archivo que lo identifica.

Por ejemplo:

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

FileClose(2)
FileClose(2)

Esto cerrará al archivo abierto que anteriormente le asignamos el número de archivo 2. También si tengo 3 archivos abiertos podría hacer lo siguiente:

FileClose( 1, 2, 3)

Si utilizamos

la sentencia

FileClose sin

ningún parámetro, o mejor dicho ningún

número de

archivo, se cerrarán todos los archivos cargados en memoria por nuestra aplicación (los que nosotros abrimos con Open).

Por lo general, si trabajamos con varios archivos abiertos simultáneamente, es aconsejable utilizar la sentencia FileClose sin ningún parámetro, de este modo cuando termine de ejecutarse el procedimiento se cerrarán todos los archivos abiertos.

Hay una función en Visual basic llamada FreeFile. Esta función lo que hace es darnos un número de archivo que esté libre y que se pueda usar, para que de este modo no intentamos abrir uno esté siendo utilizado, y evitar un error en tiempo de ejecución. Para usar la función es muy fácil, por ejemplo:

Dim NumeroArchivo As Integer

NumeroArchivo = FreeFile()

FileOpen( NumeroArchivo, "La ruta de un archivo", OpenMode.Input)

3 - Archivos secuenciales

Los archivos secuenciales se denominan de esta manera por que la forma de escribir y leer los datos en un archivo es, desde el principio hasta el fin del archivo, es decir, si yo quisiera acceder a un determinado dato del archivo y este dato se encuentra en la mitad del archivo, para llegar a ese dato necesito pasar por todos los demás datos, de forma secuencial.

Por lo general se suelen utilizar los archivos secuenciales, para trabajar con archivos que contengan una estructura de datos no muy compleja. por que por ejemplo, si utilizáramos un archivo para almacenar 50000 nombres con sus respectivos datos (apellido, teléfono, dirección

etc

...

)

, este mecanismo resultaría ineficiente, ya que si quisiera recuperar por ejemplo el registro

n° 3650, para leer este dato tendría que pasar previamente por los 3649 registros anteriores a este, haciendo mas lento el acceso y por lo tanto desperdiciando recursos del sistema.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Los archivos secuenciales disponen de una serie de características que no los habilitan para el uso diario en una aplicación, pero sin embargo por sus características permiten que sean usados en temas muy concretos,

Trasvase de datos entre empresas.

Almacenamientos de datos para tablas de una aplicación.

Guardar datos de configuración.

Normalmente estos datos son cargados al principio de un programa.

4 - FORMATOS

  • 1 ASCII delimitado.

El ASCII

delimitado es un formato

que permite indistintamente el formato de

longitud fija y variable, pues cada dato viene separado del otro con comas.

Es el más estándar, eso significa que los datos se almacenan:

Los datos alfanuméricos delimitados entre comillas dobles.

Los campos numéricos sin delimitadores.

Los campos se separan entre si por comas.

Los registros incorporan una marca de fin de registro, los caracteres ascii trece y diez.

Los problemas que pueden surgir a la hora de su utilización vendrán dados por los distintos tipos de datos numéricos que cada aplicación, o sea el lenguaje en el que se ha desarrollado esa aplicación, sea capaz de tratar.

Como el problema más normal es ese, una forma de saltarlo es grabar todos los datos como datos de tipo string, que es un tipo de dato que cualquier lenguaje es capaz de tratar sin ningún problema.

Existe otro posible problema y es que el lenguaje en cuestión no sea capaz de tratar el formato, la alternativa es la de utilizar la instrucción de lectura, que todos los lenguajes disponen, que permita leer un registro completo, es decir de marca de fin de registro hasta la siguiente.

Posteriormente se puede desarrollar una función que aísle los campos buscando las comas ubicadas entre comillas dobles, y de esa forma se consigue separar los datos.

  • 2 Registros de longitud fija.

Podemos evidentemente grabar registros de datos sin separadores de campos y utilizando una estructura de datos fija y conocida, sino no es posible tratarlos.

Se leen y graban con instrucciones que trabajan con registros completos, de marca a marca de fin de registro, o leyendo una sola variable de tipo string.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

  • 5 - Estructuras.

Los archivos secuenciales permiten que podamos trabajar con registros de longitud fija o de longitud variable, que es otra de sus ventajas.

Otra posibilidad es la de poder utilizar estructuras de registros de distintos tipos en el interior del archivo.

  • 6 - Escritura.

La escritura de cada uno de los formatos que podemos utilizar dependerá en gran medida de las posibilidades del lenguaje que estemos utilizando, ya que no todos los lenguajes incorporan instrucciones adecuadas a los posibles formatos.

La escritura en un formato de longitud fija se podrá realizar con una instrucción que permita grabar una variable de tipo string.

La escritura de un formato en ascii delimitado es posible realizarla igualmente si no hay una instrucción que genere ese formato directamente con la misma instrucción que antes, pero previamente habrá que realizar el montaje de los datos componiendo una cadena de datos con ese formato.

  • 7 - Lectura.

La lectura de uno u otro tipo de estructura de datos dependerá de la estructura utilizada.

Se vuelve a presentar la misma situación que en la grabación, puede ser que no dispongamos de instrucciones para la lectura del formato recibido, por lo tanto posiblemente habrá que recurrir a la lectura de registros completos, como cadenas de caracteres, para su posterior desmontaje o desglose en los campos y tipos adecuados.

Por ejemplo la lectura de un registro de longitud fija puede darse en dos formatos.

Como cadena de caracteres, sin delimitadores.

 

Como ascii delimitado, con delimitadores.

La estructura

de longitud variable también puede darse

bajo

los

dos

tipos

de

formatos, siempre y cuando cada registro se acompañe con las marcas de fin de registro.

  • 8 - Ejemplos de formatos.

El formato que sigue es un formato de registro de longitud fija y con marcas de final de registro.

No incorpora delimitadores de campos.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

0001DENOMINACIONCAMPOCAMPOCAMPO

0002DENOMINACIONCAMPOCAMPOCAMPO

El formato que sigue es ascii delimitado con campos de longitud fija, pero podrían haber sido de longitud variable.

Incorpora delimitadores de campo y separadores

","

Y las marcas de final de registro.

"0001","DENOMINACION","CAMPO","CAMPO","CAMPO"

"0002","DENOMINACION","CAMPO","CAMPO","CAMPO"

El registro que sigue es de longitud fija, sin delimitadores de campo y sin marcas de final de registro.

Se hace

algo más

complejo su proceso,

pues requiere de algún ajuste, y tiene

sentido usarse cuando los registros son pequeños, el soporte también, que hoy no es el caso, y queremos ajustar por el motivo que sea.

0001DENOMINACIONCAMPOCAMPOCAMPO0002DENOMINACIONCAMPOCAMPOCAMPO

9 - Utilización.

Un archivo secuencial, es un archivo que tiene muchas utilizaciones.

Cualquier archivo de imagen, sonido, o similares, son archivos que poseen una estructura, una cabecera, y una serie de datos que se leen posteriormente o bien en bloque o de forma secuencial.

Basta solo ver las definiciones de las estructuras de los archivos mencionados, para poder entender lo dicho anteriormente. Estos archivos son muy compactos. Un archivo secuencial, al igual que los random y las bases de datos, necesita de ser actualizado.

Los que contienen sonido, video e imágenes no necesitan de estos procesos, pero los que almacenan datos sí. A pesar de ser archivos que no son habituales en un proceso de gestión, sin embargo surge la necesidad de su utilización en algunas ocasiones, o en muchas.

Dado que no es un archivo direccionable, el proceso de actualización se basa siempre en un proceso de emparejamiento de registros de dos archivos secuenciales, de entrada que da uno nuevo de salida.

 

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

El que contiene los datos actuales.

El que contiene los nuevos datos.

El resultado es un archivo nuevo, en el que han desaparecido los registros que había que borrar, se han incorporado los nuevos y se han actualizado los que tenían algún cambio.

En la imagen podemos ver una representación gráfica de dicho proceso.

Además de la acción de leer y grabar,
Además de
la acción
de
leer
y
grabar,

hay un apartado importante

en

su

tratamiento, y es el de la necesidad de la utilización de una estructura repetitiva para su proceso, listado, consulta etc.

Esta estructura será siempre del tipo Mientras

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Mientras no Fin de archivo Leer registro Proceso Fin Mientras

Es importante tener presente que este es el mejor sistema para su proceso.

Un bucle del tipo Repite, no es adecuado.

10 - Actualización.

El segundo proceso clásico es el de la actualización, o el de emparejamiento, son iguales en esencia.

Su proceso se basa en el uso de lo que se conoce como high value.

Se trata

de crear

un bucle del tipo mientras,

en

el

que la condición

es que

se

proceda a leer registros proceso.

mientras no se alcance

el máximo

valor en los archivos

de

La filosofía es la de emparejar registros como ya se explicó en el tema anterior.

Importante que el valor utilizado como High value, no sea alcanzable por los datos del archivo.

El proceso se basa en que solo puede haber proceso de actualización si los códigos coinciden, en ese caso puede darse el caso de borrado o actualización, pero nunca un alta, eso sería un error.

Si el código del archivo principal se adelanta al de los cambios, significa que los registros hasta igualarse deben ser del tipo alta, en caso contrario sería un error en la grabación del archivo de cambios.

Si el código del archivo principal se queda por detrás significa que ese código no dispone de incidencias, por lo que debe ser copiado tal como está en el archivo que se crea nuevo en el proceso, para no perder los datos que no van a sufrir cambios.

Siempre debemos disponer de una pareja de registros, registro del archivo principal, inmediatamente hay que leer otro.

por

lo

que

al

tratar

un

Igual con el de los cambios. Por este motivo antes de entrar en el bucle de proceso, se debe cargar una pareja de registros fuera del bucle.

Al realizar la lectura en un archivo si se da la circunstancia de final de archivo, es cuando al código de ese archivo se le asigna el high value.

No sirve utilizar variables de tipo booleano, ni cualquier otra combinación, cuyo único resultado al final es maquiavélico, comparado con la sencillez de éste proceso.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

If No final(Incidencias) Entonces Leer(Canal, Codigo, ) ..... Sino Codigo = Hv Fin If No final(Datos) Entonces Leer(CanalDatos, CodDatos) Sino CodDatos = Hv Fin

Wientras Codigo <> Hv Or CodDatos <> Hv Según Codigo Si Codigo = CodDatos Proceso If No final(Incidencias) Entonces

Leer(Canal, Codigo, Sino Codigo = Hv Fin If No final(Datos) Entonces Leer(CanalDatos, CodDatos, Sino CodDatos = Hv Fin

)

)

Si Codigo > CodDatos Proceso If No final(Datos) Entonces Leer(CanalDatos, CodDatos, Sino CodDatos = Hv Fin Si Codigo < CodDatos Proceso If No final(Incidencias) Entonces

)

Leer(Canal, Codigo, Sino Codigo = Hv Fin Fin segun Fin Mientras

)

La variable o constante HV debe recibir un valor que sea inalcanzable por los datos del archivo, en caso contrario el proceso no funcionará adecuadamente. Los archivos a procesar deben estar ordenados, pues el proceso realiza una comparación de los códigos

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

El archivo de incidencias será igual en diseño que el archivo de datos actuales, y además incorporará un dato que indicará si es una modificación, alta o borrado. El proceso se realiza en función de los valores del campo código.

11 - Diferentes tipos de acceso

Append: esta sentencia se utiliza para agregar información a un archivo de texto.

Ejemplo :

FileOpen( 1, "c:\miarchivo.txt", OpenMode.Append)

Si el archivo ya contiene datos, se le agregarán al mismo al final del archivo, si no contenía datos los agrega igual. Si el archivo no existe, lo crea y le agrega los datos.

Input: la sentencia Input se utiliza para leer datos de un archivo de texto, ejemplo:

FileOpen( 1, "c:\miarchivo.txt", OpenMode.Input)

Este ejemplo abre un archivo para leer los datos del mismo. En las próximas líneas veremos ejemplos de como leer los datos , escribir y guardar.

Una cosa importante con respecto a leer datos de un archivo con Input es que, si el archivo que queremos abrir, no existe, se producirá un error en tiempo de ejecución al intentar abrir un archivo que no existe, por eso debemos verificar la ruta del mismo siempre que esté bien escrita en la sentencia Open y evitarnos dolores de cabeza, y simpre añadir algún manejador de error para este caso

Output: esta sentencia se utiliaza para crear un archivo de texto y grabar datos. Esta es igual que Append salvo por un gran detalle:

Output crea el archivo y le agrega información, pero si el archivo existía y contenía información

previa,

sobre escribe

todos

anteriores datos.

los datos

del archivo

por

los

datos nuevos,

perdiendo los

Si accedemos con Output a un archivo que no existe, no se produce un error, si no que se crea dicho archivo.

Conclusión : si vamos a añadir datos a un archivo existente (para actualizarlo por ejemplo) hay que utilizar la sentencia Append. si vamos a crear un archivo vacío y nuevo para grabar nuevos datos,

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

hay que utilizar la sentencia Output. si vamos a abrir un archivo para leer datos utilizamos la sentencia Input.

12 - Abrir un archivo.

El primer paso para acceder a un archivo es siempre enlazarlo con el programa, abrirlo. Lo primero es definir una variable que haga referencia al canal, en VB, la forma de identificar un archivo, es saber que canal de enlace utiliza con el sistema.

Dim Canal As Integer

Después lo más cómodo es utilizar la función freefile, que nos devolverá un canal disponible, en lugar de tenerlo que gestionar nosotros.

Canal = FreeFile()

Esta instrucción debe ejecutarse justo antes de abrir el archivo, nunca antes, si no la información obtenida puede no ser correcta.

El siguiente paso es realizar la apertura, en el modo que nos interese.

FileOpen(Canal, "Nombre.dat", OpenMode.Output)

Para grabar datos la sintaxis es la que sigue:

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Output)

Para realizar una lectura:

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Input)

Para añadir datos, a un archivo ya existente.

Dim Canal As Integer Canal = FreeFile() FileOpen(Canal, "Nombre.dat", OpenMode.Append)

 

Matices, si

se

abre

para

grabar

con

Output, si

el archivo

existe perderá su

contenido, si no existe se creará. Si se abre para grabar con el modo Append, se añaden

los

datos

a

los

que

pudiera

tener. Si

se abre

con

input

se

accede a

él

para

leer su

contenido.

 

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

  • 13 - Grabar una estructura de datos.

Bueno visto como efectuar la lectura y escritura en un archivo secuencial, conviene ampliar el tema para un archivo con una estructura algo más amplia. Para la estructura de datos podemos utilizar un array o una colección, con el fin de almacenar los datos a utilizar en la misma.

La grabación de los datos no es nada más que la generación de un registro de datos con un formato en concreto, uno de los más extendidos es el ASCII delimitado. En este formato se graban los datos numéricos separados por comas y los alfanuméricos encerrados entre comillas dobles.

VB integra directamente el formato ASCII delimitado, y no es necesario ningún tipo de acción especial. Además permite grabar registros de longitud variable, bajo una única variable, útil para datos de texto. Para la grabación de los datos de un registro podemos hacerlo bajo dos formatos. La estructura se graba como una variable definida con una estructura de usuario.

Public Structure Tiostro Public Exped As String Public Nomb As String Public Ape1 As String Public Ape2 As String Public Domic As String End Structure Dim Registro as TipoRegistro

Y grabar

WriteLine(Canal, Registro)

O bien podemos grabar los datos en una variable cada uno de ellos, prescindiendo de la estructura.

WriteLine(Canal, Expediente, Nombre, Domicilio)

  • 14 - Leer un registro.

El siguiente paso sería intentar leer el registro que hemos grabado anteriormente. Para la grabación sin usar la estructura la lectura es como sigue:

Input(Canal, Expediente) ' código Input(Canal, Nombre) Input(Canal, Domicilio)

Para la grabación usando la estructura la lectura es como sigue:

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Input(Canal, Registro) ' código

  • 15 - Lectura de un archivo secuencial.

La lectura de un archivo secuencial se basa siempre en el uso de un bucle del tipo mientras. La estructura de dicho bucle es la que sigue:

While Not EOF(Canal) ' lectura de un registro Input(Canal, Codigo) Input(Canal, Denom) Input(Canal, Cant) Input(Canal, Preci) ' Realizar el proceso correspondiente. End While

  • 16 - Proceso de actualización.

El proceso de actualización se basa en el emparejamiento de registros, para ello los archivos han de estar grabados en secuencia, en caso contrario no es posible realizar un proceso adecuadamente correcto.

El sistema seguido es el de high value, viejo sistema utilizado en otros lenguajes de programación, pero no por ello menos efectivo. La filosofía es la de emparejar registros como ya se explicó en el tema anterior. Importante que el valor utilizado como High value, no sea alcanzable por los datos del archivo.

El proceso se basa en que solo puede haber proceso de actualización si los códigos coinciden, en ese caso puede darse el caso de borrado o actualización, pero nunca un alta, eso sería un error.

Si el código del archivo principal se adelanta al de los cambios, significa que los registros hasta igualarse deben ser del tipo alta, en caso contrario sería un error en la grabación del archivo de cambios.

Si el código del archivo principal se queda por detrás significa que ese código no dispone de incidencias, por lo que debe ser copiado tal como está en el archivo que se crea nuevo en el proceso, para no perder los datos que no van a sufrir cambios.

Siempre debemos disponer de una pareja de registros,

por

lo

que

al

tratar

un

registro del archivo principal, inmediatamente hay que leer otro. Igual con el de los cambios. Por este motivo antes de entrar en el bucle de proceso, se debe cargar una pareja de registros fuera del bucle.

Al realizar la lectura en un archivo si se da la circunstancia de final de archivo, es cuando al código de ese archivo se le asigna el high value. No sirve utilizar variables de tipo booleano, ni cualquier otra combinación, cuyo único resultado al final es maquiavélico, comparado con la sencillez de éste proceso.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

A continuación exponemos el núcleo del proceso. No está completo, se ha extraído lo esencial, y se ha realizado sin el uso de estructuras.

If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End IF

While Exped <> Hv Or ExpedM <> Hv Select Case Exped

Case Is > ExpedM

' copiar maestro

Grabacion(CanalMaes, ExpedM, NombM, Ape1M, Ape2M, DomicM)

If Not EOF(CanalMalum) Then

LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if Case Is < ExpedM Select Case Tipo

Case "1"

' alta

Grabacion(CanalMaes, Exped, Nomb, Ape1, Ape2, Domic) If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End IF Case Else ' Error LineaDet(Exped, Nomb, Ape1, Ape2, Domic, Tipo, "Actualiza") If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End If End Select Case Is = ExpedM Select Case Tipo

Case "1"

' alta, error

' Línea de detalle LineaDet(Exped, Nomb, Ape1, Ape2, Domic, Tipo, "Alta") If Not EOF(CanalMoviv) Then

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End if

Case "2"

' baja, no se graba

If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv

End if If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if

Case "3"

' modificación, se graba el nuevo

Grabacion(CanalMaes, Exped, Nomb, Ape1, Ape2, Domic) If Not EOF(CanalMoviv) Then LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo) Else Exped = Hv End if If Not EOF(CanalMalum) Then LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM) Else ExpedM = Hv End if End Select End Select End While

17 - Cierre

Para ello se utiliza la instrucción FileClose(Canal)

Y se cierra cada uno de los archivos que nos interesa.

18 - Archivos aleatorios o directos

A diferencia de los archivos secuenciales, los archivos aleatorios almacenan datos en forma de registros. Como habíamos dicho en el capítulo anterior para leer datos de un archivo secuencial había que leer todo el archivo, es decir que no podíamos leer por ejemplo los datos que estuviesen en la línea 35 del mismo sin antes pasar por todos los datos anteriores, por eso su nombre de archivo secuencial.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En cambio los archivos aleatorios, también llamados archivos directos, almacenan los datos con una estructura diferente. Los datos se guardan en registros mediante una estructura definida de tipo Type (estructura definida por nosotros) también llamada UDT

Por ejemplo si tuviesemos 25 registros, cada uno con datos (apellido, email, telefono,etc

..

),

y

quisiera acceder al registro 17, puedo leer los datos del registro 17 sin tener que leer los 16 registros anteriores, ganando con ello mas velocidad y teniendo una estructura de datos definida.

  • 19 - Registros.

Mientras

que en

un archivo

secuencial, los datos

pueden

ser de

longitud fija o

variable, en un archivo random han de ser de longitud fija, ya que de otra forma no se

podría localizar la información en el mismo. Además los campos no llevan separadores entre si, y al final de los registros no existe marcas de final de registro.

Evidentemente, a partir de aquí cada cual puede inventar lo que desee, pero esta es la forma adecuada de hacerlo y como lo manejan los lenguajes de programación mas habituales.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 En cambio los archivos aleatorios, también
  • 20 - Acceso a los registros.

Hablamos de dirección, pero en realidad lo que se hace es establecer a partir del inicio del archivo, cual es el primer byte que deseamos leer, si estamos trabajando con una estructura de datos que es de longitud fija, el registro x estará, empezará en:

Posición = Longitud de registro * (X – 1)

Si el registro tiene 30 bytes de longitud, el registro número dos empezará en el byte

30.

Posición = 30

* (2 – 1)

Se considera que el primer byte disponible es el cero, y el primer registro válido es el cero.

[VISUAL BASIC.NET CON BASE DE DATOS] IDSYSTEMS 2012
[VISUAL BASIC.NET CON BASE DE DATOS]
IDSYSTEMS 2012

En un archivo random, para almacenar datos, utilizamos estructuras de longitud fija.

  • 21 - Ubicación de los registros.

El acceso a los registros de un archivo random se realiza a partir de una dirección, esa es la dirección que debe ocupar el registro en el archivo. Después podemos encontrarnos con dos situaciones para localizar los datos dentro del archivo.

El registro se almacena en la posición que le corresponde por el valor de su campo código.

El registro se almacena por la posición que le asigna un algoritmo encargado de calcular direcciones a partir de un código.

La situación más lógica es utilizar la primera, hoy no tiene sentido utilizar el segundo sistema, pues sería solaparse con un archivo indexado o con una base de datos. En el primer caso, cada registro ocuparía siempre una posición distinta, no pueden haber dos códigos iguales.

En el segundo caso, al ser una dirección proporcionada por un algoritmo, se podría dar la situación de que códigos distintos generarán direcciones iguales y hay que controlar esa posible duplicidad, de ahí que no tenga sentido llegar a esa complejidad, cuando hoy se disponen de los sistemas de gestión de bases de datos, que nos proporcionan esa tarea hecha.

Hay que tener también presente que el sistema de código posición tiene el inconveniente de que puede generar mucho espacio vacío y poco aprovechado, por eso en la actualidad estos archivos se utilizan para almacenar datos muy compactos, y que generan muy poco espacio libre en el archivo, Provincias, Países, etc.

  • 22 - Libre u ocupado.

Los

archivos

random

 

son

direccionables,

cuando

se

abre,

o

se

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

accede a ellos, se puede grabar o leer indistintamente, esto provoca que necesitemos saber si un registro al que accedemos está libre u ocupado, para saber que hacer con él en el momento de la lectura.

Podemos hablar de dos sistemas principalmente para distinguir cuando está libre u ocupado un registro.

El primero consiste en grabar a blancos todo el espacio que se prevé utilizar para el archivo, utilizando el ASCII treinta y dos.

El segundo consiste

en incluir

en

el

diseño del registro un campo adicional de un byte para grabar en el un carácter que me indique si está libre u ocupado. También se puede utilizar un campo significativo para en función de su contenido decidir esta situación.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 accede a ellos, se puede grabar

De entre los dos sistemas el más adecuado es el primero, el segundo no es que sea malo, si no al contrario puede llegar a ser hasta mejor, todo depende de las circunstancias en las que nos movamos.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 accede a ellos, se puede grabar

Si grabamos una marca para indicar

libre u ocupado,

eso implica que podemos

conservar los datos originales en el registro

aunque se

borre,

eso

es bueno

y

malo,

en

función de lo que se tenga grabado, ya que

implica que se puede recuperar todo lo que hay, lo cual a lo mejor no interesa.

El otro sistema, el de utilizar blancos, tiene la ventaja, o no, de que al borrar un registro se graban blancos en su lugar, ASCII treinta y dos, y eso impide que se pueda recuperar cualquier información una vez borrada.

Lo importante es determinar un sistema por el cual podamos saber si el registro está libre u ocupado.

23 - Diseño del registro.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En un archivo secuencial podemos establecer un diseño de registro de longitud fija o variable. En un archivo random, el diseño del registro ha de ser de longitud fija. Cada campo tiene un espacio asignado.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 En un archivo secuencial podemos establecer
[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 En un archivo secuencial podemos establecer

El diseño del ejemplo que tenemos en la imagen se corresponde con lo siguiente.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 En un archivo secuencial podemos establecer

Como podemos ver no hay separación entre campos, ni entre registros hay marcas de separación, de ahí que es imprescindible conocer el diseño del registro para su utilización.

24 - Cómo diseñar los registros.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En el ejemplo anterior se puede observar que se ha incluido el campo código en el diseño del registro, pero eso no es necesario, si se utiliza el primero de los sistemas de direccionamiento.

Si nosotros asumimos que el registro con el código siete lo colocamos en el séptimo registro, cuando accedemos a él, lo localizamos porque sabemos su código, y consecuentemente su dirección, por lo que grabar el código no representa ningún problema, pero resulta redundante.

Por lo tanto en el diseño de un registro se puede obviar el espacio que ocupa el campo código.

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 En el ejemplo anterior se puede

Esos dos tipos de diseño podemos llamarlos lógico y físico.

El diseño físico sería el que hemos visto antes.

El diseño lógico es el que vemos en la imagen de la derecha, en la que podemos observar que se ha eliminado el campo código.

25 - Utilización.

 

A partir

de

lo

visto los

pasos

en la utilización

de

un archivo

random

son

los

siguientes.

 

Establecer la estructura del registro en nuestro programa.

 

Acceder al archivo

Leer o grabar

Cerrar el archivo.

Normalmente las instrucciones de lectura y grabación en un archivo random no son las mismas que las de un archivo secuencial.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Sin embargo la filosofía no cambia, abrir, usar y cerrar al final.

El acceso

a

los

datos

sin embargo

si

que sufre cambios,

pues como hemos

comentado antes, se puede leer o grabar indistintamente sin necesidad de cerrar y volver

a abrir el archivo.

Cuando leemos hemos de realizar los siguiente pasos.

Comprobar la dirección del registro que vamos a leer.

 

Realizar la lectura.

Comprobar si el registro está libre u ocupado

Actuar en función de la comprobación anterior.

A la hora de realizar la grabación los pasos serían

Asignar los datos a las variables que representan el registro.

Grabar los datos.

Se supone

que

previamente hemos hecho una lectura que

nos

ha dado

como

resultado que la dirección a utilizar es la adecuada.

  • 26 - Altas, inserción.

El proceso de insertar o realizar altas en el archivo equivale a realizar una lectura

como se ha indicado

registro

es

que

éste

posteriormente.

antes, en la que

el resultado de la comprobación

del estado del

está libre,

y procedemos

a realizar

una grabación de datos

  • 27 - Modificación, actualización.

Se repite el proceso anterior, pero en lugar de que la condición sea que el registro está libre en este caso ha de estar ocupado, y posteriormente realizamos la grabación de los datos actualizados.

  • 28 - Borrado, eliminación.

Se vuelve a repetir las condiciones para una modificación, es decir ha de existir el registro, para a continuación visualizarlo y confirmar que se desea borrar.

El borrado implicará la grabación

de

un

registro

con blancos

en

la dirección

indicada, o la de una marca en el campo correspondiente al estado del registro.

  • 29 - Proceso del archivo.

El uso del archivo en un bucle, solo implica la de realizar un bucle desde la primera hasta la última posición y tratar aquellos registros que se van leyendo que cumplan la situación de alta u ocupado, en función del sistema seguido.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

  • 30 - Resumen de acciones.

Como se ha podido comprobar los procesos anteriores se resumen en

Leer

Comprobar

Proceder

Leer un registro del archivo, que implica comprobar la dirección a leer y realizar la lectura del registro en el archivo.

Comprobar su estado. Proceder a realizar la acción correspondiente en función del estado del mismo.

Ocupado

o Modificación o Baja Libre

o

Inserción de registro nuevo, alta.

31. Comentarios.

Los lenguajes de programación admiten que los campos

se

puedan definir de

cualquiera de los tipos en ellos existentes. Sin embargo la ventaja de utilizar un array of char, string o el tipo equivalente correspondiente en cada uno de ellos, es la compatibilidad que eso supone entre cualquier lenguaje de programación.

Un

string,

o

char,

según

toque,

siempre

tiene

un

altísimo

porcentaje

de

posibilidades de que se pueda tratar en cualquier lenguaje de programación.

Evidentemente en cualquier gestión, actualmente lo que se utiliza es una base de datos, pero los archivos random, siguen siendo válidos para muchas tareas, y su conocimiento es necesario.

  • 32 - Abrir el archivo.

La instrucción para la apertura del archivo es FileOpen, y su sintaxis:

FileOpen(Canal,Nombre,OpenMode.Random, , ,Len(Registro))

Donde

Canal Nombre Forma de apertura Longitud

Será 1, 2, 3 , pero utilizaremos FreeFile para obtener un canal libre. "Fichero.ext" por ejemplo, incluida la ruta. OpenMode.Random, formato de apertura del archivo. Len(Registro) , 56, longitud de registro.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Y no es necesario cerrar y abrir, para leer o grabar un registro.

  • 33 - Definir la estructura de un registro.

Antes de proceder

a

la lectura

o grabación

de

un registro,

estructura del registro que vamos a utilizar.

hay que definir

la

Structure FilRandom

‘ Tipo de usuario

<VBFixedString(15)> Public Nom As String <VBFixedString(15)> Public Dire As String <VBFixedString(15)> Public Pobl As String

<VBFixedString(2)> Public Prov As String <VBFixedString(9)> Public Tele As String End Structure

Para después utilizar una variable definida de ese tipo, en lectura o grabación.

Dim Registro as FilRandom

‘ Variable Registro

  • 34 - Lectura.

Una vez que tenemos definida la estructura del registro y hemos abierto el archivo, podemos leer un registro.

FileGet(Canal, Registro, Posicion)

Donde

Canal

será la misma variable utilizada en la apertura.

Registro

es la variable definida del tipo de la estructura creada.

Posición

es la dirección donde deseamos realizar la lectura.

La variable registro una vez realizada la lectura, contendrá los datos resultantes de la misma bajo la sintaxis

Registro.Nom

Regisro.Direc

El código de una acción de lectura podría ser:

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza registro

Case Else

' Código libre

Mensaje = "El código no existe"

End Select

' Campo siguiente

Case Else

' Código fuera de rango

Mensaje = "Código fuera de rango" End Select

Case Else

' Valor inadecuado

Mensaje = "Valor del campo incorrecto"

End Select

Los pasos seguidos son:

Select Case Campo00.Text <> ""

Comprobar que el contenido sea distinto de nulo, previamente ya se habrá filtrado que el contenido solo pueda ser numérico.

Posicion = CLng(Campo00.Text)

Después asignamos el valor del texto con contenido numérico a una variable de tipo Long en éste caso, para usarla en la lectura.

Select Case Posicion Case 1 To 20

Comprobamos que está dentro de los límites y procedemos a leer.

FileGet(CanalAgenda, Reg, Posicion) ' Lectura

Hecha le lectura se comprueba su resultado

Select Case Reg.Nom <> StrDup(15, " ")

Comprobando en este caso que el campo nombre no esta en blanco.

Case True

' Ocupado

Visualiza()

' Visualiza registro

Si esta ocupado se procede a visualizar su contenido.

Case Else

' Código libre

Mensaje = "El código no existe"

[ VISUAL BASIC.NET CON BASE DE DATOS ] End Select ' Campo siguiente En caso

IDSYSTEMS 2012

[VISUAL BASIC.NET CON BASE DE DATOS]

End Select

' Campo siguiente

En caso contrario se deja seguir el programa,

o

se informa

de

que

no existe

el

código, según corresponda. El resto es ya informar de que el código está fuera de rango, o

que el valor facilitado es incorrecto, en éste caso porque está vacío.

35 - Grabación de un registro.

La sintaxis de la instrucción.

FilePut(Canal, Registro, Posición)

Donde

Canal

será la misma variable utilizada en la apertura.

Registro

es la variable definida del tipo de la estructura creada.

Posición

es la dirección donde deseamos realizar la grabación.

La variable registro es la variable que contiene los datos que se van a grabar. Un ejemplo de grabación podría ser:

Private Sub Grabacion() Dim Posicion As Integer ' GRABACION Posicion = CLng(Codigo) Reg.Nom = Nombre Reg.Dire = Direccion Reg.Pobl = Poblacion Reg.Prov = Provincia Reg.Tele = Telefono

FilePut (Canal,Registro,Posicion) MsgBox("Datos grabados", MsgBoxStyle.OKOnly, Me.Text) End Sub

Los pasos seguidos son:

Posicion = CLng(Codigo)

Obtener el valor de la dirección que se va a utilizar en la grabación.

Reg.Nom = Nombre

Asignación de los datos a la variable registro del archivo.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

FilePut (Canal,Registro,Posicion)

Realizar la grabación de los datos en el archivo.

36 - Inserción, Alta.

El proceso de realizar un alta pasa por los siguientes pasos.

Podemos tomar como punto de partida la lectura realizada anteriormente, ya que al fin y al cabo la inserción de un registro ha de basarse en una comprobación previa de que el código no exista.

Esta lectura se haría cuando se introduce el campo código. Una vez hecha la lectura de comprobación el resto es dejar que se vayan introduciendo los datos de cada campo del archivo y al acabar previa confirmación proceder a grabar los datos.

Veamos el control del campo código.

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion

Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos, y seguimos

Case Else

' Código libre, dejamos que siga

End Select

' Campo siguiente

Case Else

' Código fuera de rango

Mensaje = "Código fuera de rango" End Select

Case Else

' Valor inadecuado

Mensaje = "Valor del campo incorrecto"

End Select

Los pasos

son igual

lectura de control.

que en

la lectura,

porque de hecho

el primer

paso

es

una

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos, y seguimos

Case Else

' Código libre, dejamos que siga

End Select

' Campo siguiente

Cuando comprobamos que el registro está libre u ocupado,

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Si esta ocupado podemos elegir entre seguir después de visualizar su contenido, en cuyo caso el alta se convierte en realidad en una actualización, o en pedir un código nuevo.

Si está libre simplemente seguimos con la ejecución y ya está.

Una vez realizada la introducción

de

los datos,

el siguiente

paso

es

grabar el

registro. La grabación se haría como se ha visto antes, no hay ninguna diferencia

37 - Modificación, actualización.

El proceso de realizar una modificación

puede tomar

de nuevo como

punto de

partida el de la lectura de un registro para realizar un alta, la única variación que en éste

caso el código debe existir, el resto sería idéntico. Veamos el ejemplo

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos, y seguimos

Case Else

' Código libre, dejamos que siga

Mensaje = "Código inexistente."

End Select

' Campo siguiente

Case Else

' Código fuera de rango

Mensaje = "Código fuera de rango" End Select

Case Else

' Valor inadecuado

Mensaje = "Valor del campo incorrecto" End Select

El cambio está en

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos, y seguimos

Case Else

' Código libre, dejamos que siga

Mensaje = "Código inexistente."

End Select

' Campo siguiente

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

En el mensaje que emitimos y en que de alguna forma hay que conseguir que no se pueda seguir con la introducción de datos.

Cuando comprobamos que el registro está libre u ocupado,

Si esta ocupado podemos visualizar su contenido, y después actuar ya según nuestro estilo de hacer las cosas.

Si está libre no deberíamos permitir que se siga con la introducción de datos.

Una vez realizada la introducción

de

los datos,

el siguiente

paso

es

grabar el

registro, que se realizará siempre de la misma forma.

38 - Baja eliminación.

Se vuelve a repetir las mismas condiciones que para realizar una modificación, pero en este caso solo hay que borrar el registro cuando éste se ha visualizado.

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion

Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos

Borrado()

' Pregunta y borra el registro

Case Else

' Código libre, dejamos que siga

Mensaje = "Código inexistente."

End Select

' Campo siguiente

Case Else

' Código fuera de rango

Mensaje = "Código fuera de rango" End Select

Case Else

' Valor inadecuado

Mensaje = "Valor del campo incorrecto" End Select

El cambio está en

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualiza datos

Borrado()

' Pregunta y borra el registro

Case Else

' Código libre, dejamos que siga

Mensaje = "Código inexistente."

End Select

' Campo siguiente

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Borrado es un procedimiento que realizará una pregunta de confirmación al usuario y si la respuesta es afirmativa realizara la grabación de blancos en el registro en cuestión. El procedimiento de grabación, borrado, puede ser como el ejemplo que sigue.

Private Sub Borrar()

Dim Posicion As Integer Borrado de un registro a blancos

'

Posicion = CLng(Codigo) Reg.Nom = StrDup(15, " ") Reg.Dire = StrDup(15, " ") Reg.Pobl = StrDup(15, " ") Reg.Prov = StrDup(2, " ") Reg.Tele = StrDup(9, " ")

FilePut (Canal, Registro, Posicion) MsgBox("Datos borrados", MsgBoxStyle.OKOnly, Me.Text) End Sub

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

[ VISUAL BASIC.NET CON BASE DE DATOS ] IDSYSTEMS 2012 39 - Bucle de lectura. Como

39 - Bucle de lectura.

Como podemos comprobar en el organigrama del ejemplo, el bucle no tiene en realidad ninguna complejidad, solo hay que asegurarse en el mismo de que tras la lectura debemos filtrar que el registro que se ha leído está ocupado, para que pase a proceso.

Private Sub Bucle(Hasta as Integer) Dim Posición as Integer

Posicion = 1

' iniciar contador

While Posicion <= Hasta FileGet(CanalAgenda, Reg, Posicion)

Select Case Reg.Nom <> Space(15)

Case True

' registro ocupado

' Acción de proceso End Select Posicion = Posicion + 1 End While End Sub

' Incremento del contador

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

40 - Integrar todas las acciones.

Si revisamos las acciones de alta, baja, modificación, y las comparamos veremos que los cambios son mínimos.

Y como son mínimos podemos hacer una fusión de todos y obtener un único programa que sea capaz de realizar todas las tareas de mantenimiento ahorrando código y complejidad cara al usuario. Por lo tanto podría quedar de la siguiente forma la tarea de mantenimiento:

Select Case Campo00.Text <> "" Case True Posicion = CLng(Campo00.Text) Select Case Posicion Case 1 To 20 FileGet(CanalAgenda, Reg, Posicion) ' Lectura

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualizar datos y esperar

Case Else

' Código libre, dejamos que se continúe

End Select

' Campo siguiente

Case Else

' Código fuera de rango

Mensaje = "Código fuera de rango"

End Select

Case Else

' Valor inadecuado

Mensaje = "Valor del campo incorrecto"

End Select

Explicación filosófica de la propuesta.

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualizar datos y esperar

Case Else

' Código libre, dejamos que se continúe

End Select

' Campo siguiente

Preguntamos si el registro leído esta ocupado.

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualizar datos y esperar

Case Else

' Código libre, dejamos que se continúe

End Select

' Campo siguiente

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Si está ocupado visualizamos su contenido, se pasa al siguiente dato y se queda a la espera de que

el usuario seleccione la opción de borrar.

desee introducir un código nuevo, retrocediendo al campo código.

continúe en el campo actual realizando por tanto una modificación.

Select Case Reg.Nom <> StrDup(15, " ")

Case True

' Ocupado

Visualiza()

' Visualizar datos y esperar

Case Else

' Código libre, dejamos que se continúe

End Select

' Campo siguiente

No se realiza ninguna acción, se pasa al siguiente campo y se asume que es un alta, un dato nuevo.

Si es un error porque quería acceder a un código existente, como la pantalla está vacía comprobará si es un error el código que ha introducido y si no lo es podrá ver que el código no está grabado, porque no se visualiza nada.

Este

criterio es fácil

de

comprender por quien utiliza el programa

y

fácil de

implementar.

Tal cual, evidentemente con los cambios requeridos por una base de datos, aplica para los mantenimientos de las tablas de la base de datos.

se

  • 41 - Conclusiones.

El uso de un archivo Random permite direccionar los datos que se desean leer o grabar. Conviene reservar o generar todo el espacio que va a utilizar el archivo con blancos para facilitar la gestión.

El asignar un espacio al archivo no significa que no pueda aumentar su capacidad de almacenamiento más adelante. El sistema más cómodo de direccionamiento es relacionar el código del dato con la posición del mismo en el archivo.

Siempre conviene realizar una lectura de comprobación para saber cual es la situación del registro que vamos a tratar. Actualizar es grabar un registro existente con datos. Insertar es grabar un registro que no existe, con datos. Borrar es grabar blancos en un registro que existe. Tienen evidentemente un uso muy concreto actualmente, puesto que las aplicaciones se desarrollan todas en un entorno de base de datos.

  • 42 - Funciones propias de vb para el manejo de ficheros y directorios

Visual basic posee varias funciones para manejar archivos y directorios de nuestro sistema. Las principales son.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

43 - Función Dir

La función Dir se utiliza o para buscar archivos y devuelve una cadena que representa el nombre de un archivo o directorio de acuerdo a un determinado patrón de búsqueda. La sintaxis de la función es:

Dir (ruta, atributos)

En el parámetro ruta debemos indicar el path de un archivo, directorio o unidad. Si el path no existe, la función Dir devuelve una cadena vacía.

En el parámetro atributos podemos especificar los siguientes:

vbnormal : cualquier atributo de archivo.

vbreadonly : archivos de solo lectura.

vbhidden: archivos ocultos

vbsystem : archivos de sistema

vbvolume : etiqueta de volumen de una unidad

vbdirectory : directorios

Ejemplo:

Si el archivo existe Dir devuelve "autoexec.bat"

Archivoabuscar = Dir("c:\autoexec.bat")

También podemos utilizar los comodines * y ? para filtrar búsquedas.

En este ejemplo devuelve el primer archivo exe que encuentra, si es que existe.

Archivoabuscar = Dir("c:\windows\*.exe")

En este ejemplo la función Dir devuelve directorios además de archivos

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Archivoabuscar = Dir("c:\, vbdirectory") o Archivoabuscar = Dir("c:\", FileAttribute.Directory)

El único inconveniente de esta función es que siempre devuelve el primer archivo que encuentra. Para que continúe buscando los demás archivos debemos poner la función sin parámetros. Ejemplo

Dim archivo As String

archivo = Dir("c:\*.exe")

While archivo <> "" archivo = Dir Wend

En el ejemplo anterior buscará todos los archivos exe en el directorio c:\. cuando ya no encuentre mas devolverá una cadena vacía y saldrá del bucle While.

Este otro ejemplo verifica si un archivo existe:

Private Function Verificar_Existe(path) As Boolean

If Len(Trim$(Dir$(path))) Then Verificar_Existe = True

Else

Verificar_Existe = False End If

MsgBox Verificar_Existe

End Function

Private Sub Form_Load()

Call Verificar_Existe("c:\autoexec.bat")

End Sub

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

  • 44 - Función FileCopy

FileCopy nos permite copiar archivos. Esta función es muy fácil de usar. ejemplo:

FileCopy( "origen", "destino" )

Nota: si el archivo existe la función lo sobre escribe.

  • 45 - Función MkDir

Esta función se utiliza para crear directorios, pero crea un directorio por vez, es decir que no crea varios niveles al mismo tiempo. La sintaxis es:

MkDir( "Ruta directorio")

para poder crear un Directorio que contiene varios subdirectorios, podemos hacer lo siguiente:

El ejemplo despliega un InputBox para ingresar el path a crear:

Private Sub Command1_Click()

Dim i As Integer Dim Array_Dir As Variant Dim Sub_Dir As String Dim El_Path As String

El_Path = InputBox("Escriba la ruta del directorio a crear" & _ "con los subdirectorios", " Crear varios niveles de directorios")

If El_Path = vbNullString Then Exit Sub

'Desglosa el path

Array_Dir = Split(El_Path, "\")

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

El_Path = vbNullString

'Recorre el array anterior para ir creando uno por uno For i = LBound(Array_Dir) To UBound(Array_Dir)

Sub_Dir = Array_Dir(i)

If Len(Sub_Dir) > 0 Then El_Path = El_Path & Sub_Dir & "\"

If Right$(Sub_Dir, 1) <> ":" Then

' Verificamos que no exista

If Dir$(El_Path, vbDirectory) = vbNullString Then

'Crea la carpeta

Call MkDir(El_Path) End If End If End If Next i

End Sub

46 - Función kill

La función kill se utiliza para eliminar archivos. También es muy fácil de utilizar, y el único parámetro que lleva es la ruta del archivo que queremos eliminar. Si queremos eliminar varios archivos de un directorio podemos utilizar el comodín"*", y si queremos excluir ciertos archivos utilizamos el comodín "?".

Kill( "c:\*.txt")

47 - Función FileLen

Esta función nos devuelve el tamaño en bytes de un archivo.

Ejemplo:

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

Dim tamaño As Long

tamaño = FileLen("c:\windows\system32\control.exe")

MsgBox tamaño & " bytes"

FileLen es muy útil para trabajar con archivos aleatorios, ya que si queremos conocer la cantidad de registros que tiene el archivo, debemos dividir el tamaño del archivo por el tamaño de la estructura.

Ejemplo:

Private Type t_personas

nombre As String * 20 apellido As String * 20

End Type

Dim cant_reg As Long

Private Sub Form_Load()

cant_reg = FileLen("c:\miarchivo.dat") / Len(t_personas)

End Sub

48 - Función ReName

Name se utiliza para renombrar archivos y directorios. Esta función no se puede utilizar para renombrar archivos abiertos.

Ejemplo:

ReName( "path del archivo viejo a renombrar", "path y nombre nuevo del archivo" )

También con esta sentencia podemos mover archivos y directorios a otra ubicación. para ello debemos cambiar en el segundo parámetro la ruta del archivo.

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

49 - Función GetAttr y SetAttr

La función Getattr permite recuperar información sobre los atributos de un archivo o directorio. Ejemplo:

GetAttr "ruta del archivo"

los valores devueltos por la función pueden ser los siguientes:

0 - normal

1 - solo lectura

2 - oculto

4 - archivo de sistema

16 - directorio

32 - archivo modificado

El siguiente ejemplo lo que hace es mostrar en un MsgBox los atributos de un archivo. Colocar un TextBox llamado Text1 y un Command1.

Código en el formulario:

Option Explicit

Private Sub Command1_Click() Dim ret As Long Dim Atributos As String ret = GetAttr(Text1.Text)

If ret And vbNormal Then Atributos = " Normal

= Si" & vbNewLine

Else

Atributos = " Normal

= No" & vbNewLine

End If If ret And vbReadOnly Then Atributos = Atributos & " Solo Lectura

= Si" & vbNewLine

Else

Atributos = Atributos & " Solo Lectura

= No" & vbNewLine

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

End If If ret And vbHidden Then Atributos = Atributos & " Oculto

= Si" & vbNewLine

Else

Atributos = Atributos & " Oculto End If If ret And vbSystem Then Atributos = Atributos & " Sitema

= No" & vbNewLine

= Si" & vbNewLine

Else

Atributos = Atributos & " Sitema End If If ret And vbDirectory Then

= No" & vbNewLine

Atributos = Atributos & " Directorio

= Si" & vbNewLine

Else Atributos = Atributos & " Directorio End If

= No" & vbNewLine

'Muestra los atributos del archivo elegido MsgBox Atributos, vbInformation, " Atributos "

End Sub

La función SetAttr lo que hace es establecer los atributos de un archivo .

Ejemplo:

SetAttr( "ruta del archivo", valores de los atributos )

[VISUAL BASIC.NET CON BASE DE DATOS]

IDSYSTEMS 2012

50 - Función RmDir

RmDir elimina directorios o carpetas. Pero antes de eliminar directorios tenemos que estar seguros que la carpeta no contiene archivos, de lo contrario nos dará un error en tiempo de ejecución. Si el directorio contiene archivos debemos eliminarlos previamente con la sentencia kill.

Ejemplo:

RmDir( "path del directorio a remover" )