Estou tentando obter os valores dos arquivos em .XML enviados por nossos fornecedores para utilizá-los na entrada dos produtos, atualmente feita por digitação dos DANFEs.
Para isso estou abrindo os arquivos de nomes longos através da LFN.LIB e obtenho o "string" em .XML.
Ocorre que muitos campos tem nome em duplicidade na estrutura da NFE, tais como vBC, CST, e a procura que faço por meio deles usando a função AT ou RAT, às vezes vai parar num campo homonimo ao que estou obtendo no momento.
Isto se deve ao fato de que vários produtos podem ser incluídos na mesma NFe e os seus blocos.
Quando o nome do campo .XML é único não há problema, tenho o retorno de seu valor.
Tentei importar os arquivos pelo SEFAZ mas ele os rejeita pois o CNPJ é diferente da empresa em questão.
Alguém desenvolveu algo parecido ou conhece alguma função específica para tratamento de estruturas em .XML ?
Explorar arquivos em .XML
Moderador: Moderadores
Explorar arquivos em .XML
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
- rochinha
- Administrador

- Mensagens: 4664
- Registrado em: 18 Ago 2003 20:43
- Localização: São Paulo - Brasil
- Contato:
Re: Explorar arquivos em .XML
Amiguinho,
A estrutura de um .XML de nota fiscal eletronica é composta das seguintes tags:
Quando ai tinha meu sistema em Clipper e usava intercambio com arquivos de extrato bancário(.OFX) eu costumava importar todo o arquivo para registros em um .DBF e ir interpretando por blocos.
Exemplo:
Para leitura do conteudo do bloco COBRança eu encontrava a tag <cobr> e marcava uma variavel lógica lCobr := .t. e perfazia a leitura enquanto não encontrasse </cobr>
No caso de itens de uma nota voce poderá verificar ou até criticar a tag <det nItem="N"> e cada vez que voce encontrar </det> iniciar um novo registro caso exista <det nItem="N+1">. Entendeu?
No caso dos impostos principalmente ICMS voce deverá levar em consideração que dependendo da CST existirão diferentes tags neste bloco com <ICMS00>, <ICMS20>, etc. voce deverá então pegar o conteudo das tags <orig> e <CST> e gerar o conteudo de CST para armazenar em sua base de dados.
Não posso te dar informações sobre minha rotina de leitura, já que a mesma pelo fato de ser 32bits esta acessando diretamente XML via MSXML SOAP e o Clipper não possue este tipo de acesso.
Neste caso o unico problema que estou enfrentando é em relação a pegar atributos em tags como o ID na tag infNFe.
Assim que ela estiver pronta irei disponibilizar.
A estrutura de um .XML de nota fiscal eletronica é composta das seguintes tags:
Código: Selecionar todos
<infNFe Id="NFe35100609545671000251550030000021239999978766" versao="1.10">
<ide>
...
</ide>
<emit>
...
<enderEmit>
...
</enderEmit>
...
</emit>
<dest>
...
<enderDest>
...
</enderDest>
...
</dest>
<det nItem="1">
<prod>
...
</prod>
<imposto>
<ICMS>
<ICMS00>
...
</ICMS00>
</ICMS>
<PIS>
<PISAliq>
...
</PISAliq>
</PIS>
<COFINS>
<COFINSAliq>
...
</COFINSAliq>
</COFINS>
</imposto>
</det>
<total>
<ICMSTot>
...
</ICMSTot>
</total>
<transp>
...
<transporta>
...
</transporta>
<vol>
...
</vol>
</transp>
<cobr>
<dup>
...
</dup>
</cobr>
...
</infNFe>
Exemplo:
Para leitura do conteudo do bloco COBRança eu encontrava a tag <cobr> e marcava uma variavel lógica lCobr := .t. e perfazia a leitura enquanto não encontrasse </cobr>
No caso de itens de uma nota voce poderá verificar ou até criticar a tag <det nItem="N"> e cada vez que voce encontrar </det> iniciar um novo registro caso exista <det nItem="N+1">. Entendeu?
Código: Selecionar todos
<det nItem="1">
...
</det>
<det nItem="2">
...
</det>
<det nItem="NN">
...
</det>
Não posso te dar informações sobre minha rotina de leitura, já que a mesma pelo fato de ser 32bits esta acessando diretamente XML via MSXML SOAP e o Clipper não possue este tipo de acesso.
Neste caso o unico problema que estou enfrentando é em relação a pegar atributos em tags como o ID na tag infNFe.
Assim que ela estiver pronta irei disponibilizar.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Re: Explorar arquivos em .XML
Ao amigo Rochinha:
É uma pena o nosso Clipper não dispor dessa rotina citada.
A alternativa de criar um .DBF para carregar com os valores dos campos em .XML foi por mim cogitada, mas cairia no circulo vicioso que citei antes, pois existem campos que não dá para se prever se o ICMS será ICMS10, ICMS20, ICMS60, etc. Daria uma quantidade muito grande de opções para testar.
Eu queimei alguns neurônios e achei uma saída consultando os campos chaves, quando eles começam e como terminam, tais como:
<prod>
<det nItem="1">
----------> tudo o que estiver nesse espaço eu vou consultando com a função AT, baseado num reduzido --------------> .DBF que contém a sequencia dos campos e formo uma string que inicia
----------> em <det nItem="1"> e termina em </det><det nItem=2">
</det>
<det nItem="2"
-----> aqui repito a consulta somente mudando o ítem para 3 e assim sucessivamente
</det>
</prod>
Fiz isso com os demais campos que podem repetir-se como Impostos (ICMS, IPI, PIS, etc), Duplicatas.
Deu certo pois dentro de cada grupo, não existe homonimos.
Consegui isolar todos os campos e basta gravá-los em um arquivo de movimento, para cada ítem e tenho o conteúdo do DANFE, sem precisar digitar ítem a ítem.
É uma pena o nosso Clipper não dispor dessa rotina citada.
A alternativa de criar um .DBF para carregar com os valores dos campos em .XML foi por mim cogitada, mas cairia no circulo vicioso que citei antes, pois existem campos que não dá para se prever se o ICMS será ICMS10, ICMS20, ICMS60, etc. Daria uma quantidade muito grande de opções para testar.
Eu queimei alguns neurônios e achei uma saída consultando os campos chaves, quando eles começam e como terminam, tais como:
<prod>
<det nItem="1">
----------> tudo o que estiver nesse espaço eu vou consultando com a função AT, baseado num reduzido --------------> .DBF que contém a sequencia dos campos e formo uma string que inicia
----------> em <det nItem="1"> e termina em </det><det nItem=2">
</det>
<det nItem="2"
-----> aqui repito a consulta somente mudando o ítem para 3 e assim sucessivamente
</det>
</prod>
Fiz isso com os demais campos que podem repetir-se como Impostos (ICMS, IPI, PIS, etc), Duplicatas.
Deu certo pois dentro de cada grupo, não existe homonimos.
Consegui isolar todos os campos e basta gravá-los em um arquivo de movimento, para cada ítem e tenho o conteúdo do DANFE, sem precisar digitar ítem a ítem.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
- alaminojunior
- Colaborador

