Problemas Sincronizaçao Dataset

Criei um Dataset que será executado todo dia, ele deverá ler uma tabela do Banco de Dados e copiar essas informações para o Dataset.

Criei o Dataset e codifiquei os métodos defineStructure, onSync e createDataset. Segue o código abaixo.


function defineStructure() {
    addColumn("AGENDA", DatasetFieldType.NUMBER);
    addColumn("TIPO_AGENDA");
    addColumn("ORIGEM_COD", DatasetFieldType.NUMBER);
    addColumn("ORIGEM_DV", DatasetFieldType.NUMBER);
    addColumn("DESTINO_COD", DatasetFieldType.NUMBER);
    addColumn("DESTINO_DV", DatasetFieldType.NUMBER);
    addColumn("NOTA", DatasetFieldType.NUMBER);
    addColumn("SERIE");
    addColumn("DATA_AGENDA", DatasetFieldType.DATE);
    addColumn("TIPO_NOTA");
    addColumn("FISCAL_COD", DatasetFieldType.NUMBER);
    addColumn("CFOP", DatasetFieldType.NUMBER);
    addColumn("COND_PGTO", DatasetFieldType.NUMBER);
    setKey([ "AGENDA", "NOTA", "DATA_AGENDA" ]);
    addIndex([ "ORIGEM_COD" ]);
    addIndex([ "DESTINO_COD" ]);
    addIndex([ "NOTA", "ORIGEM_COD", "DATA_AGENDA" ]);
}

function onSync(lastSyncDate) {
    var dataset = DatasetBuilder.newDataset();
    // Consulta Dataset Fiscal para pegar as Notas de Assistencia Tecnica
    var const_fiscal = new Array();
    const_fiscal.push(DatasetFactory.createConstraint("FIS_DTA_AGENDA", '01/09/2018', '01/09/2018', ConstraintType.MUST));
    //const_fiscal.push(DatasetFactory.createConstraint("FIS_DTA_AGENDA", lastSyncDate, lastSyncDate, ConstraintType.MUST));
    var ds_fiscal = DatasetFactory.getDataset("ds_aa1cfisc", null, const_fiscal, null);
    // Valida se retornou resultado a consulta
    if (ds_fiscal != null && ds_fiscal.values != null && ds_fiscal.values.length > 0) {
        var records = ds_fiscal.values;
        for ( var index in records ) {
            var record = records[index];
            dataset.addRow(new Array(record.AGENDA, record.TIPO_AGENDA, record.ORIGEM_COD, record.ORIGEM_DV, record.DESTINO_COD, record.DESTINO_DV, 
                    record.NOTA, record.SERIE, record.DATA_AGENDA, record.TIPO_NOTA, record.FISCAL_COD, record.CFOP, record.COND_PGTO));
        }
        return dataset;
    }
}

function createDataset(fields, constraints, sortFields) {
    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("AGENDA", DatasetFieldType.NUMBER);
    dataset.addColumn("TIPO_AGENDA");
    dataset.addColumn("ORIGEM_COD", DatasetFieldType.NUMBER);
    dataset.addColumn("ORIGEM_DV", DatasetFieldType.NUMBER);
    dataset.addColumn("DESTINO_COD", DatasetFieldType.NUMBER);
    dataset.addColumn("DESTINO_DV", DatasetFieldType.NUMBER);
    dataset.addColumn("NOTA", DatasetFieldType.NUMBER);
    dataset.addColumn("SERIE");
    dataset.addColumn("DATA_AGENDA", DatasetFieldType.DATE);
    dataset.addColumn("TIPO_NOTA");
    dataset.addColumn("FISCAL_COD", DatasetFieldType.NUMBER);
    dataset.addColumn("CFOP", DatasetFieldType.NUMBER);
    dataset.addColumn("COND_PGTO", DatasetFieldType.NUMBER);
    // Consulta Dataset Fiscal para pegar as Notas de Assistencia Tecnica
    var const_fiscal = new Array();
    const_fiscal.push(DatasetFactory.createConstraint("FIS_DTA_AGENDA", '01/09/2018', '01/09/2018', ConstraintType.MUST));
    //const_fiscal.push(DatasetFactory.createConstraint("FIS_DTA_AGENDA", lastSyncDate, lastSyncDate, ConstraintType.MUST));
    var ds_fiscal = DatasetFactory.getDataset("ds_aa1cfisc", null, const_fiscal, null);
    // Valida se retornou resultado a consulta
    if (ds_fiscal != null && ds_fiscal.values != null && ds_fiscal.values.length > 0) {
        var records = ds_fiscal.values;
        for ( var index in records ) {
            var record = records[index];
            dataset.addRow(new Array(record.AGENDA, record.TIPO_AGENDA, record.ORIGEM_COD, record.ORIGEM_DV, record.DESTINO_COD, record.DESTINO_DV, 
                    record.NOTA, record.SERIE, record.DATA_AGENDA, record.TIPO_NOTA, record.FISCAL_COD, record.CFOP, record.COND_PGTO));
        }
        return dataset;
    }
    else {
        return null;
    }
}

