Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lucas Cardial

Como ler todos os produtos de uma NFe?

Recommended Posts

Salve amigos,

 

Preciso gravar todos os produtos da xml de uma NFe, porém o único problema que tenho, é que só consigo ler o primeiro nó, perdendo todos os outros registros de produtos.

Detalhe: Todas as tags do produto são iguais:

<nfeProc xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">
<NFe xmlns="http://www.portalfiscal.inf.br/nfe">
<infNFe Id="NFe17140812364226000150550010000038021000189995" versao="2.00">
<ide>...</ide>
<emit>...</emit>
<dest>...</dest>
<det nItem="1">
<prod>
<cProd>01</cProd>
<cEAN/>
<xProd>BANANA NANICA</xProd>
<NCM>08039000</NCM>
<CFOP>6102</CFOP>
<uCom>KG</uCom>
<qCom>520.0000</qCom>
<vUnCom>1.7000</vUnCom>
<vProd>884.00</vProd>
<cEANTrib/>
<uTrib>KG</uTrib>
<qTrib>520.0000</qTrib>
<vUnTrib>1.7000</vUnTrib>
<indTot>1</indTot>
</prod>
<imposto>...</imposto>
</det>
<det nItem="2">...</det>
<det nItem="3">...</det>
<total>...</total>
<transp>...</transp>
<infAdic>...</infAdic>
</infNFe>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">...</Signature>
</NFe>
<protNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="2.00">...</protNFe>
</nfeProc>

A tag "Pai" dos produtos é a tag "det".

Realizo a leitura da seguinte maneira:

<?php
	function loadBasicXml($dir){
				

		foreach (glob($dir.'*.xml') as $obj) {
			ini_set('default_charset', 'UTF-8');
			$xml = simplexml_load_file($obj);
			$nfe = $xml->NFe->infNFe->ide->nNF;
			$emissao = $xml->NFe->infNFe->ide->dEmi;
			/*Código do Produto */
			$cPord = $xml->NFe->infNFe->det->prod->cProd;
			/*Nome do produto*/
			$nProd = $xml->NFe->infNFe->det->prod->xProd;
			/*Valor do produto*/
			$vProd = $xml->NFe->infNFe->det->prod->vProd;
			
			
		}

	}
?>

Porém como disse, só consigo pegar a primeira tag, perdendo todos os outros registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso é pq vc sobrescreve cada variavel a cada volta do loop.

 

Onde vc quer usar as informações ? não entendi pq vc coloca em variáveis em vez de já utilizar logo de vez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian, uso essas informações em uma tabela do Mysql.

Preciso guardar os valores numa variável, para chamar a função sql...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum.. tecnicamente, vc já poderia fazer o teu sql dentro daquele loop, sem precisar criar novas variáveis para outras variáveis q já existem.. mas vou deixar vc notar isso sozinho então.

 

Forma de fazer:

$nfe = Array();
$emissao[] = Array();
$cPord[] = Array();
$nProd[] = Array();
$vProd[] = Array();
foreach (glob($dir.'*.xml') as $obj) {
  ini_set('default_charset', 'UTF-8');
  $xml = simplexml_load_file($obj);

  $nfe[] = $xml->NFe->infNFe->ide->nNF;
  $emissao[] = $xml->NFe->infNFe->ide->dEmi;
  $cPord[] = $xml->NFe->infNFe->det->prod->cProd;
  $nProd[] = $xml->NFe->infNFe->det->prod->xProd;
  $vProd[] = $xml->NFe->infNFe->det->prod->vProd;
}
note que agora estou colocando cada iteração do loop em uma posição do array, assim eu não sobrescrevo as variáveis.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Willian, da forma como você apresentou, não funciona da forma como espero, pois tenho mais de 600 xmls no diretório, e agora os valores das 600 xmls estão no array.

Eu compreendia a sua preocupação em sobrescrever as variáveis, porém isso não ocorre, pois eu chamo uma função assim que a leitura da xml atual é finalizada.

Código completo:

<?php 

	function loadBasicXml($dir){
				

		foreach (glob($dir.'*.xml') as $obj) {
			ini_set('default_charset', 'UTF-8');
			$xml = simplexml_load_file($obj);
			$nfe = $xml->NFe->infNFe->ide->nNF;
			$emissao = $xml->NFe->infNFe->ide->dEmi;
			$cliente = $xml->NFe->infNFe->dest->xNome;
			$rua = $xml->NFe->infNFe->dest->enderDest->xLgr;
			$bairro = $xml->NFe->infNFe->dest->enderDest->xBairro;
			$municipio = $xml->NFe->infNFe->dest->enderDest->xMun;
			$uf = $xml->NFe->infNFe->dest->enderDest->UF;
			$valor = $xml->NFe->infNFe->total->ICMSTot->vNF;
			$produ = $xml->NFe->infNFe->det;
			
			sqlBasicXml($nfe, $emissao, $cliente, $rua, $bairro, $municipio, $uf, $valor, 'false');
			
		}

	}
 ?>
<?php 

	function sqlBasicXml($nfe, $emissao, $cliente, $rua, $bairro, $municipio, $uf, $valor, $rec){
		
		date_default_timezone_set('America/Sao_Paulo');
		
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		$stmt = $pdo->prepare('INSERT INTO `nfe`(
			 `nfe`
			, `dEmi`
			, `xCliente`
			, `xLgr`
			, `xBairro`
			, `xMun`
			, `xUf`
			, `vNfe`
			, `Rec`
			, `dHSys`
			) VALUES (
			:nfe,
			:emissao,
			:cliente,
			:rua,
			:bairro,
			:municipio,
			:uf,
			:valor,
			:rec,
			:now
		)');
		
		$param = array( 
			':nfe' => $nfe
			,':emissao' => $emissao
			,':cliente' => $cliente
			,':rua' => $rua
			,':bairro' => $bairro
			,':municipio' => $municipio
			,':uf' => $uf
			,':valor' => $valor
			,':rec' => 0
			,':now' => date('Y-m-d H:i:s')
		);
		$stmt->execute($param);


		
	}


	


 ?>

Dessa forma, registro todas elas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

E qual é a sua dúvida ?

 

Se você não postar o contexto completo fica impossível de ajudar. Pois ficaremos supondo coisas por não termos acesso a todas as informações necessárias.

 

O problema é entrar dentro de cada:

<det nItem="1">...</det>
<det nItem="2">...</det>
<det nItem="3">...</det>
é isso ?

Resolvido em:

 

http://forum.imasters.com.br/topic/532555-ajuda-ler-tags-filhas-iguais-de-uma-xml/

 

Tente ser mais claro no primeiro tópico, assim será muito mais fácil e rápido tentarmos ajudar.

Note que perdemos tempo tentando adivinhar e descobrir qual era a dúvida, quando na verdade era algo muito mais simples do que estávamos supondo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.