Páginas filhas
  • Integração Fluig RM

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Deck of Cards
idPasso a Passo
Card
idPasso 1
labelPasso 1
titlePasso 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
idPasso 2
labelPasso 2
titlePasso 2

Localizando o serviço RM que deseja integrar

Âncora
FindServer
FindServer

Os serviços do RM são disponibilizados de três formas:

  1. Dataserver: Se você deseja executar operações de CRUD em algum cadastro do RM, utilize esta opção.
  2. Process: Se você precisa integrar com algum processo do RM, utilize esta opção.
  3. 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
idFormas
Card
idDataserves
labelDataserves
titleDataserves

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:

  1. GetSchema: responsável por retornar o schema (XSD) do XML necessário para salvar um registro (saverecord).
  2. 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.
  3. 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.
  4. 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:

 

 

Nota
titleNota

Importante: o passo 4 define o nome do ID que deverá ser passado no parâmetro “DataServer” dos Web Services acima.

 

 

Card
idProcessos
labelProcessos
titleProcessos

Processos: Expõe no Web Services wsProcess serviços do RM. Permite consumi-los através de uma requisição webservice no padrão SOAP, respeitando os parâmetros de cada serviço que podem ser obtidos seguindo o documento abaixo:

 

http://tdn.totvs.com.br/display/public/rm/TBC+-+Web+Service+Process

Card
idConsultaSQL
labelConsultaSQL
titleConsultaSQL

ConsultaSQL: Retorna o resultado de uma consulta SQL cadastrada no RM.

Consultas SQLs são visões de dados criados no RM considerando uma ou mais tabelas e respeitando fórmulas e contextos da aplicação.

Detalhes de como criar um consulta sql podem ser obtidos clicando aqui.

A utilização do Webse

http://tdn.totvs.com.br/display/public/rm/TBC+-+Web+Service+ConsultaSQL

 

 

 

Card
idPasso3
labelPasso 3
titlePasso 3

Importando os arquivos dos aceleradores para o Fluig:

 

Após salvar os arquivos, basta importar o projeto “*.fluigprj” para dentro do seu projeto. 

Card
idPasso 4
labelPasso 4
titlePasso 4

(OPCIONAL) " Caso deseje fazer a integração manualmente, pode se fazer 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:

 

Deck of Cards
idCriação de Script Manual
Card
idp1
labelPasso 1
Card
idp2
labelPasso 2
titlePasso 2

Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração.

Exemplo: eventos de formulário, eventos de workflow e datasets.

 

 

Nota
titleNota

Mais informações sobre customização Fluig podem ser obtidas em Customização de Workflow.

 

 

 

 

 

 

 

 

Caso deseje fazer a integração manualmente, pode se fazer 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:

 

Deck of Cards
idCriação de Script Manual
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); // carrega o xml... var xmlResultados = 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); } // inicializa o dataset do resultado... var dataset = DatasetBuilder.newDataset(); dataset.addColumn("DESCRICAO"); dataset.addColumn("CODETD"
);
		// 
preenche
monta o 
dataset
filtro...
		
for each(item in xmlResultados.GETD) { dataset.addRow(new Array( item.DESCRICAO.toString() , item.CODETD.toString() )
var parsedConstraints = parseConstraints(constraints, true);
		// faz a leitura...
		var result = authService.readView(NOME_DATASERVER, parsedConstraints.filter, parsedConstraints.context);
		
}
// 
retorna.
carrega o xml...
		
return dataset
var xmlResultados = new XML(result);
	
} catch (e) {
	// verifica se a tabela é válida...
		if
(
e
xmlResultados.GETD == null){
			
e = "Erro desconhecido!"; var mensagemErro = "Ocorreu um erro ao ler dados do RM:
return logError("A tabela GETD nao foi encontrada: " + NOME_SERVICO + " - " + 
e
CAMINHO_SERVICO);
		
return logError(mensagemErro); } } function logError(mensagemErro) { var dataset
}
		// inicializa o dataset do resultado...
		var dataset = DatasetBuilder.newDataset();
		dataset.addColumn("
erro
DESCRICAO");
		dataset.
addRow(new Array(mensagemErro)
addColumn("CODETD");
	
log.error(mensagemErro);
	
return dataset; }
// 
carrega
preenche 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: " + NOME_SERVICO
dataset...
		for each(item in xmlResultados.GETD)
		{
			dataset.addRow(new Array(
				item.DESCRICAO.toString()
				, item.CODETD.toString()
			));
		}
		// retorna...
		return dataset;
	}
	
