No exemplo abaixo usamos o TXMLDocument do Delphi para ler os dados do XML retorno de retorno de envio do lote das NF-e:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var vXMLDoc: TXMLDocument;
    NodeRec: IXMLNode;
    recibo, datahora: WideString;
begin
  vXMLDoc := TXMLDocument.Create(self);
  vXMLDoc.LoadFromFile('0000000000234-rec.xml'); //Le Arquivo Recibo XML');
 
  // Campo memo para o exemplo
  Memo.lines.Add( '-------------------------------------------------');
  Memo.lines.Add( VXMLDoc.XML.Text +#13+#13 );
 
  // Prepara para ler os dados da tag "infRec"
  NodeRec := vXMLDoc.DocumentElement.ChildNodes.FindNode('infRec');
  // Lendo os campos da tag infRec
  recibo := NodeRec.ChildNodes['nRec'].text;     // posso ler assim
  datahora := NodeRec.ChildNodes['dhRecbto'].text;
 
  // adiciona os dados no Memo (apenas exemplo)
  if recibo <> '' then
      begin
      Memo.Lines.Add('-----------------------------------------------');
      Memo.Lines.Add( recibo+' ---- '+datahora );
      end;
 
end;

Posts Relacionados

Tags: , ,



24 Comentários

  • At 2008.12.05 09:25, Edson said:

    Nao consigo ler o campo xMotivo, como faco?

    • At 2008.12.05 10:19, Caio said:

      Olá Edson,

      Acrescente o código abaixo antes da linha 13:

      motivo := vXMLDoc.DocumentElement.ChildNodes['xMotivo'].text;
      • At 2008.12.10 14:48, Alaercio said:

        Caio, tudo bom, e como faria para ler o campo cStat do retorno do cancelamento, tentei utilizar este mesmo exemplo, pro recibo funcionou, mas para o retorno de cancelamento não, acredito que porque nao tenho um Node separado como no recibo, fiz várias tentativas mas não consegui

        • At 2008.12.10 17:29, Rafael Soares said:

          Boa noite,
          Tenho ler o xml do retorno da consulta de status do serviço e ele dispara uma execeção acusando falha no XML (An invalid character was found in text content).
          Abaixo o XML:

          2SP_NFE_PL_005b107Serviço em Operação352008-12-10T19:00:400

          • At 2008.12.11 11:52, Caio said:

            Olá Rafael e Alaercio,

            Publiquei mais um exemplo hoje que deve lhes ajudar a resolver essa questão. Dá uma olhada nesse link:
            http://www.caiooliveira.com.br/?p=151

            • At 2008.12.11 13:36, Alaercio said:

              Valeu, agora consegui, funcionou perfeitamente, vou tentar pegar agora o retorno de lotes, qdo vem retorno de varias NFe, umas aprovadas o outras não, vamos ver se consigo, obrigado Caio, tens nos ajudado muito, que Deus ilumine vc e vossa família

              grande abraço

              • At 2009.01.28 11:46, Fábio Oliveira said:

                Caio, bom dia!
                Estou precisando do exemplo do envio da solicitação de Consulta Recibo da NFE. Você pode me ajudar?

                Desde já agradeço,

                []
                Fábio.
                Manaus-Am.

                • At 2009.01.29 10:34, admin said:

                  Olá Fabio,

                  Usando a NFe_util.dll segue o exemplo abaixo:

                  var Util:NFe_Util_Interface;
                      i : integer;
                      NumeroLote, siglaUF, tpamb, nomercertificado,
                      cabmsg, dadosMsg, retWS, msg, proxy,
                      usuario, senha: string; 
                      arquivoXML: string;
                  begin
                    siglaUF = 'MT'; // sigla UF
                    tpamb = '2'; // 1-Producao e 2-Homologação
                    nomeCertificado = 'xxx'; // Nome do Certificado da Empresa que envia a NF-e (veja exemplos aqui no blog)
                    cabMsg = ''; // Passe em branco (embutido na funcao)
                    dadosMSg = ''; // Passe em branco (embutido na funcao)
                    retWS = ''; // Passe em branco (dados XML retorno da consulta com protocolo caso autorizada)
                    msg = ''; // Passe em branco (retorna mensagem texto retorno);
                    NumeroLote = 'xxx'; //Informe aqui o numero do lote de envio (controlado pela aplicação).
                    Proxy = 'xxx'; // informe o servidor proxy da sua rede (se houver)
                    usuario = ''; // nao informar
                    senha = ''; // nao informar
                   
                    try  
                    i:= Util.BuscaLote(siglaUF, tpamb, nomeCertificado, cabMsg, 
                         DadosMsg, retWS, msg, NumeroLote, proxy,  usuario, senha);
                   
                    // coloque o retorno num MEMO, por exemplo, e salve em disco
                    Memo1.lines.text := retWS;
                    Memo1.Lines.SaveToFile('retconsReciNFe.xml');
                   
                    // vc pode usar o valor de msg para mostrar o 
                    // resultado na tela diretamente.
                    Application.MessageBox( msg, 'Aviso');
                   
                    // Pode (e deve) anotar no seu registro do banco
                    // de dados o STATUS da NF-e.
                    // anotaconsultaregistroNFe;
                   
                    except
                        // tratamento exceção
                    end;
                   
                   
                  end;

                  sds,

                  • At 2009.02.13 09:08, Alencar said:

                    Bom dia Caio;

                    No caso de enviar um lode de NFe, estou tentando pegar, do retorno do sefaz, o ide de cada nota e se foi aprovada ou não, caso tenha sido aprovada largo em uma list box e se não largo em outra.

                    Desde ja muito obrigado

                    Att

                    • At 2009.02.13 09:38, admin said:

                      Olá Alencar,

                      Veja o post abaixo:

                      http://www.caiooliveira.com.br/?p=151

                      Sds

                      • At 2009.02.17 08:06, Berdam said:

                        Olá caio, estou com alguns problemas no cancelamento da nota, ela é enviada normalmente, porém não consigo pegar o nrrecibo no retorno dos dados da mesma. Pelo que li em manuais e outros afins, quando envio a nfe, devo receber o nrrecibo, e posteriormente com esse nrrecibo pego o nrprotocolo para poder cancelar.

                        Estou usando a Nfeutil e segue abaio meu código.

                        i := Util.EnviaNFeSCAN(WebService,xmlDoc, nroRecibo, nomeCertificado, cabMsg, DadosMsg, RetWS, msgErro,xmlassinado,”,”,”,stLicenca);
                        if i 103 then
                        begin
                        MessageDlg(‘Falha na chamada do WebService…’+#13+#13+msgErro, mtError, [mbOk], 0);
                        Abort;
                        end
                        else
                        begin
                        try
                        AssignFile(Fsaida,stDiretorioExe+stDiretorioNFEsEnviadas+’\'+stChavedeAcesso+’nfe.xml’);
                        Rewrite(Fsaida);
                        Write(Fsaida, xmlDoc); //grava arquivo sem assinatura
                        CloseFile(Fsaida);
                        DeleteFile(stDiretorioExe+stDiretorioNFEs+’\'+stChavedeAcesso+’nfe.xml’);
                        except
                        on E:Exception do
                        begin
                        MessageDlg(‘Nfe enviada, mas erro gravando XML na pasta NFEsEnviadas !!!. Causa : ‘+E.Message, mtWarning, [mbOk], 0);
                        Abort;
                        end;
                        end;

                        frmBrowseNotas.Caption := ‘Gravando no banco XmlAssinado :’+xmlassinado;
                        // Grava depois de enviado e validado
                        frmBrowseNotas.QNotas.Edit;
                        frmBrowseNotas.QNotasUSUARIO_ENVIO_NFE.AsString := FSinprod.Label2.Caption;
                        frmBrowseNotas.QNotasDATA_ENVIO_NFE.AsDateTime := Now;
                        frmBrowseNotas.QNotasNRRECIBO.AsString := nroRecibo;
                        frmBrowseNotas.QNotasNRNFE.AsString := stChavedeAcesso;
                        frmBrowseNotas.QNotasXMLASSINADO.AsString := xmlassinado;
                        frmBrowseNotas.QNotas.Post;
                        frmBrowseNotas.QNotas.ApplyUpdates;

                        MessageDlg(‘Nota Enviada ‘+frmBrowseNotas.QNotasNR_NOTA.AsString+’ Chave de acesso :’+stChavedeAcesso+’, Recibo : ‘+nroRecibo, mtInformation, [mbOk], 0);
                        end;
                        Util := nil;

                        • At 2009.02.17 14:00, Caio said:

                          Olá Berdam,

                          Repare que a variavel “retWS” contêm o XML do retorno do envio e, nesse texto estão contidos todos os dados do recibo do envio da NF-e.

                          Vc. pode usar o “TXMLDocument” para ler os dados ali contidos. Veja um exemplo de como fazer isso:

                            // seu codigo de envio da NFe aqui
                           
                            // EXEMPLO lendo os dados do recibo contidos em "retWS"
                            vXMLDoc := TXMLDocument.Create(self);
                            try
                            vXMLDoc.XML.Add( retWS );
                            VXMLDoc.Active := true;
                           
                            // ou para ler o arquivo do recibo da NFe
                            motivo := vXMLDoc.DocumentElement.ChildNodes['xMotivo'].text;
                            NodeRec2 := vXMLDoc.DocumentElement.ChildNodes.FindNode('infRec');
                            recibo := NodeRec2.ChildNodes['nRec'].text;     // posso ler assim
                            datahora := NodeRec2.ChildNodes['dhRecbto'].text;
                            if recibo <> '' then
                                begin
                                Memo.Lines.Add('-----------------------------------------------');
                                Memo.Lines.Add( recibo+' ---- '+datahora+' - '+motivo );
                                end;
                            finally
                               VCMLDoc.free;
                            end;
                           
                            // continua seu codigo para salvar na base de dados
                            // ...
                          • At 2009.02.18 07:20, Berdam said:

                            Olá Caio, mas não entendendo o seguinte, como estou usando a NFE_util.dll, o fabricante já disponibiliza um demo em delphi com código fonte.Eis o código

                            Util := CoUtil.Create;
                            nomeCertificado := trim(edNome.Text);
                            siglaWS := cbWS.Text;
                            retWS :=”;
                            cabMsg :=”;
                            msg :=”;
                            tpamb := cbAmbiente.ItemIndex + 1;
                            licenca:=edLicenca.Text;
                            Screen.Cursor := CrHourGlass;

                            i:= Util.EnviaNFeSCAN(siglaWS, NFe, nroRecibo, nomeCertificado, cabMsg, DadosMsg, retWS, msg, NFeAssinada, proxy, usuario, senha, licenca);

                            Screen.Cursor := CrDefault;
                            rtfNFeAssinada.Text := NFeAssinada;
                            rtfRetWs.Text := retWS;
                            edResultado.Text := msg;
                            GroupBox2.Visible := true;
                            GroupBox3.Visible := true;
                            GroupBox4.Visible := false;
                            btGravar.Enabled := true;
                            btGravar.SetFocus;
                            if i 103 then
                            MessageDlg( ‘Falha na chamada do WS…’+#13+#13+msg, mtError, [mbOk], 0)
                            else
                            begin
                            btBuscaNFe.Enabled := true;
                            btGravar.enabled := true;
                            btGravarNFe.enabled := true;
                            btGravaProcNFe.enabled := false;
                            edRecibo.Text := nroRecibo;
                            end;

                            Util := nil;

                            Repare que na terceira linha de baixo para cima, existe a variável nroRecibo, pelo que puder perceber rodando os exemplos que o desenvolvedor envia, não é necessário realizar este código acima que vc utilizou.

                            Vc teria alguma explicação para isso??

                            Muito obrigado pela ajuda.

                            • At 2009.02.18 10:32, admin said:

                              Olá Berdam,

                              De fato, a variável “nroRecibo” deveria conter a informação, mas, pareçe que não está funcionando. Eu não usei as funções “SCAN” ainda, por isso não posso lhe detalhar. Primeiro, verifique o retorno da variável “retWS” (se o conteúdo do recibo está ali) daí o problema está constatado, então, vc. pode entrar em contato com o suporte da NFe_util.dll (eles atendem muito bem todos os pedidos) ou pegar os dados do recibo como lhe mostrei.

                              Sds,

                              • At 2009.04.08 17:12, fernando fernandes said:

                                Caio,

                                o erro está ocorrendo agora na hora do cancelamento da NFe.
                                O erro quando eu envio e busco o retorno é aleatorio. Mas não consigo cancelar NFe.

                                Grato pela atenção…Qualquer novidade me fala.

                                fernando

                                • At 2009.05.04 07:43, pedro said:

                                  Como posso saber a causa da rejeição da nota??
                                  O demo da nfeutil.dll não informa nenhum erro, mas quando acesso o site do sefaz do RS, as notas estão todas rejeitadas.

                                  • At 2009.05.05 12:06, admin said:

                                    Olá Pedro,

                                    Se a nota está sendo enviada e vc tem o recibo, significa que não houve falha no schema (basicamente). Porém, se, ao consultar a NFe vc recebe informação de rejeição, a análise dos dados da NFe não passou (alguma informação inválida); infelismente o serviço da SEFAZ na maioria dos casos não informa qual campo foi invalidado, nesse caso, vc. tem que analisar e descobrir.

                                    Sds,

                                    • At 2009.06.30 14:45, Kleber said:

                                      Boa tarde Fábio, antes de mais nada, parabéns pelo site e vc tem sido funtamental com suas dicas para o desenvolvimento da minha aplicação.
                                      Minha dúvida é a seguinte: como faço para lêr o xml quando existe um comapo vazio Ex:

                                      begin
                                      // Cria a variável baseada no TXMLDocument
                                      vXMLDoc := TXMLDocument.Create(self);

                                      // Le conteúdo do arquivo XML informado
                                      vXMLDoc.LoadFromFile(‘\Sowing\SowingNFE\nfe.xml’);
                                      NodeNivelA := vXMLDoc.DocumentElement.ChildNodes.FindNode(‘infNFe’);

                                      cUF := NodeNivelA.ChildValues['cUF'];
                                      tpAmb := NodeNivelA.ChildValues['tpAmb'];
                                      Digamos que o campo tpAmb esteja vazio, como faço para não mostra acess violation

                                      • At 2009.06.30 15:00, admin said:

                                        Olá Kleber,

                                        Leia assim:

                                        cUF := NodeNivelA.ChildNodes['cUF'].text;

                                        Sds, Caio

                                        • At 2009.06.30 15:17, Kleber said:

                                          Valeu caio, muito obrigado garoto.

                                          Att.

                                          • At 2009.06.30 16:11, rodrigo said:

                                            Olá Caio,
                                            estou desenvolvendo o envio das notas no modo de contingencia, estou utilizando o acbrnfe_pcn, e fiquei em duvida qto ao envio do lote para o SCAN, o componente acbrnfe qdo envia o lote ele envia apenas para a Sefaz ou com a “forma de emissao” do componente setado para “Contingencia SCAN” envia automatico para o SCAN?
                                            Obrigado.

                                            • At 2009.07.01 08:06, Caio said:

                                              Olá Rodrigo,

                                              Eu não tive a oportunidade de testar o componente espcífico da ACBRNFe (é interessante depois vc. postar um comentário com a sua “impressão” com o uso desse componente no tópico ACBrNFe – Mais um componente p/Nota Fiscal Eletrônica).

                                              Sobre a opção de contigência SCAN, além de informar a contingência SCAN, vc. deve tratar o número de série da NF-e entre 900 e 999 e setar o parâmetro UF para a UF do Estado que vai receber essas NF-e. Lembrando que o uso desse processo de contingência é requisitado pela SEFAZ de origem e não pelo contribuinte.

                                              Sds,

                                              • At 2009.08.04 13:26, Emanuel Gadelha said:

                                                Olá amigos..

                                                Estou usando o ACBrNFe e nao estou tendo nenhum problema em relação ao envio e ao cancelamento de notas! Tá tudo funcionando perfeitamente na máquina que desenvolvo.. porém quando fui passar para outra maquina que vai usar o programa, estou enfrentando alguns problemas, mas com muita fé vou conseguir fazer rodar! Hehehe

                                                Ah tou com uma duvida tb, falando do ACBrNFe, já tentei, mas nao consigo ler o cStat de retorno cancelamento.. Alguem poderia me ajudar??

                                                Abraço!

                                                • At 2010.06.16 15:33, luana said:

                                                  BOA TARDE!

                                                  COMO FAÇO PARA RECUPERAR A CHAVE DE ACESSO DE UMA NOTA FISCAL EMITIDA, DA QUAL NÃO IMPRIMI O DANFE E NÃO TENHO MAIS NO SISTEMA DO EMISSOR.

                                                  You must be logged in to post a comment.