Tecnologia

Progress passando XML como parametro – Tipos complexos

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:

CREATE X−DOCUMENT hMyDocument.
/* pega primeira posiçao do EXTENT (primeiro conjunto de dados) para saber se tem dados */
lReturn = hMyDocument:LOAD(“longchar”,lcOutputDoc,FALSE).
IF lReturn = FALSE THEN DO:
MESSAGE “Could not load document returned from service.”
VIEW−AS ALERT−BOX.
APPLY “CLOSE”:U TO THIS−PROCEDURE.
RETURN.
END.
/* se encontrado dados, carrega os elementos do documento */
hMyDocument:GET−DOCUMENT−ELEMENT(hMyRootElement).
/* Encontrado dados e carregado os elemento do Documento na variavel tipo X−DOCUMENT,
pode−se utilizar variaveis de navegaçao tipo X−NODEREF. */
CREATE X−NODEREF hMyRootElement.
CREATE X−NODEREF hNode.
CREATE X−NODEREF hText.
/* Exemplo buscando pelo dado nesta estrutura chamado “totalOfOrders”: */
dTotal = ?.
iNumChild = 1.
/* find the element called totalOfOrders */
FindValue: DO WHILE iNumChild < = hmyrootelement:num−children:=”” br=””>
hMyRootElement:GET−CHILD(hNode,iNumChild).
IF hNode:LOCAL−NAME = “totalOfOrders” THEN DO:
hNode:GET−CHILD(hText,1).
dTotal= DECIMAL(hText:NODE−VALUE).
LEAVE FindValue.
END.
iNumChild = iNumChild + 1.
END.

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ção apenas codifica, não converte XML Schema para DTD.

Exemplo

CREATE X−DOCUMENT hMyDocument.
CREATE X−NODEREF hMyRootElement.
CREATE X−NODEREF hNode.
CREATE X−NODEREF hText.
hMyDocument:CREATE−NODE(hMyRootElement,”GetShipDate”,”ELEMENT”).
hMyDocument:APPEND−CHILD(hMyRootElement).
hMyRootElement:SET−ATTRIBUTE(“xmlns”,”urn:OpenEdgeServices:NewCoServie−WrappedDocLiteral:NewCoService−WrappedDocLiteral”).
hMyDocument:CREATE−NODE(hNode,”iInvoiceNum”,”ELEMENT”).
hMyRootElement:APPEND−CHILD(hNode).
hMyDocument:CREATE−NODE(hText,?,”TEXT”).
hText:NODE−VALUE = STRING(iInvoiceNum).
hNode:APPEND−CHILD(hText).
hMyDocument:SAVE(“longchar”,lcInputDoc).
/* now that LONGCHAR is crearted, delete the X−DOCUMENT objects */
DELETE OBJECT hNode.
DELETE OBJECT hMyRootElement.
DELETE OBJECT hText.
DELETE OBJECT hMyDocument.
/* invoke the Web service operation */
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.

Coimbra, PMP on FacebookCoimbra, PMP on LinkedinCoimbra, PMP on TwitterCoimbra, PMP on Youtube
Coimbra, PMP
Como fundador da Projetos e TI, ajudo as organizações a se tornarem ecossistemas adaptativos, responsivos e auto-organizáveis, implementando novas práticas, estruturas, ritmos e tecnologias que permitam transparência, abertura, inovação e uma forma progressiva de liderar. Caso queira saber mais entre em contato comigo, inscreva-se na minha newsletter, ou me convide para uma palestra.

Graduado em Gestão de Tecnologia pelo Centro Universitário Barão de Mauá.
Pós-Graduado em Gerenciamento de Projetos, com as práticas do PMI® pelo SENAC.

Certificado como PMP® pelo PMI®. Six Sigma White Belt pela Voitto.
Especializado em BPMN2 pela Anelox, PMCanvas pela PM2.0 e Análise de requisitos

Mentor e influenciador de gestão de projetos, agilidade e transformação digital.

Comentários

Deixe uma resposta

This site uses Akismet to reduce spam. Learn how your comment data is processed.