Árvore de páginas

Versões comparadas

Chave

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

...

  • Sincronização Comum: Este tipo de sincronização pode ser feita com qualquer dataset já implementado na plataforma. Neste modelo de sincronização toda vez que a tarefa agendada de sincronização de datasets for executada será criada uma nova tabela e todos os registros retornados pelo método createDataset serão copiados para esta nova tabela. A tabela anterior será removida do banco. Esse modelo não é recomendado para datasets que retornam muitos registros.

  • Sincronização Jornalizada: Este tipo de sincronização permite a atualização e cópia incremental de registros de acordo com o retorno do método onSync do dataset. Através do método defineScructure é possível definir de forma mais detalhada quais são os campos da tabela bem como seus tipos. Também é possível criar índices e uma chave principal para obter ainda mais performance durante as consultas aos dados do dataset. No método OnSync é possível determinar quais são as linhas novas a serem adicionadas na tabela como na sincronização comum. Com os métodos updateRow e deleteRow através da configuração da chave é possível atualizar registros já existentes bem como eliminar registros. Esse modelo é o recomendado para situações em que há uma grande quantidade de dados.

  • Sincronização mobile: Este modelo de sincronização pode ser utilizado com qualquer dataset, seja ele sincronizado no servidor ou não, e permite a cópia local dos registros de um dataset em um dispositivo mobile que sincronize de forma offline com o fluig. Os prazos de sincronização são configurados no aplicativo fluig Mobile.

 

Como funciona a sincronização das informações

É importante ter em mente como funciona a sincronização e gravação de informações do dataset para tabelas de banco de dados. A forma como os dados são inseridos na base de dados é gerida pelo fluig e desta forma o momento em que os registros são inseridos, editados ou excluídos no código do dataset não é o mesmo momento que na prática essas operações serão realizadas. 

Ao executar os métodos createDataset ou OnSync nas tarefas de sincronização o fluig irá montar inicialmente em memória quatro coleções de registros que são alimentadas de acordo com o comando utilizado pelo desenvolvedor :

(Andressa montar uma tabela aqui) 

Registros Novos -  addrow

Eliminados -  deleteRow

Modificados - updateRow

Modificados Ou Criados  - AddOrUpdateRow

 

Com essas coleções montadas a ordem que o fluig usa para efetivar no banco é esta :

(Andressa - outra tabela talvez com uma numeração na frente). 

Registros eliminados

Linhas Alteradas

Linhas Alteradas ou criadas

Novas linhas .

 Isso se fez necessário para que as alterações e efetivações de registros no banco sejam gerenciadas pelo fluig afim de garantir uma boa performance e obter um tempo reduzido na sincronização de informações.

 

Desenvolvendo um dataset com sincronização jornalizada

Definindo a estrutura do dataset

Para definir a estrutura de um dataset jornalizado é necessário definir a estrutura fixa da tabela no código do dataset. Para isso no código do dataset deverá ser criado o método defineScructure.

Exclusivamente dentro desta função estão disponíveis os seguintes métodos para definição da tabela:

RetornoMétodo | 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
DatasetFieldType.TEXT
setKeysetKey(Object[] fields) 
Determina quais são os campos chaves para o dataset. No banco de dados será criado um índice 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 com a função addColumn.
addIndexaddIndex(Object[] fields) 
Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset.

Exemplo:

Desenvolvendo um dataset com sincronização jornalizada

Definindo a estrutura do dataset

Para definir a estrutura de um dataset jornalizado é necessário definir a estrutura fixa da tabela no código do dataset. Para isso no código do dataset deverá ser criado o método defineScructure.

Exclusivamente dentro desta função estão disponíveis os seguintes métodos para definição da tabela:

RetornoMétodo | 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
DatasetFieldType.TEXT
setKeysetKey(Object[] fields) 
Determina quais são os campos chaves para o dataset. No banco de dados será criado um índice 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 com a função addColumn.
addIndexaddIndex(Object[] fields) 
Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset.


