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:

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:

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


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.:

Exemplo:
Configurar o autocompletar do campo "Cliente" da interface de pedido de venda (PEDVEN06.CAD_PEDIDOS_06) para apresentar:
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