1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

  2. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Importação de XML com vários nós

Discussão em 'Progress 4GL' iniciado por willians.ambrosio, Janeiro 30, 2009.

  1. willians.ambrosio

    willians.ambrosio Sem Pontuação

    Dantas deu certo obrigado.

    Aos interessados segue fonte que importa xml com diversos nós.

    Obrigado mais uma vez Dantas.

    Att.

    Willians Ambrósio

    ____________________________________________________________________________________________________________________________-
    Código:
    FOR EACH tt-arquivo:
    
        ASSIGN c-arq = c-diretorio + tt-arquivo.descricao.
    
        RUN pi-acompanhar IN h-acomp ("Lendo... " + tt-arquivo.descricao).
    
        hXML:LOAD('FILE':U, c-arq , FALSE).
        hXML:GET-DOCUMENT-ELEMENT(hRoot).
        REPEAT iNumRecords = 1 TO hRoot:NUM-CHILDREN:
           hRoot:GET-CHILD(hRecord, iNumRecords). 
           IF hRecord:SUBTYPE NE 'ELEMENT':U THEN NEXT.
    
             REPEAT iNumFields = 1 TO hRecord:NUM-CHILDREN:  
                    hRecord:GET-CHILD(hXMLField, iNumFields).
                    IF hXMLField:SUBTYPE NE 'ELEMENT':U THEN NEXT.
    
                    REPEAT iNumValues = 1 TO hXMLField:NUM-CHILDREN:
                        hXMLField:GET-CHILD(hFieldValue, iNumValues).
    
                            /* Localiza Campos para serem Salvos */
                            IF hXMLField:NAME = "Requisicao" THEN DO:
                                CREATE tt-xml.
                                ASSIGN tt-xml.requisicao = int(hFieldValue:NODE-VALUE).
                            END.
                            IF hXMLField:NAME = "Titulo_Pdc" THEN
                                ASSIGN tt-xml.titulo = hFieldValue:NODE-VALUE.
        
                            IF hXMLField:NAME = "Id_Forma_Pagamento" THEN
                                ASSIGN tt-xml.forma-pag = int(hFieldValue:NODE-VALUE).
        
                            IF hXMLField:NAME = "Data_Vencimento" THEN
                                ASSIGN tt-xml.dt-venc = date(hFieldValue:NODE-VALUE).
        
                            IF hXMLField:NAME = "Hora_Vencimento" THEN
                                ASSIGN tt-xml.hr-venc = hFieldValue:NODE-VALUE.
        
                            IF hXMLField:NAME = "Moeda" THEN
                                ASSIGN tt-xml.moeda = hFieldValue:NODE-VALUE.
        
                            IF hXMLField:NAME = "Observacao" THEN
                                ASSIGN tt-xml.observacao = hFieldValue:NODE-VALUE.
                            
                            IF hXMLField:NAME = "Campo_Extra" THEN  DO:
                                /*Tentar localizar o valor dos filhos */
    
                               REPEAT iNumValueExtra = 1 TO hFieldValue:NUM-CHILDREN:
                                      hFieldValue:GET-CHILD(hFieldValueExtra, iNumValueExtra).
    
                                      IF hFieldValue:NAME = "Nome" THEN 
                                         ASSIGN tt-xml.nome = hFieldValueExtra:NODE-VALUE.
    
                                      IF hFieldValue:NAME = "Valor" THEN
                                         ASSIGN tt-xml.valor = dec(hFieldValueExtra:NODE-VALUE).
    
                               END.
                               
                            END.
    
                            IF hXMLField:NAME = "Item_Requisicao" THEN DO:
    
                               REPEAT iNumValueExtra = 1 TO hFieldValue:NUM-CHILDREN:
                                      hFieldValue:GET-CHILD(hFieldValueExtra, iNumValueExtra).
                                      IF hFieldValueExtra:NAME = "#comment" THEN NEXT.
    
                                       IF hFieldValue:NAME = "Codigo_Produto" THEN DO:
                                           CREATE tt-xml-filho.
                                           ASSIGN tt-xml-filho.codigo-produto = INT(hFieldValueExtra:NODE-VALUE)
                                                  i-transfer                  = INT(hFieldValueExtra:NODE-VALUE).
                                       END.
                                       IF hFieldValue:NAME = "Descricao_Produto" THEN 
                                           ASSIGN tt-xml-filho.descricao-produto = hFieldValueExtra:NODE-VALUE.
    
                                       IF hFieldValue:NAME = "Quantidade" THEN 
                                           ASSIGN tt-xml-filho.quantidade = INT(hFieldValueExtra:NODE-VALUE).
    
                                       IF hFieldValue:NAME = "Programacao_Entrega" THEN DO:
                                           
                                           REPEAT iNumValueNeto = 1 TO hFieldValueExtra:NUM-CHILDREN:
                                                  hFieldValueExtra:GET-CHILD(hFieldValueNeto, iNumValueNeto).
                                                  IF hFieldValueNeto:NAME = "#comment" THEN NEXT.
    
                                                  IF hFieldValueExtra:NAME = "Data" THEN DO:
                                                      ASSIGN i-aux-1                      = i-aux-1  +  1.
    
                                                      CREATE tt-xml-neto.
                                                      ASSIGN tt-xml-neto.Data           = DATE(hFieldValueNeto:NODE-VALUE)
                                                             tt-xml-neto.chave          = i-aux-1
                                                             tt-xml-neto.codigo-produto = i-transfer.
                                                  END.
                                                  IF hFieldValueExtra:NAME = "Quantidade" THEN DO:
                                                     FIND tt-xml-neto
                                                          WHERE tt-xml-neto.chave = i-aux-1 NO-LOCK NO-ERROR.
                                                  
                                                      IF AVAIL tt-xml-neto THEN
                                                      ASSIGN tt-xml-neto.Quantidade = int(hFieldValueNeto:NODE-VALUE).
                                                  END.
                                           END.
                                        
                                       END.
                                       IF hFieldValue:NAME = "Campo_Extra" THEN DO:
    
                                           REPEAT iNumValueNeto = 1 TO hFieldValueExtra:NUM-CHILDREN:
                                                  hFieldValueExtra:GET-CHILD(hFieldValueNeto, iNumValueNeto).
                                                  IF hFieldValueNeto:NAME = "#comment" THEN NEXT.
    
                                                  IF hFieldValueExtra:NAME = "Nome" THEN DO:
                                                      ASSIGN i-aux-2                      = i-aux-2  +  1.
    
                                                      CREATE tt-xml-neto-extra.
                                                      ASSIGN tt-xml-neto-extra.nome           = hFieldValueNeto:NODE-VALUE
                                                             tt-xml-neto-extra.chave          = i-aux-2
                                                             tt-xml-neto-extra.codigo-produto = i-transfer.
                                                  END.
                                                  IF hFieldValueExtra:NAME = "Valor" THEN DO:
                                                      FIND FIRST tt-xml-neto-extra
                                                          WHERE tt-xml-neto-extra.chave = i-aux-2 NO-LOCK NO-ERROR.
    
                                                      IF AVAIL tt-xml-neto-extra THEN 
                                                      ASSIGN tt-xml-neto-extra.Valor = DEC(hFieldValueNeto:NODE-VALUE).
                                                  END.
                                           END.
                                        
                                       END.
                               END.
    
                            END.
                    END.
             END.
        END.
    END.
    
  2. fdantas

    fdantas Administrator Moderador

    Perfeito Willians,

    Só editei seu post para colocar a Tag Code.

    Abraço e precisando estamos ai.
  3. Agnaldo

    Agnaldo Membro Ativo

    Usando a API XML do StarWeb FrameWork teu programa ficaria bem mais reduzido.
    Basicamente algo como:

    DEFINE TEMP-TABLE Cabecalho ....
    DEFINE TEMP-TABLE ItemRequisicao...
    DEFINE TEMP-TABLE MaisTabelas ...

    { cgi/xml-load.i &tabela="Cabecalho" &tabela2="ItemRequisicao" &tabela3="MaisTabelas" }

    Enfim ...
    Sem entrar muito em detalhes, bastaria definir as temp-tables e chamar a include de carga.
  4. fdantas

    fdantas Administrator Moderador

    Fala ae Agnaldo tudo bom ?

    Ja vi em outros foruns e agora aqui comentários sobre esse StarWeb, realmente parece muito interessante.

    Teria alguma maneira de testar ele ?

    Abraco
  5. willians.ambrosio

    willians.ambrosio Sem Pontuação

    Bom Dia Senhores

    Não tenho conheço esse starweb, poderia me explicar melhor sobre ele?

    Att

    Willians Ambrósio
  6. Agnaldo

    Agnaldo Membro Ativo

Compartilhe esta Página