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−children:="" br=""> |
| 33 | hMyRootElement:GET−CHILD(hNode,iNumChild). |
| 34 | |
| 35 | IF hNode:LOCAL−NAME = "totalOfOrders" THEN DO: |
| 36 | |
| 37 | hNode:GET−CHILD(hText,1). |
| 38 | |
| 39 | dTotal= DECIMAL(hText:NODE−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.
-->











Bom dia Rodrigo,
Irei testar ai te falo se consegui.
Abraços