Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

natiii

[Resolvido] Gerar Arquivos TXT

Recommended Posts

Olá amigos!

 

Estou gerando pela primeira vez arquivos txt...

Usei um código que rodou, está gerando o arquivo, mas não sei como definir o tamanho fixo para os campos dentro deste código e nem colocar as letras H(para cabeçalho), F(para o corpo) e Z (para fechar o arquivo).

 

O código que usei foi o seguinte:

 

procedure TFormArquivoTxt.ButtonGerarArquivoClick(Sender: TObject);
  var Arquivo: TextFile;
  linha, NomeArquivo: String;
begin
  NomeArquivo:= 'C:\DSAC\Pingo\Arquivo.txt';
  AssignFile(Arquivo, NomeArquivo);
  ReWrite(Arquivo);

   while not AdoQueryArquivo.Eof do
   begin
   linha:= AdoQueryArquivo.fieldByName('Fatura').AsString;
   writeln(Arquivo, linha);
	AdoQueryArquivo.Next;
	end;
	CloseFile(Arquivo);


	 end;

Preciso disso urgente!

 

Desde já agradeço!

 

[]'s

 

Natiii

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi muito bem a sua situação, teria como coloca um exemplo de como deveria de ficar o arquivo ?

Deveria ficar mais ou menos assim:

 

HDSAC 20071107

P0012345200712000000015000012 000001

F0012345056700200711060000000255000000000027250000000015100000000002650000000300

0000002

F0012345060700200711060000000340000000000034780000000016700000000008520000000400

0000003

F0012345064700200711060000000425000000000041300000000018900000000014800000000500

0000004

F0012345068700200711060000000510000000000048000000000021400000000020600000000600

0000005

P0023456200801000000012000012 000006

F0023456056800200711060000000246000000000017250000000015100000000011650000000290

0000007

F0023456060800200711060000000321000000000014780000000013140000000010820000000360

0000008

F0023456064800200711060000000378000000000011300000000008900000000006800000000405

0000009

F0023456068800200711060000000360000000000010150000000008250000000006600000000385

0000010

Z00001200000000324000

 

 

H no cabeçalho, nome, estes espaços em branco, a data de geração do arquivo...

 

Espero ter clareado, minha dúvida é como colocar código para definir as posições, os tamanhos e os espaços em branco...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vai precisar montar cada item de linha de forma individual, ou seja, você mesmo precisa definir cada tamanho a ser impresso, onde que o HEADER e TRAILLER do arquivo precisa somente uma vez, o DETAIL ou corpo do arquivo é que vai variar de acordo com o número de registros, algo como base:

 

procedure TForm1.BitBtn1Click(Sender: TObject);
var
	Arquivo: TextFile;
	linha, NomeArquivo: String;
begin
NomeArquivo:='C:\DSAC\Pingo\Arquivo.txt';
AssignFile(Arquivo, NomeArquivo);
ReWrite(Arquivo);
writeln(Arquivo,'HDSAC 20071107');
writeln(Arquivo,'P0012345200712000000015000012 000001');
while not AdoQueryArquivo.Eof do
	begin
	linha:='F001234505670020071106000000025500000000002725000000001510000000000265000000
300 0000002';
	writeln(Arquivo, linha);
	AdoQueryArquivo.Next;
	end;
writeln(Arquivo,'Z00001200000000324000 ');
CloseFile(Arquivo);
end;

Claro que cada item você mesmo vai precisar substituir e escrever pelo seu devido valor, para formatar campos do tipo número com zeros a frente, pode usar o comando FormatFloat();

 

FormatFloat('00000',123);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas eu não posso colcoar cada linha de forma individual...

porque esses arquivos serão gerados com base em uma pesquisa em um form...

A pessoa digita a data de negociação, aperta em pesquisar e em um DBGrid é mostrado os dados relatiovos a essa data de negociação.

 

Aperta em Gerar Arquivo e é mostrado no Arquivo txt a data de negociação pesquisada e varios dados relacionados a essa data.

por isso naum pode ser linhas fixas...

 