- Mensagens: 1717
- Registrado em: 16 Dez 2005 21:26
- Localização: Ubatuba - SP
Re: Explorar arquivos em .XML
Júlio, eu montei esta funçãozinha que vem quebrando um galhão.
Segue um exemplo em que uso para pegar o CNPJ do destinatário na NFe.
No caso do exemplo, nnota é uma variável que guarda o texto compreendido entre as tags <dest>
Um outro exemplo: rode a função e veja com auxílio da função AT() quantas ocorrências existem da string "det nItem" e jogue o conteúdo de cada uma numa variável. Feito isso fica relativamente fácil.
Como a função retorna o trecho de informação desejada, é possível ir encadeando-a várias vezes. Uma chamada à função que retorna um trecho do texto que foi retornado por uma primeira chamada.
Boa sorte.
Segue um exemplo em que uso para pegar o CNPJ do destinatário na NFe.
No caso do exemplo, nnota é uma variável que guarda o texto compreendido entre as tags <dest>
Código: Selecionar todos
priv cnpj:= lcx("<CNPJ>","</CNPJ>",nnota[b])Código: Selecionar todos
lcx("<infNFe>","</infNFe>",memoread("arquivo.xml"))Como a função retorna o trecho de informação desejada, é possível ir encadeando-a várias vezes. Uma chamada à função que retorna um trecho do texto que foi retornado por uma primeira chamada.
Código: Selecionar todos
Function LCX(arg1,arg2,arg3)
ini:= at(arg1,arg3)+len(arg1)
fin:= at(arg2,arg3)
if fin = 0
return ""
endif
return subs(arg3,ini,fin-ini)
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
MySQL c/ SQLRDD
HwGui + GTWVG
Re: Explorar arquivos em .XML
De uma olha!
viewtopic.php?f=43&t=9528&p=54043&hilit=frazato#p54043
Frazato
viewtopic.php?f=43&t=9528&p=54043&hilit=frazato#p54043
Frazato

