P110_E6-Combinar+informacion+ficheros

=__**Ejercicio: combinar información de dos ficheros**__=

Debido a un tratamiento no correcto de la información sobre los trabajadores de una empresa, la información sobre sus trabajadores se encuentra desdoblada en dos ficheros diferentes.

Un departamento tiene un fichero denominado PERSONAL.DAT con la información de los datos personales:

>> -DNI >> -Nombre >> -Apellidos >> -Domicilio

Otro departamento tiene un fichero denominado CUENTAS.DAT con la información de los datos laborales:

>> - DNI >> - Fecha_ingreso_empresa >> - Número_seg_social >> - Número_cta_corriente

Se pide realizar un programa que permita concentrar en un único fichero toda información de los trabajadores, y muestre la información de éste último fichero.

__**Version 1**__: ** Tras analizar el contenido de los ficheros se comprueba que en ambos la información de cada persona ocupa la misma posición en ambos ficheros. ** code format="pascal" PROGRAM Fich_06_CrearFicheros ; USES Crt, SysUtils ; CONST sFICHERO_PERSONALES = 'PERSONAL.DAT' ; sFICHERO_CUENTAS   = 'CUENTAS.DAT' ; sFICHERO_TOTALES   = 'DATOS_TOTALES.DAT' ; TYPE tsCad_10 = String [10] ; tsCad_20 = String [20] ; tsCad_40 = String [40] ;

trgPersonal = RECORD sDNI      : tsCad_10 ; sNombre   : tsCad_20 ; sApellidos, sDomicilio : tsCad_40 ; END ;

trgCuentas = RECORD sDNI, sFechaIngreso   : tsCad_10 ; sNumSegSocial, sNumCtaCorriente : tsCad_10 ; END ;

trgTotales = RECORD sDNI            : tsCad_10 ; sNombre         : tsCad_20 ; sApellidos, sDomicilio      : tsCad_40 ; sFechaIngreso   : tsCad_10 ; sNumSegSocial, sNumCtaCorriente : tsCad_10 ; END ;

tfbrgPersonal = FILE OF trgPersonal ; tfbrgCuenta  = FILE OF trgCuentas  ; tfbrgTotales = FILE OF trgTotales  ;

PROCEDURE JuntarDatos (CONST rgDatosPersonal : trgPersonal ;                       CONST rgDatosCuentas  : trgCuentas ;                        VAR   rgDatosTotales  : trgTotales) ; BEGIN WITH rgDatosTotales DO      BEGIN sDNI      := rgDatosPersonal.sDNI ; sNombre   := rgDatosPersonal.sNombre ; sApellidos := rgDatosPersonal.sApellidos ; sDomicilio := rgDatosPersonal.sDomicilio ;

sFechaIngreso   := rgDatosCuentas.sFechaIngreso ; sNumSegSocial   := rgDatosCuentas.sNumSegSocial ; sNumCtaCorriente := rgDatosCuentas.sNumCtaCorriente ; END END ; { JuntarDatos }

PROCEDURE CombinarFicherosParciales_1 (sNomFichPersonales,                                      sNomFichCuentas,                                       sNomFichTotales: tsCad_20) ; VAR rgDatosTotales : trgTotales ; rgDatosPersonal : trgPersonal ; rgDatosCuentas : trgCuentas ; fbrgPersonales : tfbrgPersonal ; fbrgCuentas    : tfbrgCuenta ; fbrgTotales    : tfbrgTotales ; BEGIN Assign (fbrgPersonales, sNomFichPersonales) ; Reset (fbrgPersonales) ;

Assign (fbrgCuentas, sNomFichCuentas) ; Reset (fbrgCuentas) ;

Assign (fbrgTotales, sNomFichTotales) ; ReWrite (fbrgTotales) ;

WHILE NOT EOF (fbrgPersonales) DO      BEGIN { Leer los datos en los ficheros correspondientes } Read (fbrgPersonales, rgDatosPersonal) ; Read (fbrgCuentas, rgDatosCuentas) ;

JuntarDatos (rgDatosPersonal, rgDatosCuentas, rgDatosTotales) ;

{ Escribir los datos en el fichero correspondiente } Write (fbrgTotales, rgDatosTotales) ; END ;

Close (fbrgPersonales) ; Close (fbrgCuentas) ; Close (fbrgTotales) ; END ; { CombinarFicherosParciales_1 }

