AJUDA - Atualizei o FLUIG para FLUIG-1.7.1-210525-WIN64 e estou com erro JQUERY.JS:2

Bom dia Pessoal, tudo bem?
Poderiam me ajudar?
Tenho alguns processos do FLUIG que são integrados com o PROTHEUS. Após eu atualizar meu fluig para a versão FLUIG-1.7.1-210525-WIN64 os formulários dos processos estão vindo em branco.

Estou com erro: SEND @ JQUERY.JS:2

query = “SELECT * FROM SC7”+empresa+“0 C”

query += " INNER JOIN SA2"+empresa+"0 ON C7_FORNECE = A2_COD AND A2_LOJA = C7_LOJA "

query += " WHERE C7_NUM = ‘"+pedido+"’ AND C7_FILIAL = ‘"+filial+"’ AND C.D_E_L_E_T_ <> ‘*’ ORDER BY C7_ITEM ASC"

console.log(query)

var select = DatasetFactory.createConstraint(‘select’,’’,query,ConstraintType.MUST);

var retorno = DatasetFactory.getDataset(“ds_conecta_protheus”,null,[select],null);

var totalLinha = 0;

console.log(retorno)

Estou enviando print e o meu processo.

Process-liberacao_ped_compras.76.zip (69,9,KB)

Bom dia!

Reparou nesses alertas do jquery? ele foi atualizado, pode ser que alguma função que tenha utilizado teve sua implementação modificada. Dá uma olhada nesses documento da TOTVS:

https://tdn.totvs.com/pages/releaseview.action?pageId=547229132#id-2

https://tdn.totvs.com/pages/releaseview.action?pageId=549488105

Bom dia Daniel,

Então, eu vi sim… mas teóricamente era para funcionar, pois são warnings…

Logo abaixo tenho os erros (em vermelho).

Esta dando erro na minha variavel retorno, pois ela está vindo como vazio. O meu select está retornando dados.

query = “SELECT * FROM SC7”+empresa+“0 C”
query += " INNER JOIN SA2"+empresa+“0 ON C7_FORNECE = A2_COD AND A2_LOJA = C7_LOJA "
query += " WHERE C7_NUM = '”+pedido+"’ AND C7_FILIAL = ‘"+filial+"’ AND C.D_E_L_E_T_ <> ‘*’ ORDER BY C7_ITEM ASC"
console.log(query)
var select = DatasetFactory.createConstraint(‘select’,’’,query,ConstraintType.MUST);
var retorno = DatasetFactory.getDataset(“ds_conecta_protheus”,null,[select],null);
var totalLinha = 0;
console.log(retorno)
for(i=0; i < retorno.values.length; i++){

Obrigado desde já.

Aproveitando…
estou achando que meu problema é no meu dataset.

function createDataset(fields, constraints, sortFields) {

    log.info("==================== DATASET CONECTA BANCO XXXX====================");
    var newDataset = DatasetBuilder.newDataset();
    var dataSource = "/jdbc/Protheus_db";

    var ic = new javax.naming.InitialContext();
    var ds = ic.lookup(dataSource);
    
    var select  = '';
    var where   = '';
    var myQuery = '';

    //MONTA O SELECT
    for(var i in constraints){
        if(constraints[i]['fieldName'] == "select"){
            select = constraints[i]['finalValue'];
        }
        if(constraints[i]['fieldName'] == "where"){
            where = constraints[i]['finalValue'];
        }
    }	
    
    if (where != '') {
        myQuery = select + " " + where;
    } else {
        myQuery = select;
    }
    log.info("###Query");
    log.dir(myQuery);
 
    try {
        var conn        = ds.getConnection();
        var stmt        = conn.createStatement();
        var rs          = stmt.executeQuery(myQuery);
        log.info("###Queryzou");
        log.dir(rs);
        var columnCount = rs.getMetaData().getColumnCount();
        
        //CRIA O CABEÇALHO
        for (var i = 1; i <= columnCount; i++) {
            newDataset.addColumn(rs.getMetaData().getColumnName(i));
        }
        //LOOPING DOS REGISTROS
        while (rs.next()) {
            
            var Arr = new Array();
            for (var w = 1; w <= columnCount; w++) {
                var obj = rs.getObject(rs.getMetaData().getColumnName(w));
                
                if (null != obj) {
                    Arr[w - 1] = rs.getObject(rs.getMetaData().getColumnName(w)).toString();
                } else {	
                    Arr[w - 1] = "null";
                }
            }
            
            newDataset.addRow(Arr);
            
        }
        
    } catch (e) {
        log.error("ERRO==============> " + e.message);
        newDataset.addColumn("erro");
        newDataset.addRow([e.message]);
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    }
    
    return newDataset;
}

Boa tarde Felipe,

Verifica a estrutura de retorno do seu dataset na aba network do navegador, está parecendo que o dataset não esta tendo retorno de linhas “addRow()”. A conexão do datasource com o Protheus está ok? Tenta colocar um log.info dentro do WHILE.

Boa tarde Willian,
Obrigado pelo retorno… então… acabei de ver que o problema é o dataset mesmo… veja o que enviei acima por favor?
Obrigado

Pelo que olhei esta tudo ok, tenta colocar o log.info dentro do while e um log.info antes dele pra ver se mostra algo.

image

Eu coloquei…
pelo que me parece ele nem está entrando pq da o erro. Normal isso ?

Eu sugiro vc colocar seu TRY/CATCH iniciando já na primeira linha, como ele esta na metade do fonte pode não estar caindo no THROW, e não retornando a linha de ERRO, assim só retorna o status 500 (erro no fonte normalmente);

Eu também estou com o mesmo problema após tentar realizar as últimas atualizações. O erro se dá antes de entrar no dataset, no log do fluig nem gera erro ou nada. Tive que voltar na versão que eu estava, pois abri um chamado na Totvs e eles simplesmente disseram que não conseguiram simular o erro. Também criei um topico no forum, mas o parece que não está funcionando a página no momento.

@Filipe_Bonacin não sei se vai acontecer com vc tbm, mas no meu caso quando eu tiro a palavra SELECT da consulta… a chamada do dataset acontece. Mas ai vai dar o erro da consulta.

Isso funciona aqui a quase três anos.

Segue o trecho do meu código:
var query = “select * from bpmfluig.vw_ds_coligadas_rm”;
var c1 = DatasetFactory.createConstraint(“query”, query, query, ConstraintType.MUST);
var constraints = new Array(c1);
dataset = DatasetFactory.getDataset(“dsGenericoSQL”, null, constraints, null);

Bom dia Pessoal, tudo certo?
Primeiramente gostaria de agradecer o @Willian_Laynes e o @daniel.cabral pelas respostas.
O problema é o seguinte…
Aparentemente os patchs das versões 1.7.0 e 1.7.1 do dia 25 de maio de 2021 apresentam inconsistências em acessos aos datasets realizados pelo frontend ( HTML ou javascript do formulário ).
Isso significa que se em seu processo o acesso ao webservice da plataforma é realizado diretamente pelo formulário, então o sistema poderá gerar um erro ao executar o acesso aos dados do dataset , resultando nas mensagens: “Error getting Dataset (nome do dataset): Invalid Value to parameter: _finalValue. Possible SQL Injection.”
Aparentemente o erro só acontece quando há uma tentativa de acessar o dataset utilizando as propriedades do constraint.
Tive que alterar a estrutura do meu processo, em vez da minha consulta do dataset ser no javascript fiz ela dentro do dataset, ou seja, um dataset para cada consulta.
Fica essa dica para contornarem, até a TOTVS resolver o problema.
Abraço

1 curtida

bom dia @Filipe_Bonacin
Obrigado por avisar. Mas no meu caso vou ter que esperar a correção, pois são utilizo esse tipo de consulta de forma genérica e em mais de 20 formulários e widgets.

@Geovane_Silva então abra um chamado na TOTVS e já fala que é o mesmo problema do chamado #11685196. Já ajuda a eles verem que tem mais de um cliente com o mesmo problema.

1 curtida

Sinceramente isso pra mim não é um erro. É bem estranho essa forma de passar uma SQL inteira para um Dataset.

Do ponto de vista de segurança o correto seria chamar o Dataset passando fields e constraints e então no Dataset criar a SQL específica para o que o Dataset se propõe.

Eu não imaginaria criar um Dataset genérico para executar qualquer tipo de consulta e talvez a TOTVS também não tenha imaginado isso e por isso colocou as regras adicionais que evitam SQL Injection (afinal tivemos uma atualização justamente voltada à segurança).

1 curtida

Sim. E complementando, dava pra utilizar prepateStatement no dataset, pra deixar mais seguro ainda.

Exemplo aleatório:

var conn = ds.getConnection();
		var stmt = conn.prepareStatement(minhaQuery);
		var indice = 1;
		
		stmt.setString(indice++, data_inicio);
		stmt.setString(indice++, data_fim);
		
		stmt.setString(indice++, data_inicio);
		stmt.setString(indice++, data_fim);
		
		
		var rs = stmt.executeQuery();
1 curtida

Este tópico foi fechado automaticamente 16 horas depois da úlima resposta. Novas respostas não são mais permitidas.