Administração do sistema
Como configurar o SQL das opções de autocomplete de um campo de uma tela?
RT.FAQ-873
Para customizar o SQL que gera as opções de AUTOCOMPLETE de um campo, basta criar uma propriedade LOOKUP_SQL para o item da interface. Esta propriedade segue herança por domínio, ou seja, é possível informa-la no atributo da entidade. Caso o item da interface tenha uma LOV explícita, então a propriedade também é verificada nesta interface. Neste caso, a propriedade teria que ficar registrada diretamente abaixo do bloco que define a LOV.
Por padrão, o SQL é montado com base nas entidades do modelo. Com esta preferência, o desenvolvedor poderá definir o SQL livremente. O SQL deverá resultar 4 colunas que devem ter os seguintes nomes:
- ID (opcional)
- VALOR (valor que será colocado no campo da LOV)
- DESCRICAO (texto que acrescentará uma informação a mais sobre o registro)
- PESQUISAR (texto onde o sistema irá pesquisar com o operador LIKE)
Deve-se tomar cuidado com colunas que podem conter valores nulos - Nestes casos, é importante usar uma função tipo COALESCE ou CASE WHEN.
Exemplo:
select id as id
, codificador as valor
, codificador || coalesce(' - ' || descricao) as descricao
, codificador || ' ' || coalesce(descricao, '') as pesquisar
from codificadores
where situacao in ( 'D' )
order by codificador
Assim como as expressões WHERE utilizadas para filtrar as lookups de um bloco, esta query pode utilizar as seguintes macros para parametrizar a consulta:
- Informar uma preferência (do usuário ou não). Ex: [ERP.ESTABELECIMENTO_PADRAO]
- Informar uma variável de sessão. Ex: [USER_ID]
Customização em tempo de execução
O autocomplete de um campo pode ser customizado em tempo de execução, simplesmente configurando a preferência com o mesmo nome global do utilizado no desenvolvimento. Exemplo:
PEDREPR02.CAD_PEDIDOS_REPRESENTACAO_02.FORNECEDOR_GRUPO.LOOKUP_SQL =
select pessoa as valor
, pessoa || ' - ' || nome_completo as descricao
, pessoa || nome_completo as pesquisar
from pessoas
Observações
- A propriedade para gerar o autocomplete nas interfaces é GENERATE_AUTOCOMPLETE (O valor default é "S", para gerar) e deve ser informada abaixo do BUILD do projeto.
- AUTOCOMPLETE_LENGTH
- Quando usamos uma LOOKUP_SQL, estamos sobrepondo o comportamento gerado automático na leitura das definições do bloco e, por consequencia, ignorando qualquer filtro/restrição informado no Telescope para a respectiva lookup.
- O SQL pode utilizar macros:
- Preferências globais do sistema no formato [NOME_GLOBAL_TELESCOPE].
- Variáveis de sessão como [USER_ID] e [ESTABELECIMENTO_ID]. Ver Variáveis/parâmetros de sessão.
- Campos do formulário atual [A_...].
- Parâmetros de contexto da interface [P_...].
- Caso o SQL utilizado não tenha uma clausula "ORDER BY", os valores sugeridos para o usuário são ordenados pela coluna descrição.
- O número de caractéres que deverão ser digitados para que o autocomplete comece a ser informado é definido através da propriedade AUTOCOMPLETE_LENGTH para o item ou atributo. Quando esta propriedade não estiver configurada, o sistema abrirá o autocomplete apenas após o segundo caractér.
Melhores práticas
Quando uma entidade é muito referenciada nas interfaces e possui muitas variações nas pesquisas devido a registros de diferentes categorias, sugere-se criar um conjunto de preferências mapeando os SQLs a serem utilizados nas diferentes situações e nas interfaces configurar a propriedade LOOKUP_SQL com o valor da preferência desejada entre colchetes.
Estas preferências deverão ser colocadas log abaixo do SISTEMA utilizando um nome lógico no singular precedido da silga "AC_".
Um exemplo disso é a entidade PESSOAS onde podemos ter um autocomplete diferenciado para pessoas (geral), vendedores, representantes, clientes, fornecedores, pessoas físicas, pessoas jurídicas, etc.:
- AC_PESSOA
- AC_VENDEDOR
- AC_PESSOA_JURIDICA
- etc.
Exemplo:
Configurar o autocompletar do campo "Cliente" da interface de pedido de venda (PEDVEN06.CAD_PEDIDOS_06) para apresentar:
- pessoas ativas,
- pessoas incluídas pelo usuário logado,
- pessoas para as quais o usuário logado é o vendedor ou representante do cliente,
- todas as pessoas caso o usuário logado possua a função informada na "Role de exceção" da interface,
- todas as pessoas caso o usuário logado seja super usuário.
Para aplicar este comportamento, deve-se criar a preferência PEDVEN06.CAD_PEDIDOS_06.CLIENTE.LOOKUP_SQL com o valor:
select p.id as id
, p.pessoa as valor
, p.nome_completo || ' (' || p.pessoa || ')' as descricao
, p.pessoa || p.nome_completo || coalesce(p.nome_fantasia,'') || coalesce(p.apelido,'') as pesquisar
from pessoas p
join clientes c on c.id = p.id
where p.situacao not in ('C')
and ([USER_ID] = p.usuario_inclusao_id
or
[PERSON_ID] in (c.vendedor_id, c.representante_id)
or
exists (select 1
from usuarios u
where [USER_ID] = u.id
and u.super_usuario = 'S')
or exists (select 1
from funcoes_usuarios fu
join funcoes_sistemas fs on fs.id = fu.funcao_id
where fu.usuario_id = [USER_ID]
and fs.id = (select valor::bigint
from preferencias
where preferencia = 'PEDVEN06.CAD_PEDIDOS_06.CUSTOM_FILTER_BYPASS_ROLE_ID') )
)
order by p.nome_completo
Ver também
- (faq:12706; autocomplete)
- (faq:71093; variaveis de sessão)