PROCEDURE MostrarDatosTotales (CONST rgDatosTotales : trgTotales) ; BEGIN WITH rgDatosTotales DO      BEGIN Write  ('                           DNI: ') ; Writeln (sDNI) ; Write  ('                        Nombre: ') ; Writeln (sNombre) ; Write  ('                     Apellidos: ') ; Writeln (sApellidos) ; Write  ('                     Domicilio: ') ; Writeln (sDomicilio) ; Write  ('Fecha de ingreso en la empresa: ') ; Writeln (sFechaIngreso) ; Write  ('Numero de  la seguridad social: ') ; Writeln (sNumSegSocial) ; Write  ('Numero de  la cuenta corriente: ') ; Writeln (sNumCtaCorriente) ; END END ; { MostrarDatosTotal }

PROCEDURE MostrarFicheroDatosTotales (sNomFichTotales : tsCad_20) ; VAR rgDatosTotales : trgTotales ; fbrgTotales    : tfbrgTotales ; cEspera      : Char ; BEGIN Assign (fbrgTotales, sNomFichTotales) ; Reset (fbrgTotales) ;

WHILE NOT Eof (fbrgTotales) DO      BEGIN (* leer informacion de una persona *) Read (fbrgTotales, rgDatosTotales) ;

(* Mostrar la informacion leída *) MostrarDatosTotales (rgDatosTotales) ; Writeln ; cEspera := ReadKey ; END ;

Close (fbrgTotales) END ; { MostrarFicheroDatosTotales }

VAR sNomFichPersonales, sNomFichCuentas, sNomFichTotales : tsCad_20 ; boExistenParciales : Boolean ; cResp, cEspera : Char ;

BEGIN (******** PROGRAMA PRINCIPAL ************) (* Asignar valores a las variables de los nombres de variables *) (* Indicar los ficheros f¡sicos                                *) sNomFichPersonales := sFICHERO_PERSONALES ; sNomFichCuentas   := sFICHERO_CUENTAS ; sNomFichTotales   := sFICHERO_TOTALES ;

boExistenParciales := TRUE ;

IF NOT FileExists (sNomFichPersonales) THEN BEGIN Writeln ('ERROR: No existe el fichero ', sNomFichPersonales) ; Writeln ; boExistenParciales := FALSE ; END ; IF NOT FileExists (sNomFichCuentas) THEN BEGIN Writeln ('ERROR: No existe el fichero ', sNomFichCuentas) ; Writeln ; boExistenParciales := FALSE ; END ;

IF boExistenParciales THEN BEGIN Writeln ; WriteLn (' Se van a combinar los datos de los ficheros: '); Writeln ('   * ', sNomFichPersonales) ; Writeln ('   * ', sNomFichCuentas) ; Writeln ; Writeln (' En el fichero: ') ; Writeln ('   * ', sNomFichTotales) ; Writeln ; Write  ('Pulsa una tecla para continuar..') ; cEspera := Readkey ;

CombinarFicherosParciales_1 (sNomFichPersonales,                                  sNomFichCuentas, sNomFichTotales) ;

Writeln ; Writeln ; Write  ('        Creado el fichero combinado: ', sNomFichTotales) ; Writeln ; Writeln ; Write  ('Quieres ver el contenido del fichero ', sNomFichTotales, ' (S/N): ') ; Readln (cResp) ; IF Upcase (cResp) = 'S' THEN BEGIN Writeln ; Writeln ('Contenido del fichero de datos totales:') ; Writeln ;

MostrarFicheroDatosTotales (sNomFichTotales) ; Writeln ('---') ; END ; END ;

Writeln ; Writeln ; Write  (' _______________ Final del programa ______________') ; cEspera := ReadKey ; END. code

__**Version 2**__: ** Tras analizar el contenido de los ficheros se comprueba que en ambos la información de cada persona no ocupa la misma posición en ambos ficheros. ** >> ** Las búsquedas se realizan sobre el fichero CUENTAS.DAT **

code format="pascal" PROCEDURE BuscarDatosCuenta (sDNIBuscar : tsCad_10;                            sNomFichCuentas:tsCad_20;                             VAR iPosic  : Integer ;                             VAR rgDatosCuentas: trgCuentas) ; VAR

fbrgCuentas  : tfbrgCuenta ; boEncontrado : Boolean ; BEGIN Assign (fbrgCuentas, sNomFichCuentas) ; Reset (fbrgCuentas) ;

iPosic := 0 ; boEncontrado := FALSE ;

WHILE NOT boEncontrado AND NOT Eof (fbrgCuentas) DO      BEGIN { leer informaci¢n de una persona } Read (fbrgCuentas, rgDatosCuentas) ;

IF sDNIBuscar = rgDatosCuentas.sDNI THEN boEncontrado := TRUE ; END ;

IF boEncontrado THEN iPosic := FilePos (fbrgCuentas) - 1 ELSE iPosic := - 1 ;

Close (fbrgCuentas) ; END ; { BuscarDatosCuenta }

PROCEDURE CombinarFicherosParciales_2 (sNomFichPersonales,                                      sNomFichCuentas,                                       sNomFichTotales:tsCad_20) ; VAR rgDatosTotales : trgTotales ; rgDatosPersonal : trgPersonal ; fbrgPersonales : tfbrgPersonal ; fbrgTotales    : tfbrgTotales ; rgDatosCuentas: trgCuentas ;

iPosic : Integer ; BEGIN Assign (fbrgPersonales, sNomFichPersonales) ; Reset (fbrgPersonales) ;

Assign (fbrgTotales, sNomFichTotales) ; ReWrite (fbrgTotales) ;

WHILE NOT EOF (fbrgPersonales) DO      BEGIN { Leer los datos en los ficheros correspondientes } Read (fbrgPersonales, rgDatosPersonal) ;

BuscarDatosCuenta (rgDatosPersonal.sDNI, sNomFichCuentas,                         iPosic, rgDatosCuentas) ;

IF iPosic <> -1 THEN BEGIN JuntarDatos (rgDatosPersonal, rgDatosCuentas, rgDatosTotales) ;

{ Escribir los datos en el fichero correspondiente } Write (fbrgTotales, rgDatosTotales) ; END ELSE BEGIN Writeln ; Writeln ('ERROR: No existen datos de las cuentas del DNI: ', rgDatosPersonal.sDNI) ; Writeln ; END ; END ;

Close (fbrgPersonales) ; Close (fbrgTotales) ; END ; { CombinarFicherosParciales_2 } code

__**Version 3**__: ** Tras analizar el contenido de los ficheros se comprueba que en ambos la información de cada persona no ocupa la misma posición en ambos ficheros. ** >> ** El fichero CUENTAS.DAT se vuelca en una lista y las búsquedas se realizan sobre la lista **

code format="pascal" PROCEDURE VolcarFichAListaCuentas (sNomFichCuentas: tsCad_20 ;                                  VAR  argLista: targListaCuentas;                                   VAR  iLong   : Integer) ; VAR fbrgCuentas  : tfbrgCuenta ; BEGIN Assign (fbrgCuentas, sNomFichCuentas) ; Reset (fbrgCuentas) ;

iLong := 0 ; WHILE NOT Eof (fbrgCuentas) DO      BEGIN { leer informaci¢n de una persona } iLong := iLong + 1 ; Read (fbrgCuentas, argLista[iLong]) ; END ;

Close (fbrgCuentas) END ; { VolcarFichAListaCuentas }

FUNCTION fniBuscarDatosCuenta (sDNIBuscar : tsCad_10;                              CONST  argLista: targListaCuentas;                                      iLong   : Integer) : Integer ; VAR boEncontrado : Boolean ; i : Integer ; BEGIN boEncontrado := FALSE ; i := 1 ;

WHILE NOT boEncontrado AND (i <= iLong) DO     IF argLista[i].sDNI = sDNIBuscar THEN boEncontrado := TRUE ELSE i := i + 1 ;

IF boEncontrado THEN fniBuscarDatosCuenta := i  ELSE fniBuscarDatosCuenta := 0 ; END ;

PROCEDURE CombinarFicherosParciales_3 (sNomFichPersonales,                                      sNomFichCuentas,                                       sNomFichTotales:tsCad_20) ;

VAR rgDatosTotales : trgTotales ; rgDatosPersonal : trgPersonal ; fbrgPersonales : tfbrgPersonal ; fbrgTotales    : tfbrgTotales ;

argLista: targListaCuentas; iLong  : Integer ;

iPosic : Integer ; BEGIN VolcarFichAListaCuentas (sNomFichCuentas, argLista, iLong) ;

Assign (fbrgPersonales, sNomFichPersonales) ; Reset (fbrgPersonales) ;

Assign (fbrgTotales, sNomFichTotales) ; ReWrite (fbrgTotales) ;

WHILE NOT EOF (fbrgPersonales) DO      BEGIN { Leer los datos en los ficheros correspondientes } Read (fbrgPersonales, rgDatosPersonal) ; iPosic := fniBuscarDatosCuenta (rgDatosPersonal.sDNI,                                      argLista, iLong) ;

IF iPosic <> 0 THEN BEGIN JuntarDatos (rgDatosPersonal, argLista[iPosic], rgDatosTotales) ;

{ Escribir los datos en el fichero correspondiente } Write (fbrgTotales, rgDatosTotales) ; END ELSE BEGIN Writeln ; Writeln ('ERROR: No existen datos de las cuentas del DNI: ', rgDatosPersonal.sDNI) ; Writeln ; END ; END ;

Close (fbrgPersonales) ; Close (fbrgTotales) ; END ; { CombinarFicherosParciales_3 }

code