Making Software Fernando Posted January 10 Share Posted January 10 Bom dia, Ao utilizar o LerTXT do componente ACBrPagFor me deparei com um problema na Unit ACBrPagForLerTxt quando é feito o processamento do Segmento A do Arquivo de Retorno. Nos casos do Segmento A é incluso o Segmento B que possui algumas informações, assim como em outros Segmentos. Na leitura dos outros Segmentos (J e N) está faltando uma verificação se o Registro Pai existe, e acaba tentando inserir o Segmento B neles também, porém não existem e acaba apresentando o erro. Vou utilizar como exemplo a Leitura do Segmento J: (Observações feitas entre **** ****) procedure TPagForR.LerSegmentoJ(I: Integer); var mOk:boolean; x:integer; begin if ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3J') and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3B') and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3C') and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3Z') then Exit; if ((Copy(FArquivoTXT.Strings[i], 18, 2) <> '52') and (Copy(FArquivoTXT.Strings[i], 18, 2) <> '99')) and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3B') and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3C') and ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3Z') then begin FPagFor.Lote.Last.SegmentoJ.New; FPagFor.Lote.Last.SegmentoJ.Last.CodMovimento := StrToInMovimento(mOk, Copy(FArquivoTXT.Strings[i], 15, 3)); FPagFor.Lote.Last.SegmentoJ.Last.CodigoBarras := Copy(FArquivoTXT.Strings[i], 18, 44); FPagFor.Lote.Last.SegmentoJ.Last.NomeCedente := Copy(FArquivoTXT.Strings[i], 62, 30); FPagFor.Lote.Last.SegmentoJ.Last.DataVencimento := StringToDateTime(Copy(FArquivoTXT.Strings[i], 92, 2)+'/'+Copy(FArquivoTXT.Strings[i], 94, 2)+'/'+Copy(FArquivoTXT.Strings[i], 96, 4)); case FPagFor.Geral.Banco of pagItau, pagSantander, pagSicred, pagBancoCECRED, pagBradesco: begin FPagFor.Lote.Last.SegmentoJ.Last.ValorTitulo := StrToInt(Copy(FArquivoTXT.Strings[i], 100, 15)) / 100; FPagFor.Lote.Last.SegmentoJ.Last.Desconto := StrToInt(Copy(FArquivoTXT.Strings[i], 115, 15)) / 100; FPagFor.Lote.Last.SegmentoJ.Last.Acrescimo := StrToInt(Copy(FArquivoTXT.Strings[i], 130, 15)) / 100; FPagFor.Lote.Last.SegmentoJ.Last.DataPagamento := StringToDateTime(Copy(FArquivoTXT.Strings[i], 145, 2)+'/'+Copy(FArquivoTXT.Strings[i], 147, 2)+'/'+Copy(FArquivoTXT.Strings[i], 149, 4)); FPagFor.Lote.Last.SegmentoJ.Last.ValorPagamento := StrToInt(Copy(FArquivoTXT.Strings[i], 153, 15)) / 100; FPagFor.Lote.Last.SegmentoJ.Last.QtdeMoeda := StrToInt(Copy(FArquivoTXT.Strings[i], 168, 15)) / 100000; FPagFor.Lote.Last.SegmentoJ.Last.ReferenciaSacado := Copy(FArquivoTXT.Strings[i], 183, 20); case FPagFor.Geral.Banco of pagSicred, pagBancoCECRED, pagBradesco : FPagFor.Lote.Last.SegmentoJ.Last.NossoNumero := Copy(FArquivoTXT.Strings[i], 203, 20); else FPagFor.Lote.Last.SegmentoJ.Last.NossoNumero := Copy(FArquivoTXT.Strings[i], 216, 15) end; FPagFor.Lote.Last.SegmentoJ.Last.CodOcorrencia := Trim(Copy(FArquivoTXT.Strings[i], 231, 10)); if (FPagFor.Geral.Banco = pagItau) then FPagFor.Lote.Last.SegmentoJ.Last.DescOcorrencia := DescricaoRetornoItau(FPagFor.Lote.Last.SegmentoJ.Last.CodOcorrencia); if POS(FPagFor.Lote.Last.SegmentoJ.Last.CodOcorrencia, PAGAMENTO_LIBERADO_AVISO) = 0 then begin FPagFor.Registro0.Aviso.New; FPagFor.Registro0.Aviso.Last.CodigoRetorno := FPagFor.Lote.Last.SegmentoJ.Last.CodOcorrencia; FPagFor.Registro0.Aviso.Last.MensagemRetorno := FPagFor.Lote.Last.SegmentoJ.Last.DescOcorrencia; FPagFor.Registro0.Aviso.Last.Segmento := 'J'; FPagFor.Registro0.Aviso.Last.SegmentoFilho := ''; FPagFor.Registro0.Aviso.Last.SeuNumero := FPagFor.Lote.Last.SegmentoJ.Last.ReferenciaSacado; end; end; end; end; **** Nesse ponto abaixo é feita tentativa de inserir os segmentos opcionais, porém, não existe nenhum Segmento J preparado pois estou processando apenas o Segmento A. Com isso, é gerado um erro por não existir o registro. Acaba entrando nesse código pois reconhece no arquivo o Segmento B que existe também no Segmento A. Tentei colocar aqui uma condição "if (FPagFor.Lote.Last.SegmentoJ.Count > 0) then" mas por algum motivo minhas mudanças não estão sendo reconhecidas no código local e não consegui testar essa solução. **** {opcionais segmento J} LerSegmentoJ52(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoJ52, i); LerSegmentoJ99(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoJ99, i); LerSegmentoB(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoB, i); LerSegmentoC(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoC, i); LerSegmentoZ(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoZ, i); case FPagFor.Geral.Banco of pagItau: begin for x := 0 to FPagFor.Lote.Last.SegmentoJ.Last.SegmentoB.Count - 1 do begin if POS(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoB.Items[x].CodOcorrencia, PAGAMENTO_LIBERADO_AVISO) = 0 then begin FPagFor.Registro0.Aviso.New; FPagFor.Registro0.Aviso.Last.CodigoRetorno := FPagFor.Lote.Last.SegmentoJ.Last.SegmentoB.Items[x].CodOcorrencia; FPagFor.Registro0.Aviso.Last.MensagemRetorno := FPagFor.Lote.Last.SegmentoJ.Last.SegmentoB.Items[x].DescOcorrencia; FPagFor.Registro0.Aviso.Last.Segmento := 'J'; FPagFor.Registro0.Aviso.Last.SegmentoFilho := 'B'; FPagFor.Registro0.Aviso.Last.SeuNumero := FPagFor.Lote.Last.SegmentoJ.Last.ReferenciaSacado; end; end; for x := 0 to FPagFor.Lote.Last.SegmentoJ.Last.SegmentoC.Count - 1 do begin if POS(FPagFor.Lote.Last.SegmentoJ.Last.SegmentoC.Items[x].CodOcorrencia, PAGAMENTO_LIBERADO_AVISO) = 0 then begin FPagFor.Registro0.Aviso.New; FPagFor.Registro0.Aviso.Last.CodigoRetorno := FPagFor.Lote.Last.SegmentoJ.Last.SegmentoC.Items[x].CodOcorrencia; FPagFor.Registro0.Aviso.Last.MensagemRetorno := FPagFor.Lote.Last.SegmentoJ.Last.SegmentoC.Items[x].DescOcorrencia; FPagFor.Registro0.Aviso.Last.Segmento := 'J'; FPagFor.Registro0.Aviso.Last.SegmentoFilho := 'C'; FPagFor.Registro0.Aviso.Last.SeuNumero := FPagFor.Lote.Last.SegmentoJ.Last.ReferenciaSacado; end; end; end; end; end; Gostaria de um auxilio principalmente para eu conseguir checar se essa solução é viável, pois infelizmente não consegui testar o código já que mesmo mudando e rodando o sistema ele passa no código como se fosse o antigo ainda, ignorando minhas alterações locais. Vou continuar fazendo os testes aqui e qualquer novidade atualizo no tópico. Agradeço desde já e fico a disposição para passar mais detalhes sobre o ocorrido e chegarmos numa solução. Link to comment Share on other sites More sharing options...
mlgoncalves Posted January 21 Share Posted January 21 Olá Fernando, estou com o mesmo problema. No meu caso o banco em questão é o Banco do Brasil. Tenho vários retornos de diversos segmentos, mas não estou conseguindo ler completamente o retorno (digo dos segmentos opcionais). Você já evoluiu nesse assunto? Link to comment Share on other sites More sharing options...
Making Software Fernando Posted January 21 Author Share Posted January 21 1 minuto atrás, mlgoncalves disse: Olá Fernando, estou com o mesmo problema. No meu caso o banco em questão é o Banco do Brasil. Tenho vários retornos de diversos segmentos, mas não estou conseguindo ler completamente o retorno (digo dos segmentos opcionais). Você já evoluiu nesse assunto? Olá mlgoncalves, consegui sim. Acabei não detalhando aqui mas precisei fazer uma mudança na lógica da Unit, e para ela valer acabei tendo que criar o arquivo da Unit em outra pasta sem ser a do SVN, pois minhas mudanças eram ignoradas quando eu fazia direto no arquivo da pasta do SVN. (Mesmo sem dar o Update, que acaba alterando o arquivo) Após criar o arquivo nessa outra pasta, importei para o meu projeto e esse arquivo começou a valer no lugar do original, que era exatamente o que eu precisava. (Pois esse meu arquivo estava com a correção) Vou deixar aqui o arquivo novo já com as mudanças que resolveram o meu problema. Após atualizar o cliente me deu o feedback que tudo voltou a funcionar corretamente no momento de processar o retorno. As minhas alterações estão marcadas com o comentário "//Velosys". Nas linhas: > linha 689: Adicionada verificação se o SegmentoJ existe antes de tentar incluir informações nele, pois quando não tinha Segmento J no arquivo ainda assim a função tentava incluir informações nele e causava "Access Violation". > linha 286: Por conta do Número da Conta do Favorecido em alguns dos meus casos estourar o máximo aceito pelo Int, precisei alterar para Int64. > linha 298: Mesma situação da linha 286. Espero que isso consiga te ajudar. Fico a disposição. ACBrPagForLerTxt.pas Link to comment Share on other sites More sharing options...
mlgoncalves Posted January 21 Share Posted January 21 Fernando, obrigado pelo retorno. Analisei a unit, que por sinal está bem sinalizada com as suas intervenções, mas ainda a leitura do arquivo TXT retornado do banco está incompleta. Não consigo ler o segmento opcional Z do segmento O. Você pode tentar fazer a leitura do arquivo e verificar se o segmento opcional Z foi lido? Vou enviar o arquivo em anexo. segmento o.rar Link to comment Share on other sites More sharing options...
Making Software Fernando Posted January 24 Author Share Posted January 24 (edited) Em 21/01/2022 at 15:29, mlgoncalves disse: Fernando, obrigado pelo retorno. Analisei a unit, que por sinal está bem sinalizada com as suas intervenções, mas ainda a leitura do arquivo TXT retornado do banco está incompleta. Não consigo ler o segmento opcional Z do segmento O. Você pode tentar fazer a leitura do arquivo e verificar se o segmento opcional Z foi lido? Vou enviar o arquivo em anexo. segmento o.rar 695 B · 1 download Boa tarde, disponha Analisando aqui realmente a Unit não está reconhecendo o Segmento O para o seu caso. No segundo procedimento onde é inserido o próprio Segmento O acaba não ocorrendo esse processo pois a função atualmente aceita apenas o Segmento O no Banco Itaú. (E no seu caso o retorno é do Banco do Brasil) procedure TPagForR.LerSegmentoO(I: Integer); begin if ((Copy(FArquivoTXT.Strings[i], 8, 1) + Copy(FArquivoTXT.Strings[i], 14, 1)) <> '3O') then Exit; FPagFor.Lote.Last.SegmentoO.New; FPagFor.Lote.Last.SegmentoO.Last.CodMovimento := TInstrucaoMovimento(StrToInt(Copy(FArquivoTXT.Strings[i], 15, 3))); case FPagFor.Geral.Banco of pagItau: begin FPagFor.Lote.Last.SegmentoO.Last.CodigoBarras := Copy(FArquivoTXT.Strings[i], 18, 48); FPagFor.Lote.Last.SegmentoO.Last.NomeConcessionaria := Copy(FArquivoTXT.Strings[i], 66, 30); FPagFor.Lote.Last.SegmentoO.Last.DataVencimento := StringToDateTime(Copy(FArquivoTXT.Strings[i], 96, 2)+'/'+Copy(FArquivoTXT.Strings[i], 98, 2)+'/'+Copy(FArquivoTXT.Strings[i], 100, 4)); FPagFor.Lote.Last.SegmentoO.Last.QuantidadeMoeda := StrToInt(Copy(FArquivoTXT.Strings[i], 107, 15)) / 100000000; FPagFor.Lote.Last.SegmentoO.Last.ValorPagamento := StrToInt(Copy(FArquivoTXT.Strings[i], 122, 15)) / 100; FPagFor.Lote.Last.SegmentoO.Last.DataPagamento := StringToDateTime(Copy(FArquivoTXT.Strings[i], 137, 2)+'/'+Copy(FArquivoTXT.Strings[i], 139, 2)+'/'+Copy(FArquivoTXT.Strings[i], 141, 4)); FPagFor.Lote.Last.SegmentoO.Last.ValorPago := StrToInt(Copy(FArquivoTXT.Strings[i], 145, 15))/100; FPagFor.Lote.Last.SegmentoO.Last.NotaFiscal := StrToInt(Copy(FArquivoTXT.Strings[i], 163, 9)); FPagFor.Lote.Last.SegmentoO.Last.SeuNumero := Copy(FArquivoTXT.Strings[i], 175, 20); FPagFor.Lote.Last.SegmentoO.Last.NossoNumero := Copy(FArquivoTXT.Strings[i], 216, 15); FPagFor.Lote.Last.SegmentoO.Last.CodOcorrencia := Trim(Copy(FArquivoTXT.Strings[i], 231, 10)); FPagFor.Lote.Last.SegmentoO.Last.DescOcorrencia := DescricaoRetornoItau(FPagFor.Lote.Last.SegmentoO.Last.CodOcorrencia); end; end; {opcionais segmento O} LerSegmentoZ(FPagFor.Lote.Last.SegmentoO.Last.SegmentoZ, i); end; Isso é um dos pontos, o segundo é o fato de no começo dessa função ter uma condição verificando se a linha lida contém o "3O" ao concatenar a posição 8 e 14, e essa condição acaba sendo FALSA nas linhas opcionais (Segmento Z), pois ao concatenar acaba sendo "3Z". Deveria nessa condição também ter uma verificação para checar se está sendo lido algum Segmento Opcional do Segmento O, como é o caso do Z. Com tudo isso, cheguei na conclusão de que referente ao Segmento O ainda não está completo quanto ao processamento de Retorno, sendo necessária algumas atualizações. Por ser uma solução recente é comum não estar completo, e conforme o uso da comunidade vamos acertando os detalhes. Estou confirmando se não deixei nada passar, mas acredito que seja isso mesmo conforme o que analisei da Unit ACBrPagForLerTxt. Edited January 24 by Making Software Fernando Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now