Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Arquivo Retorno


Alberto Mota

Pergunta

Prezados colegas, finalmente recebi o arquivo retorno da Caixa com vários pagamentos.

E não estou conseguindo entender a ligação de segmentos.

São dois segmentos principais:

O segmento T vem o numero do doc. e a data de vencimento

O segmento U vem o valor e a data de pagamento do documento acima.

Supondo que venham 10 pagamentos tem que haver algo em comum nessses segmentos.

No segmento U não existe um campo que se referencie ao Segmento T,

daí não tenho como saber quem é quem.

Como o arquivo não caberia aqui, não o coloquei, talvez fosse mais facil entender meu problema

esse arquivo vem em sequencia, como abaixo.

1040001300001T

1040001300002U

1040001300003T

1040001300004U

No exemplo são 2 pagamentos e 2 detalhes.

Uma idéia que me ocorreu e me fez editar o post é que no Segmento U posso colocar no campo de relacionamento

que ele será o sequencial U menos 1, fazendo assim a junção de ambos.

Abaixo segue o código que o Jhonas me ajudou para o Segmento U. Como posso alterar para obter essa solução?

Desde já agradeço

procedure TFrmArquivoRetorno.BitBtn8Click(Sender: TObject);

var

fArq: TextFile;

Caminho: string;

Linha: string;

mTexto: TStringList;

i: integer;

valor1, valor2 : string;

somatotal : Real;

somatotal2 : String;

dat :string;

data :TDate;

Valor : real;

numero : integer;

lote: integer;

begin

detalhesu.open;

if Edit1.Text = '' then

Begin

statusbar1.Panels[0].Text := ' Selecione o arquivo retorno!';

BitBtn4.setfocus;

exit;

End;

Caminho := Edit1.Text;

AssignFile(fArq, Caminho);

ReSet(fArq);

mTexto := TStringList.Create;

try

mTexto.LoadFromFile(Caminho);

pb.Max := mTexto.Count - 1;

i := 0;

finally

mTexto.Free;

end;

while not Eof(fArq) do

begin

Readln(farq, linha);

//Caption := 'Lendo Linha: ' + IntToStr(i) + ' de: ' + IntToStr(pb.Max);

if pos('U',linha) = 14 then

Begin

dat := copy(linha,138,8);

insert('/',dat,3);

insert('/',dat,6);

data := strtodate(dat);

lote := strtoint(copy(linha,4,4));

valor := (strtofloat(copy(linha,93,15))/100);

numero := strtoint(copy(linha,143,6));

detalhesU.ExecSQL;

detalhesU.Append;

detalhesU.edit;

detalhesU.FieldbyName('loteu').Value := lote;

detalhesU.FieldbyName('dtpgto').Value := datetostr(data);

detalhesU.FieldbyName('vr').Value := valor;

//detalhes.FieldbyName('formapgto').Value := valor;

detalhesU.Post;

detalhesU.ExecSQL;

Inc(i);

pb.Position := pb.Position + 1;

Application.ProcessMessages;

Next;

pb.Visible := false;

//Label1.Caption := 'Total de registros importados: '+ IntToStr(AdoQuery1.Recordcount);

soma;

end;

end;

end;

Editado por Alberto Mota
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Bom, pessoal consegui resolver.

Esperar que a Caixa envie um arquivo mastigado é esperar demais.

Isso é bom porque faz com que nós programadores exercitemos

a tão falada lógica de programação.

Não há uma relação aparente entre os dois Segmentos: T e U.

Mas o arquivo é sequencial. E me lembrei que os numeros dos boletos

na tabela são sequenciais. E aí então...

Eureka!

Se o arquivo vem assim:

104100300001T

104100300002U

104100300003T

104100300004U

104100300005T

104100300006U

Isso quer dizer que são 3 pagamentos.

No segmento T tenho o numero do boleto e a data de venciemnto

No Segmento U tenho a data de pagamento e o valor pago do sequencial acima dele.

Então a ligação entre ambos foi criar um campo na tabela que guarda o Segmento U menos 1.

Refiz o código e voilá(diriam os franceses).

Segue o código do Segmento U.

procedure TFrmArquivoRetorno.BitBtn8Click(Sender: TObject);

var

fArq: TextFile;

Caminho: string;

Linha: string;

mTexto: TStringList;

i: integer;

valor1, valor2 : string;

somatotal : Real;

somatotal2 : String;

dat :string;

data :TDate;

Valor : real;

numero : integer;

sequencial: integer;

begin

detalhesu.open;

if Edit1.Text = '' then

Begin

statusbar1.Panels[0].Text := ' Selecione o arquivo retorno!';

BitBtn4.setfocus;

exit;

End;

Caminho := Edit1.Text;

AssignFile(fArq, Caminho);

ReSet(fArq);

mTexto := TStringList.Create;

try

mTexto.LoadFromFile(Caminho);

pb.Max := mTexto.Count - 1;

i := 0;

finally

mTexto.Free;

end;

while not Eof(fArq) do

begin

Readln(farq, linha);

//Caption := 'Lendo Linha: ' + IntToStr(i) + ' de: ' + IntToStr(pb.Max);

if pos('U',linha) = 14 then

Begin

dat := copy(linha,138,8);

insert('/',dat,3);

insert('/',dat,6);

data := strtodate(dat);

sequencial := strtoint(copy(linha,9,5));

valor := (strtofloat(copy(linha,93,15))/100);

numero := strtoint(copy(linha,143,6));

detalhesU.ExecSQL;

detalhesU.Append;

detalhesU.edit;

detalhesU.FieldbyName('sequencialU').Value := sequencial;

detalhesU.FieldbyName('sequencialBase').Value := sequencial - 1;

detalhesU.FieldbyName('dtpgto').Value := datetostr(data);

detalhesU.FieldbyName('vr').Value := valor;

//detalhes.FieldbyName('formapgto').Value := valor;

detalhesU.Post;

detalhesU.ExecSQL;

Inc(i);

pb.Position := pb.Position + 1;

Application.ProcessMessages;

Next;

pb.Visible := false;

//Label1.Caption := 'Total de registros importados: '+ IntToStr(AdoQuery1.Recordcount);

soma;

end;

end;

end;

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...