Histórico da Página
...
A sincronização de datasets tem como objetivo reduzir o número de acessos a serviços de dados fornecidos por produtos externos ao Fluigfluig. É 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.
Contudo, como tratatratam-se de sistemas sistemas externos não é possível para o fluig garantir tanto a performance quanto a disponibilidade desses serviços de dados. Em eventuais de Eventuais problemas de performance ou disponibilidade impactarão o desempenho do fluig e podem até mesmo inviabilizar o uso de determinado processo workflow como um todo.
No modelo de dados sincronizados, o fluig através de uma tarefa agendada realiza a consulta do sistema externo e copia os dados retornados para uma tabela espelho criada dentro do banco de dados do fluig.
...
Uma vez que a primeira sincronização tenha sido concluída com sucesso, todas as consultas realizadas neste dataset não irão mais consultar o sistema externo e , mas sim a tabela que foi espelhada pela tarefa agendada. Em nosso cenário hipotético caso o administrador do sistema opte por agendar a tarefa que atualiza a lista de centros de custo uma vez por dia. Após a sincronização a performance e a disponibilidade do sistema externo não afetarão mais a performance do fluig e dos sistemas workflow como um todo.
Nota | ||
---|---|---|
| ||
Observação¹: A Sincronização de datasets em tabelas do fluig só pode ser utilizada em datasets do tipo customizados . |
Tipos de
...
sincronização de datasets
Atualmente existem Existem três tipos de sincronização com datasets.:
- Sincronização Comum: Este tipo de Sincronização sincronização pode ser feita com qualquer dataset já implementado no produtona 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 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 aonde a em que há uma grande quantidade de dados é volumosa.
- 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 Fluigfluig. Os prazos de sincronização são configurados no aplicativo Fluig fluig Mobile.
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 dentro do código do dataset.
Exclusivamente dentro desta função estão disponíveis os seguintes métodos para definição da tabela.:
Retorno | Método e | Descrição |
---|---|
AddColumn | AddColumn(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 |
setKey | setKey(Object[] fields) Determina quais são os campos chaves para o dataset. No banco de dados será criado um indice í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 coma com a função addColumn. |
addIndex | addIndex(Object[] fields) Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset. |
Exemplo:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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 | ||
---|---|---|
| ||
| ||
| ||
Nota | ||
|
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 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 onde deverão ser adicionas as linhas novas no método addRow e linhas a serem manutenidas poderam ser atualizadas ou removidas, respectivamente 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 já ocorre com o método addRow já funciona hoje).
Exemplo:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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; } |
...
Cache de dados no mobile
Para realização de que ocorra a cópia de dados em dispositivos mobile é necessário criar a função onMobileSync 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 armazenados 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 no dispositivo mobile.
Exemplo:
Bloco de código | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
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; } |
...