Você está na página 1de 45

Integrao com Aplicativos

Externos

Guia de Referncia para


Customizao
Integrao Com Aplicativos Externos

Integrao com Aplicativos


Externos

Copyright 2009 TOTVS S.A. Todos os direitos reservados.


Nenhuma parte deste documento pode ser copiada, reproduzida, traduzida ou transmitida por
qualquer meio eletrnico ou mecnico, na sua totalidade ou em parte, sem a prvia autorizao
escrita da TOTVS S.A., que reserva-se o direito de efetuar alteraes sem aviso prvio. A TOTVS
S.A no assume nenhuma responsabilidade pelas conseqncias de quaisquer erros ou
inexatides que possam aparecer neste documento.
TOTVS S.A.
Av. Santos Dumont, 831, Joinville, SC, Brasil, CEP 89.222-900

Integrao com Aplicativos


Externos

ndice
Consideraes Gerais ....................................................................... 4
Viso Geral ......................................................................................... 5
WebServices ....................................................................................... 7
Acessando os WebServices do TOTVS | ECM ............................................ 7
Via Adobe Flex .................................................................................... 7
Via Java ................................................................................................ 12
Observaes ............................................................................................ 14
Via Progress 4GL .................................................................................. 15
Acessando WebServices a partir do TOTVS | ECM................................... 18

Progress Open AppServer ............................................................ 23


Caso de Uso ................................................................................................ 23
Configurao do AppServer ........................................................................ 25
Expondo cdigos 4GL com ProxyGen ......................................................... 26
Configurando o Ambiente Progress no TOTVS | ECM ............................. 29
Configurando o Servio ............................................................................... 30
Viso geral dos Objetos Envolvidos ............................................................ 32
Procedures Persistentes e No-Persistentes .......................................... 33
Parmetros de Entrada e Sada .............................................................. 34
Construindo os Datasets.............................................................................. 34
Tipos de Centros de Custo ...................................................................... 34
Naturezas de Centro de Custo ................................................................ 36
Centros de Custo ..................................................................................... 37
Usurios em Comuns .............................................................................. 39
Service Helper ............................................................................................. 41

Links Externos ................................................................................. 43


Acesso direto a pasta .................................................................................. 43
Acesso a documentos com destino ............................................................. 43
Acesso sem efetuar login............................................................................. 43

Third Party Trademarks ................................................................... 45

Integrao com Aplicativos


Externos

Consideraes Gerais
As informaes contidas neste documento tm por objetivo demonstrar como
feita a integrao entre o TOTVS | ECM e aplicativos externos. Para que se
tenha uma compreenso completa destas informaes, alguns
conhecimentos so considerados pr-requisitos, entre eles:

Viso geral sobre o produto TOTVS | ECM

Viso geral sobre integrao de sistemas

JavaScript

WebServices

SOAP

Progress 4GL

Progress Open App Server

Progress Open Client for Java

Datasets (TOTVS | ECM)

Java

Adobe Flex

Em vrias partes deste documento sero apresentados trechos de cdigos


em diferentes linguagens de programao, com o intuito de demonstrar o uso
das capacidades de integrao do TOTVS | ECM. Entretanto, este documento
no tem por objetivo capacitar o leitor no uso destas tecnologias alm do
propsito acima descrito, sendo responsabilidade do leitor buscar informaes
aprofundadas sobre estas linguagens.
Com o intuito de facilitar o entendimento das informaes apresentadas e a
simulao dos conceitos apresentados, os exemplos citados neste documento
utilizam a funcionalidade de Datasets como exemplo de uso das capacidades
de integrao do produto. Entretanto, importante ressaltar que outros pontos
do produto possuem disponveis as mesmas caractersticas de integrao
existentes nos Datasets, em especial as customizaes de processos e
fichrios.

Integrao com Aplicativos


Externos

Viso Geral
Ainda que empricos, toda empresa possui processos de negcios que
permitem empresa cumprir o seu objetivo, seja ele a prestao de um
servio, a produo de bens materiais ou o comrcio de mercadorias. Uma
empresa possui uma infinidade de processos, sendo que cada pessoa na
organizao obrigatoriamente participa em pelo menos um destes processos,
e todos eles trocam informaes entre si em algum momento. Os processos
podem ser formais (como a contratao de um profissional) ou informais
(como um incentivo inovao), crticos (faturamento) ou satlites (controle
de envio de cartes de aniversrios).
Com o advento das tecnologias de Sistema da Informao, vrios sistemas
passaram a dar apoio a estes processos de negcio, especialmente queles
considerados mais crticos para a operao da empresa. O melhor exemplo
disto a adoo dos sistemas de ERP que do suporte aos processos de
vrias reas da empresa.
O TOTVS | ECM tem como objetivo servir de ferramenta para agilizar e
automatizar processos de negcio, especialmente aqueles que no so
atendidos plenamente pelos demais sistemas da empresa. Isto pode ser
percebido em maior ou menor grau em cada uma das suas funcionalidades,
desde as mais simples (como colaborao) at as mais complexas (como
GED e Workflow).
Entretanto, parte destes processos tm alta dependncia dos sistemas de
informao j existentes na empresa e, por isso, a arquitetura do TOTVS |
ECM planejada para permitir integrar-se a estes sistemas, permitindo que os
processos modelados tenham maior valor agregado.
O TOTVS | ECM permite tanto o acesso pelo produto aos sistemas externos
(para consultar ou alimentar informaes), bem como habilita que outros
sistemas venham a conectar-se para a consulta de informaes ou para
execuo de operaes transacionais.

Integrao com Aplicativos


Externos

Figura 1 - Diagrama geral de integrao

O principal canal de integrao do produto atravs de WebServices, que


vm se tornando o padro mais comum de integrao com qualquer
aplicativo. Atravs deles, possvel ter acesso s funcionalidades do TOTVS |
ECM e dar acesso pelo produto aplicativos externos. Este documento
dedica uma seo especfica sobre integrao via WebServices.
A outra forma de integrao via chamadas ao Progress Open AppServer e
indicada para usurios que precisem integrar o TOTVS | ECM com
aplicativos desenvolvidos nesta plataforma.

Integrao com Aplicativos


Externos

WebServices
A integrao via WebServices utiliza o protocolo SOAP e , por ser um padro
aberto, permitem que sistemas desenvolvidos em plataformas totalmente
diferentes como Java, Microsoft .Net, C, C++, PHP, Ruby, Pearl ou
Python possam trocar informaes entre si de forma transparente.

Acessando os WebServices do TOTVS | ECM


O TOTVS | ECM disponibiliza um conjunto de WebServices que permitem o
acesso s informaes do produto ou a execuo de tarefas, como iniciar
processos workflow por exemplo.
Para ter uma lista dos processos disponveis, abra o navegador no endereo
http://<host>:<porta>/webdesk/services.

Cada link apresentado direciona o browser para a URL do WSDL do servio.


O WSDL (Web Service Description Language) possui a descrio do servio
no formato XML e utilizado pelas ferramentas de desenvolvimento para a
criao dos componentes que representaro este servio.
Observao: Atente para cada tipo do atributo que esperado, por exemplo,
o atributo expirationDate do objeto DocumentDto[] uma data, porm cada
linguagem interpreta de maneira diferente, veja alguns exemplos abaixo:
C#: dateTime
Java: XMLGregorianCalendar (exemplo de utilizao)
Progress: DATETIME-TZ

Via Adobe Flex


Como a grande maioria das ferramentas de desenvolvimento, o Adobe
Flex permite criar stubs para o acesso a web services. Estes stubs
encapsulam todas as operaes de empacotamento e desempacotamento
das informaes do padro XML para os tipos nativos da plataforma.

Integrao com Aplicativos


Externos

A criao dos stubs no Flex feito no menu Data, Opo Import


WebService (WSDL), conforme a imagem abaixo.

Figura 3 Flex Builder - Criando Stubs no Flex

Na primeira janela, solicitada a pasta dentro do projeto corrente onde devem


ser gerados os stubs.

Figura 2 Flex Builder - Definindo pasta de destino

Na tela a seguir, deve ser informado o endereo do WSDL onde se encontra o


servio. Tambm possvel definir se ele ser acessado da estao cliente
ou do servidor LifeCycle Data Services.

Integrao com Aplicativos


Externos

Figura 4 Flex Builder - Informando o WSDL

Na ltima tela, deve-se informar o package que ser utilizado e qual o nome
da classe principal (j sugeridos pelo Flex Builder).

Figura 5 Flex Builder - Informando o WSDL

Integrao com Aplicativos


Externos
Uma vez finalizado o processo, o Flex Builder adicionar ao projeto um
conjunto de classes que sero utilizadas pelo programador para invocar os
servios, conforme a figura abaixo:

Figura 6 - Objetos gerados pelo Flex Builder

O trecho de cdigo abaixo apresenta um exemplo de invocao do


WebService de acesso aos Datasets do TOTVS | ECM.

<?xml version="1.0" encoding="utf-8"?>


<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
creationComplete="{this.start()}">
<mx:Script>
<![CDATA[
import generated.webservices.ValuesDto;
import generated.webservices.DatasetDto;
import generated.webservices.GetDatasetResultEvent;
import generated.webservices.SearchConstraintDtoArray;
import generated.webservices.StringArray;
import generated.webservices.DatasetServiceService;
import mx.rpc.events.FaultEvent;
import mx.collections.ArrayCollection;
/* Cria uma instncia do Stub de acesso ao servio */
private var ds:DatasetServiceService = new
DatasetServiceService();
/* Cria tipos auxiliares, que sero utilizados na chamado do servio
*/
private var fields:StringArray;
private var constraints:SearchConstraintDtoArray;
private var order:StringArray;
private var search:SearchConstraintDtoArray;
private var columnsArray:ArrayCollection;
private var valuesArray:ArrayCollection;

10

Integrao com Aplicativos


Externos
public function start() : void {
/* Busca dataset especifico */
fields = new StringArray();
constraints = new SearchConstraintDtoArray();
order = new StringArray();
/* Define as funes para tratamento do retorno */
ds.addEventListener(GetDatasetResultEvent.GetDataset_RESULT, resultGetDataset);
ds.addEventListener(FaultEvent.FAULT,faultGetDataset);
ds.getDataset(1, /* Empresa */
"adm", /* Usuario */
"adm", /* Senha */
"estados", /* Nome
Dataset */
fields, /* Campos a Retornar
*/
constraints, /* Condies de
busca */
order); /* Campos p/
Ordenao */
}
// Tratamento dos dados retornados do servio invocado.
public function resultGetDataset(ev:GetDatasetResultEvent) : void
{
/* Recupera o retorno do servio, na forma de um
DatasetDto */
var dataset:DatasetDto = ev.result as DatasetDto;
/* Determina o nmero de colunas e linhas do dataset */
columnsArray = new ArrayCollection(dataset.columns);
valuesArray = new ArrayCollection(dataset.values);
/* Monta uma string com todos os dados do dataset */
var line:String = "";
/* Cabealho com o nome dos campos */
for (var j:int=0; j<columnsArray.length; j++) {
line = line + columnsArray.getItemAt(j) + "\t";
}
line = line + "\n";
/* Linha de dados */
for (var j:int=0;j<valuesArray.length;j++) {
var row:ValuesDto = valuesArray.getItemAt(j)
as ValuesDto;
line = line + j + ":";
for (var i:int=0;i<row.length;i++) {
line = line + row.getItemAt(i) + "\t";
}
line = line + "\n";
}
/* Mostra a string criada em um textarea na tela */
this.sysout.text = line;
}
public function faultGetDataset(ev:FaultEvent) : void {
this.sysout.text = ev.fault.faultString;
}
]]>
</mx:Script>
<mx:TextArea id="sysout" name="sysout" width="100%" height="100%"

11

Integrao com Aplicativos


Externos
paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"/>
</mx:Application>

Aviso: Existe um bug do Adobe Flex que impede o funcionamento correto


de servios que trabalhem com matrizes multidimensionais de dados, como
no exemplo acima, onde retornado um array (de linhas do dataset) de array
(das colunas de cada registro).
Para contornar este problema, preciso alterar a classe gerada pelo Flex
Builder que ir encapsular o array multidimensional. No exemplo acima,
este classe a DatasetDto, que dever ser alterada conforme o exemplo
abaixo:
public class DatasetDto
{
/**
* Constructor, initializes the type class
*/
public function DatasetDto() {}
[ArrayElementType("String")]
public var columns:Array;
[ArrayElementType("ValuesDto")]
public var values:Array = new Array(); /* inicializado o array */
/* public var values:Array ; */
}

Outros servios que no trabalhem com arrays multidimensionais no exigem


alteraes no cdigo gerado.

Via Java
Existem muitas implementaes de uso de WebServices em Java e neste
exemplo vamos utilizar as bibliotecas disponveis no Java 6.
Da mesma forma como no exemplo anterior, em Adobe Flex, o primeiro
passo consiste em utilizar o endereo WSDL para a gerao dos stubs em
Java. O comando abaixo apresenta um exemplo de como gerar estes
stubs.

wsimport -d <output_directory> <wsdl_url>

12

Integrao com Aplicativos


Externos
Atravs deste comando so gerados os stubs no diretrio de destino
(output_directory), conforme a descrio do arquivo wsdl (wsdl_url).

Figura 7 - Classes geradas pelo utilitrio wsimport

A partir dos stubs gerados, possvel consumir o WebService como no


exemplo abaixo:
package ExemplosDatasetService;
import javax.xml.ws.BindingProvider;
import net.java.dev.jaxb.array.StringArray;
import com.datasul.technology.webdesk.dataservice.ws.DatasetDto;
import com.datasul.technology.webdesk.dataservice.ws.DatasetService;
import com.datasul.technology.webdesk.dataservice.ws.DatasetServiceService;
import com.datasul.technology.webdesk.dataservice.ws.SearchConstraintDtoArray;
import com.datasul.technology.webdesk.dataservice.ws.ValuesDto;
/**
* Classe para invocar servio DatasetService.
*/
public class DataServiceClient {

13

Integrao com Aplicativos


Externos
// Instancia DatasetServiceService.
DatasetServiceService datasetServiceService = new DatasetServiceService();
DatasetService service = datasetServiceService.getDatasetServicePort();
// Inicia execuo da classe.
public static void main (String args[]) {
System.out.println("\nClasse DatasetService");
// Instancia classe DatasetServiceClient.
DataServiceClient dsc = new DataServiceClient();
// Configura acesso ao WebServices.
BindingProvider bp = (BindingProvider) dsc.service;
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
"http://localhost:8080/webdesk/DatasetService");
try {
dsc.getDataset();
} catch (Exception e) {
e.printStackTrace();
}
}
// Retorna dataset.
public void getDataset() throws Exception {
System.out.println("\nMtodo getDataset\n");
/* Cria os parmetros utilizados na chamada */
StringArray fields = new StringArray();
StringArray order = new StringArray();
SearchConstraintDtoArray constraints = new SearchConstraintDtoArray();
/* Invoca o dataset */
DatasetDto result = service.getDataset(1,
/* Empresa
*/
"adm",
/* Usuario
*/
"adm",
/* Senha
*/
"colleague", /* Dataset
*/
fields,
/* Campos a Retornar*/
constraints, /* Condies
*/
order);
/* Ordem dos campos */
/* Apresenta o cabealho */
for(String columnName : result.getColumns())
System.out.print(columnName + "\t");
System.out.println();
/* Apresenta as linhas do dataset */
for(ValuesDto row : result.getValues()) {
for(Object field : row.getValue())
System.out.print(field + "\t");
System.out.println();
}
}
}

Observaes
Ao utilizar os WebServices via Java, deve-se atentar para o tipo de cada
atributo e para o tipo de retorno do WebService. Exemplos:
XMLGregorianCalendar: Utilizado ao passar valores do tipo data.

Exemplo de utilizao:

14

Integrao com Aplicativos


Externos
DocumentDto document = new DocumentDto();

XMLGregorianCalendar date;
date = DatatypeFactory.newInstance().newXMLGregorianCalendar();
date.setYear(2009);
date.setMonth(10);
date.setDay(16);
date.setHour(0);
date.setMinute(0);
date.setSecond(0);

document.setExpirationDate(date);

Via Progress 4GL


Assim como nos exemplos anteriores, o primeiro passo para consumir um
Webservice em Progress utilizar um utilitrio que ir ler o endereo WSDL
e gerar as informaes necessrias para acess-lo. Diferente do Java e
Flex, o Progress no gera objetos de stub mas apenas uma
documentao sobre como consumir os servios descritos no arquivo WSDL.
Embora em algumas situaes seja possvel utilizar os tipos nativos do
Progress como parmetros, dependendo do tipo de dado utilizado preciso
manipular o XML SOAP para extrair ou enviar uma informao.
Para gerar a documentao de um servio, deve-se utilizar o utilitrio
bprowsdldoc como no exemplo abaixo:
bprowsdldoc <URL_TO_WSDL>

Com a execuo deste utilitrio, sero gerados alguns arquivos HTML com as
informaes sobre como consumir o servio, como na imagem abaixo:

15

Integrao com Aplicativos


Externos

Figura 8 - Exemplo de Documentao do WebService gerada pelo Progress


/* Parte I Invocar o WebService */
DEFINE VARIABLE hWebService AS HANDLE NO-UNDO.
DEFINE VARIABLE hDatasetService AS HANDLE NO-UNDO.
DEFINE VARIABLE companyId AS INTEGER NO-UNDO.
DEFINE VARIABLE username AS CHARACTER NO-UNDO.
DEFINE VARIABLE password AS CHARACTER NO-UNDO.
DEFINE VARIABLE name AS CHARACTER NO-UNDO.
DEFINE VARIABLE fields1 AS CHARACTER EXTENT 0 NO-UNDO.
DEFINE TEMP-TABLE item NO-UNDO
NAMESPACE-URI ""
FIELD fieldName AS CHARACTER
FIELD finalValue AS CHARACTER
FIELD initialValue AS CHARACTER .
DEFINE DATASET constraints NAMESPACE-URI
"http://ws.dataservice.webdesk.technology.datasul.com/"
FOR item.
DEFINE VARIABLE order AS CHARACTER EXTENT 0 NO-UNDO.
DEFINE VARIABLE dataset1 AS LONGCHAR NO-UNDO.
CREATE SERVER hWebService.
hWebService:CONNECT("-WSDL
'http://norberto.datasul.net:8080/webdesk/DatasetService?wsdl'").
RUN DatasetService SET hDatasetService ON hWebService.
/* Procedure invocation of getDataset operation. */
RUN getDataset IN hDatasetService(INPUT 1,
INPUT "joyce",
INPUT "adm",
INPUT "colleague",
INPUT fields1,

16

Integrao com Aplicativos


Externos
INPUT DATASET constraints,
INPUT order,
OUTPUT dataset1).
DELETE OBJECT hDatasetService.
hWebService:DISCONNECT().
DELETE OBJECT hWebService.
/* Parte II - Faz o parser do XML e criar um arquivo separado por tabulacao */
DEFINE VARIABLE iCount
AS INTEGER
NO-UNDO.
DEFINE VARIABLE iCount2 AS INTEGER
NO-UNDO.
DEFINE VARIABLE hDoc
AS HANDLE
NO-UNDO.
DEFINE VARIABLE hRoot
AS HANDLE
NO-UNDO.
DEFINE VARIABLE hValues AS HANDLE
NO-UNDO.
DEFINE VARIABLE hEntry
AS HANDLE
NO-UNDO.
DEFINE VARIABLE hText
AS HANDLE
NO-UNDO.
DEFINE VARIABLE cValue
AS CHARACTER NO-UNDO.
OUTPUT TO c:\temp\saida.txt.
CREATE X-DOCUMENT hDoc.
hDoc:LOAD("longchar", dataset1, FALSE).
CREATE X-NODEREF hRoot.
hDoc:GET-DOCUMENT-ELEMENT(hRoot).
CREATE X-NODEREF hEntry.
CREATE X-NODEREF hText.
CREATE X-NODEREF hValues.
/* Percorre as colunas primeiro */
DO iCount = 1 TO hRoot:NUM-CHILDREN WITH 20 DOWN:
hRoot:GET-CHILD(hEntry, iCount).
IF hEntry:NAME <> "columns" THEN
NEXT.
hEntry:GET-CHILD(hText, 1).
PUT UNFORMATTED hText:NODE-VALUE "~t".
DOWN.
END.
PUT UNFORMATTED SKIP.
/* Percorre os registros <values>*/
DO iCount = 1 TO hRoot:NUM-CHILDREN WITH 20 DOWN:
hRoot:GET-CHILD(hValues, iCount).
IF hValues:NAME <> "values" THEN
NEXT.
/* Percorre os campos <value>*/
DO iCount2 = 1 TO hValues:NUM-CHILDREN:
hValues:GET-CHILD(hEntry, iCount2).
IF hEntry:NUM-CHILDREN = 0 THEN
cValue = "".
ELSE DO:
hEntry:GET-CHILD(hText, 1).
cValue = hText:NODE-VALUE.
END.
PUT UNFORMATTED cValue "~t".
END.
PUT UNFORMATTED SKIP.
END.

OUTPUT CLOSE.
DELETE OBJECT hValues.
DELETE OBJECT hText.
DELETE OBJECT hEntry.

17

Integrao com Aplicativos


Externos
DELETE OBJECT hRoot.
DELETE OBJECT hDoc.

Acessando WebServices a partir do TOTVS | ECM


O TOTVS | ECM permite fazer chamadas a WebServices de terceiros atravs
do cadastro de Servios, no Painel de Controle.

Figura 9 - Cadastro de Servios, no Painel de Controle

Para adicionar um novo WebService, preciso entrar na opo Adicionar e


informar um nome para o servio, o seu tipo (neste caso WebService), a sua
descrio e a URL para o WSDL. No exemplo abaixo, ser utilizado um
WebService pblico para consulta tabela peridica, cujo endereo do WSDL
http://www.webservicex.com/periodictable.asmx?wsdl.

18

Integrao com Aplicativos


Externos

Figura 10 - Cadastro do WebService

Com base nestas informaes, o TOTVS | ECM ir extrair as informaes


sobre o WebService informado e finalizar o cadastro deste servio.
Uma vez que o servio esteja cadastrado, possvel visualizar as classes e
mtodos disponveis neste servio e que sero utilizados nos cdigos
JavaScript que faro uso do mesmo. A tela abaixo apresenta um exemplo de
visualizao de WebService.

Figura 11 - Visualizando Classes e mtodos do Servio

19

Integrao com Aplicativos


Externos
A partir do cadastro do servio, possvel instanci-lo nos pontos onde o
TOTVS | ECM customizado utilizando-se JavaScript, como nos eventos de
fichrios, processos, ou no cadastro de Datasets. No exemplo a seguir, ser
criado um dataset que far uso deste servio para trazer os dados da tabela
peridica. Para mais informaes sobre o uso de datasets no TOTVS | ECM e
como criar Datasets customizados, verifique a documentao tcnica do
produto.
O cdigo abaixo apresenta uma implementao de exemplo do uso de um
servio na construo de um Dataset.
function createDataset(fields, constraints, sortFields) {
// Cria o dataset
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("ElementName");
// Conecta o servico e busca os livros
var periodicService = ServiceManager.getService('PeriodicTable');
var serviceHelper = periodicService.getBean();
var serviceLocator =
serviceHelper.instantiate('NET.webserviceX.www.PeriodictableLocator');
var service = serviceLocator.getperiodictableSoap();
// Invoca o servico
try {
var retorno = service.getAtoms();
var NewDataSet = new XML(retorno);
for each(elemento in NewDataSet.Table) {
newDataset.addRow(new Array(elemento.ElementName.toString()));
}
} catch(erro) {
newDataset.addRow(new Array(erro.message));
}
return newDataset;
}

O primeiro passo para invocar o servio solicitar do TOTVS | ECM que faa
a
carga
do
servio,
a
partir
do
mtodo
ServiceManager.getService('PeriodicTable'). O nome passado
como parmetro, deve ser o mesmo nome utilizado no cadastro do Servio,
no Painel de Controle.
Uma vez que o servio tenhasido carregado, utilizado o mtodo getBean()
para retornar um utilitrio para acesso s classes do servio, atravs do
mtodo instantiate. Atravs deste utilitrio, possvel instanciar objetos
disponveis e que esto listadas no cadastro do Servio, conforme a Figura
10.
Uma vez que se tenha instanciado o objeto utilitrio do servio, as classes
que devem ser instanciadas e os mtodos que devem ser invocados
dependem de cada WebService utilizado, e deve-se recorrer sua
documentao para mais informaes.
Observe na tabela abaixo, os passos exigidos pelo servio da tabela peridica
e como foi criado o cdigo do dataset.

Passo

Cdigo

var serviceLocator =
Instanciar a classe
NET.webserviceX.www.Periodicta serviceHelper.instantiate('N
ET.webserviceX.www.Periodict

20

Integrao com Aplicativos


Externos
Passo

Cdigo

bleLocator para ter acesso ao


localizador do servio.

ableLocator');

Invocar o mtodo
getperiodictableSoap para
instanciar o servio.

var service =
serviceLocator.getperiodicta
bleSoap();

Invocar o mtodo getAtoms para


ter a lista dos elementos.

var retorno =
service.getAtoms();

No caso deste servio, o mtodo getAtoms retorna uma string contendo um


XML com a lista de todos os elementos, conforme o exemplo abaixo:
<NewDataSet>
<Table>
<ElementName>Actinium</ElementName>
</Table>
<Table>
<ElementName>Aluminium</ElementName>
</Table>
..
</NewDataSet>

Para percorrer o XML e extrair o dados disponveis, so utilizadas as


funcionalidades de tratamento de XML do JavaScript que facilita a
manipulao de dados deste tipo. Para mais informaes sobre esta
funcionalidade, acesse:
http://www.ecma-international.org/publications/standards/Ecma-357.htm
http://www.xml.com/pub/a/2007/11/28/introducing-e4x.html.

ou

O exemplo abaixo apresenta o cdigo utilizado para percorrer o XML


retornado. Observe que as partes destacadas so correspondentes
estrutura do XML retornado.
var NewDataSet = new XML(retorno);
for each(elemento in NewDataSet.Table) {
newDataset.addRow(new Array(elemento.ElementName.toString()));
}

Uma vez implementado o cdigo do dataset, possvel visualiz-lo, conforme


a figura abaixo.

21

Integrao com Aplicativos


Externos

Figura 12 - Exemplo de dataset que utiliza um WebService

22

Integrao com Aplicativos


Externos

Progress Open AppServer


Assim como possvel invocar operaes em WebServices, o TOTVS | ECM
tambm permite fazer chamadas a programas em Progress 4GL (ou ABL)
expostos via Progress Open AppServer.
Nos exemplos a seguir, sero criados Datasets que, via camada de servio,
faro o acesso lgicas em 4GL que faro a extrao dos dados. Embora os
cdigos 4GL, neste exemplo, sejam muito simples, eles compreendem os
casos mais comuns exigidos no dia-a-dia, uma vez que a complexidade da
integrao se encontra nas interfaces (parmetros de entrada e sada) de
cada procedure exposta, e no na sua lgica interna.
Observe que os exemplos aqui apresentados tm por objetivo demonstrar a
dinmica de integrao entre Progress e o TOTVS | ECM sem entrar em
detalhes especficos das tecnologias envolvidas. A camada de servio
Progress do TOTVS | ECM cria uma interface em JavaScript para a
biblioteca Java Open AppServer Client, da Progress e, por isso, para mais
informaes sobre como integrar aplicativos Java e Progress consulte a
documentao fornecida pela Progress.

Caso de Uso
Os exemplos exibidos a seguir, tm por objetivo a criao de quatro datasets
no TOTVS | ECM:

1) Tipos de Centro de custo, que deve retornar os tipos de centro de


custo existentes no aplicativo em Progress (neste caso, o EMS2).
2) Natureza dos Centros de Custo, que deve retornar os tipos
possveis de natureza, conforme o aplicativo em Progress (neste
caso, o EMS2).
2

3) Centros de Custo, que deve retornar os registros na tabela conta .


4) Usurios Comuns, que deve gerar uma lista de usurios comuns
entre o TOTVS | ECM e o aplicativo em Progress (utilizando a tabela
usar_mestre).
Para os trs primeiros casos, a lgica de extrao das informaes desejadas
ser exposta em um programa com vrias procedures, uma para cada
necessidade aqui apresentada.

1 Os exemplos utilizam uma base de dados do EMS2 para consulta de centros de


custo e usurios. Entretanto, apenas duas tabelas e 6 campos so utilizados no total,
o que no deve prejudicar o entendimento da lgica pelo leitor, nem impedir a
criao de um esquema equivalente para testes, caso necessrio.
2 O cdigo apresentado para extrao dos centros de custo tem fins meramente
didticos e no pode ser considerado para uso em produo. Para ter mais
informaes sobre como extrair centros de custos do EMS2, consulte a
documentao tcnica do mesmo.

23

Integrao com Aplicativos


Externos
CostCenterUtils.p
/**************************************************************************
** Utilitrio que disponibiliza procedures para a extrao de informaes
** sobre centros de custo.
**************************************************************************/
DEFINE TEMP-TABLE ttCC NO-UNDO
FIELD conta LIKE conta.ct-codigo /* CHARACTER */
FIELD natureza LIKE conta.natureza /* INTEGER */
FIELD tipo
LIKE conta.tipo /* INTEGER */
FIELD titulo LIKE conta.titulo. /* CHARACTER */
/*------------------------------------------------------------------Procedure: readCostCenters
Objetivo: Retorna uma temp-table com a lista de centros de custo.
----------------------------------------------------------------------*/
PROCEDURE readCostCenters:
DEFINE OUTPUT PARAMETER TABLE FOR ttCC.
FOR EACH conta:
CREATE ttCC.
ASSIGN
ttCC.conta = conta.ct-codigo
ttCC.natureza = conta.natureza
ttCC.tipo = conta.tipo
ttCC.titulo = conta.titulo.
END.
END.
/*------------------------------------------------------------------Procedure: readCostNatureTypes
Objetivo: Retorna uma string com as naturezas dos centros de custo,
separadas por vrgula.
----------------------------------------------------------------------*/
PROCEDURE readCostNatureTypes:
DEFINE OUTPUT PARAMETER cNatureList AS CHARACTER NO-UNDO.
cNatureList = {adinc/i01ad047.i 03}.
END.
/*------------------------------------------------------------------Procedure: readCostTypes
Objetivo: Retorna uma string com os tipos de centro de custo,
separados por vrgula.
----------------------------------------------------------------------*/
PROCEDURE readCostTypes:
DEFINE OUTPUT PARAMETER cTypeList AS CHARACTER NO-UNDO.
cTypeList = {adinc/i02ad047.i 3}.
END.

24

Integrao com Aplicativos


Externos
No caso da extrao de usurios comuns aos dois produtos, ser utilizado um
programa nico, conforme o cdigo abaixo:
verifyUsers.p
/**************************************************************************
** Utilitrio que recebe um temp-table com uma lista de usurios e retorna
** outra, apenas com os usurios da lista que existam na base de dados.
**************************************************************************/
DEFINE TEMP-TABLE ttUsers
FIELD cod_usuar AS CHARACTER
FIELD nom_usuario AS CHARACTER
INDEX principal IS PRIMARY UNIQUE
cod_usuar.
DEFINE TEMP-TABLE ttOutUsers LIKE ttUsers.
DEFINE INPUT PARAMETER TABLE FOR ttUsers.
DEFINE OUTPUT PARAMETER TABLE FOR ttOutUsers.
FOR EACH ttUsers:
IF CAN-FIND(usuar_mestre
WHERE usuar_mestre.cod_usuar = ttUsers.cod_usuar) THEN DO:
CREATE ttOutUsers.
BUFFER-COPY ttUsers TO ttOutUsers.
END.
END.

Os dois cdigos apresentados tm diferenas significativas na forma como


so utilizados e na forma como sero expostos pelo Progress. No primeiro,
o programa carregado de forma persistente e suas procedures podem ser
executadas de forma independente. No segundo caso, o programa
executado de forma no-persistente e a lgica principal se encontra no mainblock. As procedures internas, caso existam, tm por objetivo melhorar a
organizao do cdigo e no podem ser utilizadas de forma isolada.

Configurao do AppServer
Algumas informaes importantes na configurao do AppServer:
1) O AppServer deve ser carregado no modo Stateless.
2) Na configurao do agente, no campo Propath, deve ser adicionado o
diretrio onde esto localizados os arquivos compilados (.r).
IMPORTANTE:
Quando
utilizado
um
caminho
relativo
(\\servidor\pasta), o servio Windows do Progress (AdminService)
deve ser iniciado com um usurio de rede que possua permisso de
acesso ao diretrio informado.

25

Integrao com Aplicativos


Externos
Expondo cdigos 4GL com ProxyGen
O primeiro passo para que seja possvel executar rotinas em Progress 4GL
criar a biblioteca cliente, o que feito com o uso do aplicativo ProxyGen,
3
que acompanha a instalao do Progress, conforme o exemplo abaixo :

Figura 13 - ProxyGen - Nome do Projeto

Na primeira tela do ProxyGen o principal ponto que deve ser observado o


nome do Projeto (no exemplo acima, EMSProxies). A informao deste
campo ser utilizada pelo ProxyGen para nomear a classe de acesso ao
servio, e que ser utilizada na configurao do servio no TOTVS | ECM.
Nesta tela tambm preciso configurar o PROPATH corretamente, para que
seja possvel encontrar os arquivos compilados (.r).

3 Note que dependendo da verso do Progress, as telas podem sofrer alguma


variao na quantidade e disposio dos campos. Consulte a documentao em
caso de dvida.

26

Integrao com Aplicativos


Externos

Figura 14 - ProxyGen - Incluso de procedures

A segunda etapa consiste em inserir quais procedures sero expostas de


forma persistente ou no-persistente. A escolha de qual opo utilizar
depende da forma como cada objeto exposto foi construdo.

27

Integrao com Aplicativos


Externos

Figura 15 - ProxyGen - Configurando nome do Servio

Durante o processo de gerao dos proxies, observe o campo AppService.


Este deve ser o nome do servio que deve ser publicado no AppServer, caso
contrrio no ser possvel conectar o servidor.

Figura 16 - ProxyGen - Definindo o package das classes

A ltima informao relevante para a gerao dos proxies o nome do pacote


(package) onde as classes sero criadas. Esta informao utilizada durante
a configurao do servio Progress no TOTVS | ECM.

28

Integrao com Aplicativos


Externos
Uma vez criadas as classes, preciso empacot-las em um arquivo .JAR. Isto
pode ser feito via linha de comando, utilizando-se o comando abaixo:
jar -cvf <jar_file_name> <diretrio>

Observe apenas que no arquivo gerado, preciso que as classes estejam nos
diretrios corretos. No exemplo acima, o diretrio com deve ser includo e
estar no raz do arquivo Jar.
Por ser compatvel com o formato zip, um opo gerar um arquivo com as
classes geradas (respeitando-se os diretrios) e renome-lo para a extenso
.JAR.

Configurando o Ambiente Progress no TOTVS |


ECM
Como mencionado anteriormente, a camada de servio de acesso
Progress no TOTVS | ECM baseada nas bibliotecas Java Open AppServer
Client, da Progress. Uma vez que estas bibliotecas no so distribudas no
TOTVS | ECM, e como os arquivos que compem estas bibliotecas variam de
acordo com a verso do Progress utilizada, preciso que o usurio faa a
configurao destes ambientes no produto.
Para configurar o ambiente Progress no TOTVS | ECM, preciso identificar
quais os arquivos .JAR que so exigidos para a execuo dos proxies. A
tabela abaixo apresenta o conjunto padro de arquivos para as verses 9 e
10, embora ela possa sofrer variaes dependendo do ambiente do usurio.
Verifique a documentao do Progress em cada verso para mais detalhes.

Progress 9.X

OpenEdge 10.X

o4glrt.jar

common.jar

progress.jar

commonj.sdo.jar
ecore.change.jar
ecore.jar
ecore.resources.jar
ecore.sdo.jar
ecore.xmi.jar
o4glrt.jar
openedge.jar
progress.jar

ATENO: O conjunto de arquivos deve tambm ser copiado para a pasta


<ECM>\server\default\lib. necessrio parar o servio antes de efetuar a
cpia e reinici-lo em seguida.
No efetuando este procedimento pode ocorrer o erro:
java.lang.NoClassDefFoundError : com/progress/open4gl/SDOFactory na
execuo dos servios que utilizam este ambiente.

29

Integrao com Aplicativos


Externos
O TOTVS | ECM permite configurar mais de um ambiente Progress em uma
mesma instalao, desde que sejam fornecidos os arquivos .JAR de cada um
destes ambientes. Note, entretanto que o ambiente deve ser configurado de
acordo com a verso do ProxyGen utilizada para criao dos proxies e no
necessariamente verso do servidor de aplicao. Por exemplo, se os
proxies foram gerados com o ProxyGen na verso 9, o ambiente deve ser
configurado com esta verso, ainda que o servidor de aplicao esteja
rodando com o OpenEdge 10.
Para configurar um ambiente Progress, acesse no painel de controle a
opo Ambientes Progress, conforme a imagem abaixo:

Figura 17 Tela de Configurao dos Ambientes Progress

Onde:

Cdigo do Servio: Cdigo pelo qual o ambiente ser identificado.


Ex.: dlc101a, dlc91e, etc.

Descrio: Descrio do ambiente

Arquivos: Arquivos .JAR que compem o ambiente. Todos os


arquivos .JAR que forem necessrios para a execuo devem ser
informados.

Configurando o Servio
A configurao do Servio Progress no TOTVS | ECM permite isolar as
informaes de conexo aos servidor de aplicao da lgica que utiliza
servios nele disponibilizados. Com isto possvel alterar estas informaes
(como nome do servidor AppServer ou usurio de conexo), sem impactar as
customizaes que so baseadas neste servio.

30

Integrao com Aplicativos


Externos
O cadastrado de um servio feito no Painel de Controle, na opo Servios.
A tela abaixo apresenta os campos utilizados para o cadastro do Servio
Progress.

Figura 18 Tela de cadastro do Servio Progress

Onde:

Nome do Servio: Nome nico que ir identificar o servio no


sistema. Este nome ser utilizado nos cdigos JavaScript para ter
acesso a este servio

Descrio: Texto que descreve o servio de dados.

URL do Servio: Identifica a URL de acesso ao servio AppServer,


como por exemplo AppServer://<servidor>/<nome_servio>.
No caso de no estar utilizando o NameServer padro deve ser
informada
a
porta
de
acesso
ao
NameServer.
Ex:
AppServer://<servidor>:<porta_NameServer>/<nome_servio>.
Observe que dependendo da configurao do servio e/ou da forma
de conexo, a URL pode sofrer alteraes. Verifique a documentao
do Open AppServer para mais informaes.

Tipo do Servio: Identifica o tipo de servio (Progress ou


WebService)

Objeto Remoto: Identifica a classe de acesso do proxy. Esta classe


normalmente formada pelo nome do pacote utilizado para a gerao
das classes Proxy, mais o nome do projeto no ProxyGen. Exemplo:
Nas telas que apresentam o ProxyGen, foi utilizado o pacote
com.datasul.technology.webdesk.samples.ems, e o nome dado ao
projeto no ProxyGen foi EMSProxies. Neste caso, a classe do Objeto
remoto ser com.datasul.technology.webdesk.samples.ems.EMSProxies.

Usurio: Usurio utilizado na conexo ao servio, conforme definido

31

Integrao com Aplicativos


Externos
nas configuraes do mesmo no AppServer.

Senha: Senha utilizada na conexo ao servio, conforme definida nas


configuraes do mesmo no AppServer.

Parmetros Extras: Parmetros extras (e opcionais) utilizados para


conexo ao AppServer. Verifique a documentao do Open
AppServer para verificar as opes disponveis em cada verso do
Progress.

Ambiente Progress: Identifica o ambiente que ser utilizado neste


servio. Observe que o ambiente deve ser compatvel com a verso
do ProxyGen utilizada para gerao do proxy.

Arquivo Proxy: Arquivo .JAR contendo as classes geradas pelo


ProxyGen.

Uma vez que o servio tenha sido configurado, possvel visualizar as


classes disponveis e os mtodos existentes em cada delas. Estas
informaes so importantes para guiar o desenvolvimento dos cdigos de
customizao que faro uso deste servio. Para visualizar as classes e
mtodos do servio, clique no boto visualizar no cadastro de Servios,
conforme a tela abaixo:

Figura 19 Tela de Visualizao de Classes e mtodos do Servio Progress

Viso geral dos Objetos Envolvidos


O acesso s procedures expostas no AppServer envolve quatro elementos
que interagem entre si, conforme o diagrama abaixo:

32

Integrao com Aplicativos


Externos

Figura 20 - Viso geral de Classes

Onde:

Script Code: o cdigo em JavaScript que far uso das procedures


expostas no AppServer. Como mencionado anteriormente, este
JavaScript pode ser de qualquer natureza, como a implementao de
um Dataset ou a customizao de um Workflow.

Service
Provider:
Objeto
recuperado
via
mtodo
ServiceManager.getService e que fornece o acesso s
funcionalidades do servio. Este objeto responsvel por gerenciar a
conexo e recursos alocados pelo servio durante a execuo do
script.

Service Helper: Objeto recuperado via mtodo getBean no


ServiceProvider e que disponibiliza um conjunto de mtodos utilitrios
que permitem, entre outras coisas, criar objetos especficos do
Progress (StringHolder, ResultSetHolder, etc.), ter acesso ao objeto
remoto do ProxyGen e instanciar classes. Mais informaes sobre o
Service Helper sero apresentadas ao final deste capitulo.

ProxyGen Classes: Classes geradas pelo ProxyGen e que sero


utilizadas pelo programador para execuo das rotinas em
Progress. A lista das classes disponveis bem como os seus
mtodos, podem ser visualizados no cadastro de servio, na opo
visualizar.

Procedures Persistentes e No-Persistentes


Quando uma procedure adicionada ao projeto do ProxyGen, ela deve ser
configurada em duas listas: Procedures Persistentes ou No-Persistentes.
Esta deciso implica diretamente na forma como estes objetos so acessados
pela biblioteca gerada e, consequentemente, na forma como o programador
ir acess-las nos cdigos JavaScript.
As procedures expostas de forma no-persistente do origem mtodos na
classe configurada como Objeto Remoto (ou Proxy) no Servio e a sua
execuo feita chamada ao mtodo correspondente, por exemplo:
serviceHelper.getProxy().verifyUsers(inputTT, holder).

33

Integrao com Aplicativos


Externos
As procedures expostas de forma persistente do origem novas classes que
podem ser instanciadas via chamadas a mtodos no Objeto Remoto (verifique
os mtodos disponveis da classe na opo Visualizar do cadastro de
Servios), ou via o mtodo createManagedObject. A chamada via o mtodo
createManagedObject permite que o TOTVS | ECM tenha controle sobre o
ciclo de vida deste objeto, liberando-o automaticamente ao fim do mtodo.
Caso o objeto seja instanciado manualmente, o programador deve codificar a
liberao do objeto (mtodo _release()), sob pena de bloquear um novo agente
do AppServer a cada invocao do mtodo.

Parmetros de Entrada e Sada


Outro ponto importante na invocao das rotinas em 4GL observar quais os
tipos de parmetros de entrada e sada de cada procedure ou programa.
Dependendo do tipo de dado (CHARACTER, INTEGER, TEMP-TABLE, etc.),
do tipo de parmetro (INPUT, INPUT-OUTPUT, BUFFER, etc.) e da verso
utilizada do Progress, a forma de se manipular estes parmetros pode
variar.
Para os tipos mais simples, como strings, datas ou valores inteiros, o
ProxyGen utiliza um mapeamento direto para os tipos ou classes padres da
linguagem Java. Para tipos complexos, como temp-tables e buffers, o
ProxyGen utiliza classes que fazem parte da biblioteca de runtime destes
servios.
Quando os parmetros so de entrada e sada (INPUT-OUTPUT) ou de sada
(OUTPUT), os tipos primitivos precisam ser substitudos por classes
Holders, que contero o valor retornado aps a execuo do mtodo. Os
exemplos mais comuns so StringHolder ou ResultSetHolder.
Os tipos de dados utilizados em cada mtodo podem ser consultadom na
opo visualizar do cadastro de servio. Observe que dependendo da verso
do Progress pode haver variao nos tipos de parmetros utilizados e na
forma de utiliz-los. Em caso de dvida, consulte a documentao fornecida
pela Progress.

Construindo os Datasets
Uma vez que o servio tenha sido configurado no TOTVS | ECM, possvel
utiliz-lo em qualquer ponto do produto onde sejam inseridos cdigos
JavaScript para execuo no lado servidor (em especial, nas customizaes
de fichrios, processos e na construo de Datasets).
A forma de se invocar as rotinas expostas pelo servio sempre a mesma,
independente de qual ponto est sendo chamado. Entretanto, para facilitar o
entendimento do uso dos servios no produto e facilitar a reproduo dos
exemplos apresentados no ambiente do cliente, todos os exemplos abaixo
utilizaro Datasets como alvo.
Conforme visto anteriormente, os Datasets que sero apresentados aqui so
Tipos de Centro de Custo, Natureza dos Centros de Custo, Centros de
Custo, Usurios em Comum.

Tipos de Centros de Custo


O cdigo abaixo apresenta a implementao do Dataset de Tipos de Centro
de custo. A explicao de cada passo da implementao ser apresentada a
seguir:

34

Integrao com Aplicativos


Externos
function createDataset(fields, constraints, sortFields) {
// Passo 1 - Recupera o servio cadastrado no Painel de Controle
var servico = ServiceManager.getService("ems2_v10");
// Passo 2 - Carrega o objeto utilitrio para integrao com Progress
var serviceHelper = servico.getBean();
// Passo 3 - Carrega a procedure persistente CostCenterUtils.p
var remoteObj = serviceHelper.createManagedObject("CostCenterUtils");
// Passo 4 - Invoca a procedure que retorna uma string com os tipos de CC
var types = serviceHelper.createStringHolder();
remoteObj.readCostTypes(types);
// Passo 5 - Quebra a string em um array com cada um dos tipos
var typeArray = types.getStringValue().split(",");
// Passo 6 - Cria o Dataset e adiciona cada tipo retornado
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("id");
newDataset.addColumn("descricao");
for(var pos = 0; pos < typeArray.length; pos++) {
newDataset.addRow(new Array(pos + 1, typeArray[pos]));
}
return newDataset;
}

Onde:

Passo 1 Nesta etapa feita a invocao do servio configurado no


Painel de Controle (getService). Note que neste ponto no preciso
informar qualquer parmetro de conexo ao servio, uma vez que isto
j foi feito no seu cadastro.

Passo 2 feita a carga do objeto utilitrio para Servios Progress


(getBean). Este utilitrio disponibiliza uma srie de mtodos que
facilitam a interao com o proxy gerado e seus mtodos sero
apresentados em mais detalhes adiante neste documento.

Passo 3 Faz a carga do objeto CostCenterUtils de forma


gerenciada, atravs do mtodo (createManagedObject).

Passo 4 Invoca o mtodo desejado (readCostTypes) passando um


StringHolder que ir receber o valor de sada.

Passo 5 Transforma a string recebida por parmetro em um array


com as opes. O caractere , utilizado para determinar os pontos
de quebra da string.

Passo 6 Cria o Dataset, adiciona os campos desejados e percorre o


array criado, adicionando um alinha no dataset para cada item do
array.

A tela abaixo apresenta a visualizao dos dados do Dataset criado.

35

Integrao com Aplicativos


Externos

Figura 21 - Visualizao do Dataset de Tipos de Centros de Custo

Naturezas de Centro de Custo


O Dataset de Naturezas de Centro de Custo muito similar ao dataset de tipo
de centro de custo. Na prtica, a ltima alterao a procedure que
chamada.

function createDataset(fields, constraints, sortFields) {


var servico = ServiceManager.getService("ems2_v10");
var serviceHelper = servico.getBean();
var remoteObj = serviceHelper.createManagedObject("CostCenterUtils");
// L os tipos de contas
var types = serviceHelper.createStringHolder();
remoteObj.readCostNatureTypes(types);
var typeArray = types.getStringValue().split(",");
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("id");
newDataset.addColumn("descricao");
for(var pos = 0; pos < typeArray.length; pos++) {
newDataset.addRow(new Array(pos + 1, typeArray[pos]));
}
return newDataset;
}

Aps o cadastro do Dataset, possvel visualizar o seu contedo.

36

Integrao com Aplicativos


Externos

Figura 22 Visualizao do dataset de Naturezas de Centro de Custo

Centros de Custo
O Dataset de Centros de Custo possui uma estrutura muito semelhante aos
dois datasets vistos anteriormente. A diferena principal que, neste caso, a
procedure retorna uma temp-table com os centros de custo, o que altera a
forma como os dados so manipulados.
Dependendo da verso do Progress, os objetos utilizados podem variar. A
seguir, so apresentados exemplos da codificao no Progress 9 e
OpenEdge 10, respectivamente. Em ambos os casos, o resultado
apresentado pelo Dataset ser o mesmo.

Codificao Progress 9
As temp-table no Progress 9 so tratadas atravs de objetos que
implementam a interface java.sql.ResultSet.

function createDataset(fields, constraints, sortFields) {


// Recupera o servio e carrega o objeto remoto
var servico = ServiceManager.getService("ems2_v9");
var serviceHelper = servico.getBean();
var remoteObj = serviceHelper.createManagedObject("CostCenterUtils");
// L as contas correntes
var holder = serviceHelper.createResultSetHolder();
remoteObj.readCostCenters(holder);
// Cria a estrutura do Dataset
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("conta");
newDataset.addColumn("titulo");
newDataset.addColumn("natureza");
newDataset.addColumn("tipo");
// Percorre os registros, carregando o Dataset com os dados
var rs = holder.getResultSetValue();

37

Integrao com Aplicativos


Externos
while(rs.next()) {
var conta
= rs.getObject("conta");
var natureza = rs.getObject("natureza");
var tipo
= rs.getObject("tipo");
var titulo = rs.getObject("titulo");
newDataset.addRow(new Array(conta, titulo, natureza, tipo));
}
return newDataset;
}

Codificao OpenEdge 10
No OpenEdge 10, as temp-tables retornadas so encapsuladas como
objetos da classe ProDataGraph. Esta classe tambm utilizada quando se
utilizam parmetros do tipo DATASET.

function createDataset(fields, constraints, sortFields) {


var servico = ServiceManager.getService("ems2_v10");
var serviceHelper = servico.getBean();
var remoteObj = serviceHelper.createManagedObject("CostCenterUtils");
// L as contas correntes
var holder = serviceHelper.createProDataGraphHolder();
remoteObj.readCostCenters(holder);
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("conta");
newDataset.addColumn("titulo");
newDataset.addColumn("natureza");
newDataset.addColumn("tipo");
var ttCC = holder.getProDataGraphValue().getProDataObjects("ttCC");
for(var row_index = 0; row_index < ttCC.size(); row_index++) {
var row = ttCC.get(row_index);
newDataset.addRow(new Array(row.get("conta"),
row.get("titulo"),
row.get("natureza"),
row.get("tipo")));
}
return newDataset;
}

38

Integrao com Aplicativos


Externos

Figura 23 - Visualizao do Dataset de Centros de Custo

Usurios em Comuns
A primeira diferena entre o Dataset de usurios comuns e os exemplos
anteriores, que neste caso preciso passar uma temp-table como
parmetro para a procedure invocada.
A segunda diferena que o cdigo 4GL est implementado em um programa
no-persistente, o que altera a forma como a lgica invocada a partir do
cdigo JavaScript.
A terceira diferena que podemos observar neste caso que possvel
transformar um dataset nos tipos de dados requeridos pelo Progress
(ResultSet ou ProDataGraph).

Codificao Progress 9
function createDataset(fields, constraints, sortFields) {
// Passo 1 Recupera os usurios do TOTVS | ECM.
var campos = new Array("colleaguePK.colleagueId", "colleagueName");
var dataset = DatasetFactory.getDataset("colleague",
campos,
null,
null);
// Passo 2 - Instancia o servico
var servico = ServiceManager.getService("ems2_v9");
var serviceHelper = servico.getBean();
// Passo 3 - Transforma o dataset em um ResultSet (v9) e
// cria holder para saida
var inputTT = dataset.toResultSet();
var holder = serviceHelper.createResultSetHolder();
// Invoca a procedure no Progress
serviceHelper.getProxy().verifyUsers(inputTT, holder);
// Cria o novo Dataset
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("usuario");
newDataset.addColumn("nome");

39

Integrao com Aplicativos


Externos
var rs = holder.getResultSetValue();
while(rs.next()) {
var cod_usuar = rs.getObject("cod_usuar");
var nom_usuario = rs.getObject("nom_usuario");
newDataset.addRow(new Array(cod_usuar, nom_usuario));
}
return newDataset;
}

Codificao OpenEdge 10
function createDataset(fields, constraints, sortFields) {
// Primeiro, recupera os colaboradores correntes
var campos = new Array("colleaguePK.colleagueId", "colleagueName");
var dataset = DatasetFactory.getDataset("colleague",
campos,
null,
null);
// Instancia o servico
var servico = ServiceManager.getService("ems2_v10");
var serviceHelper = servico.getBean();
// Transforma o dataset em um ProDataGraph (v10) e cria holder para saida
var inputTT = serviceHelper.toProDataGraph(dataset);
var holder = serviceHelper.createProDataGraphHolder();
// Invoca a procedure no Progress
serviceHelper.getProxy().verifyUsers(inputTT, holder);
// Cria o novo Dataset
var newDataset = DatasetBuilder.newDataset();
newDataset.addColumn("usuario");
newDataset.addColumn("nome");
var ttCC = holder.getProDataGraphValue().getProDataObjects("ttOutUsers");
for(var row_index = 0; row_index < ttCC.size(); row_index++) {
var row = ttCC.get(row_index);
newDataset.addRow(new Array(row.get("cod_usuar"),
row.get("nom_usuario")));
}
return newDataset;
}

40

Integrao com Aplicativos


Externos

Figura 24 - Visualizao do Dataset de Usurios Comuns

Service Helper
A tabela abaixo apresenta a lista de mtodos existentes na classe utilitria
para servios Progress:

Method Summary
java.lang.Object createBigDecimalHolder()
Cria um objeto Holder para o tipo DECIMAL
java.lang.Object createBooleanHolder()
Cria um objeto Holder para o tipo LOGICAL
java.lang.Object createByteArrayHolder()
Cria um objeto Holder para o tipo RAW
java.lang.Object createCOMHandleHolder()
Cria um objeto Holder para o tipo COM-HANDLE
java.lang.Object createDateHolder()
Cria um objeto Holder para o tipo DATE
java.lang.Object createHandleHolder()
Cria um objeto Holder para o tipo WIDGET-HANDLE
(Handle)
java.lang.Object createIntHolder()
Cria um objeto Holder para o tipo INTEGER
java.lang.Object createLongHolder()
Cria um objeto Holder para o tipo RECID
java.lang.Object createManagedObject(java.lang.String
objName)

41

Integrao com Aplicativos


Externos
L um arquivo .p ou .r que tenha sido exposto via appserver
de forma persistente.
java.lang.Object createMemptrHolder()
Cria um objeto Holder para o tipo MEMPTR
java.lang.Object createProDataGraph(java.lang.Object
metadata)
Cria um objeto da classe ProDataGraph
java.lang.Object createProDataGraphHolder()
Cria um objeto Holder para o tipo ProDataGraphHolder
java.lang.Object createProDataGraphMetaData(java.lang.Stri
ng name)
Cria um objeto da classe ProDataGraphMetadata
java.lang.Object createProDataObjectMetaData(java.lang.Str
ing tableName, int numFields, boolean
bimageFlag, int numIndexes,
java.lang.String multiIxCols,
java.lang.String XMLNamespace,
java.lang.String XMLPrefix)
Cria um objeto da classe ProDataObjectMetadata Cria um
objeto para um dataset (Temp-table)
java.lang.Object createResultSetHolder()
Cria um objeto Holder para o tipo TABLE
java.lang.Object createRowidHolder()
Cria um objeto Holder para o tipo ROWID
java.lang.Object createStringHolder()
Cria um objeto Holder para o tipo CHARACTER.
java.lang.Object getProxy()
Retorna a instncia do objeto de conexo ao appserver, j
conectado e disponivel para uso.
java.lang.Object instantiate(java.lang.String className)
Instancia um objeto de uma classe dentro da biblioteca do
proxy.
java.lang.Object toProDataGraph(com.datasul.technology.web
desk.dataset.DefaultDataset d)
Transforma um dataset em um ProDataGraph.

42

Integrao com Aplicativos


Externos

Links Externos
Acesso direto a pasta
Para facilitar o acesso a uma pasta no sistema, utilizado um parmetro na
url do servidor. Sendo enviada a url <servidor>:<porta>/webdesk/
?state=navigation&folderId=<Nmero da pasta ou do documento>
Exemplo:
http://localhost:8080/webdesk/?state=navigation&folderId=8

Importante: Esta situao s vlida para sesses que estejam autenticadas.


Para sesses no autenticadas consulte o captulo Acesso sem efetuar login,
abaixo.

Acesso a documentos com destino


Para acessar um documento dentro de uma iframe do navegador, ou
utilizando links de um documento para outro, pode ser utilizado o parmetro
target, para definir o destino da URL. Os valores do target so os mesmo do
padro HTML, podendo ser:

_parent

_self

_top

_blank

Exemplo:
http://localhost:8080/webdesk/documentviewer?WDNrDocto=44056&WDNrVe
rsao=1000&target=_blank

Acesso sem efetuar login


possvel acessar o ECM externamente sem passar pela tela de login, basta
utilizar as URL's informando o token de acesso. O token deve ser gerado
utilizando o webservice TokenService do ECM. Para mais informaes
consultar o Guia de Referncia Utilizao de Webservices.

Os acessos disponveis so:


ECM:
http://<servidor>:<porta>/josso/signon/ExternalLogin.do?t=<token
gerado>&josso_cmd=true&josso_back_to=/webdesk/

43

Integrao com Aplicativos


Externos
Navegao posicionada em pasta:
http://<servidor>:<porta>/josso/signon/ExternalLogin.do?t=<token
gerado>&josso_cmd=true&josso_back_to=/webdesk?state=navigation%26fold
erId=<nmero da pasta>

Aba de visualizao do fluxo do processo


http://<servidor>:<porta>/josso/signon/ExternalLogin.do?t=<token
gerado>&josso_cmd=true&josso_back_to=/webdesk/workflowstate?p=<cdig
o do processo>

Aba de visualizao do fluxo do processo de uma solicitao aberta:


http://<servidor>:<porta>/josso/signon/ExternalLogin.do?t=<token
gerado>&josso_cmd=true&josso_back_to=/webdesk/workflowstate?pi=<nme
ro da solicitao>

44

Integrao com Aplicativos


Externos

Third Party Trademarks


Adobe, Flash, Flex, Flex Builder, PostScript and Reader are either registered
trademarks or trademarks of Adobe Systems Incorporated in the United States
and/or other countries.
Apache is a trademark of The Apache Software Foundation.
Apple is a trademark of Apple Inc., registered in the U.S. and other countries
Firefox and Mozilla are registered trademarks of the Mozilla Foundation.
Google, Android and Google Chrome are trademarks of the Google Inc.
IOS is a trademark or registered trademark of Cisco in the U.S. and other
countries and is used under license
JavaScript is a trademark of Oracle Corporation.
Liferay, Liferay Portal, and the Liferay logo are trademarks or registered
trademarks of Liferay, Inc., in the United States and other countries.
Linux is the registered trademark of Linus Torvalds in the U.S. and other
countries.
Microsoft, Active Directory, Excel, Internet Explorer, Outlook, PowerPoint, SQL
Server, Windows and Windows Vista are either registered trademarks or
trademarks of Microsoft Corporation in the United States and/or other
countries.
MySQL is a trademark of Oracle Corporation and/or its affiliates.
openDBcopy is an open-source project by Anthony Smith, published under the
terms of the GNU General Public License
OpenLDAP is a registered trademark of the OpenLDAP Foundation
Oracle, Java and OpenOffice.org are registered trademarks of Oracle and/or
its affiliates. Other names may be trademarks of their respective owners.
Progress and OpenEdge are trademarks or registered trademarks of Progress
Software Corporation or one of its subsidiaries or affiliates in the U.S. and
other countries.
Red Hat and JBoss are registered trademarks of Red Hat, Inc. in the United
States and other countries.
This product includes software developed by the Visigoth Software Society
(http://www.visigoths.org/).
Any other third party trademarks are the property of their respective owners.

45

Você também pode gostar