Access Violation When Selecting XML File - Nfe

Asked

Viewed 1,380 times

1

I’m trying to select the nós, but is making an error of Access Violation, what I could improve on this code so there is no error?

procedure TfrmDataB.sbtnAbrirClick(Sender: TObject);
var
  xmlNCab, xmlNItm : IXMLNode;
  //Nota Fiscal
  cNF, nNF, dEmi, verProc, serie : String;
  //emit + enderEmit
  cnpj, cpf, xNome, xFant, IE,
  xLog, nro, xBairro, cMun, xMun, uf, cep, cPais, xPais,
  fone : String;
  //prod
  cProd, xProd, uCom, qCom, vUnCom, vProd : String;
  function funcvarXML(xmlNTag : IXMLNode): WideString;
  begin
    if not (xmlNTag.ChildNodes.First = nil) then
      Result := xmlNTag.ChildNodes.First.Text;
  end;
begin
  //
  if not (opndlg_nfe.FileName = '') then Exit;
  // Lendo o arquivo pelas TAGs...
  if opndlg_nfe.Execute then
  xmldoc_nfe.LoadFromFile(opndlg_nfe.FileName);

  xmldoc_nfe.Active := true;
  // Leitura Dados da Nota Fiscal...
  xmlNCab := xmldoc_nfe.DocumentElement.childNodes.First.ChildNodes.FindNode('ide');
  if not (xmlNCab.ChildNodes.First = nil) then
  begin
    cNF := funcvarXML(xmlNCab.ChildNodes['cNF'        ]); // Código sequencial NFe
    nNF := funcvarXML(xmlNCab.ChildNodes['nNF'        ]); // Número da Nota Fiscal
    dEmi := funcvarXML(xmlNCab.ChildNodes['dEmi'      ]); // Data Emissão Nota Fiscal
    verProc := funcvarXML(xmlNCab.ChildNodes['verProc']); // Descrição da Nota Fiscal
    serie := funcvarXML(xmlNCab.ChildNodes['serie'    ]); // Série da Nota Fiscal
  end;

  // Leitura Dados do Fornecedor...
  xmlNCab := xmldoc_nfe.DocumentElement.childNodes.First.ChildNodes.FindNode('emit');
  if not (xmlNCab.ChildNodes.First = Nil) then
  begin
    cnpj := funcvarXML(xmlNCab.ChildNodes['CNPJ'   ]); // CGC Fornecedor
    cpf := funcvarXML(xmlNCab.ChildNodes['CPF'    ]); // CPF Fornecedor
    xNome := funcvarXML(xmlNCab.ChildNodes['xNome'  ]); // Razão Social do Fornecedor
    xFant := funcvarXML(xmlNCab.ChildNodes['xFant'  ]); // Nome Fantasia
    IE := funcvarXML(xmlNCab.ChildNodes['IE'     ]); // Inscrição Estadual
    // Leitura Dados Endereços do Fornecedor...
    xmlNItm := xmlNCab.ChildNodes['enderEmit'];
    if not (xmlNItm.ChildNodes.First = Nil) then
    begin
      xLog := funcvarXML(xmlNItm.ChildNodes['xLgr'   ]); // Logradouro
      nro := funcvarXML(xmlNItm.ChildNodes['nro'    ]); // Número
      xBairro := funcvarXML(xmlNItm.ChildNodes['xBairro']); // Bairro
      cMun := funcvarXML(xmlNItm.ChildNodes['cMun'   ]); // Código Município IBGE
      xMun := funcvarXML(xmlNItm.ChildNodes['xMun'   ]); // Nome Município
      uf := funcvarXML(xmlNItm.ChildNodes['UF'     ]); // Unidade Federação
      cep := funcvarXML(xmlNItm.ChildNodes['CEP'    ]); // CEP
      cPais := funcvarXML(xmlNItm.ChildNodes['cPais'  ]); // Código Pais BACEN
      xPais := funcvarXML(xmlNItm.ChildNodes['xPais'  ]); // Nome Pais
      fone := funcvarXML(xmlNItm.ChildNodes['fone'   ]); // Telefone
    end;
  end;

  // Leitura Dados Itens da Nota Fiscal...
  xmlNCab := xmldoc_nfe.DocumentElement.childNodes.First.ChildNodes.FindNode('det');
  while not (xmlNCab = Nil) do
  begin
    xmlNCab.ChildNodes.First.ChildNodes.FindNode('det');
    xmlNItm := xmlNCab.ChildNodes['prod'];
    if not (xmlNItm.ChildNodes.First = Nil) then
    begin
      cProd := funcvarXML(xmlNItm.ChildNodes['cProd'  ]); // Código do produto CFOP
      xProd := funcvarXML(xmlNItm.ChildNodes['xProd'  ]); // Nome do produto
      uCom := funcvarXML(xmlNItm.ChildNodes['uCom'    ]); // Sigla unidade da embalagem
      qCom := funcvarXML(xmlNItm.ChildNodes['qCom'    ]); // Quantidade do produto (4dec,S/M)
      vUnCom := funcvarXML(xmlNItm.ChildNodes['vUnCom']); // Valor unitário do produto (4dec,S/M)
      vProd := funcvarXML(xmlNItm.ChildNodes['vProd'  ]); // Valor total do produto (2dec,S/M)
    end;
    xmlNCab := xmlNCab.NextSibling;
  end;

