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:

  1. Utilizando chave da iVFS, onde key é a chave do script .ids que você deseja usar:

    var dts = new DataSource(key);
    
  2. 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);