Eu queria saber como definir o tamanho de cada campo...

 

tentei fazer:

 

while not AdoQueryArquivo.Eof do

begin

Write ( arq, AjustaStr ( tabela.FieldByName ( ‘Nome’ ).AsString, 30 ) );

Write ( arq, FormatFloat ( ‘00000000.00′, tabela.FieldByName ( ‘Salario’ ).AsFloat ) );

WriteLn ( arq );

tabela.Next;

end;

CloseFile ( arq );

end;

 

 

 

function AjustaStr ( str: String; tam: Integer ): String;

begin

while Length ( str ) < 88 do

str := str + ‘ ‘;

if Length ( str ) > 88 then

str := Copy ( str, 1, tam );

Result := str;

end;

 

 

mas não retornou nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso coloquei somente como exemplo, como não sei o que vai em cada posição, coloquei tudo de forma fixa, isto você terá de montar tudo...

Para formata campo pode fazer o seguinte:

function Preenche(str: string; total: integer; LR, prench: char):String;
var
   s: string;
   x, tam: integer;
begin
tam:=length(str);
s:='';
if tam > total then
	begin
	s := copy(str, 1, total);
	end
else
	begin
	for x:=tam to (total - 1)  do
		begin
		s:=s + prench;
		end;
	if LR = 'L' then
		s:=str + s
	else
		s:=s + str;
	end;
Preenche:=s;
end;

No caso a função vai formatar o valor desejado conforme o tamanho e tipo de caracter, do lado esquerdo ou direito, exemplo:

 

//Vai preencher a string NOME_CLIENTE com os caracteres restantes com espaço, ou seja, a string [b]NOME_CLIENTE[/b] tem 12 caracteres, será acrescentado mais 8 caracteres do lado direito.
writeln(txt,Preenche('NOME_CLIENTE',20,'L',' ');

//Vai preencher a string 123 com os caracteres restantes com 0, ou seja, a string [b]123[/b] tem 3 caracteres, será acrescentado mais 5 caracteres do lado esquerdo.
writeln(txt,Preenche('123',8,'R','0');

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que tenho que colocar é o seguinte, vou colocar só alguns campos:

 

Campo: Tipo Posição: 1 - 1 Tamanho: 1 Tipo: A Descrição: “H” - Cabeçalho

Campo: EmpresaPosição: 2- 24 Tamanho: 23 Tipo: A Descrição:Nome ou Sigla da Empresa terceirizada

Campo: Data de Geracao do Arquivo Posição: 25- 32 Tamanho: 8 Tipo: DATA Descrição: Data em que o arquivo foi gerado

Campo: Brancos Posição: 33- 88 Tamanho: 56 Tipo: A Descrição: Valor reservado para o uso futuro

 

Campo: Tipo Posição:1- 1 Tamanho: 1 Tipo: A Descrição: “F” - Fatura

Campo: CDC Posição:2- 8 Tamanho: 7 Tipo: N Descrição: CDC do Cliente

Campo: Fatura Posição:9-14 Tamanho: 6 Tipo: N Descrição: Número da fatura negociada

Compartilhar este post


Link para o post
Compartilhar em outros sites

O arquivo está sendo gerado, mas não aparece a letra na frente do campo...

 

Era para aparecer

F25/9/200 613380030260

 

outra coisa que não sei como fazer é definir o formato da data para: AAAAMMDD.

 

Alguem pode me ajudar?

 

O codigo que eu usei até agora foi:

 

procedure TFormArquivoTxt.ButtonGerarArquivoClick(Sender: TObject);

var Arquivo: TextFile;

linha, NomeArquivo: String;

begin

NomeArquivo:= 'C:\DSAC\Pingo\Arquivo.txt';

AssignFile(Arquivo, NomeArquivo);

ReWrite(Arquivo);

 

while not AdoQueryArquivo.Eof do

begin

 

 

write(Arquivo, Preenche(AdoQueryArquivo.fieldByName('Fatura').AsString,6,'F',' '));

writeln(Arquivo, Preenche(AdoQueryArquivo.fieldByName('CDC').AsString,7,'L',' '));

write(Arquivo, Preenche(AdoQueryArquivo.fieldByName('DataNegociacao').AsString,8,'L', ' '));

 

AdoQueryArquivo.Next;

end;

CloseFile(Arquivo);

 

 

end;

 

 

Natiii http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que faz a função preenche?

 

Poderia postar ela aqui?

 

e também o arquivo que está sendo gerado com erro... se puder postar a linha do erro seria interessante...

 

Obrigado! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Função neste post: http://forum.imasters.com.br/index.php?s=&...st&p=908568

 

 

Alguém poderia me dar uma luz no que estou fazendo de errado?

 

 

Natiii

 

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Você precisa criar as funções conforme necessidade...

 

 

 

 

procedure TFormArquivoTxt.ButtonGerarArquivoClick(Sender: TObject);

var Arquivo: TextFile;

linha, NomeArquivo: String;

begin

NomeArquivo:= 'C:\DSAC\Pingo\Arquivo.txt';

AssignFile(Arquivo, NomeArquivo);

ReWrite(Arquivo);

 

while not AdoQueryArquivo.Eof do

begin

 

write(Arquivo, 'F');

write(Arquivo, Preenche(AdoQueryArquivo.fieldByName('Fatura').AsString,6,'F',' '));

write(Arquivo, Preenche(AdoQueryArquivo.fieldByName('CDC').AsString,7,'L',' '));

writeln(Arquivo, Preenche(AdoQueryArquivo.fieldByName('DataNegociacao').AsString,8,'L', ' '));

 

AdoQueryArquivo.Next;

end;

CloseFile(Arquivo);

 

 

end;

 

 

Cole como o arquivo ficou e de como deveria de ficar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, consegui criar da maneira que eu queria...

Na realidade usei outra função:

function FixStr(str: string; tamanho: integer; caracter: char = ' '; alinhamento: byte = ESQUERDA): string;
var
cadeia: string;
begin
  if (length(str) = tamanho)
	then result := str					   // se string = tamanho, retorna string
	else if (length(str) > tamanho)
		 then result := copy(str,1,tamanho)  // se a string > tamanho, trunca
	   else								// se nao, cria a string de tamanho fixo
		 begin
		 cadeia := StringOfChar(caracter, tamanho - length(str));
		 if (alinhamento = ESQUERDA)
		   then result := str + cadeia
		  else result := cadeia + str;
		 end;
end;

e meu codigo para gerar o arquivo txt ficou da seguinte maneira:

 

procedure TFormArquivoTxt.BitBtnGerarArquivoClick(Sender: TObject);
  var Arquivo: TextFile;
  linha, NomeArquivo: String;

  begin
	NomeArquivo:= 'C:\DSAC\Pingo\Arquivo.txt';
	AssignFile(Arquivo, NomeArquivo);
	ReWrite(Arquivo);


  linha:= 'H' +   FormatDateTime('YYYYMMDD',date) +
  FixStr(' ',56);
  writeln(Arquivo, linha);

  while not AdoQueryArquivo.Eof do
   begin
  linha:= 'P' + FixStr(AdoQueryArquivo.fieldByName('CDC').AsString,7,'0',DIREITA) +
  FixStr(AdoQueryArquivo.fieldByName('Competencia').AsString,6,'0',DIREITA) +
  FixStr(SoNumeros(AdoQueryArquivo.fieldByName('VlrParcelas').AsString),12,'0',DIREITA)+
  FixStr(AdoQueryArquivo.fieldByName('QtParcelas').AsString,3,'0',DIREITA) +
  FixStr(' ',53) +
  FixStr(SoNumeros(AdoQueryArquivo.fieldByName('Indice').AsString),6,'0', DIREITA);
  Writeln(Arquivo, linha);
  AdoQueryArquivo.Next;
end;
   CloseFile(Arquivo);
	 end;

De qualquer maneira obrigada pela ajuda!

 

[]'s

 

Natiii http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.