Procedure con Archivos - AYUDA!!!!
Publicado por Facundo (2 intervenciones) el 24/06/2009 03:46:40
Tengo un problema con el siguiente programa, como veran esta duplicado el procedure ActListPagos en el cuerpo del programa, si lo corro asi funciona correctamente, ahora si uso el procedure ActListPagos me da un error en write(ArcCliente,Rcliente) como qeu no puede leer el archivo. La verdad que no puedo encontrar el error, ojala me puedan ayudar alguien.
Los white que van mostrando los datos son echos por mi para control. Pero no hacen al programa.
El objetivo es actualizar el archivo de clientes, y listar las instRecau pero el erro es antes
Program TP1;
Uses crt,DOS;
Type TD_Cliente = Longint;
TD_ApeNom = String[25];
TD_Domicilio = String[35];
TD_Fecha = Longint;
TD_Importe = Real;
TD_InsRecau = String[8];
TD_Atraso = Byte;
TD_Posicion = Longint;
TD_Aux = Longint;
TD_Anio = Integer;
TD_Dia = Byte;
TD_Mes = Byte;
TR_Cliente = Record
NCliente : TD_Cliente;
ApeNom : TD_ApeNom;
Domicilio : TD_Domicilio;
Fvenc : TD_Fecha;
FPago : TD_Fecha;
ImpTotAdeu : TD_Importe;
End;
TR_Pagos = Record
Ncliente : TD_Cliente;
FPago : TD_Fecha;
CodInsRec : TD_InsRecau;
ImpPago : TD_Importe;
End;
TR_Deuda = Record
NCliente : TD_Cliente;
FVenc : TD_Fecha;
ImpAdeu : TD_Importe;
Atraso : TD_Dia;
end;
TArc_Cliente = File of TR_cliente;
TArc_Pagos = File of TR_Pagos;
TArc_Deuda = File of TR_Deuda;
TArr_Calendario = Array[1..12] of TD_Mes;
Procedure BusquedaPagos(var ArcCliente : TArc_Cliente ; Cliente : TD_Cliente; var Pos : TD_Posicion
;var RCliente : TR_Cliente);
Var Primero,Ultimo,Medio : TD_Aux;
Begin
Primero := 0;
Ultimo := Filesize(ArcCliente);
Medio := (Primero + Ultimo) div 2;
Reset(ArcCliente);
Seek(ArcCliente,Medio);
Read(ArcCliente,Rcliente);
While (RCliente.Ncliente <> Cliente) and (Primero < Ultimo) do
Begin
If Cliente < RCliente.Ncliente then
Ultimo := Medio - 1
else
primero := Medio + 1;
Medio := (Primero + Ultimo) div 2;
Seek(ArcCliente,Medio);
Read(ArcCliente,Rcliente);
end;
If Cliente = RCliente.Ncliente then
Medio := Pos
else
Pos := -1;
End;
Procedure ActuListPagos(var ArcPagos : TArc_Pagos; var RPagos : TR_Pagos; var ArcCliente : TArc_Cliente
; var RCliente : TR_Cliente);
Var Pos: TD_Posicion;
InsAux : TD_InsRecau;
Sum : TD_Importe;
Begin
reset(ArcPagos);
reset(ArcCliente);
Sum := 0;
InsAux := '0';
While Not Eof(ArcPagos) do
Begin
Read(ArcPagos,Rpagos);
Writeln(RPagos.Ncliente,' - ',RPagos.Fpago,' - ',RPagos.codInsRec,' - ',RPagos.ImpPago,' - ');
BusquedaPagos(ArcCliente, Rpagos.Ncliente, Pos, Rcliente);
If Pos < 0 then
Writeln('No Existe el Cliente en el Archivo de Clientes')
else
seek(ArcCliente,Pos);
RCliente.Fpago := RPagos.Fpago;
RCliente.ImpTotAdeu := RCliente.ImpTotAdeu - RPagos.ImpPago;
write(ArcCliente,Rcliente); <<----- ACA DA EL ERROR!!!
Writeln(Rcliente.Ncliente,' - ',Rcliente.ImpTotAdeu,' - ',Rcliente.Fpago);
readln;
If RPagos.CodInsRec <> InsAux Then
Begin
if InsAux = '0' then
Begin
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end
else
Begin
Writeln(InsAux,Sum);
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end;
end
else
Sum := Sum + RPagos.ImpPago;
end;
Close(ArcPagos);
End;
Var RCliente : TR_Cliente;
Rpagos : TR_Pagos;
Rdeuda : TR_Deuda;
ArcCliente : TArc_Cliente;
ArcPagos : TArc_Pagos;
ArcDeuda : TArc_Deuda;
Dia : TD_Dia;
Mes : TD_Mes;
Anio : TD_Anio;
Fecha : TD_Fecha;
pos: td_posicion;
InsAux : TD_insrecau;
Sum : TD_importe;
Begin
Assign(ArcCliente,'c:Maetar.dat');
Assign(ArcPagos,'c:Pagostan.dat');
reset(ArcPagos);
reset(ArcCliente);
Sum := 0;
InsAux := '0';
While Not Eof(ArcPagos) do
Begin
Read(ArcPagos,Rpagos);
Writeln(RPagos.Ncliente,' - ',RPagos.Fpago,' - ',RPagos.codInsRec,' - ',RPagos.ImpPago,' - ');
BusquedaPagos(ArcCliente, Rpagos.Ncliente, Pos, Rcliente);
If Pos < 0 then
Writeln('No Existe el Cliente en el Archivo de Clientes')
else
seek(ArcCliente,Pos);
RCliente.Fpago := RPagos.Fpago;
RCliente.ImpTotAdeu := RCliente.ImpTotAdeu - RPagos.ImpPago;
write(ArcCliente,Rcliente);
Writeln(Rcliente.Ncliente,' - ',Rcliente.ImpTotAdeu,' - ',Rcliente.Fpago);
readln;
If RPagos.CodInsRec <> InsAux Then
Begin
if InsAux = '0' then
Begin
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end
else
Begin
Writeln(InsAux,Sum);
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end;
end
else
Sum := Sum + RPagos.ImpPago;
end;
Close(ArcPagos);
End.
Los white que van mostrando los datos son echos por mi para control. Pero no hacen al programa.
El objetivo es actualizar el archivo de clientes, y listar las instRecau pero el erro es antes
Program TP1;
Uses crt,DOS;
Type TD_Cliente = Longint;
TD_ApeNom = String[25];
TD_Domicilio = String[35];
TD_Fecha = Longint;
TD_Importe = Real;
TD_InsRecau = String[8];
TD_Atraso = Byte;
TD_Posicion = Longint;
TD_Aux = Longint;
TD_Anio = Integer;
TD_Dia = Byte;
TD_Mes = Byte;
TR_Cliente = Record
NCliente : TD_Cliente;
ApeNom : TD_ApeNom;
Domicilio : TD_Domicilio;
Fvenc : TD_Fecha;
FPago : TD_Fecha;
ImpTotAdeu : TD_Importe;
End;
TR_Pagos = Record
Ncliente : TD_Cliente;
FPago : TD_Fecha;
CodInsRec : TD_InsRecau;
ImpPago : TD_Importe;
End;
TR_Deuda = Record
NCliente : TD_Cliente;
FVenc : TD_Fecha;
ImpAdeu : TD_Importe;
Atraso : TD_Dia;
end;
TArc_Cliente = File of TR_cliente;
TArc_Pagos = File of TR_Pagos;
TArc_Deuda = File of TR_Deuda;
TArr_Calendario = Array[1..12] of TD_Mes;
Procedure BusquedaPagos(var ArcCliente : TArc_Cliente ; Cliente : TD_Cliente; var Pos : TD_Posicion
;var RCliente : TR_Cliente);
Var Primero,Ultimo,Medio : TD_Aux;
Begin
Primero := 0;
Ultimo := Filesize(ArcCliente);
Medio := (Primero + Ultimo) div 2;
Reset(ArcCliente);
Seek(ArcCliente,Medio);
Read(ArcCliente,Rcliente);
While (RCliente.Ncliente <> Cliente) and (Primero < Ultimo) do
Begin
If Cliente < RCliente.Ncliente then
Ultimo := Medio - 1
else
primero := Medio + 1;
Medio := (Primero + Ultimo) div 2;
Seek(ArcCliente,Medio);
Read(ArcCliente,Rcliente);
end;
If Cliente = RCliente.Ncliente then
Medio := Pos
else
Pos := -1;
End;
Procedure ActuListPagos(var ArcPagos : TArc_Pagos; var RPagos : TR_Pagos; var ArcCliente : TArc_Cliente
; var RCliente : TR_Cliente);
Var Pos: TD_Posicion;
InsAux : TD_InsRecau;
Sum : TD_Importe;
Begin
reset(ArcPagos);
reset(ArcCliente);
Sum := 0;
InsAux := '0';
While Not Eof(ArcPagos) do
Begin
Read(ArcPagos,Rpagos);
Writeln(RPagos.Ncliente,' - ',RPagos.Fpago,' - ',RPagos.codInsRec,' - ',RPagos.ImpPago,' - ');
BusquedaPagos(ArcCliente, Rpagos.Ncliente, Pos, Rcliente);
If Pos < 0 then
Writeln('No Existe el Cliente en el Archivo de Clientes')
else
seek(ArcCliente,Pos);
RCliente.Fpago := RPagos.Fpago;
RCliente.ImpTotAdeu := RCliente.ImpTotAdeu - RPagos.ImpPago;
write(ArcCliente,Rcliente); <<----- ACA DA EL ERROR!!!
Writeln(Rcliente.Ncliente,' - ',Rcliente.ImpTotAdeu,' - ',Rcliente.Fpago);
readln;
If RPagos.CodInsRec <> InsAux Then
Begin
if InsAux = '0' then
Begin
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end
else
Begin
Writeln(InsAux,Sum);
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end;
end
else
Sum := Sum + RPagos.ImpPago;
end;
Close(ArcPagos);
End;
Var RCliente : TR_Cliente;
Rpagos : TR_Pagos;
Rdeuda : TR_Deuda;
ArcCliente : TArc_Cliente;
ArcPagos : TArc_Pagos;
ArcDeuda : TArc_Deuda;
Dia : TD_Dia;
Mes : TD_Mes;
Anio : TD_Anio;
Fecha : TD_Fecha;
pos: td_posicion;
InsAux : TD_insrecau;
Sum : TD_importe;
Begin
Assign(ArcCliente,'c:Maetar.dat');
Assign(ArcPagos,'c:Pagostan.dat');
reset(ArcPagos);
reset(ArcCliente);
Sum := 0;
InsAux := '0';
While Not Eof(ArcPagos) do
Begin
Read(ArcPagos,Rpagos);
Writeln(RPagos.Ncliente,' - ',RPagos.Fpago,' - ',RPagos.codInsRec,' - ',RPagos.ImpPago,' - ');
BusquedaPagos(ArcCliente, Rpagos.Ncliente, Pos, Rcliente);
If Pos < 0 then
Writeln('No Existe el Cliente en el Archivo de Clientes')
else
seek(ArcCliente,Pos);
RCliente.Fpago := RPagos.Fpago;
RCliente.ImpTotAdeu := RCliente.ImpTotAdeu - RPagos.ImpPago;
write(ArcCliente,Rcliente);
Writeln(Rcliente.Ncliente,' - ',Rcliente.ImpTotAdeu,' - ',Rcliente.Fpago);
readln;
If RPagos.CodInsRec <> InsAux Then
Begin
if InsAux = '0' then
Begin
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end
else
Begin
Writeln(InsAux,Sum);
Sum := Rpagos.ImpPago;
InsAux := Rpagos.CodInsRec;
end;
end
else
Sum := Sum + RPagos.ImpPago;
end;
Close(ArcPagos);
End.
Valora esta pregunta
0