Ir para conteúdo
  • Cadastre-se

dev botao

Mudanças no retorno dos métodos do novo componente de NFS-e: ACBrNFSeX


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

Recommended Posts

  • Consultores

Olá pessoal,

Fizemos uma alteração no retorno dos métodos e com isso vai ocorrer uma quebra de código.

A motivação dessa alteração foi simplificar a codificação do lado do desenvolvedor e evitar o vazamento de memória, como foi detectado por alguns.

Desculpa pelo transtorno mas estamos trabalhando para tornar o novo componente cada vez melhor.

 

Para exemplificar essas mudanças vou apresentar aqui o antes e o depois referente ao método ConsultarSituacao.

Antes da alteração: Era necessário definir uma variável (Response por exemplo) para receber o retorno dos métodos, uma vez que eles eram uma função.

procedure TfrmACBrNFSe.btnConsultarSitLoteClick(Sender: TObject);
var
  Protocolo, Lote: String;
  Response: TNFSeConsultaSituacaoResponse;
begin
  Protocolo := '';
  if not (InputQuery('Consultar Lote', 'Número do Protocolo (Obrigatório):', Protocolo)) then
    exit;

  Lote := '';
  if ACBrNFSeX1.Configuracoes.Geral.Provedor in [proAssessorPublico,
      proEquiplano, proSP] then
  begin
    if not (InputQuery('Consultar Lote', 'Número do Lote:', Lote)) then
      exit;
  end;

  Response := ACBrNFSeX1.ConsultarSituacao(Protocolo, Lote); // <== antes era uma função

  ChecarResposta(Response);
end;

Depois da alteração: Como os métodos agora são procedure não é mais necessário definir uma variável para ler os retornos.

procedure TfrmACBrNFSe.btnConsultarSitLoteClick(Sender: TObject);
var
  Protocolo, Lote: String;
begin
  Protocolo := '';
  if not (InputQuery('Consultar Lote', 'Número do Protocolo (Obrigatório):', Protocolo)) then
    exit;

  Lote := '';
  if ACBrNFSeX1.Configuracoes.Geral.Provedor in [proAssessorPublico,
      proEquiplano, proSP] then
  begin
    if not (InputQuery('Consultar Lote', 'Número do Lote:', Lote)) then
      exit;
  end;

  ACBrNFSeX1.ConsultarSituacao(Protocolo, Lote); // <== agora é uma procedure

  ChecarResposta(tmConsultarSituacao);
end;

Outra coisa que mudou foi a procedure ChecarResposta que antes recebia a variável (Response por exemplo) e agora recebe como parâmetro um enumerador que é o tipo do método que foi executado, que no exemplo acima temos o tmConsultarSituacao.

 

Abaixo temos um fragmento do código da procedure ChecarResposta.

Antes da alteração:

procedure TfrmACBrNFSe.ChecarResposta(const Response: TNFSeWebserviceResponse);
var
  i: Integer;
begin
  memoLog.Clear;
  
  (...)
  if Response is TNFSeConsultaSituacaoResponse then
  begin
    memoLog.Lines.Add('Modo de Envio : ' + MetodoToStr(tmConsultarSituacao));
    memoLog.Lines.Add('Numero do Lote: ' + TNFSeConsultaSituacaoResponse(Response).Lote);
    memoLog.Lines.Add('Numero do Prot: ' + TNFSeConsultaSituacaoResponse(Response).Protocolo);
    memoLog.Lines.Add('Situação Lote : ' + TNFSeConsultaSituacaoResponse(Response).Situacao);
    memoLog.Lines.Add('Sucesso       : ' + BoolToStr(Response.Sucesso, True));
  end;
  
  (...)

  if Response.Erros.Count > 0 then
  begin
    memoLog.Lines.Add(' ');
    memoLog.Lines.Add('Erro(s):');
    for i := 0 to Response.Erros.Count -1 do
    begin
      memoLog.Lines.Add('Código  : ' + Response.Erros[i].Codigo);
      memoLog.Lines.Add('Mensagem: ' + Response.Erros[i].Descricao);
      memoLog.Lines.Add('Correção: ' + Response.Erros[i].Correcao);
      memoLog.Lines.Add('---------');
    end;
  end;

  if Response.Alertas.Count > 0 then
  begin
    memoLog.Lines.Add(' ');
    memoLog.Lines.Add('Alerta(s):');
    for i := 0 to Response.Alertas.Count -1 do
    begin
      memoLog.Lines.Add('Código  : ' + Response.Alertas[i].Codigo);
      memoLog.Lines.Add('Mensagem: ' + Response.Alertas[i].Descricao);
      memoLog.Lines.Add('Correção: ' + Response.Alertas[i].Correcao);
      memoLog.Lines.Add('---------');
    end;
  end;

  (...)

  pgRespostas.ActivePageIndex := 2;
