ATOUTFOX
COMMUNAUTÉ FRANCOPHONE DES PROFESSIONNELS FOXPRO
Visual FoxPro : le développement durable

Forum AtoutFox : importer um fichier XML   

Sujet

rss Flux RSS des derniers messages

Vous devez vous identifier pour pouvoir poser une question ou répondre.

mer. 28 septembre 2022, 11h36
Luis
Portugal Portugal

atoutfox.public.association

importer um fichier XML

Bonjour,

j´ai developper une routine em VFP por importer um fichier XML dans mon programme, mais mon probleme cést que je n´arrive pas a créer les 6 lignes por inserer sur ma grid de lignes de mon document.
Je vou envoi mon Code e le fichier XML a importer, ainsi comme le document aprés importer avec mon code.

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. .NotFile(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

                                        *!* fonction interne pour recalculer les totals por lignes
          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


mon Fichier XML:
[vfp]
<VFPDataSet>
<Documento>
<tipodoc>DELFOR</tipodoc>
<numdoc>20220722327506185</numdoc>
<datadoc>2022-07-22</datadoc>
<dataentrega>2022-08-31</dataentrega>
<glnfornecedor>0944502672994</glnfornecedor>
<codfornecedor>20449</codfornecedor>
<eancliente>0931344844998</eancliente>
<idtransporte>093134484499800155</idtransporte>
<Linhas>
<linha>1</linha>
<referencia>Z3505505000</referencia>
<descricao>CASQUILLO ADP AR NATU EVOL J</descricao>
<quantidade>302</quantidade>
<lineordernumber>5061850</lineordernumber>
<codlocalentrega>GOU</codlocalentrega>
<numdoc>20220722327506185</numdoc>
<Embalagem>
<codembalagem>Z20CAR12</codembalagem>
<total>3000</total>
</Embalagem>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>3</quantidaderequerida>
<datarequeridainicial>20220831</datarequeridainicial>
<datarequeridafinal>20220831</datarequeridafinal>
</Etiquetas>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>0</quantidaderequerida>
<datarequeridainicial>20220905</datarequeridainicial>
<datarequeridafinal>20220911</datarequeridafinal>
</Etiquetas>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>3</quantidaderequerida>
<datarequeridainicial>20220926</datarequeridainicial>
<datarequeridafinal>20221002</datarequeridafinal>
</Etiquetas>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>3</quantidaderequerida>
<datarequeridainicial>20221010</datarequeridainicial>
<datarequeridafinal>20221016</datarequeridafinal>
</Etiquetas>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>0</quantidaderequerida>
<datarequeridainicial>20221017</datarequeridainicial>
<datarequeridafinal>20221023</datarequeridafinal>
</Etiquetas>
<Etiquetas>
<tiporequisicao>4</tiporequisicao>
<quantidaderequerida>3</quantidaderequerida>
<datarequeridainicial>20221107</datarequeridainicial>
<datarequeridafinal>20221113</datarequeridafinal>
</Etiquetas>
</Linhas>
</Documento>
</VFPDataSet>


Toutes les lignes ont les mêmes valeurs !?

Merci pour vos aides,
Luis











Permalink : http://www.atoutfox.org/nntp.asp?ID=0000020019
19 949 messages dans le forum • Liste complète des messages

Publicité

Les pubs en cours :

www.atoutfox.org - Site de la Communauté Francophone des Professionnels FoxPro - v3.4.0 - © 2004-2022.
Cette page est générée par un composant COM+ développé en Visual FoxPro 9.0-SP2-HF3