Progress passando XML como parametro – Tipos complexos


502 visualizações

De acordo com os comentários da postagem Consumindo Webservices via OpenEdge resolvi pegar mais um pedacinho do curso e elucidar aos leitores, assinantes e companheiros do blog como trabalhar com tipos complexos via OpenEdge, lembrando que por fazer parte do curso a informação aqui inserida será utilizada para consulta, onde o desenvolvedor deverá adaptar seu código as condições abaixo citadas. Façam um bom proveito deste post e claro como sempre obrigado por comentarem e compartilhar seu conhecimento.

LONGCHAR x CHAR

O tipo LONGCHAR é um tipo complexo e comporta mais que os 32KB do CHAR.

DTD x XML Schema

Ambos são definições para o XML, onde o XML Schema é mais novo e abrange frameworks, contudo o Progress apenas trabalha com DTD. Quando se trata de tipos complexos, ou seja, criados em XML, o Progress precisa utilizar os recursos de um documento XML para poder trabalhar.

Para isto ele se utiliza:

 SQL |  Copiar código |? 
01
    CREATE X−DOCUMENT hMyDocument.
02
    /* pega primeira posiçao do EXTENT (primeiro conjunto de dados) para saber se tem dados */
03
 
04
    lReturn = hMyDocument:LOAD("longchar",lcOutputDoc,FALSE).
05
 
06
    IF lReturn = FALSE THEN DO:
07
      MESSAGE "Could not load document returned from service."
08
             VIEW−AS ALERT−BOX.
09
      APPLY "CLOSE":U TO THIS−PROCEDURE.
10
      RETURN.
11
    END.
12
 
13
    /* se encontrado dados, carrega os elementos do documento */
14
 
15
    hMyDocument:GET−DOCUMENT−ELEMENT(hMyRootElement).
16
 
17
    /* Encontrado dados e carregado os elemento do Documento na variavel tipo X−DOCUMENT,
18
       pode−se utilizar variaveis de navegaçao tipo X−NODEREF. */
19
 
20
    CREATE X−NODEREF hMyRootElement.
21
    CREATE X−NODEREF hNode.
22
    CREATE X−NODEREF hText.
23
 
24
    /* Exemplo buscando pelo dado nesta estrutura chamado "totalOfOrders": */
25
 
26
    dTotal = ?.
27
 
28
    iNumChild = 1.
29
 
30
    /* find the element called totalOfOrders */
31
 
32
    FindValue: DO WHILE iNumChild < = hmyrootelement:num&minus;children:="" br="">
33
      hMyRootElement:GET&minus;CHILD(hNode,iNumChild).
34
 
35
      IF hNode:LOCAL&minus;NAME = "totalOfOrders" THEN DO:
36
 
37
        hNode:GET&minus;CHILD(hText,1).
38
 
39
        dTotal= DECIMAL(hText:NODE&minus;VALUE).
40
 
41
        LEAVE FindValue.
42
      END.
43
 
44
      iNumChild = iNumChild + 1.
45
    END.
46
 
47

 

Este tipo de dado, a exemplo “totalOfOrders” encontramos documentado no WSDL, link GetInvoiceTotalInfo, link ArrayOfGetInvoiceTotalInfo_InvoiceTotalsRow , tópico “GetInvoiceTotalInfo_InvoiceTotalsRow type”.

Por outro lado quando se tem X-DOCUMENT para passar como parâmetro deve-se converter o formato trabalhado em XML no Progress para um formato SERIALIZADO que será reconhecido no Webservice.(no exemplo abaixo: hMyDocument:SAVE(“longchar”,lcInputDoc)).

Nota: a serializaçao apenas codifica, nao converte XML Schema para DTD.

EXEMPLO:

 SQL |  Copiar código |? 
01
  CREATE X-DOCUMENT hMyDocument.
02
  CREATE X-NODEREF hMyRootElement.
03
  CREATE X-NODEREF hNode.
04
  CREATE X-NODEREF hText.
05
 
06
  hMyDocument:CREATE-NODE(hMyRootElement,"GetShipDate","ELEMENT").
07
  hMyDocument:APPEND-CHILD(hMyRootElement).
08
 
09
  hMyRootElement:SET-ATTRIBUTE("xmlns","urn:OpenEdgeServices:NewCoServie-WrappedDocLiteral:NewCoService-WrappedDocLiteral").
10
  hMyDocument:CREATE-NODE(hNode,"iInvoiceNum","ELEMENT").
11
  hMyRootElement:APPEND-CHILD(hNode).
12
  hMyDocument:CREATE-NODE(hText,?,"TEXT").
13
 
14
  hText:NODE-VALUE = STRING(iInvoiceNum).
15
  hNode:APPEND-CHILD(hText).
16
  hMyDocument:SAVE("longchar",lcInputDoc).
17
 
18
  /* now that LONGCHAR is crearted, delete the X-DOCUMENT objects */
19
 
20
  DELETE OBJECT hNode.
21
  DELETE OBJECT hMyRootElement.
22
  DELETE OBJECT hText.
23
  DELETE OBJECT hMyDocument.
24
  /* invoke the Web service operation */
25
 
26
  RUN GetShipDate IN hPortType (INPUT lcInputDoc, OUTPUT lcOutputDoc) NO-ERROR.

Para sair apenas um INPUT e um OUTPUT com LONGCHAR, no INPUT é preciso criar os Nodes para montar o XML a enviar. E para o OUTPUT deve-se dar um LOAD no documento para ler o XML recebido.

Sobre Coimbra

Rodrigo Coimbra já escreveu 137 artigos no portal.

Administrador e fundador do site Projetos e TI. Técnico em manutenção desde 2000, graduado em Sistemas Informatizados Internet e Redes em 2005. Entusiasta de Sistemas Operacionais, principalmente OS/2 Warp, mantendo e colaborando no site OS/2 Warp Diário de bordo, Trabalha como Analista Desenvolvedor no ramo de B2B e e-Procurement, é estudioso de Wordpress e é pós graduado em Gerenciamento de Projetos. Sigam-me os Geeks @coimbrarodrigo. E veja nossos RSS no @projetoseti.

-->

1 Interação

  1. Elton disse:

    Bom dia Rodrigo,

    Irei testar ai te falo se consegui.

    Abraços

Interaja

Qual a soma entre:
4 + 1