Ir para conteúdo
  • Cadastre-se

dev botao

ACBrPagFor - Retorno (Problema com LerSegmentoJ)


Ver Solução Respondido por Making Software Fernando,
  • Este tópico foi criado há 658 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

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.

image.png.2208c6cc7feae57d425cf5b7738f370c.png

 

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 para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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.

Editado por Making Software Fernando
Link para o comentário
Compartilhar em outros sites

  • 5 meses depois ...
  • Este tópico foi criado há 658 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...