Ayuda ejercicios unidad 42: Archivos Random en VB





En la solución de los ejercicios se han utilizado los siguientes módulos:

 

 

Module Estructuras

  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

 

  Public Structure FilDatosSec

    <VBFixedString(15)> Public Nomb As String

    <VBFixedString(15)> Public Ape1 As String

    <VBFixedString(15)> Public Ape2 As String

    <VBFixedString(30)> Public Domic As String

  End Structure

End Module

 

Module Procedimientos

 

  Public Sub AbreFicheros()

    '           ABRIR FICHEROS

    Canal = FreeFile()  ' No se puede hacer en la creación

    FileOpen(Canal, NomArchivo, OpenMode.Random, OpenAccess.Default, OpenShare.Shared, Len(Reg))

  End Sub

 

 

 

  Public Sub CreaFichero()

    Dim Reg As FilRandom

    Dim X As Integer

    ' Carga de blancos en los campos

    Reg.Dire = Space(15)

    Reg.Nom = Space(15)

    Reg.Pobl = Space(15)

    Reg.Prov = "  "

    Reg.Tele = Space(9)

    ' Crear registros en blanco

    For X = 1 To 20

      FilePut(Canal, Reg, X)

    Next

    Console.WriteLine("Archivo generado.")

    Console.ReadKey()

  End Sub

 

  Public Sub Grabacion(ByVal Canal As Integer, _

                       ByVal Reg As FilRandom, ByRef Codigo As String)

    Dim Donde As Integer = Val(Codigo)   ' el código nos da la posición

    FilePut(Canal, Reg, Donde)

    Console.WriteLine("Datos grabados, pulse una tecla para seguir")

    Console.ReadKey()

  End Sub

End Module

 

Module Funciones

  Public Function Respuesta(ByVal Texto) As Boolean

    Dim Resp As String

    Do                    ' pregunta recibida desde el programa,

      Console.WriteLine(Texto)  ' siempre es del tipo S/N

      Resp = Console.ReadLine()

    Loop Until UCase(Resp) = "S" Or UCase(Resp) = "N"

    Respuesta = UCase(Resp) = "S"   ' cierto si es afirmativa

  End Function

 

  Public Function Ocupado(ByVal Canal As Integer, _

                          ByRef Reg As FilRandom, _

                          ByRef Codigo As String) As Boolean

    Dim Donde As Integer = Val(Codigo)

    Ocupado = True

    Try

      FileGet(Canal, Reg, Donde)

      ' Si no son blancos, está ocupado

      Ocupado = Reg.Nom <> Space(15)

    Catch ex As ArgumentException

    End Try

  End Function

End Module

 

 

 

 

Module Principal

  Sub Main()

    AbreFicheros()

    Dim Cual As String

    Do

      Console.Clear()

      Console.WriteLine("1 Crea archivo ")

      Console.WriteLine("2 Inserta registro ")

      Console.WriteLine("3 Leer registro ")

      Console.WriteLine("4 Mantenimiento ")

      Console.WriteLine("5 Copiar archivo secuencial ")

      Console.WriteLine("6 Listar archivo ")

      Console.WriteLine("7 Final ")

      Console.WriteLine("Seleccione opción ")

      Do

        Cual = Console.ReadLine

      Loop Until Cual > "0" And Cual < "8"

 

      Select Case CInt(Cual)

        Case 1

          CreaFichero()

        Case 2

          InsertarRegistro()

        Case 3

          LeerRegistro()

        Case 4

          ProcesoDos()

        Case 5

          Copia()

        Case 6

          Listado()

      End Select

    Loop Until Cual = "7"

  End Sub

End Module

 

 

1.     Realizar la generación de un archivo random con 20 registros de 56 bytes de longitud cada uno.

Desde el menú principal se llama al procedimiento

Case 1

  CreaFichero()

 

2.     A partir del diseño que se indica realizar la inserción de un registro en el archivo.

 

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

 

El campo código no se graba, el sistema de direccionamiento se entiende que es campo de código como dirección del registro.

 

El campo código tendrá un valor entre 1 y 20.

 

 

