Explorar arquivos em .XML

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Explorar arquivos em .XML

Mensagem 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 ?
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Explorar arquivos em .XML

Mensagem 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.
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.
Avatar do usuário
billy1943
Usuário Nível 4
Usuário Nível 4
Mensagens: 570
Registrado em: 12 Mai 2009 17:33
Localização: Bauru-SP

Re: Explorar arquivos em .XML

Mensagem 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.
O bom do computador é que ele resolve os problemas, sem nunca levantar nenhum.
Hoje atuo mais com Clipper 52E, e um pouquinho com XHarbour.
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Re: Explorar arquivos em .XML

Mensagem 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>

Código: Selecionar todos

priv cnpj:= lcx("<CNPJ>","</CNPJ>",nnota[b])
Um outro exemplo: rode a função

Código: Selecionar todos

lcx("<infNFe>","</infNFe>",memoread("arquivo.xml"))
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.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Explorar arquivos em .XML

Mensagem por frazato »

De uma olha!


viewtopic.php?f=43&t=9528&p=54043&hilit=frazato#p54043


Frazato
Responder