Ir para conteúdo
  • Cadastre-se

dev botao

Erro ao enviar um evento NFe utilizando o Comando NFE.XMLEnviarEvento("arquivoEvento.xml")


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

Recommended Posts

  • Membros Pro

Quando utilizo o método NFE.XMLEnviarEvento() por arquivo TXT (Entrada/Saida) passando o xml ou o arquivo por parâmetro o MonitorACBR me retorna o erro "Erro ao abrir o arquivo + {nomearquivo}"; 

Verificando o código do ACBR a seguinte função é invocada:

tDFeEventoNFe :
      begin
        if FilesExists(XMLorFile) then
        begin
          if not ACBrNFe1.EventoNFe.LerXML(XMLorFile) then
            raise Exception.Create('Erro ao abrir o arquivo '+ XMLorFile)
          else
            PathDfe := XMLorFile;
        end
        else
          raise Exception.Create('Arquivo '+ XMLorFile +' não encontrado.');
      end;

Pelo que percebi o erro ocorre porque no método LerXML sempre o retorno será "False". Somente consegui enviar um evento de cancelamento quando no xml também informei o elemento de retorno do evento "retEnvEvento"; Isso ocorre pois como demostrado abaixo o Result só recebe atribuição caso existir o elemento retEnvEvento.

function TRetEventoNFe.LerXml: Boolean;
var
  ok: Boolean;
  i, j: Integer;
begin
  Result := False;
  i:=0;
  try
    if (Leitor.rExtrai(1, 'evento') <> '') then
    begin
      if Leitor.rExtrai(2, 'infEvento', '', i + 1) <> '' then
      begin
        infEvento.ID           := Leitor.rAtributo('Id');
        InfEvento.cOrgao       := Leitor.rCampo(tcInt, 'cOrgao');
        infEvento.tpAmb        := StrToTpAmb(ok, Leitor.rCampo(tcStr, 'tpAmb'));
        infEvento.CNPJ         := Leitor.rCampo(tcStr, 'CNPJ');
        infEvento.chNFe        := Leitor.rCampo(tcStr, 'chNFe');
        infEvento.dhEvento     := Leitor.rCampo(tcDatHor, 'dhEvento');
        infEvento.tpEvento     := StrToTpEvento(ok,Leitor.rCampo(tcStr, 'tpEvento'));
        infEvento.nSeqEvento   := Leitor.rCampo(tcInt, 'nSeqEvento');
        infEvento.VersaoEvento := Leitor.rCampo(tcDe2, 'verEvento');

        if Leitor.rExtrai(3, 'detEvento', '', i + 1) <> '' then
        begin
          infEvento.DetEvento.xCorrecao := Leitor.rCampo(tcStr, 'xCorrecao');
          infEvento.DetEvento.xCondUso  := Leitor.rCampo(tcStr, 'xCondUso');
          infEvento.DetEvento.nProt     := Leitor.rCampo(tcStr, 'nProt');
          infEvento.DetEvento.xJust     := Leitor.rCampo(tcStr, 'xJust');

          InfEvento.detEvento.cOrgaoAutor := Leitor.rCampo(tcInt, 'cOrgaoAutor');
          infEvento.detEvento.tpAutor     := StrToTipoAutor(ok, Leitor.rCampo(tcStr, 'tpAutor'));
          infEvento.detEvento.verAplic    := Leitor.rCampo(tcStr, 'verAplic');
          infEvento.detEvento.dhEmi       := Leitor.rCampo(tcDatHor, 'dhEmi');
          infEvento.detEvento.tpNF        := StrToTpNF(ok, Leitor.rCampo(tcStr, 'tpNF'));
          infEvento.detEvento.IE          := Leitor.rCampo(tcStr, 'IE');

//           infEvento.detEvento.vNF         := Leitor.rCampo(tcDe2, 'vNF');
//           infEvento.detEvento.vICMS       := Leitor.rCampo(tcDe2, 'vICMS');
//           infEvento.detEvento.vST         := Leitor.rCampo(tcDe2, 'vST');

          if Leitor.rExtrai(4, 'dest', '', i + 1) <> '' then
          begin
            infEvento.detEvento.dest.UF            := Leitor.rCampo(tcStr, 'UF');
            infEvento.detEvento.dest.CNPJCPF       := Leitor.rCampoCNPJCPF;
            infEvento.detEvento.dest.idEstrangeiro := Leitor.rCampo(tcStr, 'idEstrangeiro');
            infEvento.detEvento.dest.IE            := Leitor.rCampo(tcStr, 'IE');

            // Alterado em 22/07/2014 por Italo
            // para ficar em conformidade com o Schema
            infEvento.detEvento.vNF   := Leitor.rCampo(tcDe2, 'vNF');
            infEvento.detEvento.vICMS := Leitor.rCampo(tcDe2, 'vICMS');
            infEvento.detEvento.vST   := Leitor.rCampo(tcDe2, 'vST');
          end;
        end;
      end;

      if Leitor.rExtrai(2, 'Signature', '', i + 1) <> '' then
      begin
        signature.URI             := Leitor.rAtributo('Reference URI=');
        signature.DigestValue     := Leitor.rCampo(tcStr, 'DigestValue');
        signature.SignatureValue  := Leitor.rCampo(tcStr, 'SignatureValue');
        signature.X509Certificate := Leitor.rCampo(tcStr, 'X509Certificate');
      end;
    end;

    if (Leitor.rExtrai(1, 'retEnvEvento') <> '') or
       (Leitor.rExtrai(1, 'retEvento') <> '') then
    begin
               Fversao   := Leitor.rAtributo('versao');
      (*HR03 *)FidLote   := Leitor.rCampo(tcInt, 'idLote');
      (*HR04 *)FtpAmb    := StrToTpAmb(ok, Leitor.rCampo(tcStr, 'tpAmb'));
      (*HR05 *)FverAplic := Leitor.rCampo(tcStr, 'verAplic');
      (*HR06 *)FcOrgao   := Leitor.rCampo(tcInt, 'cOrgao');
      (*HR07 *)FcStat    := Leitor.rCampo(tcInt, 'cStat');
      (*HR08 *)FxMotivo  := Leitor.rCampo(tcStr, 'xMotivo');
      i := 0;
      while Leitor.rExtrai(2, 'infEvento', '', i + 1) <> '' do
       begin
         FretEvento.Add;

         // Incluido por Italo em 07/05/2014
         FretEvento.Items[i].FRetInfEvento.XML := Leitor.Grupo;

//         (*HR10 *)FretEvento.versao               := Leitor.rCampo(tcStr, 'versao');
         (*HR12 *)FretEvento.Items[i].FRetInfEvento.Id         := Leitor.rAtributo('Id');
         (*HR13 *)FretEvento.Items[i].FRetInfEvento.tpAmb      := StrToTpAmb(ok, Leitor.rCampo(tcStr, 'tpAmb'));
         (*HR14 *)FretEvento.Items[i].FRetInfEvento.verAplic   := Leitor.rCampo(tcStr, 'verAplic');
         (*HR15 *)FretEvento.Items[i].FRetInfEvento.cOrgao     := Leitor.rCampo(tcInt, 'cOrgao');
         (*HR16 *)FretEvento.Items[i].FRetInfEvento.cStat      := Leitor.rCampo(tcInt, 'cStat');
         (*HR17 *)FretEvento.Items[i].FRetInfEvento.xMotivo    := Leitor.rCampo(tcStr, 'xMotivo');
         (*HR18 *)FretEvento.Items[i].FRetInfEvento.chNFe      := Leitor.rCampo(tcStr, 'chNFe');
         (*HR19 *)FretEvento.Items[i].FRetInfEvento.tpEvento   := StrToTpEvento(ok,Leitor.rCampo(tcStr, 'tpEvento'));
         (*HR20 *)FretEvento.Items[i].FRetInfEvento.xEvento    := Leitor.rCampo(tcStr, 'xEvento');
         (*HR21 *)FretEvento.Items[i].FRetInfEvento.nSeqEvento := Leitor.rCampo(tcInt, 'nSeqEvento');
         (*HR22 *)FretEvento.Items[i].FRetInfEvento.CNPJDest   := Leitor.rCampo(tcStr, 'CNPJDest');
         if FretEvento.Items[i].FRetInfEvento.CNPJDest = '' then
           (*HR23 *)FretEvento.Items[i].FRetInfEvento.CNPJDest  := Leitor.rCampo(tcStr, 'CPFDest');
         (*HR24 *)FretEvento.Items[i].FRetInfEvento.emailDest   := Leitor.rCampo(tcStr, 'emailDest');
                  FretEvento.Items[i].FRetInfEvento.cOrgaoAutor := Leitor.rCampo(tcInt, 'cOrgaoAutor');
         (*HR25 *)FretEvento.Items[i].FRetInfEvento.dhRegEvento := Leitor.rCampo(tcDatHor, 'dhRegEvento');
         (*HR26 *)FretEvento.Items[i].FRetInfEvento.nProt       := Leitor.rCampo(tcStr, 'nProt');
