natiii 0 Denunciar post Postado Novembro 8, 2007 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
marcio.theis 3 Denunciar post Postado Novembro 8, 2007 Não entendi muito bem a sua situação, teria como coloca um exemplo de como deveria de ficar o arquivo ? Compartilhar este post Link para o post Compartilhar em outros sites
natiii 0 Denunciar post Postado Novembro 8, 2007 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
marcio.theis 3 Denunciar post Postado Novembro 8, 2007 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
natiii 0 Denunciar post Postado Novembro 8, 2007 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
marcio.theis 3 Denunciar post Postado Novembro 8, 2007 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
natiii 0 Denunciar post Postado Novembro 8, 2007 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
marcio.theis 3 Denunciar post Postado Novembro 8, 2007 beleza, monta no arquivo e vai testando... Compartilhar este post Link para o post Compartilhar em outros sites
natiii 0 Denunciar post Postado Novembro 8, 2007 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
natiii 0 Denunciar post Postado Novembro 12, 2007 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 Compartilhar este post Link para o post Compartilhar em outros sites
Hugo Slepicka 0 Denunciar post Postado Novembro 12, 2007 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 Compartilhar este post Link para o post Compartilhar em outros sites
marcio.theis 3 Denunciar post Postado Novembro 13, 2007 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
natiii 0 Denunciar post Postado Novembro 13, 2007 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
marcio.theis 3 Denunciar post Postado Novembro 13, 2007 Coisa boa que conseguiu... Parabéns... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites