Usando ExtraFilter no DataSource

Data de postagem: May 12, 2011 6:13:41 PM

ExtraFilter é um recurso presente na API de segurança do Engine que filtra os registros de um DataSet de acordo com os valores especificados no cadastro de permissões e no cadastro de usuários.

Um exemplo do uso do recurso de ExtraFilter é filtrar pedidos pelo estabelecimento. Ou seja, apenas usuários do estabelecimento X poderão ver os pedidos do estabelecimento X. Vejamos como é feita a configuração de um ExtraFilter no sistema UNUM para filtrar registros de um DataSet por estabelecimento.

Na tabela iPermission existe um campo chamado ESTABELECI onde são informados os estabelecimentos de um usuário ou grupo de usuários. Após configurar quais serão os usuário que podem visualizar os registros vinculados a um ou mais estabelecimentos, é necessário informar quais serão as classes que sofrerão esse controle de permissão. Por exemplo, a classe /Dados/Transacionais/Operacoes/Pedidos ou Provisoes sofre o controle de permissão de ExtraFilter, pois na definição da classe temos a seguinte declaração:

this.permissionExtraFilter.push(["ESTABELECI", "ESTABELECI"]);

Uma vez configurado o Extra Filter, as consultas realizadas através o objeto iQuery serão afetadas por ele. Por exemplo, a query:

database.query("Select " + "PED.CHAVE, PED.CHCRIACAO, EST.CODIGO ESTABELECIMENTO, " + "CLA.NOME CLASSE " + "From " + "PEDIDO PED " + "LEFT OUTER JOIN ENTIDADE EST ON (PED.ESTABELECI = EST.CHAVE) " + "LEFT OUTER JOIN CLASSE CLA ON (PED.CLASSE = CLA.CHAVE) " + "Where PED.EMISSAO Between '05/03/2011' and '05/03/2011'");

Retorna o seguinte dataset:

Já o iQuery correspondente:

var ped = IQuery.from(-2008879000 /* Pedidos ou Provisões */) .where([ {field: "EMISSAO", operator: ">=", value: new Date(2011,2,3)}, "and", {field: "EMISSAO", operator: "<=", value: new Date(2011,2,3)} ]) .column({field: "CHAVE"}) .column({field: "CHCRIACAO"}) .column({field: "ESTABELECI.CODIGO", alias: "ESTABELECIMENTO"}) .column({field: "CLASSE.NOME", alias: "CLASSE"}); ped.execute();

Retorna o seguinte DataSet:

Note que temos apenas os registros do estabelecimento Inteq Estab na classe V Adq Terc p Consumo. No cadastro de permissões é possível conceder acesso, ao usuário ou grupo de usuários, aos registro de estabelecimentos em uma determinada classe.

Usando Extra Filter no DataSource

O mesmo exemplo acima pode ser levado para o DataSource. Veja como:

Dada a seguinte definição de DataSource:

{ /* /products/INTEQengine/library/iquery/IQuery.ijs */ includes: [-1897036629], help: "Help do DataSource", availableFilters: [ { classKey: -2008879000 /* Pedidos ou Provisões */, prefix: "PED", options: {onlyVisible: true} } ], availableColumns: [ { classKey: -2008879000 /* Pedidos ou Provisões */, prefix: "PED", options: {onlyVisible: true} } ], onGetQuery: function Exemplo001_onGetQuery(dataSource, filters, columns) { var flts = filters.getIQueryFilters("PED_*", "and"); var cols = columns.getIQueryColumns("PED_*"); var iquery = IQuery.from(-2008879000 /* Pedidos ou Provisões */) .where(flts) .column(cols); //Para usar Extra Filter é necessário retornar uma instância de um //iQuery COM COLUNAS, ao invés de retornar um String com SQL. return iquery; } }

E sua invocação:

/* /products/custom/modules/Testes/paulorogerio/ datasource/Exemplo 002.ids */ var dts = new DataSource(45684180 ) var filtros = dts.createFilters( [ {name: "PED_EMISSAO_START", value: new Date(2011,2,3)}, {name: "PED_EMISSAO_END", value: new Date(2011,2,3)} ] ); var colunas = dts.createColumns( [ {name: "PED_CHAVE"}, {name: "PED_CHCRIACAO"}, {name: "PED_ESTABELECI.NOME", alias: "ESTABELECIMENTO"}, {name: "PED_CLASSE.NOME", alias: "CLASSE"} ] ); dts.getDataSet(filtros, colunas);

Esse exemplo retornará o mesmo DataSet do exemplo com o IQuery.