Porém, no log do Servidor fica dando o seguinte erro:

Executando evento : onSyncERRO AO EXECUTAR SCRIPT -> NOK - sun.org.mozilla.javascript.internal.EvaluatorException: Java class "[Ljava.lang.Object;" has no public instance field or method named "AGENDA". (#33) in at line number 33

Gostaria que me ajudassem a entender esse erro, pois já vi e revi o código e não consigo mais identificar onde alterar para corrigir esse erro.

Bom dia Alessandro,

o melhor é usar o método getValue() do dataset. Se você tentar acessar o dataset.values diretamente ele só vai te trazer os valores sem os nomes das colunas.


var ds_fiscal = DatasetFactory.getDataset("ds_aa1cfisc", null, const_fiscal, null);

for (var i = 0; i < ds_fiscal.rowsCount; i++) {
    dataset.addRow(new Array(
            ds_fiscal.getValue(i, 'AGENDA'), 
            ds_fiscal.getValue(i, 'TIPO_AGENDA'), 
            ds_fiscal.getValue(i, 'ORIGEM_COD'), 
            ds_fiscal.getValue(i, 'ORIGEM_DV'), 
            ds_fiscal.getValue(i, 'DESTINO_COD'), 
            ds_fiscal.getValue(i, 'DESTINO_DV'), 
            ds_fiscal.getValue(i, 'NOTA'), 
            ds_fiscal.getValue(i, 'SERIE'), 
            ds_fiscal.getValue(i, 'DATA_AGENDA'), 
            ds_fiscal.getValue(i, 'TIPO_NOTA'), 
            ds_fiscal.getValue(i, 'FISCAL_COD'), 
            ds_fiscal.getValue(i, 'CFOP'), 
            ds_fiscal.getValue(i, 'COND_PGTO')));
}

return dataset;

Diogo, usando o log identifiquei isso, que ele não está reconhecendo o comando record.AGENDA.
Achei estranho porque usava assim antes e nunca tinha pegado esse erro.
Mas tentarei como você sugeriu e já já posto aqui se funcionou.

Diogo, não deu mais o erro do nome do campo AGENDA. Porém, agora deu o erro: java.sql.SQLSyntaxErrorException: ORA-00955: nome já está sendo usado por um objeto existente.

Quero criar algo incremental, será que ele está tentando criar novamente o Dataset a cada vez que executo ?

Diogo.

O Código que você me enviou resolver o erro da minha pergunta, muito obrigado.

O outro erro do Oracle, se resolveu quando eu tirei os addColumn do onSync. E como nosso Banco de Dados é do RMS os padrões de data são diferentes, então tive que mudar as consultas e retorno de Data e tive que tirar do campo DATA_AGENDA, o DatasetFieldType.DATE.

E com isso consegui fazer executar e sincronizar.

Agradeço pela ajuda Diogo.

Beleza, acho que o problema está na criação de indices, se você remover apenas os addIndex do defineStructure creio que já resolveria.