Ayuda ejercicios unidad 40: Archivos secuenciales en VB





Para la resolución de los siguientes ejercicios se han seguido métodos de lectura con estructura y sin estructura de datos, o tipos de usuario, con el fin de ilustrar que el archivo es independiente del programa, y además poder mostrar ambos formatos.

 

Se han utilizado los siguientes elementos en los ejercicios.

 

Module Estructuras

  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 FilCambios

    Public Codigo As String

    Public Nomb As String

    Public Ape1 As String

    Public Ape2 As String

    Public Domic As String

    Public Tipo As String

  End Structure

End Module

 

Module Funciones

  Public Function Respuesta() As Boolean

    Dim Resp As String

    Do

      Console.WriteLine("Los datos son correctos S/N.")

      Resp = Console.ReadLine()

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

    Respuesta = UCase(Resp) = "S"

  End Function

End Module

Module Menu

 

  Sub Main()

    Dim Cual As String

    Do

      Console.Clear()

      Console.WriteLine("1 Crea amigos ")

      Console.WriteLine("2 Listar amigos ")

      Console.WriteLine("3 Grabar cambios de amigos ")

      Console.WriteLine("4 Actualización ")

      Console.WriteLine("5 Cambiar archivos ")

      Console.WriteLine("6 Final ")

      Console.WriteLine("Seleccione opción ")

      Do

        Cual = Console.ReadLine

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

 

      Select Case CInt(Cual)

        Case 1

          GrabarDatos()

        Case 2

          Listar()

        Case 3

          GrabarCambios()

        Case 4

          Actualizacion()

        Case 5

          Try

            FileSystem.Kill("Antiguo.Sec")

          Catch

          Finally

            FileSystem.Rename("Amigos.Sec", "Antiguo.Sec")

            FileSystem.Rename("Nuevo.Sec", "Amigos.Sec")

          End Try

      End Select

    Loop Until Cual = "6"

  End Sub

End Module

 

1.-   Diseñe un registro de datos con los datos de los teléfonos de sus amigos. Grabe los datos con un archivo secuencial.

Module Grabar

  Private Sub Validar(ByRef Codigo As String, _

                      ByVal UltCod As String)

 

    If Codigo <> "" Then Codigo = Format(CInt(Codigo), "00000")

    Select Case Codigo > UltCod

      Case False

        Codigo = ""

        Console.WriteLine("El número de código está fuera de secuencia, el último utilizado es el {0} ", UltCod)

        Console.ReadKey()

    End Select

  End Sub

 

  Private Sub Grabacion(ByVal Canal As Integer, ByVal Datos As FilDatos, ByRef UltCod As String)

    With Datos

      WriteLine(Canal, .Codigo, .Nomb, .Ape1, .Ape2, .Domic)

      UltCod = .Codigo

      UltCod = Format(Val(UltCod), "00000")

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

      Console.ReadKey()

    End With

  End Sub

 

  Public Sub GrabarDatos()

    Dim Codigo As String

    Dim UltCod As String

    Dim Canal As Integer

    Dim Datos As FilDatos

 

    UltCod = ""

    Canal = FreeFile()

    FileOpen(Canal, "Amigos.sec", OpenMode.Output)

    Do

      Console.Clear()

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

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

      Codigo = Console.ReadLine

      Validar(Codigo, UltCod)

      If Codigo <> "" Then

        Datos.Codigo = Codigo

        Console.WriteLine("Introduce el nombre.")

        Datos.Nomb = Console.ReadLine()

        Console.WriteLine("Introduce el primer apellido.")

        Datos.Ape1 = Console.ReadLine()

        Console.WriteLine("Introduce el segundo apellido.")

        Datos.Ape2 = Console.ReadLine()

        Console.WriteLine("Introduce el domcilio.")

        Datos.Domic = Console.ReadLine()

        Select Case Respuesta()

          Case True

            Grabacion(Canal, Datos, UltCod)

        End Select

      End If

    Loop Until Codigo = ""

    FileClose(Canal)

  End Sub

End Module

 

2.-   Realizar el listado de esos datos en pantalla.

