Como criar grades de detalhe.

Este artigo irá mostrar algumas formas de criar uma grade detalhe.

É importante notarmos que a grade detalhe é um field que possui uma grade, então a documentação deste recurso será encontrada em:

Nos exemplos a seguir, estaremos abstraindo a escrita da grade com o .write(), tal como a interaction que deverá escrevê-la.

Exemplo 1: Grades simples

this.interaction("main", function () {

this.ds = connection.cloneLocalCacheByClass(-1898187808/* Tipos de Arquivos */);

this.ds.indexFieldNames = 'iKey';

this.detail = connection.cloneVfsByClass(-2010000000 /* Raiz */);

this.detail.indexFieldNames = 'imimeType';

var grid = this.grid("master", this.ds, -1898187808/* Tipos de Arquivos */);

grid.onDefineFields.set(function(grid){

var fld = grid.field("detail", "grid");

fld.readOnly = true;

fld.masterFieldNames = 'iKey';

fld.detailFieldNames = "imimeType";

fld.detailIndexFieldNames = "imimeType";

fld.detailFilter = null;

fld.masterDetailMaxRecordCount = 10;

fld.masterDeleteAction = "throw";

fld.onDefineGrid.set(function(field) {

var grid = field.grid

grid.onCreateDataSet.set(function (grid) {

return grid.process.detail

})

});

});

grid.onBeforePost.set(function(grid) {

if (grid.field("detail").ds.isEmpty) {

grid.process.alert("O DataSet da grade detalhe está vazio");

}

});

grid.write();

});

Interaction principal.

Criação do DataSet da Master

Criação do DataSet da Detail

Criando grade mestre.

Criando grade de detalhe.

Propriedades do field

Definição da grade do Field

Criação do dataSet da Grade

Exemplo de como acessar a grade detalhe a partir de um método da grade master.

Escrita da Grade

Com esse código, obteremos esse resultado:

Exemplo 2: Utilizando eventos específicos da grade Detalhe.

Neste exemplo, ao invés de utilizarmos as propriedades, iremos sobrescrever os eventos da grade, de forma que ela produzirá o mesmo efeito das propriedades que foram definidas no exemplo 1.

this.interaction("main", function () {

this.ds = connection.cloneLocalCacheByClass(-1898187808/* Tipos de Arquivos */);

this.ds.indexFieldNames = 'iKey';

this.detail = connection.cloneVfsByClass(-2010000000 /* Raiz */);

this.detail.indexFieldNames = 'imimeType';

var grid = this.grid("master", this.ds, -1898187808/* Tipos de Arquivos */);

grid.onDefineFields.set(function(grid){

var fld = grid.field("detail", "grid");

fld.order = 999;

fld.readOnly = true;

fld.masterDetailMaxRecordCount = 10;

fld.onDefineGrid.set(function(field) {

var grid = field.grid

grid.onCreateDataSet.set(function (grid) {

return grid.process.detail

});

grid.onMasterScroll.set(function (grid) {

var master = grid.master;

grid.ds.setRange(master.iKey,master.iKey);

});

grid.onMasterDelete.set(function (grid) {

if( !grid.ds.isEmpty ) {

throw new Error('É necessário apagar os registros da grade detalhe antes de efetuarmos a deleção.');

}

});

grid.onMasterInsert.set(function (grid) {

grid.process.alert('Essa extensão não tem nenhum arquivo associado ainda!');

});

grid.onMasterPost.set(function(grid) {

grid.process.alert('Detalhe: A master acabou de ser postada!');

});

});

});

grid.write();

});

Interaction principal.

Criação do DataSet da Master

Criação do DataSet da Detail

Criando grade mestre.

Criando grade de detalhe.

Definição da grade do Field

Criação do dataSet da Grade

No evento de onMasterScroll, estamos definindo o Range.

Estamos proibindo a deleção do registro da master caso exista mais de um registro na grade detalhe.

Alertaremos ao usuário(através da grade detalhe) toda vez que houver uma nova inserção.

Alertaremos ao usuário toda vez que houve um post.

Escrita da Grade