Voltar para o blog
Desenvolvimento Fluig4 min de leitura

Campo zoom no Fluig: como fazer a pesquisa funcionar

Por que o campo zoom do Fluig volta vazio: como configurar displayKey, fields e filterValues, e o que o dataset precisa fazer com o sqlLimit e o texto digitado.

O campo zoom é o jeito do Fluig de deixar o usuário pesquisar em uma lista, como fornecedores ou produtos. Quando funciona, parece simples. Quando não funciona, ele abre vazio e nenhum erro aparece. Quase sempre, o problema está na relação entre o displayKey, as colunas e o dataset.

O que o zoom envia ao dataset

Entender isso resolve boa parte dos casos. Quando alguém pesquisa, o dataset recebe constraints com:

  • O texto digitado, com o nome do campo definido em displayKey. Pode vir marcado como busca aproximada, às vezes já com %.
  • sqlLimit, com o limite de linhas. Em nossas medições, ele chegou sempre, mesmo sem o usuário digitar nada.
  • O que estiver em filterValues, usado para filtrar por empresa, filial ou outro critério.

Esse segundo item derruba muito dataset. Se o código considera "a primeira constraint desconhecida" como texto de busca, ele passa a procurar por 300, e o zoom fica vazio.

O padrão que funciona

A ideia é ter uma coluna de busca que junta tudo o que o usuário pode digitar:

<input type="zoom" id="fornecedor" name="fornecedor" data-zoom="{
    'displayKey': 'ZOOM',
    'datasetId': 'ds_fornecedores',
    'maximumSelectionLength': '1',
    'fields': [
        {'field': 'ZOOM', 'label': 'Fornecedor', 'standard': 'true', 'search': 'true'},
        {'field': 'CODIGO', 'label': 'Código', 'visible': 'false'},
        {'field': 'CNPJ', 'label': 'CNPJ', 'visible': 'false'}
    ]
}" />

Quatro regras:

  1. O displayKey aponta para uma coluna que concatena os dados pesquisáveis, como código | nome | CNPJ.
  2. Essa coluna está em fields, como standard e com search.
  3. As outras colunas que o JavaScript precisa entram em fields com visible falso, porque o selectedItem só traz o que está listado ali.
  4. O dataset lê o texto pela constraint com o nome do displayKey e filtra na origem.

O lado do dataset

function createDataset(fields, constraints, sortFields) {
    var dataset = DatasetBuilder.newDataset();
    dataset.addColumn("ZOOM");
    dataset.addColumn("CODIGO");
    dataset.addColumn("CNPJ");

    try {
        var termo = "";

        if (constraints != null) {
            for (var i = 0; i < constraints.length; i++) {
                var nome = String(constraints[i].fieldName);

                if (nome == "ZOOM") {
                    termo = String(constraints[i].initialValue).replace(/%/g, "");
                }
                // sqlLimit e filterValues sao controle, nunca texto de busca
            }
        }

        // Filtre na origem usando "termo" e preencha as linhas aqui
    } catch (e) {
        log.error("[ZOOM] " + e);
    }

    return dataset;
}

Lembre de ler a constraint de forma resiliente, porque o formato pode variar. E coloque todo o corpo dentro do try: uma exceção fora dele devolve zero linhas e nenhuma mensagem.

Atenção aos acentos

Quem digita "JOAO" espera encontrar "JOÃO". Para isso, retire os acentos do termo com java.text.Normalizer e compare sem acentos na origem.

Só não coloque uma faixa acentuada literal na regex do script. Em nossos ambientes, isso impediu a compilação do dataset no servidor, com o sintoma de um zoom vazio e nenhuma exceção no navegador. Mantenha o arquivo em ASCII.

filterValues: filtrar por outro campo

Para limitar a lista conforme outro campo do formulário, como a filial, recarregue o zoom:

reloadZoomFilterValues("fornecedor", "codFilial," + filial);

Detalhe medido: o filterValues também filtra o resultado pelas colunas do dataset. Portanto, codFilial precisa existir como coluna de saída. Sem ela, o zoom volta vazio, mesmo com a consulta correta.

Como ler o valor selecionado

function setSelectedZoomItem(selectedItem) {
    if (selectedItem.inputId == "fornecedor") {
        $("#codigoFornecedor").val(selectedItem["CODIGO"]);
    }
}

Se selectedItem["CODIGO"] vier vazio, confira se a coluna está em fields.

Checklist quando o zoom volta vazio

  • O nome em datasetId está certo? Lembre que dataset inexistente pode não dar erro.
  • O displayKey está em fields, como standard e search?
  • O dataset ignora sqlLimit como termo de busca?
  • As colunas usadas em filterValues existem na saída?
  • O script compila no servidor? Procure o nome dele no server.log.
  • O texto digitado chega ao dataset? Registre as constraints no log.

Uma lista grande sem filtro na origem também atrapalha. Filtre no banco ou na API, porque trazer tudo para o Fluig deixa o formulário lento.

Perguntas frequentes

Por que o campo zoom do Fluig não pesquisa?

Normalmente, o dataset não está tratando o texto digitado, ou a coluna do displayKey não está em fields com search.

O que é displayKey no zoom?

É a coluna exibida no campo depois da seleção. No padrão acima, é também a coluna usada para pesquisar.

Como pegar outras colunas do item selecionado?

Inclua as colunas em fields com visible falso e leia em setSelectedZoomItem.

Formulários com busca lenta ou que não encontra nada atrapalham quem usa o sistema todos os dias. A consultoria Fluig da MyQube pode revisar os seus. Vamos conversar.

Sua operação ainda depende de planilhas e retrabalho?

Agende uma conversa gratuita e receba um diagnóstico inicial dos seus gargalos operacionais.

Falar com a MyQube

Ou conheça nosso serviço de Consultoria Fluig