Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con archivo tipo TXT (https://www.clubdelphi.com/foros/showthread.php?t=36386)

CamiloU 10-10-2006 19:08:21

Problemas con archivo tipo TXT
 
Estoy tratando de crear un archivo tipo TXT para cargar información por Internet pero se me presentan varios problemas. Presento un pedacito del resultado del archivo para detallar los problemas:

ALFONSORTO JOSEQUES                      30303030408043  408000 408000 408000 408000 0.1550063200 2000 2000 67200    0.1200049000      0.0052200 2100 0.0400016300 0.005002000 0.0300012200 0.005002000 0.010004100 0200010CC3836049 1    70702ACOSTAA

Entre campo y campo del registro me esta generando esos cuadritos :confused: y los nombres quedan sobreescritos. Otra preguntica, como hago para cambiar de linea, es decir, la función que cumplia el WRITELN es Pascal. No he encontrado la función que lo supla en delphi y el resultado sale pegado.

Muchas Gracias.

jachguate 10-10-2006 19:19:14

Cita:

Empezado por CamiloU
esos cuadritos

¿cuales cuadritos?
Cita:

Empezado por CamiloU
la función que cumplia el WRITELN es Pascal

Delphi es (object) pascal. WriteLn está allí, donde siempre ha estado...

Hasta luego.

;)

roman 10-10-2006 19:24:08

Pero, ¿cómo vamos a saber de dónde vienen los cuadritos si no sabemos ni el origen de la información ni la forma en que estás leyendo los datos y creando el archivo?

Cita:

Empezado por jachguate
¿cuales cuadritos?

Copia y pega en el bloc de notas y los verás :)

// Saludos

ixMike 10-10-2006 19:24:51

Quizás, y repito lo de quizás, quizás esos "cuadritos" sean saltos de teclado (cambiar de una línea a otra). Pero en Windows los saltos se representan con dos carácteres (CR y LF, #13 y #10, uno detrás del otro), mientras que en Macintosh solo se usa LF y en UNIX y Linux solo el CR. Esto se soluciona con la función AdjustLineBreaks que está en la uses SysUtils. En cuanto a lo de WriteLn, pues coincido con nuestro amigo, siempre ha estado ahí.

Espero que te haya sido de ayuda.

Saludos ;)

jachguate 10-10-2006 20:05:07

En general los "cuadritos", como les has llamado, son caracteres no imprimibles, es decir, con un asii menor a 32.

Tu cadena en particular está plagada de caracteres #1, #2, #4, #5, #6 y #7, que, si no los pone tu programa, deben proceder del origen de los datos.

Hasta luego.

;)

Delar 10-10-2006 20:09:02

Esos cuadritos creo que son el Chr 1... no lo se seguro, pero eso creo.

Saludos

CamiloU 10-10-2006 20:42:31

Parece que no fui claro con la inquietud. Voy a presentar el codigo para realizar nuevemente la consulta.


Código Delphi [-]
unit PlanillarSGP01;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, StdCtrls;
type
  Registro01 = record
            c01 : string[2];
            c02 : string[5];
            c03 : string[200];
            c04 : string[2];
            c05 : string[16];
            c06 : string[1];
            c07 : string[1];
            c08 : string[10];
            c09 : string[10];
            c10 : string[1];
            c11 : string[10];
            c12 : string[40];
            c13 : string[6];
            c14 : string[7];
            c15 : string[7];
            c16 : string[10];
            c17 : string[10];
            c18 : string[5];
            c19 : string[12];
            c20 : string[1];
            c21 : string[2];
          end;
  Registro02 = record
            d01 : string[2];
            d02 : string[5];
            d03 : string[2];
            d04 : string[16];
            d05 : string[2];
            d06 : string[2];
            d07 : string[1];
            d08 : string[1];
            d09 : string[2];
            d10 : string[3];
            d11 : string[20];
            d12 : string[30];
            d13 : string[20];
            d14 : string[30];
            d15 : string[1];
            d16 : string[1];
            d17 : string[1];
            d18 : string[1];
            d19 : string[1];
            d20 : string[1];
            d21 : string[1];
            d22 : string[1];
            d23 : string[1];
            d24 : string[1];
            d25 : string[1];
            d26 : string[1];
            d27 : string[1];
            d28 : string[1];
            d29 : string[1];
            d30 : string[2];
            d31 : string[6];
            d32 : string[6];
            d33 : string[6];
            d34 : string[6];
            d35 : string[6];
            d36 : string[2];
            d37 : string[2];
            d38 : string[2];
            d39 : string[2];
            d40 : string[9];
            d41 : string[1];
            d42 : string[9];
            d43 : string[9];
            d44 : string[9];
            d45 : string[9];
            d46 : string[7];
            d47 : string[9];
            d48 : string[9];
            d49 : string[9];
            d50 : string[9];
            d51 : string[9];
            d52 : string[9];
            d53 : string[9];
            d54 : string[7];
            d55 : string[9];
            d56 : string[9];
            d57 : string[15];
            d58 : string[9];
            d59 : string[15];
            d60 : string[9];
            d61 : string[9];
            d62 : string[9];
            d63 : string[9];
            d64 : string[7];
            d65 : string[9];
            d66 : string[7];
            d67 : string[9];
            d68 : string[7];
            d69 : string[9];
            d70 : string[7];
            d71 : string[9];
            d72 : string[7];
            d73 : string[9];
          end;
  TForm1 = class(TForm)
    Button1: TButton;
    E1: TEdit;
    Tabla1: TTable;
    Tabla2: TTable;
    Tabla3: TTable;
    procedure RegistroTipo01;
    procedure RegistroTipo02;
    procedure LlenaTipo01;
    procedure LlenaTipo02;
    procedure ValorAporte;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1 : TForm1;
  R01 : file of Registro01;
  R02 : file of Registro02;
  Dato01 : Registro01;
  Dato02 : Registro02;
  c01, c02, c03, c04, c05, c06, c07, c08, c09, c10, c11, c12, c13, c14, c15, c16, c17, c18, c19, c20, c21 : string;
  d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20 : string;
  d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31, d32, d33, d34, d35, d36, d37, d38, d39, d40 : string;
  d41, d42, d43, d44, d45, d46, d47, d48, d49, d50, d51, d52, d53, d54, d55, d56, d57, d58, d59, d60 : string;
  d61, d62, d63, d64, d65, d66, d67, d68, d69, d70, d71, d72, d73, ced, aux1, aux2, temp : string;
  cont, basliq, num1, num2, num3 : integer;
  porc, par1, par2, par3 : real;
  encontrado : boolean;
implementation
{$R *.dfm}
procedure TForm1.RegistroTipo01;
begin
with Dato01 do
  begin
    c01 := '01';
    c02 := '00001';
    c03 := 'ENTIDAD';
    c04 := 'NI';
    c05 := '892280021';
    c06 := '1';
    c07 := ' ';
    c08 := ' ';
    c09 := ' ';
    c10 := 'U';
    c11 := ' ';
    c12 := ' ';
    c13 := ' ';
    c14 := '2006-09';
    c15 := '2006-09';
    c16 := ' ';
    c17 := ' ';
    c18 := ' ';
    c19 := ' ';
    c20 := '1';
    c21 := ' ';
  end;
end;
 
procedure TForm1.LlenaTipo01;
begin
assignfile(R01,'PlanillaSGP01.txt');
rewrite(R01);
RegistroTipo01;
seek(R01, FileSize(R01));
Write(R01,Dato01);
Closefile(R01);
end;
 
procedure TForm1.RegistroTipo02;
var
  n1, n2, n3 : integer;
  nom1, nom2, ape1, ape2 : string;
