gerar arquivo txt para enviar para o boa vista

07/02/2019

25

bom noite, sou novato estou com dificuldades para cirar uma funcao que envie os dados de boletos protestado ao boa vista / serasa. alguem teria um exempledo dessa funcao vi que la tem os tamanhos especificos para cara campo.
Camilo Raposo

Camilo Raposo

Responder

Posts

08/02/2019

Hélio Devmedia

Olá Camilo,

É difícil postar pra você aqui algo completo até porque eu não tenho idéia do layout utilizado, mas normalmente usamos o objeto TStringGrid para montar um arquivo TXT.
s:= TStringGrid.Create;

s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.saveToFile('c:\\pastaBoletos\\arquivo01.txt');


Este código simplesmente cria um objeto StringList e permite adicionar linhas de texto pelo add();

para salvar em TXT usa-se SaveToFile(caminho do arquivo);

para fazer o layout, e colocar tamanho dos campos específicos você pode usar vários comandos de formatação,

Por exemplo, imagine que na linha o nome tem que ter 20 posições, o endereço 30 posições, o código 10 posições com zero e o valor 16 posições com duas casas decimais
  nome:='Hélio Carlos';
  endereco:='Rua Maria Ortiz';
  codigo:=2565;
  valor:=200.00;

  nome    :=Format('%-20s',[nome]);
  endereco:=Format('%-30s',[endereco]);
  codigoS  :=Format('%10.10d',[codigo]);
  valorS   :=FormatFloat('00000000000000.00',valor);
  s.add(nome+endereco+codigoS+valorS);


lembrado que se você quiser saber tudo o que o comando format tem a oferecer digite Format no delphi, clique em cima da palavra e aperte F1 que será mostrado a documentação completa do comando.

Se o seu delphi for uma versão mais recente é possível usar também o PadLeft e o PadRigth para preencher espaços a direita e a esquerda:

nome.PadLeft(10,' '); //" Hélio Carlos";
nome.PadLeft(10,' 0'); //"00000000Hélio Carlos";
nome.PadRigth(10,' '); //"Hélio Carlos ";
nome.PadRigth(10,'0 '); //"Hélio Carlos00000000";

a mesma coisa para numeros...

Espero ter ajudado. Um forte abraço e fique com Deus.





Responder

14/02/2019

Camilo Raposo

obrigado pela ajuda vou tentar aqui. o layout seria esse aqui:

https://1drv.ms/b/s!AoTEmtd6yZSBuVfjHsyNvjUb-Yvr


Olá Camilo,

É difícil postar pra você aqui algo completo até porque eu não tenho idéia do layout utilizado, mas normalmente usamos o objeto TStringGrid para montar um arquivo TXT.
s:= TStringGrid.Create;

s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.add('texto');
s.saveToFile('c:\\\\pastaBoletos\\\\arquivo01.txt');


Este código simplesmente cria um objeto StringList e permite adicionar linhas de texto pelo add();

para salvar em TXT usa-se SaveToFile(caminho do arquivo);

para fazer o layout, e colocar tamanho dos campos específicos você pode usar vários comandos de formatação,

Por exemplo, imagine que na linha o nome tem que ter 20 posições, o endereço 30 posições, o código 10 posições com zero e o valor 16 posições com duas casas decimais
  nome:='Hélio Carlos';
  endereco:='Rua Maria Ortiz';
  codigo:=2565;
  valor:=200.00;

  nome    :=Format('%-20s',[nome]);
  endereco:=Format('%-30s',[endereco]);
  codigoS  :=Format('%10.10d',[codigo]);
  valorS   :=FormatFloat('00000000000000.00',valor);
  s.add(nome+endereco+codigoS+valorS);


lembrado que se você quiser saber tudo o que o comando format tem a oferecer digite Format no delphi, clique em cima da palavra e aperte F1 que será mostrado a documentação completa do comando.

Se o seu delphi for uma versão mais recente é possível usar também o PadLeft e o PadRigth para preencher espaços a direita e a esquerda:

nome.PadLeft(10,' '); //" Hélio Carlos";
nome.PadLeft(10,' 0'); //"00000000Hélio Carlos";
nome.PadRigth(10,' '); //"Hélio Carlos ";
nome.PadRigth(10,'0 '); //"Hélio Carlos00000000";

a mesma coisa para numeros...

