Consumindo uma fonte de dados
Para utilizar o DataSource
, você deve incluir a classe da seguinte forma:
var DataSource = require('@nginstack/datasource/lib/DataSource');
Uma vez que a dependência tenha sido incluída, podemos criar instâncias a partir dele. Há duas formas:
-
Utilizando chave da iVFS, onde key é a chave do script .ids que você deseja usar:
var dts = new DataSource(key);
-
Ou utilizando objeto literal e passando para o construtor:
var obj = {includes: [], //includes help: '', //Ajuda do DataSource availableFilters: [], //Filtros disponíveis availableColumns: [], //Colunas disponíveis onCreate: function(){}, //Função invocada na criação do DataSource (opcional) onGetQuery: function(dataSource, filters, columns){} //Função de montagem da query } var dts = new DataSource(obj);
Antes de recuperar um DataSet
com o nosso DataSource
, precisamos definir quais colunas e
filtros desejamos utilizar, através das funções createFilter e createColumns. Por exemplo:
var filters = dts.createFilters([{prefix: 'U',
classKey: -1898187811 /*Grupos, papéis e usuários*/}]);
var columns = dts.createColumns([{prefix: 'U',
classKey: -1898187811 /*Grupos, papéis e usuários*/}]);
A seguir, utilizamos o método getDataSet da instância:
var ds = dts.getDataSet(filters, columns);
Exemplo de consumo
Dada a seguinte definição de DataSource:
{
includes: [
-1897036629 // IQuery.ijs
],
help: 'Descreve os dados que podem ser obtidos pela fonte de dados.',
availableFilters: [
{
classKey: -2008879000 /* Pedidos ou Provisões */,
prefix: 'PED',
options: {}
}
],
availableColumns: [
{
classKey: -2008879000 /* Pedidos ou Provisões */,
prefix: 'PED'
}
],
onCreate: function (dataSource) {
var flt = dataSource.filters.filter('PED_EMISSAO_START');
flt.help = 'Data de Emissão Inicial';
var flt = dataSource.filters.filter('PED_EMISSAO_END');
flt.help = 'Data de Emissão Final';
},
onGetQuery: function (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);
return iquery.toSql()
}
}
Você poderá usar no IDBCSql o DataSource definido por esse código das seguintes formas:
const dts = new DataSource(40108470);
dts.filters; // => Lista todos os filtros disponíveis no DataSource
dts.columns; // => Lista todas as colunas disponíveis no DataSource
const filter = dts.filters.filter('PED_EMISSAO_START');
filter.help; // => Ajuda do filtro PED_EMISSAO_START
const filters = dts.createFilters([
{
name: 'PED_EMISSAO_START',
operator: '>=',
value: new Date(2010,0,1)
},
{
name: 'PED_EMISSAO_END',
operator: '<=',
value: new Date(2010,0,31)
}
]);
const columns = dts.createColumns([
{name: 'PED_RECURSO.NOME'},
{name: 'PED_QUANTIDADE'}
]);
dts.getQuery(filters, columns); // => SQL gerado pela fonte de dados
dts.getDataSet(filters, columns); // => DataSet gerado pela fonte de dados
Executando múltiplas consultas em uma única transação
Alguns desenvolvedores tem a necessidade de executar várias consultas SQL no contexto de uma única transação. O motivo disso pode ser para reduzir a quantidade de round-trips ou garantir o isolamento entres as consultas que executam de forma concorrente.
O DataSource
só permite a execução de uma consulta por vez, logo para atender a necessidade
citada acima foi criada a classe
DataSourceExecutor
.
Para utilizar a classe DataSourceExecutor, você deve incluí-la da seguinte forma:
var DataSourceExecutor = require('@nginstack/datasource/lib/DataSourceExecutor');
Exemplos de uso
const executor = new DataSourceExecutor();
// Adiciona o primeiro DataSource
executor.addDataSource(
40108470 /* /products/custom/.../Exemplo 000.ids */,
[{name: 'PED_EMISSAO',value: new Date()}],
[{name: 'PED_RECURSO.NOME'}]
);
// Adiciona o segundo DataSource
executor.addDataSource(
40108470 /* /products/custom/.../Exemplo 000.ids */,
[{name: 'PED_EMISSAO',value: new Date()}],
[{name: 'PED_PESSOA.NOME'}]
);
executor.execute();
const ds1 = executor.getDataSet(0);
const ds2 = executor.getDataSet(1);
// Neste exemplo é passada uma instância de um DataSource para o método addDataSource()
// ao invés da chave.
const executor = new DataSourceExecutor();
const dts = new DataSource(40108470 /* /products/custom/.../Exemplo 000.ids */);
executor.addDataSource(
dts,
[{name: 'PED_EMISSAO',value: new Date()}],
[{name: 'PED_RECURSO.NOME'}]
);
executor.addDataSource(
dts,
[{name: 'PED_EMISSAO',value: new Date()}],
[{name: 'PED_PESSOA.NOME'}]
);
executor.execute();
const ds1 = executor.getDataSet(0);
const ds2 = executor.getDataSet(1);