begin
with Dato02 do
  begin
  d01 := '02';
  if cont < 10 then aux1 := concat('0000',inttostr(cont));
  if (cont >= 10) and (cont < 100) then aux1 := concat('000',inttostr(cont));
  if (cont >= 100) and (cont < 1000) then aux1 := concat('00',inttostr(cont));
  if (cont >= 1000) and (cont < 10000) then aux1 := concat('0',inttostr(cont));
  if (cont >= 10000) then aux1 := inttostr(cont);
  d02 := aux1;
  Tabla1.First;
  encontrado := false;
  while (Not Tabla1.Eof) and (encontrado = false) do
    begin
      if Tabla1.FieldByName('cedula').AsString = Tabla2.FieldByName('Cedula').AsString then
        begin
          if Tabla1.FieldByName('Tipo').AsString = '1' then d03 := 'CC';
          if Tabla1.FieldByName('Tipo').AsString = '2' then d03 := 'CE';
          encontrado := true;
        end
      else Tabla1.Next;
    end;
  d04 := Tabla2.FieldByName('Cedula').AsString;
  d05 := '1';
  d06 := ' ';
  d07 := ' ';
  d08 := ' ';
  d09 := '70';
  d10 := Tabla2.FieldByName('Mun_Colegi').AsString;
  Tabla3.First;
  encontrado := false;
  while (Not Tabla3.Eof) and (encontrado = false) do
    begin
      if Tabla3.FieldByName('cedula').AsString = Tabla2.FieldByName('Cedula').AsString then
        begin
          nom1 := Tabla3.FieldByName('Primer_Ape').AsString;
          nom2 := Tabla3.FieldByName('Segundo_Ap').AsString;
          ape1 := Tabla3.FieldByName('Primer_Nom').AsString;
          ape2 := Tabla3.FieldByName('Segundo_No').AsString;
          aux2 := Tabla3.FieldByName('Base').AsString;
          encontrado := true;
        end;
      Tabla3.Next;
    end;
  d11 := nom1;
  d12 := nom2;
  d13 := ape1;
  d14 := ape2;
  num1 := strtoint(aux2);
  num2 := num1 DIV 1000;
  num3 := num1 MOD 1000;
  if num3 >= 500 then num2 := num2 + 1;
  basliq := num2 * 1000;
  d15 := ' ';
  d16 := ' ';
  d17 := ' ';
  d18 := ' ';
  d19 := ' ';
  d20 := ' ';
  d21 := ' ';
  d22 := ' ';
  d23 := ' ';
  d24 := ' ';
  d25 := ' ';
  d26 := ' ';
  d27 := ' ';
  d28 := ' ';
  d29 := ' ';
  d30 := ' ';
  d31 := ' ';
  d32 := ' ';
  d33 := ' ';
  d34 := ' ';
  d35 := ' ';
  d36 := '30';
  d37 := '30';
  d38 := '30';
  d39 := '30';
  d40 := aux2;
  d41 := ' ';
  d42 := inttostr(basliq);
  d43 := inttostr(basliq);
  d44 := inttostr(basliq);
  d45 := inttostr(basliq);
  d46 := '0.15500';
  porc := 0.15500;
  ValorAporte;
  n1 := num2 * 100;
  d47 := inttostr(n1);
  porc := 0.00500;
  ValorAporte;
  n2 := num2 * 100;
  d48 := inttostr(n2);
  porc := 0.00500;
  ValorAporte;
  n3 := num2 * 100;
  d49 := inttostr(n3);
  d50 := inttostr(n1 + n2 + n3);
  d51 := ' ';
  d52 := ' ';
  d53 := ' ';
  d54 := '0.12000';
  porc := 0.12000;
  ValorAporte;
  d55 := inttostr(num2 * 100);
  d56 := ' ';
  d57 := ' ';
  d58 := ' ';
  d59 := ' ';
  d60 := ' ';
  d61 := '0.0052200';
  d62 := ' ';
  porc := 0.0052200;
  ValorAporte;
  d63 := inttostr(num2 * 100);
  d64 := '0.04000';
  porc := 0.04000;
  ValorAporte;
  d65 := inttostr(num2 * 100);
  d66 := '0.00500';
  porc := 0.00500;
  ValorAporte;
  d67 := inttostr(num2 * 100);
  d68 := '0.03000';
  porc := 0.03000;
  ValorAporte;
  d69 := inttostr(num2 * 100);
  d70 := '0.00500';
  porc := 0.00500;
  ValorAporte;
  d71 := inttostr(num2 * 100);
  d72 := '0.01000';
  porc := 0.01000;
  ValorAporte;
  d73 := inttostr(num2 * 100);   
  end;
