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

XML WebService + Progress

Discussão em 'Progress 4GL' iniciado por fernandofarah, Agosto 6, 2015.

  1. fernandofarah

    fernandofarah Membro Participativo

    Alguém possui exemplos de como o Progress trabalha com WEBServices e importação de arquivo XML?

    Obrigado!
  2. fernandofarah

    fernandofarah Membro Participativo

  3. fernandofarah

    fernandofarah Membro Participativo

    Bom, consegui!

    Abaixo fontes para se alguém precisar.

    Código:
    
    /* Cria/Escreve no XML */
    DEFINE TEMP-TABLE Pessoa
        FIELD nome    AS CHARACTER
        FIELD idade   AS INTEGER
        FIELD sexo    AS CHARACTER
        FIELD salario AS DECIMAL.
    
    DEFINE VARIABLE cTargetType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFile AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lFormatted AS LOGICAL NO-UNDO.
    DEFINE VARIABLE cEncoding AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cSchemaLocation AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lWriteSchema AS LOGICAL NO-UNDO.
    DEFINE VARIABLE lMinSchema AS LOGICAL NO-UNDO.
    DEFINE VARIABLE retOK AS LOGICAL NO-UNDO.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "carlos"
           Pessoa.idade   = 25
           Pessoa.sexo    = "m"
           Pessoa.salario = 1000.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "joao"
           Pessoa.idade   = 16
           Pessoa.sexo    = "m"
           Pessoa.salario = 500.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "rita"
           Pessoa.idade   = 32
           Pessoa.sexo    = "f"
           Pessoa.salario = 2000.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "aline"
           Pessoa.idade   = 22
           Pessoa.sexo    = "f"
           Pessoa.salario = 1270.
    
    ASSIGN
            cTargetType = "file"
            cFile = session:temp-dir + 'Pessoa.xml'
            lFormatted = YES
            cEncoding = ?
            cSchemaLocation = ?
            lWriteSchema = NO
            lMinSchema = NO.
    
    retOK = TEMP-TABLE Pessoa:WRITE-XML(cTargetType,
                                        cFile,lFormatted,
                                        cEncoding,
                                        cSchemaLocation,
                                        lWriteSchema,
                                        lMinSchema).
    
    
    /*Arquivo gerado (pessoa.xml)*/
    
    '<xml version=1.0>
    <Pessoa xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&gt;
    <PessoaRow>
    <nome>carlos</nome>
    <idade>25</idade>
    <sexo>m</sexo>
    <salario>1000.0</salario>
    </PessoaRow>
    <PessoaRow>
    <nome>joao</nome>
    <idade>16</idade>
    <sexo>m</sexo>
    <salario>500.0</salario>
    </PessoaRow>
    <PessoaRow>
    <nome>rita</nome>
    <idade>32</idade>
    <sexo>f</sexo>
    <salario>2000.0</salario>
    </PessoaRow>
    <PessoaRow>
    <nome>aline</nome>
    <idade>22</idade>
    <sexo>f</sexo>
    <salario>1270.0</salario>
    </PessoaRow>
    </Pessoa>'
    

    Código:
    /* Lê Arquivo XML */
    DEFINE VARIABLE cSourceType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cReadMode AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lOverrideDefaultMapping AS LOGICAL NO-UNDO.
    DEFINE VARIABLE cFile AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cEncoding AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cSchemaLocation AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFieldTypeMapping AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cVerifySchemaMode AS CHARACTER NO-UNDO.
    DEFINE VARIABLE retOK AS LOGICAL NO-UNDO.
    DEFINE VARIABLE httPessoa AS HANDLE NO-UNDO.
    DEFINE VARIABLE i_campos AS INTEGER.
    DEFINE VARIABLE bh                       AS HANDLE    NO-UNDO.
    DEFINE VARIABLE qh                       AS HANDLE    NO-UNDO.
    DEFINE VARIABLE fld1                     AS HANDLE    NO-UNDO.
    
    CREATE TEMP-TABLE httPessoa.
    
    ASSIGN cSourceType = 'file'
           cFile = 'pessoa.xml'
           cReadMode = 'empty'
           cSchemaLocation = 'pessoa.xsd'
           lOverrideDefaultMapping = ?
           cFieldTypeMapping = ?
           cVerifySchemaMode = ?.
    
    retOK = httPessoa:READ-XML(cSourceType,
                               cFile,
                               cReadMode,
                               cSchemaLocation,
                               lOverrideDefaultMapping,
                               cFieldTypeMapping,
                               cVerifySchemaMode).
    
    bh = httPessoa:DEFAULT-BUFFER-HANDLE.
    
    CREATE QUERY qh.
    qh:SET-BUFFERS(bh).
    qh:QUERY-PREPARE('for each ' + bh:Table).
    qh:QUERY-OPEN().
    
    REPEAT:
        qh:GET-NEXT().
        IF qh:QUERY-OFF-END THEN LEAVE.
       
            Do i_campos = 1 To bh:Num-fields:
                fld1 = bh:BUFFER-FIELD(i_campos).
                MESSAGE bh:BUFFER-FIELD(i_campos):name
                fld1:BUFFER-VALUE() VIEW-AS ALERT-BOX.
            END.
    END.
    
    qh:QUERY-CLOSE().
    bh:BUFFER-RELEASE().
    
    DELETE OBJECT httPessoa.
    DELETE OBJECT qh.
    
    
    
    Valeeu!
    renato.schlogel curtiu isso.
  4. fernandofarah

    fernandofarah Membro Participativo

    Só complementando:

    Encontrei um erro no fonte de leitura, segue o fonte corrigido:
    Código:
    DEFINE VARIABLE cSourceType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cReadMode AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lOverrideDefaultMapping AS LOGICAL NO-UNDO.
    DEFINE VARIABLE cFile AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cEncoding AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cSchemaLocation AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFieldTypeMapping AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cVerifySchemaMode AS CHARACTER NO-UNDO.
    DEFINE VARIABLE retOK AS LOGICAL NO-UNDO.
    DEFINE VARIABLE httPessoa AS HANDLE NO-UNDO.
    DEFINE VARIABLE i_campos AS INTEGER.
    DEFINE VARIABLE bh                       AS HANDLE    NO-UNDO.
    DEFINE VARIABLE qh                       AS HANDLE    NO-UNDO.
    DEFINE VARIABLE fld1                     AS HANDLE    NO-UNDO.
    
    CREATE TEMP-TABLE httPessoa.
    
    ASSIGN cSourceType = 'file'
           cFile = session:temp-dir + 'pessoa.xml'
           cReadMode = 'empty'
           cSchemaLocation = 'pessoa.xml'
           lOverrideDefaultMapping = ?
           cFieldTypeMapping = ?
           cVerifySchemaMode = ?.
    
    retOK = httPessoa:READ-XML(cSourceType,
                               cFile,
                               cReadMode,
                               "", /*cSchemaLocation,*/ /* tirei essa linha */
                               lOverrideDefaultMapping,
                               cFieldTypeMapping,
                               cVerifySchemaMode).
    
    bh = httPessoa:DEFAULT-BUFFER-HANDLE.
    
    CREATE QUERY qh.
    qh:SET-BUFFERS(bh).
    qh:QUERY-PREPARE('for each ' + bh:Table).
    qh:QUERY-OPEN().
    
    REPEAT:
        qh:GET-NEXT().
        IF qh:QUERY-OFF-END THEN LEAVE.
       
            Do i_campos = 1 To bh:Num-fields:
                fld1 = bh:BUFFER-FIELD(i_campos).
                MESSAGE bh:BUFFER-FIELD(i_campos):name
                fld1:BUFFER-VALUE() VIEW-AS ALERT-BOX.
            END.
    END.
    
    qh:QUERY-CLOSE().
    bh:BUFFER-RELEASE().
    
    DELETE OBJECT httPessoa.
    DELETE OBJECT qh.
    
    Abaixo um novo método de criação do XML utilizando o SAXWrite:
    Código:
    DEFINE VARIABLE c-msg-xml  AS MEMPTR  NO-UNDO.
    DEFINE VARIABLE hSAXWriter AS HANDLE  NO-UNDO.
    DEFINE VARIABLE lok        AS LOGICAL NO-UNDO.
    
    
    DEFINE TEMP-TABLE Pessoa
        FIELD nome    AS CHARACTER
        FIELD idade   AS INTEGER
        FIELD sexo    AS CHARACTER
        FIELD salario AS DECIMAL.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "carlos"
           Pessoa.idade   = 25
           Pessoa.sexo    = "m"
           Pessoa.salario = 1000.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "joao"
           Pessoa.idade   = 16
           Pessoa.sexo    = "m"
           Pessoa.salario = 500.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "rita"
           Pessoa.idade   = 32
           Pessoa.sexo    = "f"
           Pessoa.salario = 2000.
    
    CREATE Pessoa.
    ASSIGN Pessoa.nome    = "aline"
           Pessoa.idade   = 22
           Pessoa.sexo    = "f"
           Pessoa.salario = 1270.
    
    CREATE SAX-WRITER hSAXWriter.
    hSAXWriter:STRICT    = FALSE.
    hSAXWriter:FORMATTED = TRUE.
    
    lok = hSAXWriter:SET-OUTPUT-DESTINATION('MEMPTR', c-msg-xml).
    lok = hSAXWriter:START-DOCUMENT().
    lok = hSAXWriter:START-ELEMENT('pessoa').
    
    FOR EACH pessoa
    NO-LOCK:
    
    lok = hSAXWriter:START-ELEMENT('pessoa').
    lok = hSAXWriter:WRITE-DATA-ELEMENT('nome', pessoa.nome).
    lok = hSAXWriter:WRITE-DATA-ELEMENT('idade', string(pessoa.idade)).
    lok = hSAXWriter:WRITE-DATA-ELEMENT('sexo', pessoa.sexo).
    lok = hSAXWriter:WRITE-DATA-ELEMENT('salario', string(pessoa.salario)).
    lok = hSAXWriter:END-ELEMENT('pessoa').
    
    END.
    
    lok = hSAXWriter:END-ELEMENT('pessoa').
    lok = hSAXWriter:END-DOCUMENT().
    
    DELETE OBJECT hSAXWriter.
    
    OUTPUT TO pessoa.xml.
    
    EXPORT c-msg-xml.
    
    OUTPUT CLOSE.
    
    Todos os códigos estão funcionando perfeitamente.
    renato.schlogel e TrombiniSP curtiram isso.

Compartilhe esta Página