//                  FretEvento.Items[i].FRetInfEvento.chNFePend   := Leitor.rCampo(tcStr, 'chNFePend');

         j := 0;
         while  Leitor.rExtrai(3, 'chNFePend', '', j + 1) <> '' do
          begin
            FretEvento.Items[i].FRetInfEvento.chNFePend.Add;

            FretEvento.Items[i].FRetInfEvento.chNFePend[j].ChavePend := Leitor.rCampo(tcStr, 'chNFePend');

            inc(j);
          end;

         inc(i);
       end;
      Result := True;
    end;
  except
    result := False;
  end;
end; 

 

Está correto o método só possuir retorno "True" quando o xml possuir o elemento de retorno do evento? Creio que o "Result" deveria ficar antes do tratamento da exceção, conforme segue:

...

            inc(j);
          end;

         inc(i);
       end;
    end;
    Result := True;
  except
    result := False;
  end;

...

 

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

 

Utilizei o validador da SEFAZ https://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx  para o ArquivoQueGerouErroNoACBR.xml  e validou o schema corretamente.

Já o ArquivoProcessado.xml consta o elemento <retEnvEvento></retEnvEvento> e que só assim foi processado pelo ACBR conforme mencionei acima.

 

Link para o comentário
Compartilhar em outros sites

  • Moderadores

A tag retEnvEvento, se refere a Leitura do XML de retorno, quando ocorre o envio. Experimente utilizar o método NFe.EnviarEvento(). 

Outro problema é que o XML em anexo ArquivoQueGerouErroNoACBR está formado... com espaços....

Passe um arquivo .INI com as informações, conforme manual: https://acbr.sourceforge.io/ACBrMonitor/NFEEnviarEvento.html assim pode ver o padrão do XML gerado pelo ACBrMonitor.

Consultor SAC ACBr

José Junior
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link para o comentário
Compartilhar em outros sites

  • Membros Pro

Sim José! É esse o problema! Porque para ter um retorno TRUE da função LerXML se precisa colocar um elemento "retEnvEvento" no XML de envio do evento? Conforme coloquei escopo desta postagem eu utilizei o método  NFe.EnviarEvento() passando o caminho do XML. A questão é que o método de leitura de XML que é utilizando para a LEITURA do XML de envio e retorno não esta retornando TRUE quando o XML de envio de evento é lido ocasionando o erro "Erro ao abrir o arquivo"; 

Link para o comentário
Compartilhar em outros sites

  • Consultores
  • Solution

Bom dia,

Realmente esta faltando um Result := True dentro do IF que faz a leitura do XML do envio do evento.

Já fiz a correção e vou enviar para o repositório.

Por favor aguarde a nova compilação do Monitor.

Ficamos no aguardo de um retorno.

  • Curtir 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

  • 2 semanas depois ...
×
×
  • 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.