Module Listado

  Private Sub Cabecera()

    Console.Clear()

    Console.WriteLine("Listado de los amigos")

    Console.WriteLine()

  End Sub

 

  Private Sub Visualizar(ByVal Datos As FilDatos)

    With Datos

      Console.WriteLine(" {0} {1}  {2}  {3} {4} ", .Codigo, .Nomb, .Ape1, .Ape2, .Domic)

    End With

  End Sub

 

  Public Sub Listar()

    Dim Datos As FilDatos

    Dim Canal As Integer = 1

    Dim Lin As Integer

 

    Canal = FreeFile()

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

    Cabecera()

    While Not EOF(Canal)

      ' lectura de un registro

      With Datos

        Input(Canal, .Codigo)  ' código

        Input(Canal, .Nomb)

        Input(Canal, .Ape1)

        Input(Canal, .Ape2)

        Input(Canal, .Domic)

      End With

      ' Línea de detalle

      Visualizar(Datos)

      Lin = Lin + 1

      ' Control de fin de página

      Select Case Lin Mod 20 = 0

        Case True

          Console.ReadKey()

          Cabecera()

      End Select

    End While

    FileClose(Canal)

    Console.WriteLine()

    Console.WriteLine("Listado finalizado, pulse una tecla para seguir")

    Console.ReadKey()

  End Sub

End Module

 

3.-   Cree ahora un archivo igual al anterior y añádale el dato tipo y grabe datos en él. El campo tipo será 1 para nuevos datos, 2 para actualizar datos existentes, 3 para borrar datos.

Module Cambios

  Private Sub Validar(ByRef Codigo As String, _

                      ByVal UltCod As String)

 

    If Codigo <> "" Then Codigo = Format(CInt(Codigo), "00000")

    Select Case Codigo > UltCod

      Case False

        Codigo = ""

        Console.WriteLine("El número de código está fuera de secuencia, el último utilizado es el {0} ", UltCod)

        Console.ReadKey()

    End Select

  End Sub

 

  Private Sub Grabacion(ByVal Canal As Integer, ByVal Datos As FilCambios, ByRef UltCod As String)

    With Datos

      WriteLine(Canal, .Codigo, .Nomb, .Ape1, .Ape2, .Domic, .Tipo)

      UltCod = .Codigo

      UltCod = Format(Val(UltCod), "00000")

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

      Console.ReadKey()

    End With

  End Sub

 

  Public Sub GrabarCambios()

    Dim Codigo As String

    Dim UltCod As String

    Dim Canal As Integer

    Dim Datos As FilCambios

 

    UltCod = ""

    Canal = FreeFile()

    FileOpen(Canal, "Cambios.sec", OpenMode.Output)

    Do

      Console.Clear()

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

      Console.WriteLine("Si es nuevo, el código no ha de existir, en caso contrario sí.")

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

      Codigo = Console.ReadLine

      Validar(Codigo, UltCod)

      If Codigo <> "" Then

        Datos.Codigo = Codigo

        Console.WriteLine("Introduce el nombre.")

        Datos.Nomb = Console.ReadLine()

        Console.WriteLine("Introduce el primer apellido.")

        Datos.Ape1 = Console.ReadLine()

        Console.WriteLine("Introduce el segundo apellido.")

        Datos.Ape2 = Console.ReadLine()

        Console.WriteLine("Introduce el domcilio.")

        Datos.Domic = Console.ReadLine()

        Console.WriteLine("Introduce el 1 para Nuevo, 2 para Cambios, 3 para Borrar.")

        Datos.Tipo = Console.ReadLine()

        Select Case Respuesta()

          Case True

            Grabacion(Canal, Datos, UltCod)

        End Select

      End If

    Loop Until Codigo = ""

    FileClose(Canal)

  End Sub

End Module

 

4.-   Realice el proceso de actualización del primer archivo con los datos del segundo.

