PDA

Ver la Versión Completa : Problemas con archivo tipo TXT


CamiloU
10-10-2006, 19:08:21
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
esos cuadritos
¿cuales cuadritos?
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?


¿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.



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í:

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:

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.


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.

;)