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 EndifI attach my code and the small XML file so you can help me.