Module Actualizar

  Private Sub LeerAmigos(ByVal Canal As Integer, _

                        ByRef Codigo As String, _

                        ByRef Nomb As String, _

                        ByRef Ape1 As String, _

                        ByRef Ape2 As String, _

                        ByRef Domic As String)

 

    ' lectura de un registro

    Input(Canal, Codigo)  ' código

    Input(Canal, Nomb)

    Input(Canal, Ape1)

    Input(Canal, Ape2)

    Input(Canal, Domic)

  End Sub

 

  Private Sub Grabacion(ByVal Canal As Integer, _

                        ByRef Codigo As String, _

                        ByRef Nomb As String, _

                        ByRef Ape1 As String, _

                        ByRef Ape2 As String, _

                        ByRef Domic As String)

    WriteLine(Canal, Codigo, Nomb, Ape1, Ape2, Domic)

  End Sub

 

  Private Sub LeerCambios(ByVal Canal As Integer, _

                        ByRef Codigo As String, _

                        ByRef Nomb As String, _

                        ByRef Ape1 As String, _

                        ByRef Ape2 As String, _

                        ByRef Domic As String, _

                        ByRef Tipo As String)

 

    ' lectura de un registro

    Input(Canal, Codigo)  ' código

    Input(Canal, Nomb)

    Input(Canal, Ape1)

    Input(Canal, Ape2)

    Input(Canal, Domic)

    Input(Canal, Tipo)

  End Sub

 

  Private Sub Proceso(ByVal Canal As Integer, ByVal CanalC As Integer, ByVal CanalN As Integer)

    Const Hv As String = "99999"

    Dim CodCamb As String

    Dim NombC As String

    Dim Ape1C As String

    Dim Ape2C As String

    Dim DomicC As String

 

    Dim Codigo As String

    Dim Nomb As String

    Dim Ape1 As String

    Dim Ape2 As String

    Dim Domic As String

    Dim Tipo As String

 

    If Not EOF(Canal) Then LeerAmigos(Canal, Codigo, Nomb, Ape1, Ape2, Domic) Else Codigo = Hv

    If Not EOF(CanalC) Then LeerCambios(CanalC, CodCamb, NombC, Ape1C, Ape2C, DomicC, Tipo) Else CodCamb = Hv

 

    While Codigo <> Hv Or CodCamb <> Hv

      Select Case Codigo

        Case Is < CodCamb   ' copiar maestro

          Grabacion(CanalN, Codigo, Nomb, Ape1, Ape2, Domic)

          If Not EOF(Canal) Then LeerAmigos(Canal, Codigo, Nomb, Ape1, Ape2, Domic) Else Codigo = Hv

        Case Is > CodCamb

          Select Case Tipo

            Case "1"   ' alta

              Grabacion(CanalN, CodCamb, NombC, Ape1C, Ape2C, DomicC)

          End Select

          If Not EOF(CanalC) Then LeerCambios(CanalC, CodCamb, NombC, Ape1C, Ape2C, DomicC, Tipo) Else CodCamb = Hv

        Case Is = CodCamb

          Select Case Tipo

            Case "1"   ' alta, error, habría que tratar el error

              If Not EOF(CanalC) Then LeerCambios(CanalC, CodCamb, NombC, Ape1C, Ape2C, DomicC, Tipo) Else CodCamb = Hv

            Case "2"   ' modificación, se graba el nuevo

              Grabacion(CanalN, CodCamb, NombC, Ape1C, Ape2C, DomicC)

              If Not EOF(Canal) Then LeerAmigos(Canal, Codigo, Nomb, Ape1, Ape2, Domic) Else Codigo = Hv

              If Not EOF(CanalC) Then LeerCambios(CanalC, CodCamb, NombC, Ape1C, Ape2C, DomicC, Tipo) Else CodCamb = Hv

            Case "3"   ' baja, no se graba

              If Not EOF(Canal) Then LeerAmigos(Canal, Codigo, Nomb, Ape1, Ape2, Domic) Else Codigo = Hv

              If Not EOF(CanalC) Then LeerCambios(CanalC, CodCamb, NombC, Ape1C, Ape2C, DomicC, Tipo) Else CodCamb = Hv

          End Select

      End Select

    End While

  End Sub

 

  Public Sub Actualizacion()

    Dim Canal As Integer

    Dim CanalCamb As Integer

    Dim CanalNuevo As Integer

 

    ' Abrir archivos

    Canal = FreeFile()

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

    CanalCamb = FreeFile()

    FileOpen(CanalCamb, "Cambios.sec", OpenMode.Input)

    CanalNuevo = FreeFile()

    FileOpen(CanalNuevo, "Nuevo.sec", OpenMode.Output)

 

    Proceso(Canal, CanalCamb, CanalNuevo)

 

    ' cerrar todos los archivos

    FileClose()

  End Sub

End Module

 

   Inicio    






Página inicial  Cursos Informática Gratuitos

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