Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-10-2006
CamiloU CamiloU is offline
Miembro
 
Registrado: dic 2005
Ubicación: Sincelejo - COlombia
Posts: 59
Poder: 19
CamiloU Va por buen camino
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 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.
Responder Con Cita
  #2  
Antiguo 10-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 10-10-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #4  
Antiguo 10-10-2006
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 10-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate

Última edición por jachguate fecha: 10-10-2006 a las 20:15:10.
Responder Con Cita
  #6  
Antiguo 10-10-2006
Delar Delar is offline
Miembro
 
Registrado: oct 2006
Posts: 90
Poder: 18
Delar Va por buen camino
Esos cuadritos creo que son el Chr 1... no lo se seguro, pero eso creo.

Saludos
Responder Con Cita
  #7  
Antiguo 10-10-2006
CamiloU CamiloU is offline
Miembro
 
Registrado: dic 2005
Ubicación: Sincelejo - COlombia
Posts: 59
Poder: 19
CamiloU Va por buen camino
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.

Muchas gracias por la colaboración.

Última edición por roman fecha: 10-10-2006 a las 20:49:03.
Responder Con Cita
  #8  
Antiguo 10-10-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #9  
Antiguo 10-10-2006
CamiloU CamiloU is offline
Miembro
 
Registrado: dic 2005
Ubicación: Sincelejo - COlombia
Posts: 59
Poder: 19
CamiloU Va por buen camino
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.
Responder Con Cita
  #10  
Antiguo 11-10-2006
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cargar archivo de tipo de letra TTF dabas Varios 5 18-06-2010 20:40:09
Abrir cualquier tipo de archivo desde mi aplicación Albano Varios 3 06-10-2006 20:48:31
Como leer un archivo del cual no se el tipo ? ilichhernandez Varios 4 04-07-2006 10:02:18
Guardar cualquier tipo de datos en un mismo archivo metalfox6383 Varios 5 22-08-2005 21:35:54
Crear mi propio tipo de archivo. JuanErasmo C++ Builder 3 18-08-2005 14:53:05


La franja horaria es GMT +2. Ahora son las 18:44:29.


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