Programación General > Pascal

 Leer Y Modificar Archivo .dat

(1/4) > >>

jeraco:
Buenas tardes, si alguien me puede ayudar a resolver este problema:
Tengo archivo llamado aclie.dat con la siguiente estructura:

--- Código: Text --- program cliente;usescrt, dos;Type   RegSplCliente  = Record                        Case Byte Of                         0: ( Conf:         RegConfArchivo);                         1: ( Codigo:       String[KL];                              Descripcion,                              Representante,                              Direccion1,                              Direccion2:   String[40];                              Telefonos:    String[30];                              ZonaC,                              VendC:        String[KM];                              Clase:        String[KO];                              MesVenc:      SmallInt;                              TipoPVP:      Byte;                              CreditoStat:  Byte;                              MaxCredito,   {maximo credito permitido}                              PagosA,       {pagos anticipados}                              SaldoP,       {saldo pendiente}                              MontoMax,     {Monto maximo venta}                              MontoMaxCre,  {maximo credito}                              IVARetenido:  Real;                              UltimaV,                              UltimoP:      RegUltimaOperacion;                              ChequesD:     Array[1..5] Of RegUltimaOperacion;                              PromDay:      SmallInt;                              NDays:        SmallInt;                              RIF:          String[15];                              TipoIva:      Char;                              UVend:        String[KM]; {Ultimovendedor}                              IntMora:      Boolean;                              BitVarios:    Byte;{$IFNDEF CHILE}  {$IFNDEF COLOMBIA}                              NIT:          String[15];  {$ELSE}                              Dummy0:       Array[1..16] Of Byte;  {$ENDIF}{$ELSE}                              Dummy0:       Array[1..16] Of Byte;{$ENDIF}                              Estadistics:  Array[1..NMes,1..EstC] Of Real;                              {Cambios del dia  12-9-98 OJO !!!}                              FlagContab:   Boolean;                              CuentaContab: String[25];                              Descuento:    Real;                              Dummy2:       Array[1..50] Of Byte;                              );                      End;      RegCliente     = Record                        Status:   LongInt;                        Special:  RegSplCliente;                        DataArea: Array[1..1] Of Byte;                      End;  Var F: File of Regcliente;    P: Regcliente;    Begin  clrscr;  Assign(F,'aclie.dat');  reset(F);  while not Eof(F)  do   begin    read(F,P);    with P,special do    begin     maxcredito:=maxcredito/1000;     saldop:=saldop/1000;     montomax:=montomax/1000;     montomaxcre:=montomaxcre/1000;    end;    seek(F,filepos(F)-1);    write(F,P);   end;  close(F); end.  El problema es que el compila Bien, pero cuando lo ejecuto da un error 100
si alguien tiene una solucion, para modificar y accesar este archivo seria de suma ayuda
gracias

Enko:
Me sorprende que el codigo compile. Al parecer está escrito usando las librerias de Turbo Pascal pero el codigo es de Free Pascal o Delphi.
No le detecto fallas exepto que el archivo no exista en la carpeta de la ejecutable.

--- Código: Text --- P,special  Alli va un "." y no una coma. (medio dificil que compile)

jeraco:
amigo enko, ya todo eso de archivo en carpeta y compilacion ya fue descartado de hecho hice el mimo codigo para otro archivo que se llama aprod.dat (del sistema Saint) y funciono bien. Yo creo que el error esta en el Record anidado o en en la longitud del campo Dummi2 pero no encuentro la solucion. En cuanto a la parte del codigo p,special es por que lee con el with a p y tambien a special  la sintaxis esta bien necesito otro tipo de ayuda que no se limite a buscar una simple coma porque ese no es el problema

Enko:

--- Citar ---Yo creo que el error esta en el Record anidado o en en la longitud del campo Dummi2 pero no encuentro la solucion

--- Fin de la cita ---
Supongo que tienes razón ahí.
Lo más probable es que esté mal la estructura de los registros. Pero con eso no hay que te ayude pues no se cual debería ser la estructura correcta.

Lo que puedes intentar es abrir el archivo *.dat en cuestion con un editor hexadecimal y comprobar vos mismo como es la estructura correcta. (supongo que te llevará bastante tiempo).

De donde conseguiste la info sobre la estructura del archivo? Si está en un manual comprueba que esté bien. Si la creaste vos, sería rarisimo.



--- Citar --- En cuanto a la parte del codigo p,special es por que lee con el with a p y tambien a specia

--- Fin de la cita ---
Si el problema es que "p" es de tipo "Regcliente"  y "Special" es de tipo  RegSplCliente
Como veras, son dos tipos de datos distintos.
Como si esto fuera poco:

--- Citar ---RegCliente     = Record
                       Status:   LongInt;
                       Special:  RegSplCliente;
                       DataArea: Array[1..1] Of Byte;
                     End;

--- Fin de la cita ---
RegSplCliente forma parte de RegCliente. Por eso es que va un "." y no una coma.

--- Citar --- with P,special do
   begin
    maxcredito:=maxcredito/1000;
    saldop:=saldop/1000;
    montomax:=montomax/1000;
    montomaxcre:=montomaxcre/1000;
   end;

--- Fin de la cita ---
maxcredito, saldop, montomax, montomaxcre forman parte de "RegSplCliente" y no de RegCliente, por eso que va el punto ya que se quiere acceder a los campos de p.Special : RegSplCliente; pues estos campos no son parte de P sino de p.special



--- Citar ---RegCliente     = Record
                       Status:   LongInt;
                       Special:  RegSplCliente;
                       DataArea: Array[1..1] Of Byte;
                     End;

--- Fin de la cita ---

--- Citar --- DataArea: Array[1..1] Of Byte;

--- Fin de la cita ---
1 byte solo, seguro?

jeraco:
Muchas gracias enko pero me guastaria saber como harias tu una rutina para leer ese archivo con esa informacion y modicar los campos. Cambie incluso el with dando la direccion completa del campo ejemplo: p.special.maxcredito:=p.special.maxcredito/1000; y todas maneras el archivo revienta y no hace el cambio (no se por que) tal vez haya otra forma de leer ese archivo pregunto?

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa