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
CEO do portal, apaixonado por gestão de projetos, metodologias, minha família, professor, consultor, certificado PMP, Six Sigma White Belt.

Deixe uma resposta