...
Deck of Cards |
---|
|
Card |
---|
id | Passo 1 |
---|
label | Passo 1 |
---|
title | Passo 1 |
---|
| Configurar o WS TOTVS Client Para que o TOTVS WS Client consiga acessar os WebServices do RM, é necessário que os mesmos estejam ativos e que o DefaultDB esteja configurado. Para saber como configurar o DefaultDB acesse o link: http://tdn.totvs.com/x/sQSqC Para uso do sistema "TOTVS WS Client" é necessário copiar os arquivos: "TotvsWSClient.exe" e "TotvsWSClient.exe.config" para a pasta RM.Net do seu ambiente configurado. Em seguida, basta editar o arquivo "TotvsWSClient.exe.config" alterando as Tag's "Host", "Port" e "WS-Server" para as configurações do ambiente desejado. Conforme exemplo abaixo: TotvsWSClient.exe.config | <?xml version="1.0"?> <configuration> <appSettings> <add key="Host" value="localhost" /> <add key="Port" value="1180" /> <add key="EnableCompression" value="False" /> <add key="WS-Server" value="http://localhost:8051" /> <add key="WS-UserName" value="mestre" /> <add key="WS-DataServerName" value="GlbUsuarioData" /> <add key="WS-ProcessName" value="GlbAcessoData" /> <add key="WS-CodColigadaSQL" value="" /> <add key="WS-CodSistemaSQL" value="" /> </appSettings> </configuration> |
|
|
Card |
---|
id | Passo 2 |
---|
label | Passo 2 |
---|
title | Passo 2 |
---|
| Localizando o serviço RM que deseja integrar Os serviços do RM são disponibilizados de três formas: - Dataserver: Se você deseja executar operações de CRUD em algum cadastro do RM, utilize esta opção.
- Process: Se você precisa integrar com algum processo do RM (ex: baixa de lançamento, faturar movimento etc), utilize esta opção.
- Consulta SQL: Caso deseje retornar alguma informação do RM que não esteja normalizada em cadastro ou que exista uma Consulta SQL cadastrada, utilize esta opção. Mais informações, clique aqui.
Deck of Cards |
---|
| Card |
---|
id | Dataserves |
---|
label | Dataserves |
---|
title | Dataserves |
---|
| 1) DataServers: Todos os CRUDS dos cadastros desenvolvidos na tecnologia .NET do RM são disponibilizados através do Web Services WsDataServer. Basicamente, oferece quatro métodos principais: - GetSchema: responsável por retornar o schema (XSD) do XML necessário para salvar um registro (saverecord).
- ReadView: responsável por efetuar a leitura do cadastro do RM e retornar um XML contendo registros de acordo com o contexto e o filtro informado.
- ReadRecord: responsável por efetuar a leitura do cadastro do RM e retornar um XML contendo registros de acordo com a chave primária e o contexto informado.
- SaveRecord: responsável por efetuar alterações de registros do cadastro do RM de acordo com o XML informado.
A lista de dataservers (com o ID) disponíveis pode ser obtido aqui ou usando a opção de localizar do aplicativo “TOTVS WS Client” conforme imagem abaixo: ![](/download/attachments/219682921/image2015-12-8%2016%3A19%3A22.png?version=1&modificationDate=1449591596000&api=v2) Nota |
---|
| Importante: o passo 4 define o nome do ID que deverá ser passado no parâmetro “DataServer” dos Web Services acima. |
|
|
|
Card |
---|
id | Passo3 |
---|
label | Passo 3 |
---|
title | Passo 3 |
---|
| Importando os arquivos dos aceleradores para o Fluig: Após a escolha de um cadastro (proveniente de um Dataserver), a opção "Aceleradores Fluig" ficará disponível e permitirá gerar os arquivos de integração do Fluig com o RM. Para ser exato, o aplicativo gera o formulário que expõem os campos marcados como visíveis no TOTVSWSCLIENT, o scritp que consome o Web Service que provê os dados e a classe de Datasets de comunicação com os lookups do RM. Você poderá modificar estes arquivos de acordo com a necessidade de cada projeto e usá-los apenas como ponto de partida para a sua implementação.
![](/download/attachments/219682921/image2015-12-8%2016%3A23%3A26.png?version=1&modificationDate=1449591840000&api=v2)
Após salvar os arquivos, basta importar o projeto “*.fluigprj” para dentro do seu projeto. | card
id Passo 4 |
label | Passo 4 |
---|
title | Passo 4 |
(OPCIONAL) "
Caso deseje fazer a integração manualmente, seguir os passos abaixo:
Deck of Cards |
---|
id | Criação de Script Manual |
---|
|
Card |
---|
| Card |
---|
id | p2 |
---|
label | Passo 2 |
---|
title | Passo 2 |
---|
| Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração. Exemplo: eventos de formulário, eventos de workflow e datasets. |
|
|
Caso deseje fazer a integração manualmente, proceder da seguinte forma:
Fazendo a comunicação via “Web Services SOAP” do aplicativo.
Neste tipo de integração utilizando Web Service padrão SOAP disponibilizado pelo ERP, o acesso do Fluig a estes serviços é direto.
A seguir são apresentadas as configurações do Fluig para acesso ao Web Service padrão SOAP:
Cadastrar um serviço do tipo Web Services dentro do Fluig pelo Fluig Studio (opção Incluir Serviços na aba Visualizar Serviços) apontando para WSDL do Web Service RM disponibilizado para integração. Para saber o nome do Web Services, bem como o WSDL, você deve seguir os passos 1 e 2 do tópico anterior. Nota: A criação de DataSets que consomem WebServices do RM pode ser obtidos modificando o template abaixo: Bloco de código |
---|
| function createDataset(fields, constraints, sortFields)
{
var NOME_DATASERVER = "FisEtdDataBR";
try
{
// carrega o webservice...
var authService = getWebService();
// monta o filtro...
var parsedConstraints = parseConstraints(constraints, true);
// faz a leitura...
var result = authService.readView(NOME_DATASERVER, parsedConstraints.filter, parsedConstraints.context);
|
|
|
Deck of Cards |
---|
id | Criação de Script Manual |
---|
|
Card |
---|
| Cadastrar um serviço do tipo Web Services dentro do Fluig pelo Fluig Studio (opção Incluir Serviços na aba Visualizar Serviços) apontando para WSDL do Web Service RM disponibilizado para integração. Nota: A criação de DataSets que consomem WebServices do RM pode ser obtidos modificando o template abaixo: Bloco de código |
---|
| function createDataset(fields, constraints, sortFields)
{
var NOME_DATASERVER = "FisEtdDataBR";
try
{
// carrega o webservicexml...
var authServicexmlResultados = new getWebServiceXML(result);
// monta o filtro verifica se a tabela é válida...
var parsedConstraints = parseConstraints(constraints, true)if(xmlResultados.GETD == null){
return logError("A tabela GETD nao foi encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO);
}
// inicializa o fazdataset ado leituraresultado...
var resultdataset = authServiceDatasetBuilder.readView(NOME_DATASERVER, parsedConstraints.filter, parsedConstraints.contextnewDataset();
dataset.addColumn("DESCRICAO");
dataset.addColumn("CODETD");
// carregapreenche o xmldataset...
varfor xmlResultadoseach(item = new XML(result);
// verifica se a tabela é válida...
if(xmlResultados.GETD == null){
return logError("A tabela GETD nao foi encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO);
in xmlResultados.GETD)
{
dataset.addRow(new Array(
item.DESCRICAO.toString()
, item.CODETD.toString()
));
}
// inicializa o dataset do resultadoretorna...
varreturn dataset = DatasetBuilder.newDataset();
dataset.addColumn("DESCRICAO");
dataset.addColumn("CODETD");
// preenche o dataset...
for each(item in xmlResultados.GETD)
{
;
}
catch (e)
{
if (e == null) e = "Erro desconhecido!";
var mensagemErro = "Ocorreu um erro ao ler dados do RM: " + e;
return logError(mensagemErro);
}
}
function logError(mensagemErro)
{
var dataset = DatasetBuilder.newDataset();
dataset.addColumn("erro");
dataset.addRow(new Array(mensagemErro));
item.DESCRICAO.toString()
, item.CODETD.toString()
));
}
// retorna...
return dataset;
}
catch (e)
{
if (e == null) e = "Erro desconhecido!";
var mensagemErro = "Ocorreu um erro ao ler dados do RMlog.error(mensagemErro);
return dataset;
}
// carrega o web service
function getWebService(){
var NOME_SERVICO = "WSDATASERVER";
var CAMINHO_SERVICO = "com.totvs.WsDataServer";
var dataServerService = ServiceManager.getServiceInstance(NOME_SERVICO);
if(dataServerService == null){
throw "Servico nao encontrado: " + eNOME_SERVICO;
return logError(mensagemErro);
}
}
function logError(mensagemErro)
{}
var datasetserviceLocator = DatasetBuilderdataServerService.newDatasetinstantiate(CAMINHO_SERVICO);
dataset.addColumn("erro");
dataset.addRow(new Array(mensagemErro));
log.error(mensagemErro);
return dataset;
}
// carrega o web service
function getWebService(){
var NOME_SERVICO = "WSDATASERVER";
var CAMINHO_SERVICO = "com.totvs.WsDataServer";
var dataServerService = ServiceManager.getServiceInstance(NOME_SERVICO);
if(dataServerServiceif(serviceLocator == null){
throw "Instancia do servico nao encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
var service = serviceLocator.getRMIwsDataServer();
if(service == null){
throw "Servico nao encontradoInstancia do dataserver do invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
var serviceLocatorserviceHelper = dataServerService.instantiategetBean(CAMINHO_SERVICO);
if(serviceLocatorserviceHelper == null){
throw "Instancia do servicoservice naohelper encontradainvalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
var serviceauthService = serviceLocatorserviceHelper.getRMIwsDataServer(getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", 'mestre', 'totvs');
if(serviceserviceHelper == null){
throw "Instancia do dataserverauth doservice invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
var serviceHelper = dataServerService.getBean();
if(serviceHelper == null){
throw "Instancia do service helper invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
var authService = serviceHelper.getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", 'mestre', 'totvs');
if(serviceHelper == null){
throw "Instancia do auth service invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
}
return authService;
}
//Transforma o conceito de constraints do Fluig para o Filtro do TBC.
function parseConstraints(constraints, filterRequired)
{
// inicializa o resultado...
var result = [];
result.context = "";
// inicializa o filtro...
var filter = "";
// varre as contraints...
for each(con in constraints) {
var fieldName = con.getFieldName().toUpperCase();
return authService;
}
//Transforma o conceito de constraints do Fluig para o Filtro do TBC.
function parseConstraints(constraints, filterRequired)
{
// inicializa o resultado...
var result = [];
result.context = "";
// inicializa o filtro...
var filter = "";
// varre as contraints...
for each(con in constraints) {
var fieldName = con.getFieldName().toUpperCase();
if (fieldName == "RMSCONTEXT")
{
result.context = con.getInitialValue();
continue;
}
filter += "(";
if (fieldName == "RMSCONTEXTRMSFILTER")
{
result.contextfilter += con.getInitialValue();
continue;}
}else
filter += "("; {
if (con.getInitialValue(fieldName) == "RMSFILTER")
{
filter += con.getInitialValue();
}
else
{
if (con.getInitialValue() == con.getFinalValue() con.getFinalValue() || isEmpty(con.getFinalValue()))
{
filter += con.getFieldName();
var isLike = false;
switch(con.getConstraintType())
{
case ConstraintType.MUST:
filter += " = ";
break;
case ConstraintType.MUST_NOT:
filter += " = ";
break;
case ConstraintType.SHOULD:
filter += " LIKE ";
isLike = true;
break;
case ConstraintType.SHOULD_NOT:
filter += " NOT LIKE ";
isLike = true;
break;
}
filter += getFormattedValue(con.getInitialValue(), isLike);
}
else
{
filter += con.getFieldName();
filter += " BETWEEN ";
filter += getFormattedValue(con.getInitialValue(), false);
filter += " AND ";
filter += getFormattedValue(con.getFinalValue(), false);
}
}
filter += ") AND ";
}
if (filter.length == 0)
{
if(filterRequired){
filter = "1=2";
}
else{
filter = "1=1";
}
}
else
filter = filter.substring(0, filter.length-5);
// guarda o filtro...
result.filter = filter;
// retorna o resultado...
return result;
}
function isEmpty(str) {
return (!str || 0 === str.length);
}
function getFormattedValue(value, isLike){
if(isLike){
return "'%" + value + "%'";
}
else{
return "'" + value + "'";
}
} |
Card |
---|
| Card |
---|
id | p2 |
---|
label | Passo 2 |
---|
title | Passo 2 |
---|
| Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração. Exemplo: eventos de formulário, eventos de workflow e datasets. |
|
|
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
...