Espero ter ajudado. Um forte abraço e fique com Deus.





Responder

14/02/2019

Daniel Araújo

Vê se esse artigo te ajuda Camilo:
https://www.devmedia.com.br/criando-e-gravando-dados-em-txt-com-delphi/22630

Nele ensina como gerar arquivos. Aí tu só adapta ao teu layout.
Responder

14/02/2019

Camilo Raposo

eu criei o arquivo e enviei ao boa vista eles so responde que esta desalinhado. nao me enviam nenhum relatório de erro com as posições erradas.
uma duvida sobre o codigo:

nome :=Format('%-20s',[nome]);
endereco:=Format('%-30s',[endereco]);
codigoS :=Format('%10.10d',[codigo]);
valorS :=FormatFloat('00000000000000.00',valor);

ai o campo nome tem 20 posições se eu colocar um nome com apenas 10 posições ele vai completar o restante com espaço em branco?

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Vê se esse artigo te ajuda Camilo:
https://www.devmedia.com.br/criando-e-gravando-dados-em-txt-com-delphi/22630

Nele ensina como gerar arquivos. Aí tu só adapta ao teu layout.
Responder

14/02/2019

Daniel Araújo

Cara, cria uma função chamada CompletarComEspacos(Texto : String):String;

Aí em cada informação que tu for adicionar na linha, tu chama essa função passando o texto e a quantidade de caracteres informada no layout. Essa função deve completar com espaços em branco.

Chamaria assim:

Nome := CompletarComEspacos('Camilo', 20)

Entendeu?
Responder

14/02/2019

Camilo Raposo

sim, entendi ate ja faço dessa forma, creio que agora vou apenas revisar o codigo para tentar descobrir o desalinhamento por que o boa vista nao da um resposta clara do problema do arquivo e nao achei nenhum portal para homologar esse arquivo.

segue os codigos que estou usando:

 private
    { Private declarations }

    function calculaespaco(tamanho_campo,campo:integer): String;
    function geralinha(numero_linha:String) : String;
    function zeroesquerda(value, tamanho:String):String;
    function gerarcabecalho:String;
    function gerarodape(linha:string):String;
    const
    tliv_protesto=6;
    tfol_protesto=4;
    tespec_titulo=3;
    tvalor_tit=14;
    tNM_SACADO=45;
    tCPFCGC_SACADO=9;
    ted_sacado=45;
    tcid_sacado=20;
    tuf_sacado=2;


function TForm1.geralinha(numero_linha: String): String;
var
tamanho,tcampo,itamanho, i : Integer;
espaco,espacoantes,espaco25, linha,dado,vltit,filial,ncontrole,cep_sacado,protocolo : String;
liv_protesto,fol_protesto,espec_titulo,valor_tit,dt_protesto,tpessoa,tdoc,
NM_SACADO,CPFCGC_SACADO,ed_sacado,cid_sacado,uf_sacado,cartorio,
dt_cancel,tipo_protesto,dt_emissao,dt_vencimento,espaco3,espaco10,espaco20,espaco91 : String;
begin


//FORMATAR DATA DDMMYYYY
if not cdsdadodt_cancel.IsNull then
dt_cancel:= FormatDateTime('ddmmyyyy',cdsdadodt_cancel.AsDateTime)
else
dt_cancel:= '00000000';
if not cdsdadodt_emissao.IsNull then
dt_emissao:=FormatDateTime('ddmmyyyy',cdsdadodt_emissao.AsDateTime);
if not cdsdadodt_vencimento.IsNull then
dt_vencimento:= FormatDateTime('ddmmyyyy',cdsdadodt_vencimento.AsDateTime);
if not cdsdadodt_protesto.IsNull then
dt_protesto:= FormatDateTime('ddmmyyyy',cdsdadodt_protesto.AsDateTime);


//livro protesto
espacoantes :='';
espaco:='';
espaco25 := calculaespaco(25,0);
espaco3 :=  calculaespaco(3,0);
espaco10 :=  calculaespaco(10,0);
espaco20 :=  calculaespaco(20,0);
espaco91 :=  calculaespaco(91,0);
espacoantes := calculaespaco(223,0);
cartorio :='01';

//espaco := calculaespaco(tliv_protesto,Length(cdsdadoliv_protesto.AsString));
liv_protesto:=espacoantes+zeroesquerda(cdsdadoliv_protesto.AsString,'6')+cdsdadoliv_protesto.AsString;