end;

Depois da alteração:

procedure TfrmACBrNFSe.ChecarResposta(aMetodo: TMetodo);
var
  i: Integer;
begin
  memoLog.Clear;
  memoLog.Lines.Clear;
  
  with ACBrNFSeX1.WebService do
  begin
    case aMetodo of
      (...)

      tmConsultarSituacao:
        begin
          with ConsultaSituacao do
          begin
            memoLog.Lines.Add('Modo de Envio : ' + MetodoToStr(tmConsultarSituacao));
            memoLog.Lines.Add('Numero do Lote: ' + Lote);
            memoLog.Lines.Add('Numero do Prot: ' + Protocolo);
            memoLog.Lines.Add('Situação Lote : ' + Situacao);
            memoLog.Lines.Add('Sucesso       : ' + BoolToStr(Sucesso, True));
            memoLog.Lines.Add(' ');

            MemoResp.Lines.Text := XmlEnvio;
            memoRespWS.Lines.Text := XmlRetorno;
            LoadXML(XmlEnvio, WBResposta);

            if Erros.Count > 0 then
            begin
              memoLog.Lines.Add(' ');
              memoLog.Lines.Add('Erro(s):');
              for i := 0 to Erros.Count -1 do
              begin
                memoLog.Lines.Add('Código  : ' + Erros[i].Codigo);
                memoLog.Lines.Add('Mensagem: ' + Erros[i].Descricao);
                memoLog.Lines.Add('Correção: ' + Erros[i].Correcao);
                memoLog.Lines.Add('---------');
              end;
            end;

            if Alertas.Count > 0 then
            begin
              memoLog.Lines.Add(' ');
              memoLog.Lines.Add('Alerta(s):');
              for i := 0 to Alertas.Count -1 do
              begin
                memoLog.Lines.Add('Código  : ' + Alertas[i].Codigo);
                memoLog.Lines.Add('Mensagem: ' + Alertas[i].Descricao);
                memoLog.Lines.Add('Correção: ' + Alertas[i].Correcao);
                memoLog.Lines.Add('---------');
              end;
            end;
          end;
        end;

    end;

  end;

  (...)

  pgRespostas.ActivePageIndex := 2;
end;

 

Resumindo:

Os métodos: Emitir, Consultar (em geral), Cancelar e Substituir agora são procedures.

O componente tem agora uma classe chamada WebService e dentro dela uma classe para cada método e é nessas classes dos métodos que temos os campos que contem os retornos como por exemplo o numero do protocolo, a situação do lote, etc.

No programa exemplo temos a procedure ChecarResposta com a leitura de todos os parâmetros de todos os métodos.

  • Curtir 1
  • Obrigado 2
Consultor SAC ACBr

Italo Giurizzato Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

Analista de Sistemas / e-mail: [email protected] / Fone: (16) 9-9701-5030 / Araraquara-SP

Araraquara - A era dos Trólebus

Link para o comentário
Compartilhar em outros sites

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