Ir para conteúdo
  • Cadastre-se

dev botao

Enviar Lote GNRE, gera exceção no retorno para Status de conclusão


  • Este tópico foi criado há 2613 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Bom dia, venho aqui para tirar dúvidas sobre como manipular os dados ao Enviar o XML do Lote GNRE.

Da maneira que eu faço hoje, no meu ponto de vista, está gerando exceções onde deveriam ser apenas mensagens.

Vou mostrar usando o código do Exemplo:

  ACBrGNRE1.Guias.Clear;
  GerarGNRE;
  ACBrGNRE1.Enviar;

  MemoResp.Lines.Text   := UTF8Encode(ACBrGNRE1.WebServices.Retorno.RetWS);
  memoRespWS.Lines.Text := UTF8Encode(ACBrGNRE1.WebServices.Retorno.RetWS);
  LoadXML(MemoResp, WBResposta);

O método Enviar (unit ACBrGNRE2):

function TACBrGNRE.Enviar(Imprimir: Boolean): Boolean;
var
  i: Integer;
begin
  Guias.GerarGNRE;
  
  if Guias.Count <= 0 then
    GerarException(ACBrStr('ERRO: Nenhuma GNRE adicionada ao Lote'));

  if Guias.Count > 50 then
    GerarException(ACBrStr('ERRO: Conjunto de GNRE transmitidas (máximo de 50 GNRE)' +
      ' excedido. Quantidade atual: ' + IntToStr(Guias.Count)));

  Result := WebServices.Envia;

  if FGNREGuia <> nil then
  begin
    for i := 0 to Guias.Count - 1 do
    begin
      if Guias.Items[i].Confirmada and Imprimir then
        Guias.Items[i].Imprimir;
    end;
  end;

end;

Até então está tudo perfeito, o problema começa aqui:
Método WebServices.Envia (unit ACBrGNREWebServices);

function TWebServices.Envia: Boolean;
begin
  if not FEnviar.Executar then
    FEnviar.GerarException( FEnviar.Msg );

  FRetorno.numeroRecibo := FEnviar.numero;
  if not FRetorno.Executar then
    FRetorno.GerarException( FRetorno.Msg );

  Result := True;
end;

if not FRetorno.Executar then
  FRetorno.GerarException( FRetorno.Msg );

Acredito que deveria gerar exceção se realmente ocorressem erros...

FRetorno.Executar (unit ACBrGNREWebServices):

function TGNRERetRecepcao.Executar: Boolean;
var
  IntervaloTentativas, Tentativas: Integer;
begin
  Result := False;

  TACBrGNRE(FPDFeOwner).SetStatus(stGNRERetRecepcao);
  try
    Sleep(FPConfiguracoesGNRE.WebServices.AguardarConsultaRet);

    Tentativas := 0;
    IntervaloTentativas := max(FPConfiguracoesGNRE.WebServices.IntervaloTentativas, 1000);

    while (inherited Executar) and
      (Tentativas < FPConfiguracoesGNRE.WebServices.Tentativas) do
    begin
      Inc(Tentativas);
      sleep(IntervaloTentativas);
    end;
  finally
    TACBrGNRE(FPDFeOwner).SetStatus(stGNREIdle);
  end;

  if FGNRERetorno.codigo = 402 then  // Lote processado ?
    Result := TratarRespostaFinal;
end;

Ele gera exceção sempre que o código for diferente de 402, mas temos que lembrar que essa função é responsável por enviar o Lote, e já consulta o mesmo.
Caso dê erros no envio creio que deveria ser gerado exceções (como ele já faz), mas na consulta do retorno apenas se existir realmente um erro, como no caso do código de retorno 404, pois seria necessário corrigir e enviar o lote novamente nesse caso.

Exemplo:
 


  if FGNRERetorno.codigo <> 404 then  // Sem erros no lote?
    Result := TratarRespostaFinal;

 

Caso for eu quem esteja fazendo errado, peço que me mostrem como fazer, muito obrigado.

 

 

Segue em anexo os status e mensagens retornadas na consulta.

 

QUADRO IV - SITUACOES DE PROCESSAMENTO DO LOTE.png

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois ...
  • Este tópico foi criado há 2613 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.