Alberto Mota Postado Janeiro 28, 2010 Denunciar Share Postado Janeiro 28, 2010 (editado) 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 vencimentoO 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. 1040001300001T1040001300002U1040001300003T1040001300004UNo 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çoprocedure TFrmArquivoRetorno.BitBtn8Click(Sender: TObject);varfArq: 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;begindetalhesu.open;if Edit1.Text = '' thenBeginstatusbar1.Panels[0].Text := ' Selecione o arquivo retorno!';BitBtn4.setfocus;exit;End;Caminho := Edit1.Text;AssignFile(fArq, Caminho);ReSet(fArq);mTexto := TStringList.Create;trymTexto.LoadFromFile(Caminho);pb.Max := mTexto.Count - 1;i := 0;finallymTexto.Free;end;while not Eof(fArq) dobeginReadln(farq, linha);//Caption := 'Lendo Linha: ' + IntToStr(i) + ' de: ' + IntToStr(pb.Max);if pos('U',linha) = 14 thenBegindat := 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 Janeiro 28, 2010 por Alberto Mota Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Alberto Mota Postado Janeiro 29, 2010 Autor Denunciar Share Postado Janeiro 29, 2010 Bom, pessoal consegui resolver.Esperar que a Caixa envie um arquivo mastigado é esperar demais.Isso é bom porque faz com que nós programadores exercitemosa 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 boletosna tabela são sequenciais. E aí então...Eureka!Se o arquivo vem assim:104100300001T104100300002U104100300003T104100300004U104100300005T104100300006UIsso quer dizer que são 3 pagamentos.No segmento T tenho o numero do boleto e a data de venciemntoNo 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);varfArq: 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;begindetalhesu.open;if Edit1.Text = '' thenBeginstatusbar1.Panels[0].Text := ' Selecione o arquivo retorno!';BitBtn4.setfocus;exit;End;Caminho := Edit1.Text;AssignFile(fArq, Caminho);ReSet(fArq);mTexto := TStringList.Create;trymTexto.LoadFromFile(Caminho);pb.Max := mTexto.Count - 1;i := 0;finallymTexto.Free;end;while not Eof(fArq) dobeginReadln(farq, linha);//Caption := 'Lendo Linha: ' + IntToStr(i) + ' de: ' + IntToStr(pb.Max);if pos('U',linha) = 14 thenBegindat := 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Alberto Mota
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 MotaLink para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
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.