end;

Error on this line if not (xmlNCab.ChildNodes.First = nil) then

Follows structure of . XML

- <ide>
    <cUF>00</cUF> 
    <cNF>0000000</cNF> 
    <natOp>--------------------</natOp> 
    <indPag>0</indPag> 
    <mod>55</mod> 
    <serie>1</serie> 
    <nNF>1455</nNF> 
    <dEmi>2012-07-28</dEmi> 
    <tpNF>1</tpNF> 
    <cMunFG>0000000</cMunFG> 
    <tpImp>1</tpImp> 
    <tpEmis>1</tpEmis> 
    <cDV>2</cDV> 
    <tpAmb>1</tpAmb> 
    <finNFe>1</finNFe> 
    <procEmi>0</procEmi> 
    <verProc>1.75.0.0</verProc> 
  </ide>
- <emit>
    <CNPJ>00000000000000</CNPJ> 
    <xNome>SUPER. xxxxxxxx</xNome> 
    <xFant>SUPERMERCADO xxxxxxxxx</xFant> 
  - <enderEmit>
      <xLgr>ALGUEM</xLgr> 
      <nro>163</nro> 
      <xBairro>CENTRO</xBairro> 
      <cMun>000000</cMun> 
      <xMun>XXXXXXXXXX</xMun> 
      <UF>XX</UF> 
      <CEP>00000000</CEP> 
      <cPais>1058</cPais> 
      <xPais>BRASIL</xPais> 
      <fone>0000000000</fone> 
    </enderEmit>
    <IE>20000000</IE> 
    <CRT>3</CRT> 
  </emit>
- <dest>
    <CNPJ>00000000000000</CNPJ> 
    <xNome>xxxxxxxxxxxxxxxxxxxxxxxx</xNome> 
  - <enderDest>
      <xLgr>xxxxxxxxxxxxxxxxxxxxxxxxxxx</xLgr> 
      <nro>163</nro> 
      <xBairro>xxxxxxxxx</xBairro> 
      <cMun>0000000</cMun> 
      <xMun>xxxxxxxxxx</xMun> 
      <UF>xx</UF> 
      <CEP>00000000</CEP> 
      <cPais>1058</cPais> 
      <xPais>BRASIL</xPais> 
      <fone>0000000000</fone> 
    </enderDest>
    <IE>200852949</IE> 
    <email>[email protected]</email> 
  </dest>
- <det nItem="1">
- <prod>
    <cProd>00000000001</cProd> 
    <cEAN /> 
    <xProd>LARANJA</xProd> 
    <NCM>08109000</NCM> 
    <CFOP>5102</CFOP> 
    <uCom>KG</uCom> 
    <qCom>1.0000</qCom> 
    <vUnCom>1.2000000000</vUnCom> 
    <vProd>1.20</vProd> 
    <cEANTrib /> 
    <uTrib>KG</uTrib> 
    <qTrib>1.0000</qTrib> 
    <vUnTrib>1.2000000000</vUnTrib> 
    <indTot>1</indTot> 
  </prod>
  • Have you debugged? In which statement exactly does the error occur?

  • Before beginning this instruction, I click, and the Open Dialog opens, however, before executing the instruction, it stops. I will debug again, to present the line.

  • @Fonseca, I put the line of error at the end of the question...

  • @Fonseca, I removed the ifs and he presented the same error, however, in this line cNF := funcvarXML(xmlNCab.ChildNodes['cNF' ]); // Código sequencial NFe

  • Put the xml structure please.

  • @Filipe.Fonseca, the structure is in the question.

Show 1 more comment

2 answers

3

Error on this line if not (xmlNCab.ChildNodes.First = nil) then

This line contains 3 objects. One of them is nil; xmlNCab or Childnodes or First is nil.

You can test everyone to see what it is.

Then review your logic, to solve the problem before reaching this line.

  • The error is right here, ta returning the access Violation xmlNCab.ChildNodes.First

  • I tried to give a showmessage to show what he was getting on this line that I commented on, and he took it Element "NFe" does not contain a single text node

  • in fact, there was something wrong, because I have to select all the nodes to then do something to select the values, I was running over these conditions and so I was making mistakes, I will post the answer.

