Histórico da Página
Índice
Índice | ||||||||
---|---|---|---|---|---|---|---|---|
|
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.
...
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 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. |
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 |
---|
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 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
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; } |
...