Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
How to scan each line from TAG Etiquetas
Message
From
28/09/2022 04:43:41
Luis Santos
Biglevel-Soluções Informáticas, Lda
Portugal
 
 
To
27/09/2022 07:20:15
Luis Santos
Biglevel-Soluções Informáticas, Lda
Portugal
General information
Forum:
Visual FoxPro
Category:
Coding, syntax & commands
Miscellaneous
Thread ID:
01684999
Message ID:
01685001
Views:
44
Hello community,

I'm trying to import an XML file into a document, however I have a problem when I get to TAG tags because I can't create a line for each record in my XML file, which in practice is 6 Lines.
The script imports the contents of the tags from line #1 6 times instead of inserting values for each line.
Local Array MyFiles[1,5]

nFilesFound = Adir( MyFiles, "D:\Trabalho_Clientes\Caimaplas\DELFOR\*.xml" )

If Empty(nFilesFound)
	MSG("Não existem encomendas a importar")
	Return .F.
Else
	For i = 1 To nFilesFound

		** Criar Dossiers Programaticamente
		fecha("mbocursor")
		fecha("mbo2cursor")
		fecha("mbicursor")

		* usar tabelas de dossiers
		Do dbfusebi
		Do dbfuseboall

		* Utilizar a configuração do tipo de dossier nº1
		Do tsread With "",1

		* criar os cursores mbocursor, mbo2cursor, mbicursor e mbicursor2 vazios
		Create Cursor mbocursor (no N(10), estab N(3), memissao c(10),dataobra d(8),dataopen d(8),datafinal d(10),boano N(4),marca c(20),serie c(20),maquina c(20),obrano N(10),obranome c(30),Nome c(60),morada c(60),Local c(60),codpost c(60),ncont c(60))

		u_sqlexec([select * from bo2 (nolock) where 1=0],[mbo2cursor])
		u_sqlexec([select * from bi (nolock) where 1=0],[mbicursor])


		* CLEAN ALL CURSORS
		Select mbocursor
		Delete For .T.
		Select mbo2cursor
		Delete For .T.
		Select mbicursor
		Delete For .T.

		**Inicialização de variáveis locais que irão ser utilizadas mais à frente no código
		Local SFILE As String, SDATAXML As String, SSEL As String

		**M.sfile é a variável que vai guardar o nome do ficheiro XML a importar. Além do nome também guarda o caminho (path) para o ficheiro.
		m.SFILE = "D:\Trabalho_Clientes\Caimaplas\DELFOR\"+MyFiles[i,1]

		If Empty(M.SFILE)
			Return .F.
		Else
			**Verifica se o ficheiro é do tipo XML
			If .Not. ".XML"$Alltrim(Upper(M.SFILE))
				MSG("Tipo de ficheiro inválido!")
				Return .F.
			Else
				**A função Type avalia uma expressão do tipo caracter e retorna o tipo de dados da expressão, e para além disso verificamos aqui se o ficheiro existe ou não
				If Type("m.sFile")<>"C" .Or. .Not. File(M.SFILE)
					MSG("Ficheiro Não Encontrado!")
					Return .F.
				Endif
			Endif
		Endif

		**A variável M.sdataxml vai conter o resultado da função Filetostr, esta retorna o conteúdo de um ficheiro como sendo uma string, para ser utilizada em xbase.
		m.SDATAXML = Filetostr(M.SFILE)

		**Inicialização da variável local que irá conter o XML
		Local oXMLDocument As MSXML2.DOMDocument

		**Inicialização da variável local que irá conter a lista de Transacções
		Local ONODELIST As MSXML2.IXMLDOMNodeList

		** Criar o objecto e atribui-lhe o XML
		m.oXMLDocument = Createobject("msxml2.domdocument.4.0")
		m.oXMLDocument.Load(M.SFILE)
		m.oXMLDocument.Async = .F.
		m.oXMLDocument.VALIDATEONPARSE = .F.
		m.oXMLDocument.PreserveWhiteSpace = .F.

		** Define a root do XML (nó principal)
		m.OROOT = M.oXMLDocument.DOCUMENTELEMENT

		** Lê a tag OrderDate
		m.obranome =  m.OROOT.selectNodes("Documento/numdoc").Item(0).Text
		m.datadoc =  m.OROOT.selectNodes("Documento/datadoc").Item(0).Text
		m.dataentrega =  m.OROOT.selectNodes("Documento/dataentrega").Item(0).Text
		m.glnfornecedor =  m.OROOT.selectNodes("Documento/glnfornecedor").Item(0).Text
		m.idtransporte =  m.OROOT.selectNodes("Documento/idtransporte").Item(0).Text

		*!* LINES OF DOCUMENT
		m.ref = m.OROOT.selectNodes("Documento/Linhas/referencia").Item(0).Text
		m.design = m.OROOT.selectNodes("Documento/Linhas/descricao").Item(0).Text
		m.qtt = m.OROOT.selectNodes("Documento/Linhas/quantidade").Item(0).Text
		m.lineordernumber = m.OROOT.selectNodes("Documento/Linhas/lineordernumber").Item(0).Text

		m.boano=Year(Date())

		** Embalagem
		m.embalagem = m.OROOT.selectNodes("Documento/Linhas/Embalagem/codembalagem").Item(0).Text
		m.total = m.OROOT.selectNodes("Documento/Linhas/Embalagem/total").Item(0).Text


		*!* Etiquetas
		Create Cursor mbicursor( ref c(18), Design c(60), qtt N(10,3), edebito N(10,3), debito N(10,3), desconto N(10,2), desc2 N(10,2) , desc3 N(10,2), desc4 N(10,2), desc5 N(10,2), desc6 N(10,2), tabiva N(4,2) , ttdeb N(10,3), ettdeb N(10,3), stns L, Lote c(30), usalote L, Lordem N(20,0), partes N(10,2) , cativo L , stipo N(2,0) , armazem N(5,0), lobs c(10), litem c(20), dedata c(10), atedata c(10)) &&

		m.tiporequisicao = m.OROOT.selectNodes("Documento/Linhas/Etiquetas/tiporequisicao").Item(0).Text

		** READ LIST OF ETIQUETAS
		m.ONODELIST = M.OROOT.selectNodes("Documento/Linhas/Etiquetas")

		For Each ONODE As 'MSXML2.IXMLDOMNode' In M.ONODELIST

			m.ONODELISTTRA = M.OROOT.selectNodes("Documento/Linhas/Etiquetas")

			** Verifica o nome do elemento e lê o seu valor
			Do Case
				Case  Alltrim(ONODE.NODENAME) == "Etiquetas"

					m.qttetiqueta = m.OROOT.selectNodes("Documento/Linhas/Etiquetas/quantidaderequerida").Item(0).Text
					If Val(m.qttetiqueta) <> 0

						m.qttetiqueta = m.OROOT.selectNodes("Documento/Linhas/Etiquetas/quantidaderequerida").Item(0).Text
						m.dedata  = m.OROOT.selectNodes("Documento/Linhas/Etiquetas/datarequeridainicial").Item(0).Text
						m.atedata  = m.OROOT.selectNodes("Documento/Linhas/Etiquetas/datarequeridafinal").Item(0).Text

                        *!* Date conversion
						m.dedata = Ctod(Substr(m.dedata,7,2)+'.'+Substr(m.dedata,5,2)+'.'+Substr(m.dedata,1,4))
						m.atedata = Ctod(Substr(m.atedata ,7,2)+'.'+Substr(m.atedata ,5,2)+'.'+Substr(m.atedata,1,4))

					Endif

					** Percorre a lista de OrderItems
					Select mbicursor
					Append Blank

					Replace mbicursor.ref With m.ref
					Replace mbicursor.Design With m.design
					Replace mbicursor.qtt With Val(m.qttetiqueta)
					Replace mbicursor.edebito With 0.00
					Replace mbicursor.debito With 0.00 *200.482
					Replace mbicursor.ettdeb With 0.00 * Val(m.qtt)
					Replace mbicursor.ttdeb With 0.00 * Val(m.qtt) *200.482
					Replace mbicursor.stipo With 4
					Replace mbicursor.armazem With 1
					Replace mbicursor.desconto With 0.00
					Replace mbicursor.desc2 With 0.00
					Replace mbicursor.desc3 With 0.00
					Replace mbicursor.desc4 With 0.00
					Replace mbicursor.desc5 With 0.00
					Replace mbicursor.desc6 With 0.00
					Replace mbicursor.stns With .F.
					Replace mbicursor.Lote With ''
					Replace mbicursor.usalote With .F.
					Replace mbicursor.lobs With Alltrim(m.lineordernumber)
					Replace mbicursor.litem With Alltrim(m.embalagem)
					Replace mbicursor.Lordem With 0
					Replace mbicursor.partes With 0
					Replace mbicursor.cativo With .F.

					Replace mbicursor.dedata With Dtoc(m.dedata)
					Replace mbicursor.atedata With Dtoc(m.atedata)

					If Empty(m.ref)
						Select mbicursor
						Replace mbicursor.tabiva With 2
					Endif

					Do u_bottdeb With 'mbicursor'

			Endcase
		Endfor

		m.eancl= m.OROOT.selectNodes("Documento/eancliente").Item(0).Text

		TEXT to m.cSel noshow textmerge
              select cl.no,nome,morada,local,codpost,pncont,ncont from cl where cl.eancl='<<Alltrim(m.eancl)>>' and cl.estab=0
		ENDTEXT

		If u_sqlexec(m.cSel,"cliente")
			If Reccount("cliente")>0
				Select cliente
				m.no=cliente.no
				m.nome=cliente.Nome
				m.morada=cliente.morada
				m.local=cliente.Local
				m.codpost=cliente.codpost
				m.codpais=cliente.pncont
				m.ncont=cliente.ncont
			Endif
		Endif


		TEXT to m.cSel noshow textmerge
                   select isnull(max(bo.obrano),0) as obrano from bo where bo.ndos=1 and bo.boano=year(getdate())
		ENDTEXT

		If u_sqlexec(m.cSel,"dossier") And Reccount("dossier")>0
			Select dossier
			m.obrano=dossier.obrano+1
		Endif


		** DEFINE DOCUMENT TO IMPORT
		m.ndos=1

		* preencher alguns campos do cabeçalho (mbocursor)
		Select mbocursor
		Append Blank
		Replace mbocursor.no With m.no
		Replace mbocursor.estab With 0
		Replace mbocursor.memissao With 'EURO'
		Replace mbocursor.dataobra With Ctod(m.datadoc)
		Replace mbocursor.dataopen With Ctod(m.datadoc)
		Replace mbocursor.datafinal With Ctod(m.datadoc)
		Replace mbocursor.boano With m.boano
		Replace mbocursor.obrano With m.obrano
		Replace mbocursor.obranome With m.obranome
		Replace mbocursor.Nome With m.nome
		Replace mbocursor.morada With m.morada
		Replace mbocursor.Local With m.local
		Replace mbocursor.codpost With m.codpost
		Replace mbocursor.ncont With m.ncont



		**Esta função manda uma mensagem ao utilizador enquanto é executada a importação das encomendas
		Do ACTFORM With "Estou a importar a encomenda Nº "+m.obranome+" de "+m.nome

		If Not criabobi(1,'mbicursor','mbocursor','mbo2cursor',.F.,.F.,,.F.)
			mensagem('Erro a gravar dossier','DIRECTA')
			Return
		Endif

		Set Path To "D:\Trabalho_Clientes\Caimaplas\DELFOR\"
		Rename MyFiles[i,1] To "D:\Trabalho_Clientes\Caimaplas\DELFOR\"+MyFiles[i,1]+".lido"

	Endfor

	DEACTFORM()
	MSG("Importação de encomendas terminado com sucesso.")

	sbo.Refresh
Endif
I attach my code and the small XML file so you can help me.

Thank you very much for your help.
Best regards,
Luis Santos


Hello,

Someone could help me please !

Thanks
LS
Previous
Reply
Map
View

Click here to load this message in the networking platform