end;
 
procedure TForm1.LlenaTipo02;
begin
Tabla1.Open;
Tabla2.Open;
Tabla3.Open;
Tabla2.First;
assignfile(R02,'PlanillaSGP01.txt');
cont := 1;
while (Not Tabla2.Eof) do
  begin
    if (Tabla2.FieldByName('Cargo').AsString < '9900') and
       (Tabla2.FieldByName('Est_Labora').AsString = '01') then
      begin
        reset(R02);
        RegistroTipo02;
        seek(R02, cont);
        Write(R02,Dato02);
        cont := cont + 1;
      end;
    Tabla2.Next;
  end;
Closefile(R02);
end;
 
procedure TForm1.ValorAporte;
begin
  par1 := porc * basliq;
  temp := floattostrf(par1,fffixed,10,0);
  num1 := strtoint(temp);
  num2 := num1 DIV 100;
  num3 := num1 MOD 100;
  if num3 >= 50 then num2 := num2 + 1;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  LlenaTipo01;
  LlenaTipo02;
end;
end.




Lo que intento hacer es generar el archivo plano para una Planilla de Pago por Internet. Debe traer un Registro Tipo 1 que se genera en LlenaTipo1 y un Tipo 2 que tiene tantos como funcionarios tenga la entidad. Cabe anotar que la planilla es para aportes Fiscales y parafiscales.

Hasta ahi no hay problema. Sin embargo, cuando reviso el Archivo resultante, que se llama PlanillaSGP01.txt, veo en el resultado cuadros que separan los diferentes campos del Registro.

Esos son los cuadritos a los cuales me refiero.

Además, al revisar dicho archivo, veo que los nombres se mezclan, por ejemplo, el Primer nombre es ANDRES y el Segundo es ROBERTO y el resultado que veo es ANDRESERTO. Lo mismo pasa con los apellidos.

Y por ultimo, lo ideal es que cada registro inicie línea pero no se como darle el salte. Intente con WRITELN y me dio el error
Writeln(R02,Dato02); Illegal type en Write/Writeln statement. :confused:

Muchas gracias por la colaboración.

Lepe 10-10-2006 21:04:35

El problema está aquí:
Código Delphi [-]
while (Not Tabla2.Eof) do
  begin
    if (Tabla2.FieldByName('Cargo').AsString < '9900') and
       (Tabla2.FieldByName('Est_Labora').AsString = '01') then
      begin
        reset(R02);
        RegistroTipo02;
        seek(R02, cont);
        Write(R02,Dato02);
        cont := cont + 1;
      end;
    Tabla2.Next;
  end;
Closefile(R02);

creo que más bien deberías hacer:
Código Delphi [-]
reset(R02);
while (Not Tabla2.Eof) do
  begin
    if (Tabla2.FieldByName('Cargo').AsString < '9900') and
       (Tabla2.FieldByName('Est_Labora').AsString = '01') then
      begin
        RegistroTipo02;
        Write(R02,Dato02);
        cont := cont + 1;
      end;
    Tabla2.Next;
  end;
Closefile(R02);

Saludos

CamiloU 10-10-2006 23:08:39

Muchas Gracias Lepe por la colaboración pero te comento que el archivo me genero igual.

Como inserto el cambio de lìnea, cual instruccion debo utilizar para que cada registro inicie linea y pueda obtener registros de longitud 487.

Muchas Gracias.

jachguate 11-10-2006 01:46:27

El problema es que estas usando archivos binarios y tratando de producir un archivo de texto.

Código Delphi [-]
var
  Form1 : TForm1;
  R01 : TextFile; //file of Registro01;
  R02 : TextFile; //file of Registro02;

Esto, porque writeln solamente tiene sentido en archivos de texto.

El "montaje" de los nombres ocurre porque, al grabar un archivo binario, (file of record) almacenará tantos caracteres como tenga reservados el registro para la cadena del nombre y del apellido, y evidentemente estos espacios no están resultando suficientes.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 18:27:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi