Consumindo uma fonte de dados

Guia para consumo de fontes de dados personalizadas.

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);