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
Síguenos en: Facebook Sobre aulaClic Política de Cookies