var serviceLocator = dataServerService.instantiate(CAMINHO_SERVICO); if(serviceLocator
catch (e)
	{
		if (e == null)
{
	e = "Erro desconhecido!";
		
throw
var 
"Instancia
mensagemErro 
do
= 
servico
"Ocorreu 
nao
um 
encontrada:
erro 
"
ao 
+
ler 
NOME_SERVICO
dados 
+
do 
"
RM: 
-
" + 
CAMINHO_SERVICO
e;
		return logError(mensagemErro);
	}
}
function logError(mensagemErro)
{
	var 
service
dataset = 
serviceLocator
DatasetBuilder.
getRMIwsDataServer
newDataset();
	dataset.addColumn("erro");
	
if
dataset.addRow(
service == null){ throw "Instancia do dataserver do invalida: " +
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 
serviceHelper
dataServerService = 
dataServerService
ServiceManager.
getBean
getServiceInstance(NOME_SERVICO);
	if(
serviceHelper
dataServerService == null){
		throw "
Instancia
Servico 
do service helper invalida
nao encontrado: " + NOME
_SERVICO + " - " + CAMINHO
_SERVICO;
	}
	
	var 
authService
serviceLocator = 
serviceHelper.getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", 'mestre', 'totvs'); if(serviceHelper == null)
dataServerService.instantiate(CAMINHO_SERVICO);
	if(serviceLocator == null){
		throw "Instancia do 
auth
servico 
service
nao 
invalida
encontrada: " + 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(); if (fieldName == "RMSCONTEXT") { result.context = con.getInitialValue(); continue; } filter += "("; if (fieldName == "RMSFILTER") { filter += con.getInitialValue(); } else { if (con.getInitialValue() == 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;
var service = serviceLocator.getRMIwsDataServer();	
	if(service == null){
		throw "Instancia do dataserver do 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();
    	if (fieldName == "RMSCONTEXT")
    	{
    		result.context = con.getInitialValue();
    		continue;
    	}
    	
    	filter += "(";
    	
    	if (fieldName == "RMSFILTER")
		{
    		filter += con.getInitialValue();
		}
    	else
		{
    		if (con.getInitialValue() == con.getFinalValue() || isEmpty(con.getFinalValue()))
			{
				filter += con.getFieldName();
				var isLike = false;
				switch(con.getConstraintType())
				{
					case ConstraintType.
SHOULD_NOT
MUST:
						filter += " 
NOT
= 
LIKE
";
					
isLike = true
break;
					
break;
case ConstraintType.MUST_NOT:
		
}
				filter += 
getFormattedValue(con.getInitialValue(), isLike)
" = ";
			
}
		break;
		
else
			
{
case ConstraintType.SHOULD:
			
filter += con.getFieldName();
			filter += " 
BETWEEN
LIKE ";
						
filter
isLike 
+
= 
getFormattedValue(con.getInitialValue(), false);
true;
					break;
					case ConstraintType.SHOULD_NOT:
						filter += " NOT 
AND
LIKE ";
						isLike 
= true;
					break;
				}
				filter += getFormattedValue(con.
getFinalValue
getInitialValue(), 
false
isLike);
			}
    		else
			
}
{
    	
		filter += 
") AND "; }
con.getFieldName();
    			filter += " BETWEEN ";
    
if (filter.length == 0) {
			filter += getFormattedValue(con.getInitialValue(), false);
    	
if(filterRequired){
		filter += "
1=2
 AND ";
    			
}
filter += 
else{
getFormattedValue(con.getFinalValue(), false);
			}
		}
    
	
		filter += "
1=1
) AND ";
	}
    
}

    
else filter = filter.substring(0, filter.length-5);
if (filter.length == 0)
    {
    
// guarda o filtro... result.
	if(filterRequired){
    	  filter = 
filter
"1=2";
    	}
    
// 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
idp1
labelPasso 1

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:

Nota
titleNota

O campo “NOME_DATASERVER” é o ID obtido de acordo com o passo 2 “Localizando o serviço RM que deseja integrar

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
languagejs
themeEclipse
function createDataset(fields, constraints, sortFields)
{
	var NOME_DATASERVER = "FisEtdDataBR";
	try
	{
		// carrega o webservice...
		var authService = getWebService(
Deck of Cards
idCriação de Script Manual
Card
idp1
labelPasso 1
Nota
titleNota

O campo “NOME_DATASERVER” é o ID obtido de acordo com o passo 2 “Localizando o serviço RM que deseja integrar

Bloco de código
languagejs
themeEclipse
Card
idp2
labelPasso 2
titlePasso 2

Utilizar o serviço cadastrado nos pontos requeridos no escopo da integração.

Exemplo: eventos de formulário, eventos de workflow e datasets.

 

 

Nota
titleNota

Mais informações sobre customização Fluig podem ser obtidas em Customização de Workflow.

 

 

 

 

 

 

 

 

...

	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 + "'";
	}
}

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

...