Delphi - Dar formato a un archivo txt

 
Vista:

Dar formato a un archivo txt

Publicado por rdzulc (7 intervenciones) el 28/02/2008 21:15:26
Hola:

Estoy desarrollando un proyecto en delphi 2006 y sql server 2000. Durante el proceso me he topado com varias dudas, sobre delphi y sobre sql server. Bueno la más importante de ellas y que concierne a delphi es:

De una tabla en sql server convierto los datos a un archivo txt los cuales quedan como algo parecido a esto:

GAGG730524MDFRTB08, ,1595.31,200801,20080228,09,80987359777,2953.23, ,1
FEFP471019HMSRLB01, ,672.5,200801,20080228,09,80944790924,8070.6, ,1
MOJA710905MDFNRN07, ,944.24,200801,20080228,09,80927114555,2617.49, ,1

Ahora lo que yo necesito es que cada campo quede de la misma longitud encada registro, algo como esto:

GAGG730524MDFRTB08, ,1595.31,200801,20080228,09,80987359777,2953.23, ,1
FEFP471019HMSRLB01, ,0672.50,200801,20080228,09,80944790924, 8070.6, ,1
MOJA710905MDFNRN07, ,0944.24,200801,20080228,09,80927114555,2617.49, ,1

¿como podria hacer eso? que los campos numericos quedaran con 0 a la izquierda para completar el numero de espacios; y en los campos alfanumericos con espacios en blanco a la derecha para lo mismo.

Después necesito eliminar todos los puntos que encontrara, algo asi como el buscar y reemplazar del notepad.

Y por ultimo si alguien supiera en el sql como hacer para redondear a dos decimales por que ahora lo que me queda el que si yo tengo 7888.50 me lo deja en 7888.5 o si yo quiero que quede 690.00 me lo deja en 690 . Utilizo la funcion Round.

De antemano gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:Dar formato a un archivo txt

Publicado por E.T. (1244 intervenciones) el 29/02/2008 00:23:55
Bueno, en primera, para hacer que todo quede del mismo tamaño primero debes definir el número máximo de caracteres que cada compo debe tener, basado en eso solo hay que insertar n caracteres o espacios, para bucar los puntos existe la función pos, y para remplazarlos hay una pero no la recuerdo ahorita, busca en la ayuda "String handling routines" ahi te pone las rutinas para manejo de cadenas y una de ellas es para reemplazar caracteres por otros, o cadenas por otras, para el redondeo con sql no puedo ayudarte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dar formato a un archivo txt

Publicado por rdzulc (7 intervenciones) el 03/03/2008 17:23:56
OK, ya resolví el problema del punto decimal y del redondeo a dos decimales.

Ahora lo que resta es poner el formato a mi archivo de texto, para que cada campo quede de la misma longitud en cada registro. Obviamente yo ya tengo las longitudes que debe de llevar cada campo, lo único que me falta es hacerlo en el archivo de texto.

La función que uso para pasar de la base que esta en sql server, a archivo de texto es la siguiente:

procedure GrabaDelimitado( Datos:TDatasource; Fichero: string; Delimitador:char);
var
f : textfile;
n : integer;
Linea : string;
begin
AssignFile(f,Fichero);
Rewrite(f);
With Datos.DataSet do
begin
DisableControls;
{Vamos al primer registro}
{First record}
First;
{Vamos registro a registro, hasta el final}
{From first to last, one by one}
While Not Eof do
begin
Linea:='';
{Recorremos todos los campos del registro}
{all field of the record}
for n:=1 to FieldCount-1 do
begin
If (Fields[n] is TBlobField) or (Fields[n] is TGraphicField) or (Fields[n] is TMemoField) or (Fields[n].IsNull) then
Linea:=Linea+Delimitador
else
Linea:=Linea+Delimitador+Fields[n].AsString;
end; {Del For}
Linea:=Copy(Linea,2,Length(Linea)-1);
Memo1.Lines.Add(Linea);
writeln(f,Linea);
Next;
end; {Del While}
EnableControls;
end; {Del With}
CloseFile(f);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Dar formato a un archivo txt

Publicado por rdzulc (7 intervenciones) el 03/03/2008 19:55:18
OK, ya resolvi mi problema, modifique la función como sigue:

function TForm1.rellenarcadena(longitud: integer; cadena: string): string;
var
I, O: integer;
begin
O:=length(cadena);
for I := O to longitud-1 do
cadena:=cadena+' ';
Result:=cadena;
end;

function TForm1.rellenarnumero(longitud: integer; cadena: string): string;
var
I, O: integer;
begin
O:=length(cadena);
for I := O to longitud-1 do
cadena:='0'+cadena;
Result:=cadena;
end;

procedure GrabaDelimitado( Datos:TDatasource; Fichero: string; Delimitador:char);
var
f : textfile;
n : integer;
Linea : string;
begin
AssignFile(f,Fichero);
Rewrite(f);
With Datos.DataSet do
begin
DisableControls;
{Vamos al primer registro}
{First record}
First;
{Vamos registro a registro, hasta el final}
{From first to last, one by one}
While Not Eof do
begin
Linea:='';
{Recorremos todos los campos del registro}
{all field of the record}
for n:=2 to FieldCount-1 do
begin
If (Fields[n] is TBlobField) or (Fields[n] is TGraphicField) or (Fields[n] is TMemoField) or (Fields[n].IsNull) then
Linea:=Linea+Delimitador
else
case n of
5: Linea:=Linea+Delimitador+rellenarcadena(13, Fields[n].AsString);
6: Linea:=Linea+Delimitador+rellenarnumero(12, Fields[n].AsString);
7: Linea:=Linea+Delimitador+rellenarcadena(40, Fields[n].AsString);
8: Linea:=Linea+Delimitador+rellenarcadena(30, Fields[n].AsString);
14: Linea:=Linea+Delimitador+rellenarnumero(6, Fields[n].AsString);
15: Linea:=Linea+Delimitador+rellenarnumero(6, Fields[n].AsString);
18: Linea:=Linea+Delimitador+rellenarnumero(6, Fields[n].AsString);
21: Linea:=Linea+Delimitador+rellenarnumero(6, Fields[n].AsString);
23: Linea:=Linea+Delimitador+rellenarnumero(6, Fields[n].AsString);
26: Linea:=Linea+Delimitador+rellenarnumero(7, Fields[n].AsString);
30: Linea:=Linea+Delimitador+rellenarcadena(11, Fields[n].AsString);
31: Linea:=Linea+Delimitador+rellenarnumero(12, Fields[n].AsString);
else
Linea:=Linea+Delimitador+Fields[n].AsString;
end;
end; {Del For}
Linea:=Copy(Linea,2,Length(Linea)-1);
Memo1.Lines.Add(Linea);
writeln(f,Linea);
Next;
end; {Del While}
EnableControls;
end; {Del With}
CloseFile(f);
end;

Si tienen dudas de como funciona ahi esta mi mail.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar