Leccion 2 - Manejo de archivos y funciones propias

Embed Size (px)

Citation preview

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    1/39

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

    1 -Introduccin

    En esta seccin se ve un repaso bsico de las tres formas de trabajar con diferentes tipos dearchivos en visual basic: Archivos secuenciales, archivos aleatorios y archivos binarios.

    Por ltimo en el final de la seccin, se describe como utilizar sentencias y funciones propias devisual basic para trabajar con archivos y directorios del sistema operativo, como por ejemplo lasentencia Dir para buscar ficheros, Filecopy para copiar , ChDir, Mkdir para crear carpetas yalgunas otras funciones relacionadas.

    2 - Sentencia FileOpen

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

    Esta sentencia tiene una serie de parmetros que varan 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. cuandodecimos abrir, estamos diciendo que se encuentra actualmente abierto y alojado en la memoriaram para poder manipularlo.

    En el primer parmetro indicamos el path del archivo en el que queremos trabajar.

    El primer parametro indica el nmero de archivo que estamos utilizando. Este nmero loasignamos nosotros y va desde el rango 1 al 511. El "nmero de archivo" se utiliza para poderdiferenciar al archivo en el cdigo. Cada archivo que se encuentra abierto no se puede asignar unnmero de archivo igual, ya que nos dara un error en tiempo de ejecucin.

    Por ejemplo no podramos 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 autilizar mas, debemos cerrarlo. para ello se utiliza la sentencia FileClose seguido del nmero dearchivo que lo identifica.

    Por ejemplo:

    LECCION 2 Manejo de archivos y funciones propias Pgina 1

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    2/39

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

    FileClose(2)

    Esto cerrar al archivo abierto que anteriormente le asignamos el nmero de archivo 2. Tambin sitengo 3 archivos abiertos podra hacer lo siguiente:

    FileClose( 1, 2, 3)

    Si utilizamos la sentencia FileClose sin ningn parmetro, o mejor dicho ningn nmero dearchivo, se cerrarn todos los archivos cargados en memoria por nuestra aplicacin (los quenosotros abrimos con Open).

    Por lo general, si trabajamos con varios archivos abiertos simultneamente, es aconsejable utilizarla sentencia FileClose sin ningn parmetro, de este modo cuando termine de ejecutarse el

    procedimiento se cerrarn todos los archivos abiertos.

    Hay una funcin en Visual basic llamada FreeFile. Esta funcin lo que hace es darnos un nmero dearchivo que est libre y que se pueda usar, para que de este modo no intentamos abrir uno estsiendo utilizado, y evitar un error en tiempo de ejecucin. Para usar la funcin es muy fcil, porejemplo:

    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 losdatos en un archivo es, desde el principio hasta el fin del archivo, es decir, si yo quisiera acceder aun determinado dato del archivo y este dato se encuentra en la mitad del archivo, para llegar a esedato necesito pasar por todos los dems datos, de forma secuencial.

    Por lo general se suelen utilizar los archivos secuenciales, para trabajar con archivos quecontengan una estructura de datos no muy compleja. por que por ejemplo, si utilizramos unarchivo para almacenar 50000 nombres con sus respectivos datos (apellido, telfono, direccinetc...) , este mecanismo resultara ineficiente, ya que si quisiera recuperar por ejemplo el registron 3650, para leer este dato tendra que pasar previamente por los 3649 registros anteriores aeste, haciendo mas lento el acceso y por lo tanto desperdiciando recursos del sistema.

    LECCION 2 Manejo de archivos y funciones propias Pgina 2

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    3/39

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

    Los archivos secuenciales disponen de una serie de caractersticas que no los habilitan para el uso diario

    en una aplicacin, pero sin embargo por sus caractersticas permiten que sean usados en temas muy

    concretos,

    Trasvase de datos entre empresas.

    Almacenamientos de datos para tablas de una aplicacin. Guardar datos de configuracin.

    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 delongitud fija y variable, pues cada dato viene separado del otro con comas.

    Es el ms estndar, eso significa que los datos se almacenan:

    Los datos alfanumricos delimitados entre comillas dobles.

    Los campos numricos 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 utilizacin vendrn dados por losdistintos tipos de datos numricos que cada aplicacin, o sea el lenguaje en el que se hadesarrollado esa aplicacin, sea capaz de tratar.

    Como el problema ms normal es ese, una forma de saltarlo es grabar todos losdatos como datos de tipo string, que es un tipo de dato que cualquier lenguaje es capazde tratar sin ningn problema.

    Existe otro posible problema y es que el lenguaje en cuestin no sea capaz de tratarel formato, la alternativa es la de utilizar la instruccin de lectura, que todos los lenguajesdisponen, que permita leer un registro completo, es decir de marca de fin de registrohasta la siguiente.

    Posteriormente se puede desarrollar una funcin que asle los campos buscando lascomas 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 yutilizando una estructura de datos fija y conocida, sino no es posible tratarlos.

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

    LECCION 2 Manejo de archivos y funciones propias Pgina 3

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    4/39

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

    5 - Estructuras.

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

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

    6 - Escritura.

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

    La escritura en un formato de longitud fija se podr realizar con una instruccin quepermita grabar una variable de tipo string.

    La escritura de un formato en ascii delimitado es posible realizarla igualmente si nohay una instruccin que genere ese formato directamente con la misma instruccin queantes, pero previamente habr que realizar el montaje de los datos componiendo unacadena de datos con ese formato.

    7 - Lectura.

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

    Se vuelve a presentar la misma situacin que en la grabacin, puede ser que nodispongamos de instrucciones para la lectura del formato recibido, por lo tanto

    posiblemente habr que recurrir a la lectura de registros completos, como cadenas decaracteres, 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 tambin puede darse bajo los dos tipos de

    formatos, siempre y cuando cada registro se acompae 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 finalde registro.

    No incorpora delimitadores de campos.

    LECCION 2 Manejo de archivos y funciones propias Pgina 4

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    5/39

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

    0001DENOMINACIONCAMPOCAMPOCAMPO

    0002DENOMINACIONCAMPOCAMPOCAMPO

    El formato que sigue es ascii delimitado con campos de longitud fija, pero podranhaber 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 definal de registro.

    Se hace algo ms complejo su proceso, pues requiere de algn ajuste, y tienesentido usarse cuando los registros son pequeos, el soporte tambin, que hoy no es elcaso, y queremos ajustar por el motivo que sea.

    0001DENOMINACIONCAMPOCAMPOCAMPO0002DENOMINACIONCAMPOCAMPOCAMPO

    9 - Utilizacin.

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

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

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

    Los que contienen sonido, video e imgenes no necesitan de estos procesos, pero

    los que almacenan datos s. A pesar de ser archivos que no son habituales en un procesode gestin, sin embargo surge la necesidad de su utilizacin en algunas ocasiones, o enmuchas.

    Dado que no es un archivo direccionable, el proceso de actualizacin se basasiempre en un proceso de emparejamiento de registros de dos archivos secuenciales, deentrada que da uno nuevo de salida.

    LECCION 2 Manejo de archivos y funciones propias Pgina 5

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    6/39

    [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 quehaba que borrar, se han incorporado los nuevos y se han actualizado los que tenan algncambio.

    En la imagen podemos ver una representacin grfica de dicho proceso.

    Adems de la accin de leer y grabar, hay un apartado importante en sutratamiento, y es el de la necesidad de la utilizacin de una estructura repetitiva para suproceso, listado, consulta etc.

    Esta estructura ser siempre del tipo Mientras

    LECCION 2 Manejo de archivos y funciones propias Pgina 6

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    7/39

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

    Mientras no Fin de archivo

    Leer registro

    ProcesoFin Mientras

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

    Un bucle del tipo Repite, no es adecuado.

    10 - Actualizacin.

    El segundo proceso clsico es el de la actualizacin, o el de emparejamiento, soniguales 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 condicin es que se

    proceda a leer registros mientras no se alcance el mximo valor en los archivos deproceso.

    La filosofa 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 datosdel archivo.

    El proceso se basa en que solo puede haber proceso de actualizacin si los cdigoscoinciden, en ese caso puede darse el caso de borrado o actualizacin, pero nunca un alta,eso sera un error.

    Si el cdigo del archivo principal se adelanta al de los cambios, significa que losregistros hasta igualarse deben ser del tipo alta, en caso contrario sera un error en lagrabacin del archivo de cambios.

    Si el cdigo del archivo principal se queda por detrs significa que ese cdigo nodispone de incidencias, por lo que debe ser copiado tal como est en el archivo que secrea 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 unregistro 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, escuando al cdigo de ese archivo se le asigna el high value.

    No sirve utilizar variables de tipo booleano, ni cualquier otra combinacin, cuyonico resultado al final es maquiavlico, comparado con la sencillez de ste proceso.

    LECCION 2 Manejo de archivos y funciones propias Pgina 7

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    8/39

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

    If No final(Incidencias) Entonces

    Leer(Canal, Codigo, .....)

    SinoCodigo = Hv

    Fin

    If No final(Datos) EntoncesLeer(CanalDatos, CodDatos)

    Sino

    CodDatos = HvFin

    Wientras Codigo Hv Or CodDatos Hv

    Segn CodigoSi Codigo = CodDatos

    Proceso

    If No final(Incidencias) Entonces

    Leer(Canal, Codigo, ......)Sino

    Codigo = HvFin

    If No final(Datos) Entonces

    Leer(CanalDatos, CodDatos, .....)Sino

    CodDatos = Hv

    Fin

    Si Codigo > CodDatosProceso

    If No final(Datos) Entonces

    Leer(CanalDatos, CodDatos, .....)Sino

    CodDatos = Hv

    FinSi Codigo < CodDatos

    Proceso

    If No final(Incidencias) Entonces

    Leer(Canal, Codigo, ......)Sino

    Codigo = Hv

    FinFin segun

    Fin Mientras

    La variable o constante HV debe recibir un valor que sea inalcanzable por los datosdel archivo, en caso contrario el proceso no funcionar adecuadamente. Los archivos aprocesar deben estar ordenados, pues el proceso realiza una comparacin de los cdigos

    LECCION 2 Manejo de archivos y funciones propias Pgina 8

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    9/39

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

    El archivo de incidencias ser igual en diseo que el archivo de datos actuales, yadems incorporar un dato que indicar si es una modificacin, alta o borrado. El procesose realiza en funcin de los valores del campo cdigo.

    11 - Diferentes tipos de acceso

    Append: esta sentencia se utiliza para agregar informacin a un archivo de texto.

    Ejemplo :

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

    Si el archivo ya contiene datos, se le agregarn al mismo al final del archivo, si no contena datoslos 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 prximas lneas veremosejemplos 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 quequeremos abrir, no existe, se producir un error en tiempo de ejecucin al intentar abrir un archivoque no existe, por eso debemos verificar la ruta del mismo siempre que est bien escrita en lasentencia Open y evitarnos dolores de cabeza, y simpre aadir algn manejador de error para estecaso

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

    Output crea el archivo y le agrega informacin, pero si el archivo exista y contena informacinprevia, sobre escribe todos los datos del archivo por los datos nuevos, perdiendo losanteriores datos.

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

    Conclusin : si vamos a aadir datos a un archivo existente (para actualizarlo por ejemplo) hay queutilizar la sentencia Append. si vamos a crear un archivo vaco y nuevo para grabar nuevos datos,

    LECCION 2 Manejo de archivos y funciones propias Pgina 9

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    10/39

    [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 lasentencia 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 deidentificar un archivo, es saber que canal de enlace utiliza con el sistema.

    Dim Canal As Integer

    Despus lo ms cmodo es utilizar la funcin freefile, que nos devolver un canaldisponible, en lugar de tenerlo que gestionar nosotros.

    Canal = FreeFile()

    Esta instruccin debe ejecutarse justo antes de abrir el archivo, nunca antes, si no

    la informacin 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 IntegerCanal = FreeFile()

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

    Para aadir 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 sucontenido, si no existe se crear. Si se abre para grabar con el modo Append, se aadenlos datos a los que pudiera tener. Si se abre con input se accede a l para leer sucontenido.

    LECCION 2 Manejo de archivos y funciones propias Pgina 10

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    11/39

    [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, convieneampliar el tema para un archivo con una estructura algo ms amplia. Para la estructura dedatos podemos utilizar un array o una coleccin, con el fin de almacenar los datos autilizar en la misma.

    La grabacin de los datos no es nada ms que la generacin de un registro de datoscon un formato en concreto, uno de los ms extendidos es el ASCII delimitado. En esteformato se graban los datos numricos separados por comas y los alfanumricosencerrados entre comillas dobles.

    VB integra directamente el formato ASCII delimitado, y no es necesario ningn tipode accin especial. Adems permite grabar registros de longitud variable, bajo una nicavariable, til para datos de texto. Para la grabacin de los datos de un registro podemoshacerlo bajo dos formatos. La estructura se graba como una variable definida con unaestructura de usuario.

    Public Structure Tiostro

    Public Exped As String

    Public Nomb As String

    Public Ape1 As StringPublic Ape2 As String

    Public Domic As String

    End StructureDim Registro as TipoRegistro

    Y grabar

    WriteLine(Canal, Registro)

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

    WriteLine(Canal, Expediente, Nombre, Domicilio)

    14 - Leer un registro.

    El siguiente paso sera intentar leer el registro que hemos grabado anteriormente.Para la grabacin sin usar la estructura la lectura es como sigue:

    Input(Canal, Expediente) ' cdigo

    Input(Canal, Nombre)

    Input(Canal, Domicilio)

    Para la grabacin usando la estructura la lectura es como sigue:

    LECCION 2 Manejo de archivos y funciones propias Pgina 11

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    12/39

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

    Input(Canal, Registro) ' cdigo

    15 - Lectura de un archivo secuencial.

    La lectura de un archivo secuencial se basa siempre en el uso de un bucle del tipomientras. 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 actualizacin.

    El proceso de actualizacin se basa en el emparejamiento de registros, para ello losarchivos han de estar grabados en secuencia, en caso contrario no es posible realizar unproceso adecuadamente correcto.

    El sistema seguido es el de high value, viejo sistema utilizado en otros lenguajes deprogramacin, pero no por ello menos efectivo. La filosofa es la de emparejar registroscomo 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 actualizacin si los cdigos

    coinciden, en ese caso puede darse el caso de borrado o actualizacin, pero nunca un alta,eso sera un error.

    Si el cdigo del archivo principal se adelanta al de los cambios, significa que losregistros hasta igualarse deben ser del tipo alta, en caso contrario sera un error en lagrabacin del archivo de cambios.

    Si el cdigo del archivo principal se queda por detrs significa que ese cdigo nodispone de incidencias, por lo que debe ser copiado tal como est en el archivo que secrea 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 loscambios. Por este motivo antes de entrar en el bucle de proceso, se debe cargar unapareja de registros fuera del bucle.

    Al realizar la lectura en un archivo si se da la circunstancia de final de archivo, escuando al cdigo de ese archivo se le asigna el high value. No sirve utilizar variables detipo booleano, ni cualquier otra combinacin, cuyo nico resultado al final esmaquiavlico, comparado con la sencillez de ste proceso.

    LECCION 2 Manejo de archivos y funciones propias Pgina 12

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    13/39

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

    A continuacin exponemos el ncleo del proceso. No est completo, se ha extradolo esencial, y se ha realizado sin el uso de estructuras.

    If Not EOF(CanalMalum) Then

    LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM)

    ElseExpedM = Hv

    End ifIf Not EOF(CanalMoviv) Then

    LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo)

    Else

    Exped = HvEnd IF

    While Exped Hv Or ExpedM HvSelect 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 = HvEnd if

    Case Is < ExpedM

    Select Case TipoCase "1" ' alta

    Grabacion(CanalMaes, Exped, Nomb, Ape1, Ape2, Domic)

    If Not EOF(CanalMoviv) ThenLeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo)

    Else

    Exped = HvEnd 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)

    ElseExped = Hv

    End If

    End SelectCase Is = ExpedM

    Select Case Tipo

    Case "1" ' alta, error

    ' Lnea de detalleLineaDet(Exped, Nomb, Ape1, Ape2, Domic, Tipo, "Alta")

    If Not EOF(CanalMoviv) Then

    LECCION 2 Manejo de archivos y funciones propias Pgina 13

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    14/39

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

    LeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo)

    Else

    Exped = HvEnd if

    Case "2" ' baja, no se graba

    If Not EOF(CanalMoviv) ThenLeerMoviv(CanalMoviv, Exped, Nomb, Ape1, Ape2, Domic, Tipo)

    Else

    Exped = HvEnd if

    If Not EOF(CanalMalum) Then

    LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM)

    ElseExpedM = Hv

    End if

    Case "3" ' modificacin, 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 ifIf Not EOF(CanalMalum) Then

    LeerMaes(CanalMalum, ExpedM, NombM, Ape1M, Ape2M, DomicM)

    Else

    ExpedM = HvEnd if

    End Select

    End SelectEnd While

    17 - Cierre

    Para ello se utiliza la instruccin 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 deregistros. Como habamos dicho en el captulo anterior para leer datos de un archivo secuencialhaba que leer todo el archivo, es decir que no podamos leer por ejemplo los datos que estuviesenen la lnea 35 del mismo sin antes pasar por todos los datos anteriores, por eso su nombre dearchivo secuencial.

    LECCION 2 Manejo de archivos y funciones propias Pgina 14

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    15/39

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

    En cambio los archivos aleatorios, tambin llamados archivos directos, almacenan los datos conuna estructura diferente. Los datos se guardan en registros mediante una estructura definida detipo Type (estructura definida por nosotros) tambin llamada UDT

    Por ejemplo si tuviesemos 25 registros, cada uno con datos (apellido, email, telefono,etc..), yquisiera 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 ovariable, en un archivo random han de ser de longitud fija, ya que de otra forma no sepodra localizar la informacin en el mismo. Adems los campos no llevan separadoresentre 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 estaes la forma adecuada de hacerlo y como lo manejan los lenguajes de programacin mashabituales.

    20 - Acceso a los registros.

    Hablamos de direccin, pero en realidad lo que se hace es establecer a partir delinicio del archivo, cual es el primer byte que deseamos leer, si estamos trabajando conuna estructura de datos que es de longitud fija, el registro x estar, empezar en:

    Posicin = Longitud de registro * (X 1)

    Si el registro tiene 30 bytes de longitud, el registro nmero dos empezar en el byte30.

    Posicin = 30 * (2 1)

    Se considera que el primer byte disponible es el cero, y el primer registro vlido esel cero.

    LECCION 2 Manejo de archivos y funciones propias Pgina 15

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    16/39

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

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

    21 - Ubicacin de los registros.

    El acceso a los registros de un archivo random se realiza a partir de una direccin,

    esa es la direccin que debe ocupar el registro en el archivo. Despus podemosencontrarnos con dos situaciones para localizar los datos dentro del archivo.

    El registro se almacena en la posicin que le corresponde por el valor de su campo cdigo.

    El registro se almacena por la posicin que le asigna un algoritmo encargado de calcular

    direcciones a partir de un cdigo.

    La situacin ms lgica es utilizar la primera, hoy no tiene sentido utilizar elsegundo sistema, pues sera solaparse con un archivo indexado o con una base de datos.En el primer caso, cada registro ocupara siempre una posicin distinta, no pueden haberdos cdigos iguales.

    En el segundo caso, al ser una direccin proporcionada por un algoritmo, se podradar la situacin de que cdigos distintos generarn direcciones iguales y hay que controlaresa posible duplicidad, de ah que no tenga sentido llegar a esa complejidad, cuando hoyse disponen de los sistemas de gestin de bases de datos, que nos proporcionan esa tareahecha.

    Hay que tener tambin presente que el sistema de cdigo posicin tiene elinconveniente de que puede generar mucho espacio vaco y poco aprovechado, por eso enla actualidad estos archivos se utilizan para almacenar datos muy compactos, y quegeneran muy poco espacio libre en el archivo, Provincias, Pases, etc.

    22 - Libre u ocupado.

    Los archivos random sondireccionables, cuando se abre, o se

    LECCION 2 Manejo de archivos y funciones propias Pgina 16

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    17/39

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

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

    Podemos hablar de dos sistemas principalmente para distinguir cuando est libre uocupado un registro.

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

    El segundo consiste en incluir en eldiseo del registro un campo adicional de unbyte para grabar en el un carcter que meindique si est libre u ocupado. Tambin sepuede utilizar un campo significativo para enfuncin de su contenido decidir esta situacin.

    De entre los dos sistemas el ms adecuado es el primero, el segundo no es que seamalo, si no al contrario puede llegar a ser hasta mejor, todo depende de las circunstanciasen las que nos movamos.

    Si grabamos una marca para indicarlibre u ocupado, eso implica que podemosconservar los datos originales en el registroaunque se borre, eso es bueno y malo, enfuncin de lo que se tenga grabado, ya queimplica 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 unregistro se graban blancos en su lugar, ASCII treinta y dos, y eso impide que se puedarecuperar cualquier informacin una vez borrada.

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

    23 - Diseo del registro.

    LECCION 2 Manejo de archivos y funciones propias Pgina 17

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    18/39

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

    En un archivo secuencial podemos establecer un diseo de registro de longitud fijao variable. En un archivo random, el diseo del registro ha de ser de longitud fija. Cadacampo tiene un espacio asignado.

    El diseo del ejemplo que tenemos en la imagen se corresponde con lo siguiente.

    Como podemos ver no hay separacin entre campos, ni entre registros hay marcasde separacin, de ah que es imprescindible conocer el diseo del registro para suutilizacin.

    24 - Cmo disear los registros.

    LECCION 2 Manejo de archivos y funciones propias Pgina 18

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    19/39

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

    En el ejemplo anterior se puede observar que se ha incluido el campo cdigo en eldiseo del registro, pero eso no es necesario, si se utiliza el primero de los sistemas dedireccionamiento.

    Si nosotros asumimos que el registro con el cdigo siete lo colocamos en el sptimoregistro, cuando accedemos a l, lo localizamos porque sabemos su cdigo, y

    consecuentemente su direccin, por lo que grabar el cdigo no representa ningnproblema, pero resulta redundante.

    Por lo tanto en el diseo de un registro se puede obviar el espacio que ocupa elcampo cdigo.

    Esos dos tipos de diseo podemos llamarlos lgico y fsico.

    El diseo fsico sera el que hemos visto antes.

    El diseo lgico es el que vemos en la imagen de la derecha, en la que podemosobservar que se ha eliminado el campo cdigo.

    25 - Utilizacin.

    A partir de lo visto los pasos en la utilizacin de un archivo random son lossiguientes.

    Establecer la estructura del registro en nuestro programa. Acceder al archivo

    Leer o grabar

    Cerrar el archivo.

    Normalmente las instrucciones de lectura y grabacin en un archivo random no sonlas mismas que las de un archivo secuencial.

    LECCION 2 Manejo de archivos y funciones propias Pgina 19

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    20/39

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

    Sin embargo la filosofa no cambia, abrir, usar y cerrar al final.

    El acceso a los datos sin embargo si que sufre cambios, pues como hemoscomentado antes, se puede leer o grabar indistintamente sin necesidad de cerrar y volvera abrir el archivo.

    Cuando leemos hemos de realizar los siguiente pasos.

    Comprobar la direccin del registro que vamos a leer.

    Realizar la lectura.

    Comprobar si el registro est libre u ocupado

    Actuar en funcin de la comprobacin anterior.

    A la hora de realizar la grabacin los pasos seran

    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 comoresultado que la direccin a utilizar es la adecuada.

    26 - Altas, insercin.

    El proceso de insertar o realizar altas en el archivo equivale a realizar una lecturacomo se ha indicado antes, en la que el resultado de la comprobacin del estado delregistro es que ste est libre, y procedemos a realizar una grabacin de datosposteriormente.

    27 - Modificacin, actualizacin.

    Se repite el proceso anterior, pero en lugar de que la condicin sea que el registroest libre en este caso ha de estar ocupado, y posteriormente realizamos la grabacin delos datos actualizados.

    28 - Borrado, eliminacin.

    Se vuelve a repetir las condiciones para una modificacin, es decir ha de existir elregistro, para a continuacin visualizarlo y confirmar que se desea borrar.

    El borrado implicar la grabacin de un registro con blancos en la direccinindicada, 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 primerahasta la ltima posicin y tratar aquellos registros que se van leyendo que cumplan lasituacin de alta u ocupado, en funcin del sistema seguido.

    LECCION 2 Manejo de archivos y funciones propias Pgina 20

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    21/39

    [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 direccin a leer y realizar lalectura del registro en el archivo.

    Comprobar su estado. Proceder a realizar la accin correspondiente en funcin delestado del mismo.

    Ocupado

    o Modificacin

    o Baja Libre

    o Insercin de registro nuevo, alta.

    31. Comentarios.

    Los lenguajes de programacin admiten que los campos se puedan definir decualquiera de los tipos en ellos existentes. Sin embargo la ventaja de utilizar un array ofchar, string o el tipo equivalente correspondiente en cada uno de ellos, es lacompatibilidad que eso supone entre cualquier lenguaje de programacin.

    Un string, o char, segn toque, siempre tiene un altsimo porcentaje deposibilidades de que se pueda tratar en cualquier lenguaje de programacin.

    Evidentemente en cualquier gestin, actualmente lo que se utiliza es una base dedatos, pero los archivos random, siguen siendo vlidos para muchas tareas, y suconocimiento es necesario.

    32 - Abrir el archivo.

    La instruccin para la apertura del archivo es FileOpen, y su sintaxis:

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

    Donde

    Canal Ser 1, 2, 3 , pero utilizaremos FreeFile para obtener un canal libre.

    Nombre "Fichero.ext" por ejemplo, incluida la ruta.

    Forma de apertura OpenMode.Random, formato de apertura del archivo.Longitud Len(Registro) , 56, longitud de registro.

    LECCION 2 Manejo de archivos y funciones propias Pgina 21

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    22/39

    [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 grabacin de un registro, hay que definir laestructura del registro que vamos a utilizar.

    Structure FilRandom Tipo de usuario

    Public Nom As String

    Public Dire As String

    Public Pobl As String Public Prov As String

    Public Tele As String

    End Structure

    Para despus utilizar una variable definida de ese tipo, en lectura o grabacin.

    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.Posicin es la direccin donde deseamos realizar la lectura.

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

    Registro.Nom

    Regisro.Direc

    El cdigo de una accin de lectura podra ser:

    Select Case Campo00.Text ""

    Case True

    Posicion = CLng(Campo00.Text)Select Case Posicion

    LECCION 2 Manejo de archivos y funciones propias Pgina 22

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    23/39

    [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 ' Cdigo libreMensaje = "El cdigo no existe"

    End Select ' Campo siguiente

    Case Else ' Cdigo fuera de rangoMensaje = "Cdigo 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 filtradoque el contenido solo pueda ser numrico.

    Posicion = CLng(Campo00.Text)

    Despus asignamos el valor del texto con contenido numrico a una variable de tipoLong en ste caso, para usarla en la lectura.

    Select Case Posicion

    Case 1 To 20

    Comprobamos que est dentro de los lmites 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 ' OcupadoVisualiza() ' Visualiza registro

    Si esta ocupado se procede a visualizar su contenido.

    Case Else ' Cdigo libre

    Mensaje = "El cdigo no existe"

    LECCION 2 Manejo de archivos y funciones propias Pgina 23

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    24/39

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

    End Select ' Campo siguiente

    En caso contrario se deja seguir el programa, o se informa de que no existe elcdigo, segn corresponda. El resto es ya informar de que el cdigo est fuera de rango, oque el valor facilitado es incorrecto, en ste caso porque est vaco.

    35 - Grabacin de un registro.

    La sintaxis de la instruccin.

    FilePut(Canal, Registro, Posicin)

    Donde

    Canal ser la misma variable utilizada en la apertura.

    Registro es la variable definida del tipo de la estructura creada.Posicin es la direccin donde deseamos realizar la grabacin.

    La variable registro es la variable que contiene los datos que se van a grabar. Unejemplo de grabacin podra ser:

    Private Sub Grabacion()

    Dim Posicion As Integer

    ' GRABACIONPosicion = CLng(Codigo)

    Reg.Nom = Nombre

    Reg.Dire = DireccionReg.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 direccin que se va a utilizar en la grabacin.

    Reg.Nom = Nombre

    Asignacin de los datos a la variable registro del archivo.

    LECCION 2 Manejo de archivos y funciones propias Pgina 24

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    25/39

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

    FilePut (Canal,Registro,Posicion)

    Realizar la grabacin de los datos en el archivo.

    36 - Insercin, Alta.

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

    Podemos tomar como punto de partida la lectura realizada anteriormente, ya que alfin y al cabo la insercin de un registro ha de basarse en una comprobacin previa de queel cdigo no exista.

    Esta lectura se hara cuando se introduce el campo cdigo. Una vez hecha la lecturade comprobacin el resto es dejar que se vayan introduciendo los datos de cada campodel archivo y al acabar previa confirmacin proceder a grabar los datos.

    Veamos el control del campo cdigo.

    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 ' Cdigo libre, dejamos que siga

    End Select ' Campo siguienteCase Else ' Cdigo fuera de rango

    Mensaje = "Cdigo fuera de rango"End Select

    Case Else ' Valor inadecuado

    Mensaje = "Valor del campo incorrecto"End Select

    Los pasos son igual que en la lectura, porque de hecho el primer paso es unalectura de control.

    Select Case Reg.Nom StrDup(15, " ")Case True ' Ocupado

    Visualiza() ' Visualiza datos, y seguimosCase Else ' Cdigo libre, dejamos que siga

    End Select ' Campo siguiente

    Cuando comprobamos que el registro est libre u ocupado,

    LECCION 2 Manejo de archivos y funciones propias Pgina 25

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    26/39

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

    Si esta ocupado podemos elegir entre seguir despus de visualizar su contenido, en cuyo caso el alta se

    convierte en realidad en una actualizacin, o en pedir un cdigo nuevo.

    Si est libre simplemente seguimos con la ejecucin y ya est.

    Una vez realizada la introduccin de los datos, el siguiente paso es grabar elregistro. La grabacin se hara como se ha visto antes, no hay ninguna diferencia

    37 - Modificacin, actualizacin.

    El proceso de realizar una modificacin puede tomar de nuevo como punto departida el de la lectura de un registro para realizar un alta, la nica variacin que en stecaso el cdigo debe existir, el resto sera idntico. Veamos el ejemplo

    Select Case Campo00.Text ""

    Case TruePosicion = CLng(Campo00.Text)

    Select Case PosicionCase 1 To 20

    FileGet(CanalAgenda, Reg, Posicion) ' Lectura

    Select Case Reg.Nom StrDup(15, " ")Case True ' Ocupado

    Visualiza() ' Visualiza datos, y seguimos

    Case Else ' Cdigo libre, dejamos que siga

    Mensaje = "Cdigo inexistente."End Select ' Campo siguiente

    Case Else ' Cdigo fuera de rangoMensaje = "Cdigo 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 ' Cdigo libre, dejamos que siga

    Mensaje = "Cdigo inexistente."

    End Select ' Campo siguiente

    LECCION 2 Manejo de archivos y funciones propias Pgina 26

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    27/39

    [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 sepueda seguir con la introduccin de datos.

    Cuando comprobamos que el registro est libre u ocupado,

    Si esta ocupado podemos visualizar su contenido, y despus actuar ya segn nuestro estilo de hacer lascosas.

    Si est libre no deberamos permitir que se siga con la introduccin de datos.

    Una vez realizada la introduccin de los datos, el siguiente paso es grabar elregistro, que se realizar siempre de la misma forma.

    38 - Baja eliminacin.

    Se vuelve a repetir las mismas condiciones que para realizar una modificacin, peroen este caso solo hay que borrar el registro cuando ste se ha visualizado.

    Select Case Campo00.Text ""

    Case TruePosicion = CLng(Campo00.Text)

    Select Case Posicion

    Case 1 To 20

    FileGet(CanalAgenda, Reg, Posicion) ' LecturaSelect Case Reg.Nom StrDup(15, " ")

    Case True ' Ocupado

    Visualiza() ' Visualiza datosBorrado() ' Pregunta y borra el registro

    Case Else ' Cdigo libre, dejamos que sigaMensaje = "Cdigo inexistente."

    End Select ' Campo siguiente

    Case Else ' Cdigo fuera de rango

    Mensaje = "Cdigo fuera de rango"

    End SelectCase Else ' Valor inadecuado

    Mensaje = "Valor del campo incorrecto"

    End Select

    El cambio est en

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

    Case True ' OcupadoVisualiza() ' Visualiza datos

    Borrado() ' Pregunta y borra el registro

    Case Else ' Cdigo libre, dejamos que sigaMensaje = "Cdigo inexistente."

    End Select ' Campo siguiente

    LECCION 2 Manejo de archivos y funciones propias Pgina 27

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    28/39

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

    Borrado es un procedimiento que realizar una pregunta de confirmacin al usuarioy si la respuesta es afirmativa realizara la grabacin de blancos en el registro en cuestin.El procedimiento de grabacin, borrado, puede ser como el ejemplo quesigue.

    Private Sub Borrar()

    Dim Posicion As Integer

    ' Borrado de un registro a blancosPosicion = 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

    LECCION 2 Manejo de archivos y funciones propias Pgina 28

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    29/39

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

    39 - Bucle de lectura.

    Como podemos comprobar en el organigrama del ejemplo, el bucle no tiene enrealidad ninguna complejidad, solo hay que asegurarse en el mismo de que tras la lecturadebemos filtrar que el registro que se ha ledo est ocupado, para que pase a proceso.

    Private Sub Bucle(Hasta as Integer)

    Dim Posicin as Integer

    Posicion = 1 ' iniciar contadorWhile Posicion

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    30/39

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

    40 - Integrar todas las acciones.

    Si revisamos las acciones de alta, baja, modificacin, y las comparamos veremosque los cambios son mnimos.

    Y como son mnimos podemos hacer una fusin de todos y obtener un nicoprograma que sea capaz de realizar todas las tareas de mantenimiento ahorrando cdigoy complejidad cara al usuario. Por lo tanto podra quedar de la siguiente forma la tarea demantenimiento:

    Select Case Campo00.Text ""

    Case TruePosicion = CLng(Campo00.Text)

    Select Case Posicion

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

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

    Case True ' OcupadoVisualiza() ' Visualizar datos y esperar

    Case Else ' Cdigo libre, dejamos que se contine

    End Select ' Campo siguiente

    Case Else ' Cdigo fuera de rangoMensaje = "Cdigo fuera de rango"

    End Select

    Case Else ' Valor inadecuadoMensaje = "Valor del campo incorrecto"

    End Select

    Explicacin filosfica de la propuesta.

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

    Case True ' Ocupado

    Visualiza() ' Visualizar datos y esperar

    Case Else ' Cdigo libre, dejamos que se contineEnd Select ' Campo siguiente

    Preguntamos si el registro ledo esta ocupado.

    Select Case Reg.Nom StrDup(15, " ")Case True ' Ocupado

    Visualiza() ' Visualizar datos y esperar

    Case Else ' Cdigo libre, dejamos que se contineEnd Select ' Campo siguiente

    LECCION 2 Manejo de archivos y funciones propias Pgina 30

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    31/39

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

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

    el usuario seleccione la opcin de borrar.

    desee introducir un cdigo nuevo, retrocediendo al campo cdigo.

    contine en el campo actual realizando por tanto una modificacin.

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

    Case True ' OcupadoVisualiza() ' Visualizar datos y esperar

    Case Else ' Cdigo libre, dejamos que se contine

    End Select ' Campo siguiente

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

    Si es un error porque quera acceder a un cdigo existente, como la pantalla estvaca comprobar si es un error el cdigo que ha introducido y si no lo es podr ver que elcdigo no est grabado, porque no se visualiza nada.

    Este criterio es fcil de comprender por quien utiliza el programa y fcil deimplementar.

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

    41 - Conclusiones.

    El uso de un archivo Random permite direccionar los datos que se desean leer ograbar. Conviene reservar o generar todo el espacio que va a utilizar el archivo conblancos para facilitar la gestin.

    El asignar un espacio al archivo no significa que no pueda aumentar su capacidadde almacenamiento ms adelante. El sistema ms cmodo de direccionamiento esrelacionar el cdigo del dato con la posicin del mismo en el archivo.

    Siempre conviene realizar una lectura de comprobacin para saber cual es lasituacin del registro que vamos a tratar. Actualizar es grabar un registro existente condatos. Insertar es grabar un registro que no existe, con datos. Borrar es grabar blancos enun 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. Lasprincipales son.

    LECCION 2 Manejo de archivos y funciones propias Pgina 31

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    32/39

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

    43 - Funcin Dir

    La funcin Dir se utiliza o para buscar archivos y devuelve una cadena que representa el nombrede un archivo o directorio de acuerdo a un determinado patrn de bsqueda. La sintaxis de lafuncin es:

    Dir (ruta, atributos)

    En el parmetro ruta debemos indicar el path de un archivo, directorio o unidad. Si el path noexiste, la funcin Dir devuelve una cadena vaca.

    En el parmetro 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")

    Tambin podemos utilizar los comodines * y ? para filtrar bsquedas.

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

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

    En este ejemplo la funcin Dir devuelve directorios adems de archivos

    LECCION 2 Manejo de archivos y funciones propias Pgina 32

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    33/39

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

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

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

    El nico inconveniente de esta funcin es que siempre devuelve el primer archivo que encuentra.

    Para que contine buscando los dems archivos debemos poner la funcin sin parmetros. Ejemplo

    Dim archivo As String

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

    While archivo ""archivo = DirWend

    En el ejemplo anterior buscar todos los archivos exe en el directorio c:\. cuando ya no encuentre

    mas devolver una cadena vaca 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

    LECCION 2 Manejo de archivos y funciones propias Pgina 33

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    34/39

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

    44 - Funcin FileCopy

    FileCopy nos permite copiar archivos. Esta funcin es muy fcil de usar. ejemplo:

    FileCopy("origen", "destino" )

    Nota: si el archivo existe la funcin lo sobre escribe.

    45 - Funcin MkDir

    Esta funcin se utiliza para crear directorios, pero crea un directorio por vez, es decir que no creavarios 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, "\")

    LECCION 2 Manejo de archivos y funciones propias Pgina 34

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    35/39

    [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 existaIf Dir$(El_Path, vbDirectory) = vbNullString Then

    'Crea la carpeta

    Call MkDir(El_Path)

    End If

    End If

    End If

    Next i

    End Sub

    46 - Funcin kill

    La funcin kill se utiliza para eliminar archivos. Tambin es muy fcil de utilizar, y el nicoparmetro que lleva es la ruta del archivo que queremos eliminar. Si queremos eliminar variosarchivos de un directorio podemos utilizar el comodn"*", y si queremos excluir ciertos archivosutilizamos el comodn "?".

    Kill( "c:\*.txt")

    47 - Funcin FileLen

    Esta funcin nos devuelve el tamao en bytes de un archivo.

    Ejemplo:

    LECCION 2 Manejo de archivos y funciones propias Pgina 35

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    36/39

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

    Dim tamao As Long

    tamao = FileLen("c:\windows\system32\control.exe")

    MsgBox tamao & " bytes"

    FileLen es muy til para trabajar con archivos aleatorios, ya que si queremos conocer la cantidadde registros que tiene el archivo, debemos dividir el tamao del archivo por el tamao de laestructura.

    Ejemplo:

    Private Type t_personas

    nombre As String * 20apellido 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 - Funcin ReName

    Name se utiliza para renombrar archivos y directorios. Esta funcin no se puede utilizar pararenombrar archivos abiertos.

    Ejemplo:

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

    Tambin con esta sentencia podemos mover archivos y directorios a otra ubicacin. para ello

    debemos cambiar en el segundo parmetro la ruta del archivo.

    LECCION 2 Manejo de archivos y funciones propias Pgina 36

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    37/39

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

    49 - Funcin GetAttr y SetAttr

    La funcin Getattr permite recuperar informacin sobre los atributos de un archivo o directorio.Ejemplo:

    GetAttr "ruta del archivo"

    los valores devueltos por la funcin 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 unTextBox llamado Text1 y un Command1.

    Cdigo 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

    LECCION 2 Manejo de archivos y funciones propias Pgina 37

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    38/39

    [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 = No" & vbNewLine

    End If

    If ret And vbSystem Then

    Atributos = Atributos & " Sitema = Si" & vbNewLine

    Else

    Atributos = Atributos & " Sitema = No" & vbNewLine

    End If

    If ret And vbDirectory Then

    Atributos = Atributos & " Directorio = Si" & vbNewLineElse

    Atributos = Atributos & " Directorio = No" & vbNewLine

    End If

    'Muestra los atributos del archivo elegido

    MsgBox Atributos, vbInformation, " Atributos "

    End Sub

    La funcin SetAttr lo que hace es establecer los atributos de un archivo .

    Ejemplo:

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

    LECCION 2 Manejo de archivos y funciones propias Pgina 38

  • 7/30/2019 Leccion 2 - Manejo de archivos y funciones propias

    39/39

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

    50 - Funcin RmDir

    RmDir elimina directorios o carpetas. Pero antes de eliminar directorios tenemos que estar segurosque la carpeta no contiene archivos, de lo contrario nos dar un error en tiempo de ejecucin. Siel directorio contiene archivos debemos eliminarlos previamente con la sentencia kill.

    Ejemplo:

    RmDir( "path del directorio a remover" )