Árvore de páginas

Versões comparadas

Chave

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

Índice

Índice
outlinetrue
stylenone
exclude.*ndice
stylenone

 

Conceito

A sincronização de datasets tem como objetivo reduzir o número de acessos a serviços de dados fornecidos por produtos externos ao Fluig. É uma prática comum trazer dados de sistemas externos para complementar informações do formulário de um processo ou realizar validações em eventos com base nas informações retornadas por este dataset. Em um exemplo mais específico vamos supor que o usuário precisa informar no formulário de seu processo o centro de custo e que a lista dos centros de custo válidos está disponível em um sistema externo. Para que este usuário consiga informar um centro de custo válido ele deverá através de um formulário acessar um campo com pesquisas que por sua vez solicita informações para o dataset que quando executado através do fluig faz acesso ao serviço de dados do sistema externo. Se este workflow possuir uma média de cinco mil abertura de processo por dia teremos pelo menos cinco mil acessos a este sistema externo que em muitos casos acaba retornando sempre as mesmas informações ou tendo uma variação muito pequena de informações entre uma consulta e outra . O desenho abaixo ilustra como funciona o ciclo de acesso do usuário a uma informação externa ao fluig.

...

RetornoMétodo e Descrição
AddColumnAddColumn(String field, DatasetFieldType type) 
Cria um campo na tabela com o nome e tipo informados. O tipo de campo pode ser omitido e neste caso o campo será criado com o tipo String. Os tipos disponíveis são :
DatasetFieldType.NUMBER
DatasetFieldType.DATE
DatasetFieldType.BOOLEAN
DatasetFieldType.STRING
setKeysetKey(Object[] fields) 
Determina quais são os campos chaves para o dataset. No banco de dados será criado um indice utilizando os campos informados neste método. Esses campos serão utilizados na localização dos registros para atualização ou remoção das linhas através dos métodos updateRow e deleteRow. Importante informar apenas campos que foram previamente definidos coma função addColumn.
addIndexaddIndex(Object[] fields) 
Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset.

Exemplo:

Bloco de código
languagejavascript
themeEclipse
languagejavascript
firstline1
linenumberstrue
function defineStructure() {
	addColumn("CE_CODIGO", DatasetFieldType.NUMBER);
	addColumn("CE_LOJA");
	addColumn("CE_NUMTIT", DatasetFieldType.NUMBER);
	addColumn("CE_PARCELA");
	addColumn("CE_PEFIXO");
	addColumn("CE_TIPO");
	addColumn("CE_VALOR", DatasetFieldType.NUMBER);
	addColumn("CE_INSS");
	addColumn("CE_ISS");
	addColumn("CE_IRRF");
	addColumn("DT_TITULO", DatasetFieldType.DATE);
	addColumn("CE_PIS");
	addColumn("CE_COFINS");
	addColumn("Logico", DatasetFieldType.BOOLEAN);
	setKey([ "CE_CODIGO", "CE_NUMTIT" ]);
	addIndex([ "CE_CODIGO" ]);
	addIndex([ "CE_CODIGO", "CE_LOJA", "CE_NUMTIT" ]);
}
Nota

Na atualização do dataset caso ocorra qualquer alteração neste método que indique alteração da estrutura da tabela ocorrerá o drop da tabela antiga e todos os dados anteriores a esta alteração serão perdidos . A alteração de estrutura da tabela ocorrerá na próxima execução da tarefa agendada de sincronização do dataset.

Nota

Lembre-se que os mones das colunas dos datasets serão os nomes das colunas criadas em banco. Lembre-se de considerar as regras de nomenclatura de campos do seu banco. Não utilizar espaços em branco no nome nem utilizar caracteres especiais como (!@#$%-+=, etc) ou palavras reservadas do banco. Ao utilizar esses valores inválidos como campos de tabela de dataset não será possível sincronizar os dados na tabela.

Nota

Não definir um campo com o nome ID. Internamente a sincronização cria um campo com este nome para fins de paginação e gerenciamento de registros. Ao criar uma metalista com este nome será gerado um erro de campo duplicado ao tentar criar a tabela de sincronização.

...

Para a transferência de dados do dataset para a tabela deverá ser definida a função onSync que será executada toda vez que a tarefa agendada for executada . Dentro desta função deverá ser criado um objeto do tipo dataset aonde deverão ser adicionas as linhas novas no método addRow e linhas a serem manutenidas nos métodos updateRow e deleteRow. Os métodos updateRow e deleteRow recebem uma lista de objetos que são os valores das linhas da mesma forma que o addRow já funciona hoje. 

Exemplo:

Bloco de código
language
languagejavascript
themeEclipse
javascriptfirstline1
linenumberstrue
function onSync(lastSyncDate) {
	var dataset = DatasetBuilder.newDataset();
	var integracao = ServiceManager.getService('FLUIG3');
	var serviceLocator = integracao
			.instantiate('pkgWkfSolicPagamento.FLUIGLocator');
	var service = serviceLocator.getFLUIGSOAP();
	var cdEmp = 1; // código empresa pagadora
	var cdFilial = 0; // todas as filiais
	var cdTitulo = 0; // todos os titulos
	var cdPrefixo = ""
	var cnpj = 0; // cnpj fornecedor
	var codForn = 0; // cod universal para todos os fornecedores
	var lojaForn = 0; // loja fornecedor
	// Invocando o servico passando a data da ultima sincronização com o fluig.
	// O webservice foi preparado para trazer apenas os dados desde a ultima
	// sincronização.
	var retorno = service.CONSPAG(cdEmp, cdFilial, cdTitulo, cdPrefixo, cnpj,
			codForn.toString(), lojaForn.toString(), lastSyncDate);
	var arrayListaTitulo = retorno.getLISTACPAG();
	for (var i = 0; i < arrayListaTitulo.length; i++) {
		var r = arrayListaTitulo[i];
		if (r.getCE_TIPO() == "ADD") {
			newDataset.addRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r
					.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r
					.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r
					.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r
					.getCE_PIS(), r.getCE_COFINS()));
		} else if (r.getCE_TIPO() == "MOD") {
			
			newDataset.updateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r
					.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r
					.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r
					.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r
					.getCE_PIS(), r.getCE_COFINS()));
			
		} else if (r.getCE_TIPO() == "DEL") {
			
			newDataset.removeRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r
					.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r
					.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r
					.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r
					.getCE_PIS(), r.getCE_COFINS()));
			
		} else {
			// Estado do registro é desconhecido no cache 
			newDataset.addOrUpdateRow(new Array(r.getCE_CODIGO(), r.getCE_LOJA(), r
					.getCE_NUMTIT(), r.getCE_PARCELA(), r.getCE_PEFIXO(), r
					.getCE_TIPO(), r.getCE_VALOR(), r.getCE_INSS(), r
					.getCE_ISS(), r.getCE_IRRF(), new java.util.Date(r.getDT_TITULO()), r
					.getCE_PIS(), r.getCE_COFINS()));
			
			
		}
	}

	return dataset;
}

...

Para realização de cópia de dados em dispositivos mobile é necessário criar a função onMobileSync que recebe o usuário logado no dispositivo como parâmetro. Neste método é possível criar constraints, definir os campos pelo qual a consulta será ordenada e definir quais campos do dataset serão armazendos no dispositivo mobile. O objetivo deste método é filtrar as informações do dataset para que seja armazenado apenas as informações relevantes para a execução do processo em dispositivo mobile.

Exemplo:

Bloco de código
languagejavascript
themeEclipselanguagejavascript
firstline1
linenumberstrue
 function onMobileSync(user) {
	var sortingFields = new Array();
	var constraintTitulo1 = DatasetFactory.createConstraint('CE_CODIGO',
			'1', '1', ConstraintType.MUST);
	var constraints = new Array(constraintTitulo1);
		
	var colunastitulo = new Array('CE_CODIGO', 'CE_LOJA', 'CE_NUMTIT', 'CE_PARCELA',
			'CE_PARCELA');
	var result = {
		'fields' : colunastitulo,
		'constraints' : constraints,
		'sortingFields' : sortingFields
	};
	return result;
} 

...