Especializando a classe de importação de filtros e colunas

Data de postagem: Jun 03, 2011 7:16:3 PM

O DataSource faz parte da biblioteca UWL, do Framework. Para utilizá-la fora do Framework, você deve incluí-la da seguinte forma:

__includeOnce('ufs:/uwl/all.js');

Os dados do sistema UNUM estão logicamente distribuidos em classes, e cada classe possui uma relação de hierarquia com outras classes. Cada classe possui um conjunto de campos próprios e campos herdados de suas classes “mães”. Esta característica do sistema UNUM nos levou a implementar o conceito de especialização da classe de importação de filtros e colunas. Vejamos um exemplo prático para melhor compreender:

Dada a seguinte definição de DataSource:

{ includes: [ -1897036629 /* /products/INTEQengine/library/iquery/IQuery.ijs */ ], availableFilters: [ {classKey: -2007890000 /* Pessoas */, prefix: "PES"} ], availableColumns: [ {classKey: -2007890000 /* Pessoas */, prefix: "PES"} ], onGetQuery: function DataSource_onGetQuery(dataSource, filters, columns) { var pessoas = IQuery.from( -2007890000 /* Pessoas */ ); var filtros = filters.getIQueryFilters("PES_*"); var colunas = columns.getIQueryColumns("PES_*"); return pessoas.where(filtros).column(colunas).toSql(); }, onMountDataSet: function DataSource_onMountDataSet(dataSource, ds) { return ds; } }

Chamamos a atenção para as declarações:

availableFilters: [ {classKey: -2007890000 /* Pessoas */, prefix: "PES"} ], availableColumns: [ {classKey: -2007890000 /* Pessoas */, prefix: "PES"} ],

Note que as colunas e filtros do DataSource acima são compostos pelos campos da classe Pessoas. Mas o se o usuário do DataSource tentar filtrar por um filtro cujo campo pertença a uma classe filha de Pessoas? Por exemplo, o campo PROFISSAO, que está definido em Clientes, mas não está definido em Pessoas. Como fazer, neste caso, para filtrar pelo campo PROFISSAO?

A solução é indicar ao DataSource que ele deve especializar a classe de importação de filtro e colunas, que no exemplo acima é Clientes. Isso pode ser feito da seguinte forma:

Usando a API do DataSource diretamente:

var options = { specializedFilters: [{classKey: -2007889000 /* Clientes */, prefix: "PES"}], specializedColumns: [{classKey: -2007889000 /* Clientes */, prefix: "PES"}] } var dts = new DataSource(-1897036071 /* /products/.../pessoa.ids */, options) var filtros = dts.createFilters([{name: "PES_PROFISSAO", value: -1897054030 /* 0300 */}]); var colunas = dts.createColumns([{name: "PES_PROFISSAO"}]) dts.getDataSet(filtros, colunas)

Usando a definição do DataSourceQuery:

{ dataSource: { key: 45736580 /* /products/custom/.../Exemplo Pessoa.ids */, specializedFilters: [ {classKey: -2007889000 /* clientes */, prefix: "PES"} ], specializedColumns: [ {classKey: -2007889000 /* clientes */, prefix: "PES"} ] }, filters: [ {name: "PES_PROFISSAO", classKey: -1897054119 /* Profissões */} ], columns: [ {name: "PES_NOME"} ], orderBy: "PES_NOME" }

Note que dentro do objeto literal da propriedade dataSource há mais duas propriedades: specializedFilters e specializedColumns. Elas são responsáveis por realizar a especialização da classe de importação de filtros e colunas.