Exemplo:

  • A função defineStructure é obrigatória para configuração do dataset offline.
  • O tipo de campo DatasetFieldType.TEXT foi introduzido na Atualização 1.6.1 da plataforma fluig. Este tipo foi desenvolvido especificamente para sincronização de datasets em ambientes que utilizam o banco de dados Oracle, onde o tipo DatasetFieldType.STRING é limitado a apenas 255 caracteres. O tipo de campo TEXT em Oracle suporta até 4000 caracteres. Em ambientes MySQL e SQL Server, não há distinção no comportamento dos tipos TEXT e STRING.
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.
Lembre-se que os nomes 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 ou caracteres especiais como (!@#$%-+=, etc) ou palavras reservadas do banco. Caso utilize a nomenclatura não permitida, não será possível sincronizar os dados na tabela.
  • 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 ocorrerá um erro de campo duplicado ao tentar criar a tabela de sincronização.
    • Os comandos AddIndex e AddKey não irão gerar índices nas tabelas de bancos de Dados SQLServer. Os comandos podem ser implementados no código do porém os índices de tabela deverão ser criados via ferramenta de administração do banco. Os campos informados no comando addKey serão utilizados como campos para controle de registros duplicados e nas operação de adição, remoção e modificação de registros.
    Bloco de código
    languagejavascript
    themeEclipse
    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
    Bloco de código
    languagejavascript
    themeEclipse
    firstline1
    linenumberstrue
    function defineStructure() {
    	addColumn("CE_CODIGO", DatasetFieldType.NUMBER);
    	addColumn("CE_LOJAPIS");
    	addColumn("CE_NUMTITCOFINS", DatasetFieldType.NUMBER);
    	addColumn("CE_PARCELA"Logico", DatasetFieldType.BOOLEAN);
    	addColumn(setKey([ "CE_CODIGO", "CE_PEFIXONUMTIT" ]);
    	addColumnaddIndex([ "CE_TIPOCODIGO" ]);
    	addColumnaddIndex([ "CE_VALORCODIGO", DatasetFieldType.NUMBER);
    	addColumn("CE_INSS");
    	addColumn(LOJA", "CE_ISSNUMTIT");
    	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
    titleImportante

     

    Sincronização de informações

    Para a transferência de dados do dataset para a tabela, deverá ser definida a função onSync que será chamado à cada execução da tarefa agendada.

    Para que a sincronização aconteça deve ser criada uma tarefa no 'Agendador de tarefas' do fluig com o tipo 'Sincronização de dataset', selecionando qual dataset deverá ser sincronizado e em que período.

    Dentro da função onSync deverá ser criado um objeto do tipo dataset onde as novas linhas deverão ser adicionadas pelo método addRow e linhas a serem atualizadas ou removidas pelos métodos updateRow e deleteRow, respectivamente.

    Os métodos updateRow e deleteRow recebem uma lista de objetos que são os valores das linhas (da mesma forma que já ocorre com o método addRow). 

    Exemplo:

     ]);
    }
    Nota
    titleImportante
    • A função defineStructure é obrigatória para configuração do dataset offline.
    • O tipo de campo DatasetFieldType.TEXT foi introduzido na Atualização 1.6.1 da plataforma fluig. Este tipo foi desenvolvido especificamente para sincronização de datasets em ambientes que utilizam o banco de dados Oracle, onde o tipo DatasetFieldType.STRING é limitado a apenas 255 caracteres. O tipo de campo TEXT em Oracle suporta até 4000 caracteres. Em ambientes MySQL e SQL Server, não há distinção no comportamento dos tipos TEXT e STRING.
    • 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.

    • Lembre-se que os nomes 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 ou caracteres especiais como (!@#$%-+=, etc) ou palavras reservadas do banco. Caso utilize a nomenclatura não permitida, não será possível sincronizar os dados na tabela.

    • 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 ocorrerá um erro de campo duplicado ao tentar criar a tabela de sincronização.
    • Os comandos AddIndex e AddKey não irão gerar índices nas tabelas de bancos de Dados SQLServer. Os comandos podem ser implementados no código do porém os índices de tabela deverão ser criados via ferramenta de administração do banco. Os campos informados no comando addKey serão utilizados como campos para controle de registros duplicados e nas operação de adição, remoção e modificação de registros.

     

    Sincronização de informações

    Para a transferência de dados do dataset para a tabela, deverá ser definida a função onSync que será chamado à cada execução da tarefa agendada.

    Para que a sincronização aconteça deve ser criada uma tarefa no 'Agendador de tarefas' do fluig com o tipo 'Sincronização de dataset', selecionando qual dataset deverá ser sincronizado e em que período.

    Dentro da função onSync deverá ser criado um objeto do tipo dataset onde as novas linhas deverão ser adicionadas pelo método addRow e linhas a serem atualizadas ou removidas pelos métodos updateRow e deleteRow, respectivamente.

    Os métodos updateRow e deleteRow recebem uma lista de objetos que são os valores das linhas (da mesma forma que já ocorre com o método addRow). 

    Exemplo:

    Bloco de código
    languagejavascript
    themeEclipse
    firstline1
    linenumberstrue
    function onSync(lastSyncDate) {
    	var dataset = DatasetBuilder.newDataset();
    
    Bloco de código
    languagejavascript
    themeEclipse
    firstline1
    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.deleteRow(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;
    }					.getCE_PIS(), r.getCE_COFINS()));
    			
    			
    		}
    	}
    
    	return dataset;
    }

     

    Como funciona a sincronização das informações

    É importante saber como funciona a sincronização e gravação de informações do dataset para tabelas de banco de dados. A forma como os dados são inseridos na base de dados é gerida pelo fluig e desta forma o momento em que os registros são inseridos, editados ou excluídos no código do dataset, não é o mesmo momento em que na prática, essas operações serão realizadas. 

    Ao executar os métodos createDataset ou OnSync nas tarefas de sincronização o fluig irá montar inicialmente em memória quatro coleções de registros que serão alimentadas de acordo com o comando utilizado pelo desenvolvedor.

     

    Registros Novosaddrow
    Eliminados deleteRow
    Modificados updateRow
    Modificados ou CriadosAddOrUpdateRow

     

    Com as coleções montadas, a ordem que o fluig utiliza para fazer a efetivação no banco é a seguinte.

    1 - Registros eliminados

    2 - Linhas Alteradas

    3 - Linhas Alteradas ou criadas

    4 - Novas linhas

    Isso é necessário para que as alterações e efetivações de registros no banco sejam gerenciadas pelo fluig, afim de garantir melhor performance e obter um tempo reduzido na sincronização de informações.

     

    Cache de dados no mobile

    ...