0


Follow the answer, code working :

procedure TfrmDataB.sbtnAbrirClick(Sender: TObject);
var
  xmlNCab, xmlNItm, NoPrinc, NoXML , NoPai : IXMLNode;
  //Nota Fiscal
  cNF, nNF, dEmi, verProc, serie : String;
  //emit + enderEmit
  cnpj, cpf, xNome, xFant, IE, xLog, nro, xBairro,
  cMun, xMun, uf, cep, cPais, xPais, fone : String;

  //prod
  cProd, xProd, uCom, qCom, vUnCom, vProd : String;
begin
 //
  if not (opndlg_nfe.FileName = '') then Exit;

  // Lendo o arquivo pelas TAGs...
  if opndlg_nfe.Execute then
  xmldoc_nfe.LoadFromFile(opndlg_nfe.FileName);

  xmldoc_nfe.Active := true;

  //ShowMessage(xmlNTag.ChildNodes.First.Text);
  NoXML :=  xmldoc_nfe.DocumentElement.ChildNodes['NFe'];
  NoPrinc := NoXML.ChildNodes['infNFe'];
  // Leitura Dados da Nota Fiscal...
  xmlNCab := NoPrinc.ChildNodes.FindNode('ide');
  //ShowMessage(xmldoc_nfe.DocumentElement.ChildNodes.First.Text);

  cNF := xmlNCab.ChildNodes['cNF'].Text; // Código sequencial NFe
  nNF := xmlNCab.ChildNodes['nNF'].Text; // Número da Nota Fiscal
  dEmi := xmlNCab.ChildNodes['dEmi'].Text; // Data Emissão Nota Fiscal
  verProc := xmlNCab.ChildNodes['verProc'].Text; // Descrição da Nota Fiscal
  serie := xmlNCab.ChildNodes['serie'].Text; // Série da Nota Fiscal


  // Leitura Dados do Fornecedor...
  xmlNCab := NoPrinc.ChildNodes.FindNode('emit');

    cnpj := xmlNCab.ChildNodes['CNPJ'].Text; // CGC Fornecedor
    //cpf := funcvarXML(xmlNCab.ChildNodes['CPF'    ].Text; // CPF Fornecedor
    xNome := xmlNCab.ChildNodes['xNome'].Text; // Razão Social do Fornecedor
    xFant := xmlNCab.ChildNodes['xFant'].Text; // Nome Fantasia
    IE := xmlNCab.ChildNodes['IE'].Text; // Inscrição Estadual
    // Leitura Dados Endereços do Fornecedor...
    xmlNItm := xmlNCab.ChildNodes['enderEmit'];

      xLog := xmlNItm.ChildNodes['xLgr'   ].Text; // Logradouro
      nro := xmlNItm.ChildNodes['nro'    ].Text; // Número
      xBairro := xmlNItm.ChildNodes['xBairro'].Text; // Bairro
      cMun := xmlNItm.ChildNodes['cMun'   ].Text; // Código Município IBGE
      xMun := xmlNItm.ChildNodes['xMun'   ].Text; // Nome Município
      uf := xmlNItm.ChildNodes['UF'     ].Text; // Unidade Federação
      cep := xmlNItm.ChildNodes['CEP'    ].Text; // CEP
      cPais := xmlNItm.ChildNodes['cPais'  ].Text; // Código Pais BACEN
      xPais := xmlNItm.ChildNodes['xPais'  ].Text; // Nome Pais
      fone := xmlNItm.ChildNodes['fone'   ].Text; // Telefone


  // Leitura Dados Itens da Nota Fiscal...
  xmlNCab := NoPrinc.ChildNodes.FindNode('det');
  while not (xmlNCab = Nil) do
  begin
    xmlNCab.ChildNodes.First.ChildNodes.FindNode('det');
    xmlNItm := xmlNCab.ChildNodes['prod'];

      cProd := xmlNItm.ChildNodes['cProd'  ].Text; // Código do produto CFOP
      xProd := xmlNItm.ChildNodes['xProd'  ].Text; // Nome do produto
      uCom := xmlNItm.ChildNodes['uCom'    ].Text; // Sigla unidade da embalagem
      qCom := xmlNItm.ChildNodes['qCom'    ].Text; // Quantidade do produto (4dec,S/M)
      vUnCom := xmlNItm.ChildNodes['vUnCom'].Text; // Valor unitário do produto (4dec,S/M)
      vProd := xmlNItm.ChildNodes['vProd'  ].Text; // Valor total do produto (2dec,S/M)
      xmlNCab := xmlNCab.NextSibling;
  end;
end;

Thanks for the personal help!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.