Module Grabar

  Public Sub InsertarRegistro()

    Dim Codigo As String

    Do

      Console.Clear()

      Console.WriteLine("Grabar datos de los amigos.")

      Console.WriteLine("Introduce el código del amigo")

      Codigo = Console.ReadLine

 

      Select Case Ocupado(Canal, Reg, Codigo)

        Case False

          With Reg

            If Codigo <> "" Then

              Console.WriteLine("Introduce el nombre.")

              .Nom = Console.ReadLine()

              Console.WriteLine("Introduce la dirección.")

              .Dire = Console.ReadLine()

              Console.WriteLine("Introduce la población.")

              .Pobl = Console.ReadLine()

              Console.WriteLine("Introduce la provincia.")

              .Prov = Console.ReadLine()

              Console.WriteLine("Introduce el Teléfono.")

              .Tele = Console.ReadLine()

              Select Case Respuesta("Los datos son correctos S/N.")

                Case True

                  Grabacion(Canal, Reg, Codigo)

              End Select

            End If

          End With

        Case Else

          Console.WriteLine("El código {0} ya está útilizado.", Codigo)

          Console.ReadKey()

      End Select

    Loop Until Codigo = ""

  End Sub

End Module

 

Desde el menú principal se ejecuta:

InsertarRegistro()

3.     Realizar la lectura de los datos grabados en el ejercicio anterior.

 

Module Leer

  Public Sub LeerRegistro()

    Dim Codigo As String

    Console.Clear()

    Do

      Console.WriteLine("Leer los datos de los amigos.")

      Console.WriteLine("Introduce el código del amigo")

      Codigo = Console.ReadLine

      Console.Clear()  ' limpiar pantalla

      Select Case Ocupado(Canal, Reg, Codigo)

        Case True

          With Reg

            Console.WriteLine("Nombre {0}", .Nom)

            Console.WriteLine("Dirección {0}", .Dire)

            Console.WriteLine("Población {0}", .Pobl)

            Console.WriteLine("Provincia {0}", .Prov)

            Console.WriteLine("Teléfono {0}", .Tele)

          End With

        Case Else

          Console.WriteLine("El código {0} no está útilizado.", Codigo)

          Console.ReadKey()

      End Select

    Loop Until Codigo = ""

  End Sub

End Module

 

 

Desde el menú principal se ejecuta:

  LeerRegistro()

 

4.     Realizar un programa que permita altas, bajas y modificaciones en un solo programa.

 

Module Mantener

 

  Private Function LeerCodigo() As String

    Dim Codigo As String

    Console.Clear()

    Console.WriteLine("Leer los datos de los amigos.")

    Console.WriteLine("Introduce el código del amigo")

    Codigo = Console.ReadLine

    Console.Clear()

    LeerCodigo = Codigo

  End Function

 

  Private Sub Accion(ByVal Existe As Boolean, ByVal Codigo As String)

    Dim Graba As Boolean = False

    Dim Modif As Boolean

    With Reg

      Select Case Existe

        Case True ' si existe se visualiza

          Console.WriteLine("Nombre {0}", .Nom)

          Console.WriteLine("Dirección {0}", .Dire)

          Console.WriteLine("Población {0}", .Pobl)

          Console.WriteLine("Provincia {0}", .Prov)

          Console.WriteLine("Teléfono {0}", .Tele)

          Modif = Respuesta("Desea modificarlos S/N ")

      End Select

      Select Case (Modif And Existe) Or Not Existe

        Case True  ' si existe y se quiere modificar, o es nuevo

          Console.WriteLine("Introduce el nombre.")

          .Nom = Console.ReadLine()

          Console.WriteLine("Introduce la dirección.")

          .Dire = Console.ReadLine()

          Console.WriteLine("Introduce la población.")

          .Pobl = Console.ReadLine()

          Console.WriteLine("Introduce la provincia.")

          .Prov = Console.ReadLine()

          Console.WriteLine("Introduce el Teléfono.")

          .Tele = Console.ReadLine()

          Graba = True  ' cualquier acción acaba en grabar

        Case Else ' si existe y no modifica, desea borrarlos

          Select Case Existe And Not Modif

            Case True

              If Respuesta("Desea borrarlos S/N ") Then

                ' se cargan a blancos

                Reg.Dire = Space(15)

                Reg.Nom = Space(15)

                Reg.Pobl = Space(15)

                Reg.Prov = "  "

                Reg.Tele = Space(9)

                Graba = True  ' cualquier acción acaba en grabar

              End If

          End Select

      End Select

      ' si es alta, baja o modificación

      Select Case Graba

        Case True

          Grabacion(Canal, Reg, Codigo)

      End Select

    End With

  End Sub

 

  Public Sub Proceso()

    Dim Codigo As String

    Dim Existe As Boolean

    ' mientras se introduzca un código

    Codigo = LeerCodigo()

    While Codigo <> ""

      Existe = Ocupado(Canal, Reg, Codigo)

      Accion(Existe, Codigo)

      Codigo = LeerCodigo()

    End While

  End Sub

