Página 1 de 1
Explorar arquivos em .XML
Enviado: 03 Jul 2010 23:11
por billy1943
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 ?
Re: Explorar arquivos em .XML
Enviado: 04 Jul 2010 14:28
por rochinha
Amiguinho,
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>
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?
Código: Selecionar todos
<det nItem="1">
...
</det>
<det nItem="2">
...
</det>
<det nItem="NN">
...
</det>
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.
Re: Explorar arquivos em .XML
Enviado: 04 Jul 2010 19:36
por billy1943
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.
Re: Explorar arquivos em .XML
Enviado: 04 Jul 2010 19:59
por alaminojunior
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.
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)
Boa sorte.
Re: Explorar arquivos em .XML
Enviado: 05 Jul 2010 10:59
por frazato
De uma olha!
viewtopic.php?f=43&t=9528&p=54043&hilit=frazato#p54043
Frazato