//folha livro
espacoantes:=' ';
espaco := calculaespaco(tfol_protesto,Length(cdsdadofol_protesto.AsString));
fol_protesto:=espacoantes+cdsdadofol_protesto.AsString+espaco;

 //especie titulo

espaco := calculaespaco(tespec_titulo,Length(cdsdadoespec_titulo.AsString));
espec_titulo:= cdsdadoespec_titulo.AsString+espaco;



//valor titulo
vltit := CDSDADOvalor_tit.AsString;
While pos('.', vltit) <> 0 Do
    delete(vltit,pos('.', vltit),1);
//vltit := cdsdadovalor_tit.AsString;
vltit := zeroesquerda(vltit,'14')+vltit;
espaco := calculaespaco(tvalor_tit,Length(vltit));
valor_tit:=cdsdadovalor_tit.AsString+espaco;


//nome sacado
espaco := calculaespaco(tNM_SACADO,Length(cdsdadoNM_SACADO.AsString));
NM_SACADO:=cdsdadoNM_SACADO.AsString+espaco;




//ENDERECO SACADO
espaco := calculaespaco(ted_sacado,Length(cdsdadoed_sacado.AsString));
ed_sacado:=cdsdadoed_sacado.AsString+espaco;

//CIDADE SACADO
espaco := calculaespaco(tcid_sacado,Length(cdsdadocid_sacado.AsString));
cid_sacado:=cdsdadocid_sacado.AsString+espaco;


uf_sacado:=cdsdadouf_sacado.AsString;

cartorio:= '01';
tipo_protesto:= cdsdadotipo_protesto.AsString;

{filial
tpessoa,tdoc
ncontrole }

if Length(CDSDADOCPFCGC_SACADO.AsString) = 11 then
begin
  tpessoa := 'F';
  tdoc := '2';
  //CPF CNPJ SACADO
  espaco := calculaespaco(tCPFCGC_SACADO,9);
  CPFCGC_SACADO:= COPY(cdsdadoCPFCGC_SACADO.AsString,0,8);
  ncontrole := copy(CDSDADOCPFCGC_SACADO.AsString,10,2);
  filial := '0000';
end else if Length(CDSDADOCPFCGC_SACADO.AsString) = 14 then
begin
  tpessoa := 'J';
  tdoc := '1';
  espaco := calculaespaco(tCPFCGC_SACADO,9);
  CPFCGC_SACADO:= COPY(cdsdadoCPFCGC_SACADO.AsString,0,8)+'000';
  ncontrole := '';
  filial := '';
  //ncontrole := copy(CDSDADOCPFCGC_SACADO.AsString,13,2);
  //filial :=   copy(CDSDADOCPFCGC_SACADO.AsString,9,4);
end;

cep_sacado := CDSDADOcep_sacado.AsString;

protocolo  := CDSDADOnm_protoc.AsString;




linha := '1PIMAVFR'+liv_protesto+fol_protesto+espec_titulo+valor_tit+dt_protesto+tpessoa+tdoc+'00'+espaco25+
NM_SACADO+espaco3+CPFCGC_SACADO+filial+ncontrole+espaco10+ed_sacado+cep_sacado+cid_sacado+uf_sacado+cartorio+protocolo+espaco20+
dt_cancel+
tipo_protesto+dt_emissao+dt_vencimento+espaco91+numero_linha;

result := linha;



function TForm1.zeroesquerda(value,tamanho : String): String;
var i,t : integer;
zero : String;
begin
zero:='';
t := StrToInt(tamanho)-Length(value);
i := 0;
zero :='';
while i <t do
begin
  zero:= zero+'0';
  i:=i+1;
end;
  Result:= zero;
end;



function TForm1.gerarcabecalho : String;
var espaco43,espaco5,espaco9,espaco22,espaco40,espaco272,espaco60,servico,telefonecartorio,versaosoft,tenvio: String;
retorno,dataatual,cnpj,nomecontato,cep,remessa : String;