End Module

 

Desde el menú principal se ejecuta:

  Proceso()

 

La opción utilizada en las soluciones está basada en el uso de la consola, donde los recursos son algo más limitados, mientras que en los ejemplos del tema se han planteado desde un entorno gráfico, lo que facilita la creación del ejemplo.

 

Si tomamos como punto de partida el ejemplo visto en el tema, podría quedar así el ejercicio.

 

Module Mantener

  Private Sub Visualiza()

    With Reg

      Console.WriteLine("Nombre {0}", .Nom)

      Console.WriteLine("Dirección {0}", .Dire)

      Console.WriteLine("Población {0}", .Pobl)

      Console.WriteLine("Provincia {0}", .Prov)

      Console.WriteLine("Teléfono {0}", .Tele)

    End With

  End Sub

 

  Private Sub Accion(ByVal Existe As Boolean, ByVal Codigo As String)

    Dim Graba As Boolean = False

    Dim Modif As Boolean

    With Reg

      Select Case Existe

        Case True ' si existe se visualiza

          Modif = Respuesta("Desea modificarlos S/N ")

      End Select

      Select Case (Modif And Existe) Or Not Existe

        Case True  ' si existe y se quiere modificar, o es nuevo

          Console.WriteLine("Introduce el nombre.")

          .Nom = Console.ReadLine()

          Console.WriteLine("Introduce la dirección.")

          .Dire = Console.ReadLine()

          Console.WriteLine("Introduce la población.")

          .Pobl = Console.ReadLine()

          Console.WriteLine("Introduce la provincia.")

          .Prov = Console.ReadLine()

          Console.WriteLine("Introduce el Teléfono.")

          .Tele = Console.ReadLine()

          Graba = True  ' cualquier acción acaba en grabar

        Case Else ' si existe y no modifica, desea borrarlos

          Select Case Existe And Not Modif

            Case True

              If Respuesta("Desea borrarlos S/N ") Then

                ' se cargan a blancos

                Reg.Dire = Space(15)

                Reg.Nom = Space(15)

                Reg.Pobl = Space(15)

                Reg.Prov = "  "

                Reg.Tele = Space(9)

                Graba = True  ' cualquier acción acaba en grabar

              End If

          End Select

      End Select

      ' si es alta, baja o modificación

      Select Case Graba

        Case True

          Grabacion(Canal, Reg, Codigo)

      End Select

    End With

  End Sub

 

  Private Function Control(ByVal Codigo As String) As Boolean

    Dim Posicion As Integer

    Control = False

    Select Case Codigo <> ""

      Case True

        Posicion = CLng(Codigo)

        Select Case Posicion

          Case 1 To 20

            FileGet(Canal, Reg, Posicion)  ' Lectura

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

              Case True       ' Ocupado

                Visualiza()       ' Visualizar datos y esperar

                Control = True

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

            End Select            ' Campo siguiente

          Case Else           ' Código fuera de rango

            Console.WriteLine("Código fuera de rango")

        End Select

      Case Else               ' Valor inadecuado

        Console.WriteLine("Valor del campo incorrecto")

    End Select

  End Function

 

 

  Public Sub Proceso()

    Dim Codigo As String

    Dim Existe As Boolean

    ' mientras se introduzca un código

    Codigo = LeerCodigo()

    While Codigo <> ""

      Existe = Control(Codigo)

      Accion(Existe, Codigo)

      Codigo = LeerCodigo()

    End While

  End Sub

End Module

 

Como puede verse, de alguna forma hay que introducir los datos, lo que hace que el código no sea todo lo adecuado que podría ser, sin aumentar el volumen del mismo, para no hacerlo excesivamente largo.

 

5.     Copie el diseño del tema de archivos secuenciales del archivo de Amigos, para un archivo Random.

  Public Structure FilDatos

    Public Codigo As String

    Public Nomb As String

    Public Ape1 As String

    Public Ape2 As String

    Public Domic As String

  End Structure

 

  Public Structure FilDatosSec

    <VBFixedString(15)> Public Nomb As String

    <VBFixedString(15)> Public Ape1 As String

    <VBFixedString(15)> Public Ape2 As String

    <VBFixedString(30)> Public Domic As String

  End Structure

 

6.     Copie los datos del archivo secuencial en uno Random, asignándole como posición el código de cada uno de sus amigos.

Module CopiaSecuencial

  Private Sub CreaFichero(ByVal Canal As Integer)

    Dim Reg As FilDatosSec

    Dim X As Integer

    ' Carga de blancos en los campos

    Reg.Nomb = Space(15)

    Reg.Ape1 = Space(15)

    Reg.Ape2 = Space(15)

    Reg.Domic = Space(30)

    ' Crear registros en blanco

    For X = 1 To 20

      FilePut(Canal, Reg, X)

    Next

    Console.WriteLine("Archivo generado.")

    Console.ReadKey()

  End Sub

 

 

 

  Public Sub Copia()

    Dim CanSec As Integer

    Dim CanRan As Integer

    Dim RegSec As FilDatos

    Dim RegRan As FilDatosSec

 

    CanSec = FreeFile()

    FileOpen(CanSec, "Amigos.sec", OpenMode.Input)

    CanRan = FreeFile()

    FileOpen(CanRan, "Amigos.ran", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(RegRan))

    CreaFichero(CanRan)

 

    While Not EOF(CanSec)

      With RegSec

        ' lectura del registro secuencial

        Input(CanSec, .Codigo)

        Input(CanSec, .Nomb)

        Input(CanSec, .Ape1)

        Input(CanSec, .Ape2)

        Input(CanSec, .Domic)

        ' Copia si es menor de 21

        If CInt(.Codigo) < 21 Then

          RegRan.Nomb = .Nomb

          RegRan.Ape1 = .Ape1

          RegRan.Ape2 = .Ape2

          RegRan.Domic = .Domic

          FilePut(CanRan, RegRan, CInt(.Codigo))

        Else   ' incidencia, debería hacerse en un archivo

          Console.WriteLine("Código {0} fuera de rango .", .Codigo)

          Console.ReadKey()

        End If

      End With

    End While

    Console.WriteLine("Proceso finalizado")

    Console.ReadKey()

    FileClose(CanRan)

    FileClose(CanSec)

  End Sub

End Module

 

Desde el menú principal se ejecuta:

  Copia()

 

7.     Realizar el listado de esos datos en pantalla.

 

Module Listar

  Private Sub Cabecera()

    Console.WriteLine("Código  Nombre          Apellidos  ")

    Console.WriteLine("_________________________________")

  End Sub

 

  Private Sub LineaDetalle(ByVal Codigo As Integer, ByVal Reg As FilDatosSec)

    Console.WriteLine("   {0}    {1:18} {2:16} {3:16} ", CStr(Codigo), Reg.Nomb, Reg.Ape1, Reg.Ape2)

  End Sub

 

 

  Private Sub Bucle(ByVal CanRan As Integer, _

                    ByVal Desde As Integer, ByVal Hasta As Integer)

    Dim Posicion As Integer        ' contador de lectura

    Dim RegRan As FilDatosSec

    Dim L As Integer               ' contador de líneas

    Posicion = Desde               ' iniciar contador

    Console.Clear()

    While Posicion <= Hasta

      FileGet(Canran, RegRan, Posicion)

      Select Case RegRan.Nomb <> Space(15)

        Case True                  ' registro ocupado

          If L = 0 Then Cabecera() ' control de cabcera

          LineaDetalle(Posicion, RegRan)

          L = L + 1

          If L > 50 Then L = 0 ' control de cabcera

      End Select

      Posicion = Posicion + 1     ' Incremento del contador

    End While

    Console.WriteLine("Listado finalizado")

    Console.ReadKey()

  End Sub

 

  Public Sub Listado()

    Dim Desde As Integer

    Dim Hasta As Integer

    Dim CanRan As Integer

    Dim RegRan As FilDatosSec

 

    CanRan = FreeFile()

    FileOpen(CanRan, "Amigos.ran", OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, Len(RegRan))

 

    Console.WriteLine("Indique desde que valor, 1 a 20")

    Desde = CInt(Console.ReadLine)

    Console.WriteLine("Indique hasta que valor, {0} a 20", Desde)

    Hasta = CInt(Console.ReadLine)

    Console.WriteLine("Desea realizar el listado S/N ")

    Select Case UCase(Console.ReadKey.KeyChar)

      Case "S"

        Bucle(CanRan, Desde, Hasta)

    End Select

    FileClose(CanRan)

  End Sub

End Module

 

Desde el menú principal se ejecuta:

  Listado()

   Inicio    






Página inicial  Cursos Informática Gratuitos

Síguenos en:   Facebook       Sobre aulaClic            Política de Cookies