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:
- O
displayKeyaponta para uma coluna que concatena os dados pesquisáveis, comocódigo | nome | CNPJ. - Essa coluna está em
fields, comostandarde comsearch. - As outras colunas que o JavaScript precisa entram em
fieldscomvisiblefalso, porque oselectedItemsó traz o que está listado ali. - O dataset lê o texto pela constraint com o nome do
displayKeye 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
datasetIdestá certo? Lembre que dataset inexistente pode não dar erro. - O
displayKeyestá emfields, comostandardesearch? - O dataset ignora
sqlLimitcomo termo de busca? - As colunas usadas em
filterValuesexistem 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 MyQubeOu conheça nosso serviço de Consultoria Fluig