1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Variável longchar com XML para uma temp-table

Discussão em 'Progress 4GL' iniciado por noellen, Novembro 12, 2013.

  1. noellen

    noellen Equipe de Suporte Moderador Equipe de Suporte

    Olá, boa tarde,

    por favor, alguém tem algum exemplo de como transformo os dados de um xml que está vindo numa variável longchar (incluindo as tags) em uma temp-table apenas com os dados?

    desde já, obrigada.


    Att.
  2. Agnaldo

    Agnaldo Membro Ativo

    Tu podes usar os recursos da versão 10, ref. a dataset.
    Ele possui métodos de read/write (read-xml e write-xml).

    Por exemplo:
    O código abaixo ira gerar um xml para aquivo:
    Código:
    DEFINE VARIABLE retorno AS LOGICAL.
    
    DEFINE TEMP-TABLE ttCli XML-NODE-NAME "cliente"
          FIELD codigo  LIKE Customer.cust-num
          FIELD nome    LIKE Customer.name
          FIELD pais    LIKE Customer.country.
    
    DEFINE DATASET dtsCli FOR ttCli.
    
    FOR EACH Customer NO-LOCK:
        CREATE ttCli.
        ASSIGN ttCli.Codigo = Customer.Cust-num
              ttCli.nome  = Customer.NAME
              ttCli.pais  = Customer.Country.
    END.
    
    /* Gera o XML em c:\temp\arquivo.xml */
    ASSIGN retorno = DATASET dtsCli:WRITE-XML("file",'c:\temp\arquivo.xml',YES,"utf-8",?,NO,NO).
      
    Ira gerar algo assim:

    Código:
    <?xml version="1.0" encoding="UTF-8"?>
    <dtsCli xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <cliente>
        <codigo>1</codigo>
        <nome>Lift Line Skiing</nome>
        <pais>USA</pais>
      </cliente>
      <cliente>
        <codigo>2</codigo>
        <nome>Urpon Frisbee</nome>
        <pais>Finland</pais>
      </cliente>
      <cliente>
        <codigo>3</codigo>
        <nome>Hoops Croquet Co.</nome>
        <pais>USA</pais>
      </cliente>
       .
       .
       .
      
    E para ler, do arquivo em disco, poderias usar:

    Código:
    DEFINE VARIABLE retorno AS LOGICAL.
    
    DEFINE TEMP-TABLE ttCli XML-NODE-NAME "cliente"
          FIELD codigo  LIKE Customer.cust-num
          FIELD nome    LIKE Customer.name
          FIELD pais    LIKE Customer.country.
    
    DEFINE DATASET dtsCli FOR ttCli.
    
    ASSIGN retorno = DATASET dtsCli:READ-XML("file","c:\temp\arquivo.xml","empty",?,?,?,?).
    
    FOR EACH ttCli:
        DISPLAY ttCli.
    END.
    
    Uma variante disso, usando uma longchar, poderia ser:

    Código:
    DEFINE VARIABLE retorno    AS LOGICAL.
    DEFINE VARIABLE varLongChar AS LONGCHAR.
    
    DEFINE TEMP-TABLE ttCli XML-NODE-NAME "cliente"
          FIELD codigo  LIKE Customer.cust-num
          FIELD nome    LIKE Customer.name
          FIELD pais    LIKE Customer.country.
    
    DEFINE DATASET dtsCli FOR ttCli.
    
    COPY-LOB FROM FILE "c:\temp\arquivo.xml" TO varLongChar.
    
    ASSIGN retorno = DATASET dtsCli:READ-XML("longchar",varLongChar,"empty",?,?,?,?).
    
    FOR EACH ttCli:
        DISPLAY ttCli.
    END.
    
    Note que o xml (e a temp) são estruturas bem simples.
    Com um pouco de esforço deve ser possível trabalhar com estuturas bem mais complexas.

    Eu uso os recursos da API do StarWeb FrameWork para esses casos.
    Pra mim é mais simples e flexivel, podendo ainda ser executada sobre Progress 9.
    noellen e fdantas curtiram isso.
  3. arnaldolima

    arnaldolima Sem Pontuação

  4. arnaldolima

    arnaldolima Sem Pontuação

    Agnaldo ,

    Bom dia, dentro deste seu exemplo do XML do Customer, como faria para colocar dentro de cada cliente os pedidos e as duplicatas em aberto:

    <cliente>
    <pedidos do cliente>
    <titulos do cliente>

    Mais ou menos assim.

    Agradeço antecipadamente a atenção.

    Arnaldo.
  5. noellen

    noellen Equipe de Suporte Moderador Equipe de Suporte

    Agnaldo, muito obrigada pelas dicas, tenho certeza que serão úteis para muitos.

    No meu caso em específico, não estou trabalhando com arquivo, e sim com parametros/variaveis, é aquele WebService que ainda está me perseguindo sabe kkkkk :D

    Mas enfim, encontrei como fazer, me indicaram utilizar a utp/ut-genxml2.p, mas vimos que a utp/utapi021.p faz aparentemente a mesma coisa, então fiquei com a segunda.

    O Manual de Construção de Adapters, no capítulo 4 descreve cada um dos métodos detalhadamente.

    Segue abaixo o código completo caso alguém precise, o fonte abaixo consome um webservice, onde obtém o retorno do xml no parâmetro return1 (uma única string), a partir dela faço a extração de cada campo do XML.

    Código:
    /*------------------------------------------------------------------------
        File        : ConsumerWS
        Description : Consumir um WS e extrair dados da string com xml
        Author(s)  : Noellen
        Created    : 06/11/2013
      ----------------------------------------------------------------------*/
    /* ***************************  Definitions  ************************** */
    
    /* Variaveis WEBService */
    DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
    DEFINE VARIABLE hIDBIws AS HANDLE NO-UNDO.
    
    /* Variaveis / parametros */
    DEFINE VARIABLE usuario AS CHARACTER NO-UNDO.
    DEFINE VARIABLE senha AS CHARACTER NO-UNDO.
    DEFINE VARIABLE CodigoConsulta AS INTEGER NO-UNDO.
    DEFINE VARIABLE Valor1 AS CHAR NO-UNDO.
    DEFINE VARIABLE Valor2 AS CHARACTER NO-UNDO.
    DEFINE VARIABLE Valor3 AS CHARACTER NO-UNDO.
    DEFINE VARIABLE Valor4 AS CHARACTER NO-UNDO.
    DEFINE VARIABLE Valor5 AS CHARACTER NO-UNDO.
    DEFINE VARIABLE return1 AS LONGCHAR NO-UNDO.
    
    
    /*Variaveis para extrair valor string xml*/
    DEF VAR h-xml          AS HANDLE NO-UNDO.
    
    DEF TEMP-TABLE tt-campos NO-UNDO
        FIELD nome    AS CHAR  FORMAT "X(100)"
        FIELD valor    AS CHAR  FORMAT "X(100)".
    
    DEF VAR v-segmento      AS CHARACTER NO-UNDO.
    DEF VAR v-descricao    AS CHARACTER NO-UNDO.
    DEF VAR v-id            AS INTEGER  NO-UNDO.
    DEF VAR v-campos        AS CHARACTER NO-UNDO.
    DEF VAR v-cont          AS INTEGER  NO-UNDO.
    DEF VAR v-id-campo      AS INTEGER  NO-UNDO.
    DEF VAR v-nome          AS CHARACTER NO-UNDO.
    DEF VAR v-valor        AS CHARACTER NO-UNDO.
    DEF VAR v-extent        AS CHARACTER NO-UNDO.
    DEF VAR v-decimal      AS CHARACTER NO-UNDO.
    
    
    CREATE SERVER hWebService.
    hWebService:CONNECT("-WSDL 'http://ws3.smartscore.com.br/DBIws.dll/wsdl/IDBIws/'").
    
    RUN IDBIws SET hIDBIws ON hWebService.
    
      ASSIGN usuario = ""
            senha  = ""
            codigoConsulta = 1
            valor1 =  ''
            valor2 =  ''
            valor3 =  ''
            valor4 =  ''
            valor5 =  ''.
    
    RUN ConsultaOnLine IN hIDBIws(INPUT usuario, INPUT senha, INPUT CodigoConsulta, INPUT Valor1, INPUT Valor2, INPUT Valor3, INPUT Valor4, INPUT Valor5, OUTPUT return1).
    
    PROCEDURE ConsultaOnLine:
      DEFINE INPUT PARAMETER usuario AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER senha AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER CodigoConsulta AS INTEGER NO-UNDO.
      DEFINE INPUT PARAMETER Valor1 AS CHAR NO-UNDO.
      DEFINE INPUT PARAMETER Valor2 AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER Valor3 AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER Valor4 AS CHARACTER NO-UNDO.
      DEFINE INPUT PARAMETER Valor5 AS CHARACTER NO-UNDO.
      DEFINE OUTPUT PARAMETER return1 AS LONGCHAR NO-UNDO.
    END PROCEDURE.
                                           
    hWebService:DISCONNECT().
    DELETE OBJECT hWebService.
    
    RUN utp/utapi021.p PERSISTENT SET h-xml.
    
    RUN MontaTabela.
    
    
    OUTPUT TO VALUE("v:\temp\ExtraiValores.txt").
    FOR EACH tt-campos.
        DISP tt-campos WITH WIDTH 600.
    END.
    OUTPUT CLOSE.
    
    
    /*=================================================================================
                Obter os dados da string com o XML e extrair os valores
    ==================================================================================*/
    PROCEDURE MontaTabela:
    
        EMPTY TEMP-TABLE tt-campos.
    
        /* gera estrutura XML na api */
        RUN loadXMLFromString IN h-xml (return1).
    
        /* obtem segmento */
        RUN getChildrenList IN h-xml (1, OUTPUT v-segmento).
        RUN getTagName IN h-xml (INTEGER(v-segmento), OUTPUT v-descricao).
    
        /* obtem campos */
        RUN getChildrenList IN h-xml (INTEGER(v-segmento), OUTPUT v-campos).
    
        /*MESSAGE 'v-campos ' v-campos SKIP 'v-segmento ' v-segmento SKIP 'v-descricao ' v-descricao
            VIEW-AS ALERT-BOX INFO BUTTONS OK. */
    
        REPEAT v-cont = 1 TO NUM-ENTRIES(v-campos):
            v-id-campo = INTEGER(ENTRY(v-cont, v-campos)).
            RUN getTagName  IN h-xml (v-id-campo, OUTPUT v-nome).
            RUN getValue    IN h-xml (v-id-campo, OUTPUT v-valor).
            RUN getAttrValue IN h-xml (v-id-campo, "EXTENT":U, OUTPUT v-extent).       
            RUN getAttrValue IN h-xml (v-id-campo, "DECIMALS":U, OUTPUT v-decimal).
    
            /* MESSAGE 'v-nome ' v-nome SKIP 'v-valor' v-valor SKIP 'v-extente ' v-extent SKIP 'v-decimal ' v-decimal
                VIEW-AS ALERT-BOX INFO BUTTONS OK. */
    
            CREATE tt-campos.
            ASSIGN tt-campos.nome  = v-nome
                  tt-campos.valor  = v-valor.
    
        END.
        /* limpa XML */
        RUN reset IN h-xml.
    
        DELETE PROCEDURE h-xml.
    
    END PROCEDURE.
    fdantas curtiu isso.
  6. fdantas

    fdantas Administrator Moderador

    Noellen se puder coloca esse manual na área de resources. :)

Compartilhe esta Página