*!*Ver PDF e Explicação 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 bo3 (nolock) where 1=0],[mbo3cursor]) u_sqlexec([select * from bi (nolock) where 1=0],[mbicursor]) **u_sqlexec([select * from bi2 (nolock) where 1=0],[mbicursor2]) * limpar os cursores Select mbocursor Delete For .T. Select mbo2cursor Delete For .T. Select mbicursor Delete For .T. **Select mbicursor2 **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.dataobra = M.OROOT.CHILDNODES(1).CHILDNODES(0).Text m.dataobra = Ctod(Substr(m.dataobra,7,2)+'.'+Substr(m.dataobra,5,2)+'.'+Substr(m.dataobra,1,4)) ** Lê a tag RequestedDeliveryDate m.dataopen = M.OROOT.CHILDNODES(1).CHILDNODES(2).Text m.dataopen = Ctod(Substr(m.dataopen,7,2)+'.'+Substr(m.dataopen,5,2)+'.'+Substr(m.dataopen,1,4)) ** Lê a tag RequestedDeliveryDueDate m.datafinal = M.OROOT.CHILDNODES(1).CHILDNODES(3).Text m.datafinal = Ctod(Substr(m.datafinal,7,2)+'.'+Substr(m.datafinal,5,2)+'.'+Substr(m.datafinal,1,4)) m.boano=Year(Date()) ** Lê a lista de OrderReferences m.ONODELIST = M.OROOT.CHILDNODES() ** Percorre a lista de OrderReferences For Each ONODE As 'MSXML2.IXMLDOMNode' In M.ONODELIST If ONODE.NODENAME="OrderReferences" Do Case Case ONODE.CHILDNODES(0).Attributes.Item(2).Text=="CDU_ECI_Sucursal" m.marca=ONODE.CHILDNODES(0).Text Case ONODE.CHILDNODES(0).Attributes.Item(2).Text=="CDU_ECI_Departamento" m.maquina=ONODE.CHILDNODES(0).Text Endcase Endif Endfor ** Lê a lista de OrderIdentities m.ONODELIST = M.OROOT.CHILDNODES() ** Percorre a lista de OrderIdentities For Each ONODE As 'MSXML2.IXMLDOMNode' In M.ONODELIST If ONODE.NODENAME="OrderIdentities" Do Case Case ONODE.CHILDNODES(0).CHILDNODES(0).Attributes.Item(0).Text=="Comprador" m.serie=ONODE.CHILDNODES(0).CHILDNODES(0).Text ** Nº do Cliente Case ONODE.CHILDNODES(0).CHILDNODES(0).Attributes.Item(0).Text=="Facturacao" m.eancl=ONODE.CHILDNODES(0).CHILDNODES(0).Text TEXT to m.cSel noshow textmerge select cl.no,nome,morada,local,codpost,pncont,ncont from cl where cl.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 ** Descrição do País TEXT to m.cSel noshow textmerge select paises.nome from paises where paises.nomeabrv='<>' ENDTEXT If u_sqlexec(m.cSel,"paisestmp") If Reccount("paisestmp")>0 Select paisestmp m.nomepais=paisestmp.Nome Endif Endif ** Local Entrega Case ONODE.CHILDNODES(0).CHILDNODES(0).Attributes.Item(0).Text=="LocalEntrega" m.glncl=ONODE.CHILDNODES(0).CHILDNODES(0).Text TEXT to m.cSel noshow textmerge select SZADRSDESC from szadrs where szadrs.u_glncl='<>' ENDTEXT If u_sqlexec(m.cSel,"temp") And Reccount("temp")>0 Select temp m.szadrsdesc=temp.szadrsdesc Endif Endcase Endif Endfor 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 ** Lê a tag MsgNumber m.obranome = M.OROOT.CHILDNODES(0).CHILDNODES(1).Text ** Nº Interno do Dossier m.ndos=1 ** Percorre a lista de OrderItems For Each ONODE As 'MSXML2.IXMLDOMNode' In M.ONODELIST If ONODE.NODENAME="OrderItem" m.ref='' Select mbicursor Append Blank Do Case Case ONODE.CHILDNODES(0).CHILDNODES(1).NODENAME=="ItemNumber" m.codigo=ONODE.CHILDNODES(0).CHILDNODES(1).Text m.design=ONODE.CHILDNODES(0).CHILDNODES(3).Text m.qtt=Val(ONODE.CHILDNODES(0).CHILDNODES(4).Text) m.edebito=Val(ONODE.CHILDNODES(0).CHILDNODES(6).Text) Replace mbicursor.ref With m.ref Replace mbicursor.Design With m.design If Substr(m.codigo,1,1)='0' Replace mbicursor.codigo With Substr(m.codigo,2,Len(m.codigo)-1) Else Replace mbicursor.codigo With m.codigo Endif Replace mbicursor.qtt With m.qtt Replace mbicursor.edebito With m.edebito Replace mbicursor.debito With m.edebito*200.482 Replace mbicursor.ettdeb With m.edebito*m.qtt Replace mbicursor.ttdeb With m.edebito*m.qtt*200.482 Replace mbicursor.stipo With 4 Replace mbicursor.armazem With 1 TEXT to m.cSel noshow textmerge select st.ref from st where st.codigo=(case when substring('<>',1,1)='0' then substring('<>',2,LEN('<>')-1) else '<>' end) ENDTEXT If u_sqlexec(m.cSel,"artigo") And Reccount("artigo")>0 Select artigo m.ref=artigo.ref Replace mbicursor.ref With m.ref Endif TEXT to m.cSel noshow textmerge select st.ref,st.tabiva,(select taxa from taxasiva where taxasiva.codigo=st.tabiva) iva from st where st.ref='<>' ENDTEXT If u_sqlexec(m.cSel,"artigos") And Reccount("artigos")>0 Select artigos Replace mbicursor.tabiva With artigos.tabiva Endif If Empty(m.ref) Select mbicursor Replace mbicursor.tabiva With 2 Endif Do u_bottdeb With 'mbicursor' Endcase Endif Endfor * 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 m.dataobra Replace mbocursor.dataopen With m.dataopen Replace mbocursor.datafinal With m.datafinal Replace mbocursor.boano With m.boano Replace mbocursor.marca With m.marca Replace mbocursor.serie With m.serie Replace mbocursor.maquina With m.maquina 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 Select mbo2cursor Append Blank Replace mbo2cursor.descar With m.szadrsdesc **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(38,'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