Este recurso está disponível a partir da Atualização 1.5.5 da plataforma fluig. |
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.
Contudo, como tratam-se de sistemas externos não é possível para o fluig garantir tanto a performance quanto a disponibilidade desses serviços de dados. Eventuais problemas de performance ou disponibilidade impactarão o desempenho do fluig e podem até mesmo inviabilizar o uso de determinado processo workflow.
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, 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.
A Sincronização de datasets em tabelas do fluig só pode ser utilizada em datasets do tipo personalizados . |
Existem três tipos de sincronização com datasets:
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.
Novos dados criados em dispositivos móveis, quando utilizando o modo offline, só estarão disponíveis para consulta em outros formulários depois que o aplicativo móvel passar por um processo de sincronização com o servidor do fluig. Para entender mais sobre este processo, acesse nesta página o passo Configurando sincronização de datasets. |
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:
Retorno | Método | Descrição |
---|---|
AddColumn | AddColumn(String field, DatasetFieldType type) Cria um campo na tabela com o nome e tipo informados. O nome sempre deve ser informado em caracteres maiúsculos. 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 |
setKey | setKey(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. Devem ser informados em caracteres maiúsculos. |
addIndex | addIndex(Object[] fields) Permite adicionar mais índices para obtenção de maior performance nas consultas do dataset. Devem ser informados em caracteres maiúsculos. |
Quando um campo é definido como chave (setKey) o mesmo é definido automaticamente como índice. Neste caso, o campo não poderá ser utilizado para criação de um índice único, entretanto é pertimitido utilizar em um índice composto. No exemplo abaixo o campo 'CE_CODIGO' foi configurado como chave, portanto não pode ser utilizado como índice único 'addIndex("CE_CODIGO")'. Não há impedimento, porém, se usar em um índice composto, como está sendo utilizado no exemplo 'addIndex([ "CE_CODIGO", "CE_LOJA", "CE_NUMTIT" ])'. |
Exemplo:
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" ]); } |
|
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:
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") { dataset.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") { dataset.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") { dataset.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 dataset.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; } |
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 é exatamente o mesmo momento em que, na prática, essas operações serão realizadas. Com isso, a importância em saber como funciona a sincronização e gravação de informações do dataset para tabelas de banco de dados é de utilidade geral.
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.
Coleção | Método |
Registros novos | addRow |
Eliminados | deleteRow |
Modificados | updateRow |
Modificados ou Criados | addOrUpdateRow |
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.
Quando se tem em mente um dispositivo móvel, imediatamente surge a questão do espaço ocupado por uma aplicação. A função onMobileSync é chamada apenas durante a atualização de um dataset offline já existente. Esta função recebe o usuário autenticado no dispositivo como parâmetro e retorna todos os campos.
Quando o aplicativo realiza a primeira sincronização, ao fazer o carregamento inicial dos dados, está função não será executada.
Lembre-se de que todas as colunas informadas no código devem estar em caracteres maiúsculos.
Exemplo:
function onMobileSync(user) { var sortFields = 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, 'sortFields' : sortFields }; return result; } |
O acesso a datasets sincronizados seja ele jornalizado ou não permance exatamente igual ao acesso de qualquer dataset, não sendo necessário passar nenhum parâmetro extra.
No painel de controle, aba Gerais, clique sobre Datasets. Acessando essa tela, temos uma listagem de todos os datasets cadastrados no fluig. Nessa tela é possível:
Clicando no lápis ao lado do valor da coluna "Offline mobile" é possível definir como será o comportamento do dispositivo mobile para realização do cache de informações bem como o acesso a essas informações de acordo com o estado do dispositivo.
Nesta tela temos as seguintes opções :
Utilize os botão salvar para confirmar as alterações.
Clicando no lápis ao lado do valor da coluna "Sincronização" é possível definir que determinado dataset customizado irá sincronizar as linhas obtidas para dentro de uma tabela fluig.
A opção "Sincronizar com o servidor?" irá ativar o modo de sincronia de dados no servidor.
Ao desligar a sincronização de um dataset que estava sendo sincronizado e jornalizado lembre-se que as tabela que abrigada os dados e as tarefas de sincronização serão removidas e que por consequência todos os dados sincronizados até aquele momento serão perdidos. Com a sincronização desligada os dados que serão listados para este dataset são os dados obtidos pelo método createDataset. |
Após definir que determinado dataset é sincronizado no servidor do fluig deverá ser agendada pelo menos uma execução da tarefa de sincronia de datasets para isso será necessário acessar o menu lateral ao lado da coluna ultima sincronização e escolher a opção "Editar Agendamentos" .
Nesta tela deverão ser preenchidos obrigatoriamente os seguintes campos :
As outras informações se referem a frequência e horário de execução da tarefa e segue o mesmo padrão dos outros tipos de tarefa agendada existentes no fluig.
Clicando sobre a lupa da coluna Opções referente ao dataset , ao lado da coluna "próxima sincronização", será possível consultar os resultados pertencente a consulta no banco de dados do fluig.
Este recurso é apenas um facilitador para o administrador verificar rapidamente o código do dataset. É importante o administrador do fluig se certificar se os métodos onSync, defineStructure, createDataset e onSyncmobile estão implementadas para que ele possa decidir se liga ou desliga a geração de cache e sincronização de informações. Esta função pode ser acessada através da coluna Opções, ao lado da coluna "próxima sincronização" deve-se escolher a opção "Exibir código" .
Essa opção permite ao administrador remover a tabela que contem os dados sincronizados com o servidor. Importante notar que os dados não serão apagados imediatamente após a confirmação da mensagem e sim na próxima execução da tarefa de sincronização. A próxima tarefa de sincronização criará uma nova tabela gravando os dados daquela execução. A tabela que abrigava os dados antes da ordem de eliminação de dados será removida junto com seus registros.