Ler xml Nfe
Autor: Amarildo Matos | Publicado: 2014-12-08T09:14:00-08:00

Ler xml Nfe


1. CRIAR UMA WINDOW VAZIA

2. Crie uma Variavel Chamada Loc:NomeXml

3. Coloque para digitar essa variavel e agora, coloque um botao para importar xml

4. para facilitar coloque no lado do nome, DosFileLookup para buscar o arquivo xml 
&nbsp;&nbsp; ou digite manualmente
&nbsp;&nbsp; 
5. comandos dentro do botao importa xml

&nbsp;&nbsp; Abrir o arquivo na memoria
&nbsp;&nbsp; ==========================
&nbsp;&nbsp; 
&nbsp;&nbsp; x#=xml:loadfromfile(Loc:NomeXml_SERVICO,false)&nbsp; ! Esse comando le o arquivo selecionado
&nbsp;&nbsp; if x#=0&nbsp; ! caso de 0 é porque ele achou o arquivo
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('agora vamos comecar a ler os campos do xml')
&nbsp;&nbsp;&nbsp; ELSE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('nao Existe Xml')
&nbsp;&nbsp; END

6.
&nbsp;&nbsp; CRIAR UMA VARIAVEL CHAMADA 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOC:RETORNO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSTRING(@S80)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 
&nbsp;&nbsp; x#=xml:loadfromfile(Loc:NomeXml_SERVICO,false)&nbsp; ! Esse comando le o arquivo selecionado
&nbsp;&nbsp; if x#=0&nbsp; ! caso de 0 é porque ele achou o arquivo
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml:gototop() ! inicio xml
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not xml:FindNextNode('ide')&nbsp; ! procura tag ide
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not xml:FindNextNode('cUF') ! procura tag cUF 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ~xml:readCurrentData(loc:retorno) ! achou
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message(loc:retorno)&nbsp; !&nbsp; esse é o campo cUf é so colocar onde voce quizer
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ! esses campos irao pegar os campos normais
&nbsp;&nbsp;&nbsp; ELSE
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('nao Existe Xml')
&nbsp;&nbsp;&nbsp; END







&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00001988&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5101 Venda de producao do estabelecimento 07 pis&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 7. pegar campos dos produtos&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REFNum1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TERMOSTATO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39199000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.00000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100.00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10.00000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Dentro do Local Data&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Oher Declarations&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Criar a variavel queue para ler os produtos&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; Recs&nbsp;&nbsp;&nbsp; LONGNota_nfe_Queue&nbsp; QUEUE,PRE(nfeq)&nbsp; ! esse é a queue com os itens do produtos, conforme as tagsnItem&nbsp;&nbsp;&nbsp;&nbsp; string(3)cProd&nbsp;&nbsp;&nbsp;&nbsp; STRING(20)xProd&nbsp;&nbsp;&nbsp;&nbsp; string(50)CFOP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(20)uCom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(20)qCom&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(20)vUnCom&nbsp;&nbsp;&nbsp; string(20)vProd&nbsp;&nbsp;&nbsp;&nbsp; string(20)uTrib&nbsp;&nbsp;&nbsp;&nbsp; string(20)qTrib&nbsp;&nbsp;&nbsp;&nbsp; string(20)vUnTrib&nbsp;&nbsp; string(20)NCM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(20)orig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)CST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)modBC&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)vBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)&nbsp; ! 1=ICM 2=IPIpICMS&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)vICMS&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)pIPI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)vIPI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)pRedBC&nbsp;&nbsp;&nbsp; string(10),dim(20)vBCST&nbsp;&nbsp;&nbsp;&nbsp; string(10),dim(20)pICMSST&nbsp;&nbsp; string(10),dim(20)vICMSST&nbsp;&nbsp; string(10),dim(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ENDloc:importa_nfe&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cstring(255)&nbsp;&nbsp; Dentro do programa abaixo do xml que ja esta baixando acrescente o seguinte:&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; free(Nota_nfe_Queue) ! limpa queue&nbsp;&nbsp;&nbsp; xml:gototop() ! inicio xml&nbsp;&nbsp;&nbsp; if not XML:FindNextNode('det') ! procura tag det&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recs = xml:loadqueue(Nota_nfe_Queue,true,true)&nbsp; ! move para memoria&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp; sort(Nota_nfe_Queue,+nfeq:nItem) ! classifica queue&nbsp;&nbsp;&nbsp; loop contador#=1 to records(Nota_nfe_Queue)&nbsp; ! loop queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get(Nota_nfe_Queue,contador#)&nbsp; ! ler queu&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;message(nfeq:nItem) ! aqui esta cada linha, e so usar&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; linha completa&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; x#=xml:loadfromfile(Loc:NomeXml_SERVICO,false)&nbsp; ! Esse comando le o arquivo selecionado&nbsp;&nbsp; if x#=0&nbsp; ! caso de 0 é porque ele achou o arquivo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml:gototop() ! inicio xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not xml:FindNextNode('ide')&nbsp; ! procura tag ide&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not xml:FindNextNode('cUF') ! procura tag cUF &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ~xml:readCurrentData(loc:retorno) ! achou&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message(loc:retorno)&nbsp; !&nbsp; esse é o campo cUf é so colocar onde voce quizer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(Nota_nfe_Queue) ! limpa queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xml:gototop() ! inicio xml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not XML:FindNextNode('det') ! procura tag det&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recs = xml:loadqueue(Nota_nfe_Queue,true,true)&nbsp; ! move para memoria&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sort(Nota_nfe_Queue,+nfeq:nItem) ! classifica queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; loop contador#=1 to records(Nota_nfe_Queue)&nbsp; ! loop queue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get(Nota_nfe_Queue,contador#)&nbsp; ! ler queu&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; message(nfeq:nItem) ! aqui esta cada linha, e so usar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end&nbsp;&nbsp;&nbsp;&nbsp; ELSE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message('nao Existe Xml')&nbsp;&nbsp;&nbsp;&nbsp; END&nbsp;