Update no banco retorna valor nulo

Olá Fluiggers! tudo bem? estou com um problemão que estou tentando desvendar, será que alguem consegue me ajudar?

Quando eu chego em um determinado processo e tento envia-lo, o meu programa deve fazer um update no banco para atualizar as informações de outro sistema por meio de uma procedure. A mensagem que me retorna é esta:

Onde o meu codigo de update é este:

/**
 *
 *
 * @param {string[]} fields Campos Solicitados
 * @param {Constraint[]} constraints Filtros
 * @param {string[]} sorts Campos da Ordenação
 * @returns {Dataset}
 */

function createDataset(fields, constraints, sortFields) {
    
    var Dataset = DatasetBuilder.newDataset();
    var result = "";

    //#region Constraints
        var filial = "";
        var tipo_doc = "";
        var num_pedido = "";
        var cr_nivel = "";
        var dbm_user = "";
        

        if (constraints != null) {
            for (var i = 0; i < constraints.length; i++) {
                if (constraints[i].fieldName == "filial" && constraints[i].initialValue && constraints[i].initialValue != "") {
                    filial = constraints[i].initialValue;
                }
                if (constraints[i].fieldName == "tipo_doc" && constraints[i].initialValue && constraints[i].initialValue != "") {
                    tipo_doc = constraints[i].initialValue;
                }
                if (constraints[i].fieldName == "num_pedido" && constraints[i].initialValue && constraints[i].initialValue != "") {
                    num_pedido = constraints[i].initialValue;
                }
                if (constraints[i].fieldName == "cr_nivel" && constraints[i].initialValue && constraints[i].initialValue != "") {
                    cr_nivel = constraints[i].initialValue;
                }
                if (constraints[i].fieldName == "dbm_user" && constraints[i].initialValue && constraints[i].initialValue != "") {
                    dbm_user = constraints[i].initialValue;
                }
            }
        }
    //#endregion 

    var dataSource = "//ip que eu retirei"; //Nome do serviço cadastrado no Fluig"
    var ic = new javax.naming.InitialContext();
    var ds = ic.lookup(dataSource);

        var query = "EXEC APROVACAO_FLUIG" +
        " @filial = '" + filial + "'," +
        " @tipo_doc = '" + tipo_doc + "'," +
        " @num_pedido = '" + num_pedido + "'," +
        " @cr_nivel = '" + cr_nivel + "'," +
        " @dbm_user = '" + dbm_user + "'";
        
    var erro = "";
    var result = "";

    try {
        var conn = ds.getConnection();
        var stmt = conn.createStatement();
        stmt.execute(query);
        erro = 0;
        result = "Dados atualizados";
    } catch (e) {
        log.error("ERRO==============> " + e.message);
        erro = 1;
        result = "Erro ao atualizar (Linha: " + e.lineNumber + "): " + String(e.message.replace("com.microsoft.sqlserver.jdbc.SQLServerException:", ""))  + " Query => " + query;
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    } 

    Dataset.addColumn("Erro");
    Dataset.addColumn("Message");
    Dataset.addRow([erro, result])
    log.error(Dataset)
    return Dataset;  
}


E o meu script de BeforeTaskSave do update é este: 
```javascript
function beforeTaskSave(colleagueId, nextSequenceId, userList) {
    var state = getValue("WKCurrentState");

    if (state == 35) {
        var constraints = [];

        var filial = hAPI.getCardValue("filial").replace(" ", "").split("-")[0];
        var tipo_doc = hAPI.getCardValue("crtipo")
        var num_pedido = hAPI.getCardValue("crnum")
        var cr_nivel = hAPI.getCardValue("crnivel")
        var dbm_user = hAPI.getCardValue("dbmitem")


        // Adicione suas restrições aqui
        constraints.push(DatasetFactory.createConstraint("filial", filial, filial, ConstraintType.MUST));
        constraints.push(DatasetFactory.createConstraint("tipo_doc", tipo_doc, tipo_doc, ConstraintType.MUST));
        constraints.push(DatasetFactory.createConstraint("num_pedido", num_pedido, num_pedido, ConstraintType.MUST));
        constraints.push(DatasetFactory.createConstraint("cr_nivel", cr_nivel, cr_nivel, ConstraintType.MUST));
        constraints.push(DatasetFactory.createConstraint("dbm_user", dbm_user, dbm_user, ConstraintType.MUST));

        var dataset = DatasetFactory.getDataset("ds_update_compras", null, constraints, null);
        
        if (dataset.getValue(0, "Erro") == 0) {

            log.info("Atualizado com sucesso!");
        } else {
        
            log.error("Erro ao atualizar ==> " + dataset.getValue(1, "Message"));

            throw "Erro ao atualiiizar ==> " + dataset.getValue(1, "Message");
        }
    }
}

alguem poderia me ajudar?

O que aparece no Log do Fluig? Tá com cara que seu Dataset tá dando erro, aí retorna null. Aí não tem como chamar o método getValue porque a variável tá nula.


pode ser isso? mas nao sei como corrigir, o update está lá setado, do jeito certo

Consegui arrumar o update, porem ele fica carregando infinito, segue prints:
Enviando: photo_5111685555770469400_w.jpg… e
e não sai disso, ele nem me retorna nada pelo console e rede…

a imagem não apareceu.

e erro em dataset e evento de processo só vai aparecer no Log do Fluig mesmo.

E fica carregando infinito… e tem uma hora que da erro de network

Você está tentando usar jquery num evento de back-end?

Em algum lugar você tá tentando acessar o índice 1 de um array/lista que só possuí 1 elemento, então você deveria acessar o índice 0 ao invés do 1.

Em questão do “$” é um erro bobo que eu preciso arrumar rs, isso não está afetando o processo…

no beforetask onde aponta a linha 28 é apenas um log error com (1, “message”)

E no update do script é uma validação

E é exatamente onde está o erro. Pelo que vi seu Dataset retorna só 1 linha, então porque está tentando acessar o índice 1 ao invés do 0?

Eu validaria se alguma variável ficou vazia e já mandaria um erro com mensagem de campos obrigatórios (se eles forem) ao invés de esperar por um erro do banco dizendo que tem parâmetros faltando.

Então Bruno, eu dei uma melhorada no codigo, arrumei as conexoes etc… porem ele tenta fazer o update e fica carregando infinito, sabe oque pode ser?

cheguei a colocar varios Logs.info e está retornando todos os dados certinhos

conforme o print a cima ele faz as validações e chega até criar a query

Mas não sei se ele consegue fazer a conexao e fica carregando para sempre

Se concentra primeiro no Dataset. Faz ele funcionar e faz as validações tudo certinho.

Peguei aquele seu primeiro código e só dei uma mexida nas validações:

/**
 * Executa uma Stored Procedure em um banco de dados externo
 *
 * @param {string[]} fields Campos Solicitados
 * @param {Constraint[]} constraints Filtros
 * @param {string[]} sorts Campos da Ordenação
 * @returns {Dataset}
 */
function createDataset(fields, constraints, sorts) {
    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("error");
    dataset.addColumn("message");

    if (constraints == null || !constraints.length) {
        dataset.addRow([
            1,
            "Obrigatório fornecer os dados"
        ]);

        return dataset;
    }

    var filial = "";
    var tipo_doc = "";
    var num_pedido = "";
    var cr_nivel = "";
    var dbm_user = "";

    for (var i = 0; i < constraints.length; ++i) {
        if (constraints[i].fieldName == "filial") {
            filial = constraints[i].initialValue;
            continue;
        }

        if (constraints[i].fieldName == "tipo_doc") {
            tipo_doc = constraints[i].initialValue;
            continue;
        }

        if (constraints[i].fieldName == "num_pedido") {
            num_pedido = constraints[i].initialValue;
            continue;
        }

        if (constraints[i].fieldName == "cr_nivel") {
            cr_nivel = constraints[i].initialValue;
            continue;
        }

        if (constraints[i].fieldName == "dbm_user") {
            dbm_user = constraints[i].initialValue;
            continue;
        }
    }

    if (filial == "" 
        || tipo_doc == ""
        || num_pedido == ""
        || cr_nivel == ""
        || dbm_user == ""
    )  {
        dataset.addRow([
            1,
            "Obrigatório fornecer todos dados"
        ]);

        return dataset;
    }

    var query = "EXEC APROVACAO_FLUIG "
        + "@filial = '" + filial + "', "
        + "@tipo_doc = '" + tipo_doc + "', "
        + "@num_pedido = '" + num_pedido + "', "
        + "@cr_nivel = '" + cr_nivel + "', "
        + "@dbm_user = '" + dbm_user + "'"
    ;

    try {
        var dataSource = "/jdbc/MeuBancoExternoDS";
        var ic = new javax.naming.InitialContext();
        var ds = ic.lookup(dataSource);
        var conn = ds.getConnection();
        var stmt = conn.createStatement();

        // Pode ser que, dependendo da SP, tenha que mudar essa validação
        if (stmt.execute(query)) {
            dataset.addRow([
                0,
                "Dados Atualizados"
            ]);
        } else {
            dataset.addRow([
                1,
                "Ocorreu um erro ao atualizar os dados"
            ]);
        }
    } catch (e) {
        dataset.addRow([
            1,
            "Erro ao atualizar:\n\n"
                + e.message
                + "\n\n"
                + query
        ]);
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    }

    return dataset;
}

Aí você executa o dataset (vi que tá usando a extensão do VSCode. Nela é tranquilo testar esse dataset) e valida que tá realmente atualizando o banco de dados. Acompanha o log do Fluig pra ver se dispara algum erro.

Só depois do dataset perfeito que você vai se preocupar em utilizar ele no seu evento de processo.

E se o dataset retorna sempre só 1 linha você sempre vai acessar só o primeiro índice (que inicia em 0).

Ele para basicamente aqui brunão, no getConnection, a partir disso ele não lê mais nada e fica carregando infinito, eu tenho que passar algum login ou password?

Provavelmente não configurou corretamente o serviço de acesso a banco de dados.

Seguiu certinho os passos do manual?

https://tdn.totvs.com/display/public/fluig/Datasets+acessando+banco+de+dados+externo

Opa isso tenho ctz que esteja correto mesmo, pois puxo mtas views do banco pro sistema: segue os prints tbm:

Então nem ideia. Se no seu código você tá criando o dataSource apontando pro serviço correto não era pra dar problema né.

no pior dos casos teria que abrir chamado pra totvs validar se seu ambiente não está com problema ou alguma consultoria.

E te aconselho a no ambiente de Dev e Homolog você já colocar os nomes corretos dos serviços/bancos. Porque aí quando exportar seu código pra produção não vai ter que ficar alterando tudo.

Eu abri um chamado mesmo com a totvs agorinha, estava tentando conexão com algum outro SGDB, como SqlServer ou Dbeaver ou alguma outra coisa pra ver se o problema ta nas credenciais do banco ou no fluig e realmente esta falhando