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:

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:

 

Passo 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

function createDataset
Bloco de código
languagejs
themeEclipse
titleCriar Dataset
function createDataset(fields, constraints, sortFields)

{
      var NOME

	var NOME_DATASERVER = "FisEtdDataBR";

 

      try

      {

            // carrega o 

	try
	{
		// carrega o webservice...
            var authService =

		var authService = getWebService();

 

           

		//
 
 monta
 o 
 o filtro...
            var parsedConstraints =

		var parsedConstraints = parseConstraints(constraints,
 
 true);

 

           

		//
 
 faz
 a 
 a leitura...
            var result =

		var result = authService.readView(NOME_DATASERVER, parsedConstraints.filter, parsedConstraints.context);

 

           

		//
 
 carrega
 o 
 o xml...
            var xmlResultados = new XML

		var xmlResultados = new XML(result);

 

           

		//
 
 verifica
 
 se
 a tabela é 
 a tabela é válida...
            

		if(xmlResultados.GETD ==
 
 null){
                  return logError

			return logError("A tabela GETD nao foi encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO);

            }

 

           

		}
		//
 
 inicializa
 o dataset do 
 o dataset do resultado...
            var dataset =

		var dataset = DatasetBuilder.newDataset();
           

		dataset.addColumn("DESCRICAO");
           

		dataset.addColumn("CODETD");

 

           

		//
 
 preenche
 o 
 o dataset...
            for 

		for each(
item 
item in
 xmlResultados
 xmlResultados.GETD)

            {

                 

		{
			dataset.addRow(new
 Array(                       
 Array(
				item.DESCRICAO.toString()
                        ,

				, item.CODETD.toString()
                 

			));

            }

 

           

		}
		//
 
 retorna...

            return dataset;

      }

      catch 

		return dataset;
	}
	catch (e)

      {

            if 

	{
		if (e ==
 
 null)
   
	e = "Erro desconhecido!";
            var mensagemErro =

		var mensagemErro = "Ocorreu um erro ao ler dados do RM: " + e;
            return logError

		return logError(mensagemErro);
     

	}

}

function
 logError
 logError(mensagemErro)

{
      var dataset =

	var dataset = DatasetBuilder.newDataset();
     

	dataset.addColumn("erro");
     

	dataset.addRow(new
 Array
 Array(mensagemErro));
     

	log.error(mensagemErro);

      return dataset;

}

 

// carrega o web service

function getWebService(){

      var NOME_SERVICO = "WSDATASERVER";

      var CAMINHO_SERVICO =

	return dataset;
}
// carrega o web service
function getWebService(){
	var NOME_SERVICO = "WSDATASERVER";
	var CAMINHO_SERVICO = "com.totvs.WsDataServer";

 

      var dataServerService =

	var dataServerService = ServiceManager.getServiceInstance(NOME_SERVICO);
      

	if(dataServerService ==
 
 null){
            throw 

		throw "Servico nao encontrado: " + NOME_SERVICO;

      }

     

      var serviceLocator =

	}
	
	var serviceLocator = dataServerService.instantiate(CAMINHO_SERVICO);
      

	if(serviceLocator ==
 
 null){
            throw 

		throw "Instancia do servico nao encontrada: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;

      }

 

      var service =

	}
	var service = serviceLocator.getRMIwsDataServer();
        
	
	if(service ==
 
 null){
            throw 

		throw "Instancia do dataserver do invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;

      }

 

      var serviceHelper =

	}
	var serviceHelper = dataServerService.getBean();
      

	if(serviceHelper ==
 
 null){
            throw 

		throw "Instancia do service helper invalida: " + NOME_SERVICO + " - " + CAMINHO_SERVICO;

      }

 

      var authService =

	}
	var authService = serviceHelper.getBasicAuthenticatedClient(service, "com.totvs.IwsDataServer", 'mestre', 'totvs');
       
	  
	if(serviceHelper ==
 
 null){
            throw 

		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 =

	}
	
	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 

    	if (fieldName == "RMSCONTEXT")

      {

           

    	{
    		result.context = con.getInitialValue();

            continue;

      }

     

      filter += "(";

     

      if (fieldName == "RMSFILTER")

            {

            filter +=

    		continue;
    	}
    	
    	filter += "(";
    	
    	if (fieldName == "RMSFILTER")
		{
    		filter += con.getInitialValue();

            }

      else

            {

            if 

		}
    	else
		{
    		if (con.getInitialValue() == con.getFinalValue() || isEmpty(con.getFinalValue()))

                  {

                        filter +=

			{
				filter += con.getFieldName();

                        var isLike = false;

                        

				var isLike = false;
				switch(con.getConstraintType())

                        {

                             case ConstraintType.MUST:

                                   filter += " = ";

                             break;

                             case ConstraintType

				{
					case ConstraintType.MUST:
						filter += " = ";
					break;
					case ConstraintType.MUST_NOT:
                                   filter

						filter += " = ";

                             break;

                             case ConstraintType.SHOULD:

                                   filter += " LIKE ";

                                   isLike = true;

                             break;

                             case ConstraintType.SHOULD_NOT:

                                   filter += " NOT LIKE ";

                                   isLike = true;

                             break;

                        }

                        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 +=

			}
    		else
			{
    			filter += con.getFieldName();
                  filter

    			filter += " BETWEEN ";
                  filter

    			filter += getFormattedValue(con.getInitialValue(),
 
 false);
                  filter

    			filter += " AND ";
                  filter

    			filter += getFormattedValue(con.getFinalValue(),
 
 false);

                  }

            }

     

            filter += ") AND ";

      }

   

    if 

			}
		}
    	
		filter += ") AND ";
	}
    
    if (filter.length == 0)

    {

      

    {
    	if(filterRequired){
        filter =

    	  filter = "1=2";

      }

      else{

              filter =

    	}
    	else{
      	  filter = "1=1";

      }

    }

    else

      filter =

    	}
    }
    else
    	filter = filter.substring(0, filter.length-5);

   

   

    
    //
 
 guarda
 o 
 o filtro...
   

    result.filter = filter;

   

   

    
    //
 
 retorna
 o 
 o resultado...

    return result;

}

 

function isEmpty

    return result;
}
function isEmpty(str)
{    return 
 {
    return (!str || 0 === str.length);

}

 

function getFormattedValue

function getFormattedValue(value, isLike){
      

	if(isLike){
        return 

	  return "'%" + value + "%'";

      }

      else{

        return 

	}
	else{
	  return "'" + value + "'";
     

	}

}

 

...

 

 

Passo 2

 

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

...