begin
espaco43:= calculaespaco(43,0);
espaco9 := calculaespaco(9,0);
espaco40:= calculaespaco(40,0);
espaco272:= calculaespaco(272,0);
espaco60:=calculaespaco(60,0);
espaco5:= calculaespaco(5,0);
espaco22:=   calculaespaco(7,0);
cnpj:='00000000';
nomecontato:= 'xxxxxxxx';
nomecontato:= nomecontato + calculaespaco(70,length(nomecontato));
servico:='Boavistaservicos-ProtestoE98  ';
telefonecartorio:='36551059';
versaosoft:='2';
tenvio:='M';
dataatual := FormatDateTime('ddmmyyyy',now);
cep:='65320000';
remessa :='8888';

retorno:= '0'+espaco43+dataatual+espaco9+'008888'+espaco22+'1'+cnpj+servico+
telefonecartorio+'0000'+nomecontato+versaosoft+espaco5+tenvio+espaco40+espaco272+espaco60+'0000001';

result := retorno;
end



function TForm1.gerarodape(linha : String) : String;
var
espaco :String;
begin
espaco := calculaespaco(592,0);
 result := '9'+espaco+linha;
end;


function TForm1.calculaespaco(tamanho_campo,campo : Integer): String;
var tamanho,i : integer;
espaco : String;
begin
espaco:='';
tamanho := tamanho_campo - campo;
i := 0;
espaco :='';
while i <tamanho do
begin
  espaco:= espaco+' ';
  i:=i+1;
end;
  Result:= espaco;
end;


procedure TForm1.Button1Click(Sender: TObject);
  var F: TextFile;
  linha, numero_registro : string;
  registro: integer;
begin
 registro := 2;
 cdsdado.Open;
 cdsdado.First;
  AssignFile(f,'DTVENC.p1.txt');

  Rewrite(f); //abre o arquivo para escrita
  Writeln(f,gerarcabecalho);
 while not cdsdado.Eof do
 begin

  numero_registro := zeroesquerda(IntToStr(registro),'7')+IntToStr(registro);
  registro := registro+1;
  linha := geralinha(numero_registro);
  Writeln(f,linha); //escreve no arquivo e desce uma linha
  cdsdado.Next;
 end;
   numero_registro := zeroesquerda(IntToStr(registro),'7')+IntToStr(registro);
  registro := registro+1;
  linha := gerarodape(numero_registro);
  Writeln(f,linha); //escreve no arquivo e desce uma linha
  Closefile(f); //fecha o handle de arquivo
 end;

=========================================================================================================
Cara, cria uma função chamada CompletarComEspacos(Texto : String):String;

Aí em cada informação que tu for adicionar na linha, tu chama essa função passando o texto e a quantidade de caracteres informada no layout. Essa função deve completar com espaços em branco.

Chamaria assim:

Nome := CompletarComEspacos('Camilo', 20)

Entendeu?
Responder

14/02/2019

Daniel Araújo

O lance é pegar o arquivo e ir batendo posição a posição com o layout. Eu uso o notepad++ quando vou verificar arquivos.
Responder

15/02/2019

Ricardo Diniz

Olá,

Amigo você terá de ver o layout para ir colocando posição por posição para geração do arquivo de modo que fique no padrão do boa vista / serasa.

At,
Responder

15/02/2019

Camilo Raposo

consegui gerar o arquivo porem o boa vista nao da uma resposta concreta sobre o erro no arquivo entao vou fazer um app para ler as linhas do arquivos e validar as posições.


Olá,

Amigo você terá de ver o layout para ir colocando posição por posição para geração do arquivo de modo que fique no padrão do boa vista / serasa.

At,
Responder

16/02/2019

Camilo Raposo

amigos, alguem sabe dizer porque mesmo so campos todos tendo o mesmo tamanho (48 caracteres) mesmo assim fica desalinhado?

JEFFERSON COSTA DE CASTRO ALIMENTOS-------------179648700000183
VANDERLEY VIEIRA SOARES-------------------------874920673000072
VIVIANE DOS SANTOS COSTA------------------------020459803000067
MARIA NILZENIR PIMENTEL MACEDO 450391-----------210345770000194
JOSE FAUSTINO DE CARVALHO NEVES-----------------907692013000034
Responder

18/02/2019

Natanael Ferreira

O desalinhamento pode ser causado porque vc não está usando uma fonte mono-espaçada no seu arquivo texto.

Em fontes mono-espaçadas cada letra/caracter ocupa o mesmo espaço na horizontal.

Exemplo de fontes mono-espaçadas mais conhecidas são:

- Lucida Console;
- Courier;
- Courier New;
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários,
consulte nossa política de privacidade.

Aceitar