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
defaulttrue
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

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

Deck of Cards
idFormas de Acesso ao RM
Card
idDataservers
labelDataservers
titleDataservers

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

 

Nota

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

Card
idProcessos
labelProcessos
titleProcessos

Processos: Expõe no wsProcess serviços do RM. Permite consumi-los através de uma requisição webservice padrão SOAP, respeitando os parâmetros de cada serviço que podem ser obtidos seguindo os passos 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. Detalhes de como criar um consulta sql podem ser obtidos clicando aqui.

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

  Passo 3:

 

 

 

Card
idPasso 3
labelPasso 3
titlePasso 3

Importando os arquivos dos aceleradores para o Fluig:

 

 

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

 

 

 

 

 

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
idPasso a Passo
1:
Card
idPasso 1
labelPasso 1
titlePasso 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 doWeb Service SAP disponibilizado para integração.

 

Nota: A criação de DataSets que consomem WebServices do RM pode ser obtidos modificando o template abaixo:

Obs: 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
titleCriar Dataset
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 o dataset...
		for each(item in xmlResultados.GETD)
		{
			dataset.addRow(new Array(
				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 RM: " + e;
		return logError(mensagemErro);
	}
}
function logError(mensagemErro)
{
	var dataset = DatasetBuilder.newDataset();
	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(dataServerService == null){
		throw "Servico nao encontrado: " + NOME_SERVICO;
	}
	
	var serviceLocator = dataServerService.instantiate(CAMINHO_SERVICO);
	if(serviceLocator == null){
		throw "Instancia do servico nao encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;
	}
	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.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
idPasso 2
labelPasso 2
titlePasso 2

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.

 

 

Nota
titleNota

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

 

 

ERP RM acessando Fluig
Âncora
ERPFluig
ERPFluig

...