As tabelas podem ser filtradas antes de ser abertas nas janelas PAD, restringindo os dados trazidos do servidor, de forma

  • Fixa, valores fixos e com substituição de variáveis
  • Interativa, informado pelo usuário antes de abrir
  • Dinâmica, através de scripts

O string resultado é utilizado na cláusula WHERE. Utilize Argow Commander para editar os filtros interativos.

Existem quatro lugares para especificar um filtro fixo:

  • dicTable.TableFilter (usado ao abrir a tabela)
  • dicJoin.TableFilter (usado quando detalhe; é concatenado com o filtro de dicTable usando AND (ou inicie o filtro com OR)
  • dicAppMenu.TableFilter
  • dicAppTree.TableFilter

e um para filtro interativo e dinâmico:

As listas de escolha das colunas lookup podem ser filtradas (com ou sem parâmetros), informando em:

Os detalhes de tabelas com filtro mestre interativo podem ser filtrados, informando em:

Filtro Fixo

Os filtros fixos podem ser simples como

  ( CODE = 5 )

ou

  ( ( MONTH( DATA ) = MONTH( getDate() ) ) AND ( YEAR( DATA ) = YEAR( getDate() ))

ou conter variáveis Argow, como:

  (FK_Funcionario = :AR_UserName)

e variáveis globais (especificadas com :grupo.nome):

  ( MONTH( DATA ) = :PARAM.MES_INICIO )
    AND
  ( YEAR( DATA ) = :PARAM.ANO_INICIO )

Para não confundir o filtro fixo com um complexo, nunca inicie uma linha com colchete (parêntese reto, ]).

Filtro da lista de Lookup

Para filtrar a lista de escolha das colunas n ⇒ 1 (dicJoin.IsLookup←true), deve especificar o filtro na seção [$list] em dicJoin.TableFilter.

Neste caso, a tabela é filtrada somente quando a lista de seleção é aberta. O Filtro é local (gerenciado ADO, ver ADO Filter Property). Notar que os nomes das colunas estão à esquerda do operador. Cláusulas podem ser concatenadas com AND ou OR.

Para criar um filtro opcional, veja dicJoin.ItemAction listFilter.

[$List]
Filter= ( ATIVO = 'T' ) AND ( SELECIONAVEL = 'T' )

O filtro pode conter referências a outras colunas da tabela detalhe:

[$List]
Filter= ( FK_CLIENTE = :CLIENTE )

ou colunas da tabela master (antecedida da palavra reservada $master):

[$List]
Filter= ( FK_CLIENTE = :$master.FK_CLIENTE )

ou variáveis Argow ou globais (especificadas com :grupo.nome):

[$List]
Filter= ( USUARIO = :AR_UserName )  :FILTRO.CONTAS

Se precisar informar um filtro para a tabela (não para a lista de seleção) utilize a seção [$Table]:

[$Table]
Filter= ( OBRA = 'BR' )

[$List]
Filter= ( SELECIONAVEL= 'T' )

Filtro em Detalhes com Mestre Interativo

Para filtrar tabelas detalhes 1 ⇒ n (dicJoin.IsLookup←false), deve especificar o filtro na seção [$Master] em dicJoin.TableFilter.

A tabela é filtrada somente quando existe filtro interativo na tabela mestre. Existe uma palavra reservada ($auto) e um parâmetro ($master) para especificar o filtro.

[$Master]
Filter= (fk_master in ( Select pk From TabelaMaster Where (:$master)) )

O parâmetro $master é substituído pelo filtro interativo aplicado à tabela mestre. Podem ser incluidas variáveis Argow e globais.

[$Master]
Filter= $auto

Pode usar $auto quando o relacionamento for por somente uma coluna, já que o filtro é criado automaticamente da seguinte forma:

[$Master]
Filter= ({dicJoin.FieldsDetail} in (Select {dicJoin.FieldsMaster} From {dicJoin.TableMaster} Where :$master )

Para indicar que seja montado um filtro automático para todos os detalhes cuja tabela mestre tem filtro interativo, use a configuração global DETAIL_AUTO_FILTER (em dicConfig).

Se deseja evitar o filtro automático numa tabela especifica, use a palavra reservada $none:

[$Master]
Filter= $none

Se precisar informar um filtro para a tabela (não para o interativo) utilize a seção [$Table]:

[$Table]
Filter= ( OBRA = 'BR' )

[$Master]
Filter= $auto

Filtro Interativo

Em dicAppMenu.TableFilter é possível especificar filtros interativos. Antes de abrir a tabela, a janela de filtro é apresentada ao usuário para que informar os valores das variáveis.

O filtro interativo aplicado numa tabela pode ser acessado com uiFilter e editado em Argow Commander.

O filtro interativo tem a seguinte sintaxe, com todas as chaves opcionais:

[name]
Field=
List=
Source=
Filter=
Caption=
Hint=
Required=
Range=
Size=

Onde

  • Name Nome da seção, usualmente é igual ao nome da coluna que deseja filtrar
  • Field Nome da coluna, se não especificado é usado Name. Se a coluna for lookup (colunas 1 ⇒ n (dicJoin.IsLookup ←true), use o 'nome interno', especificado em dicJoin.ResultName.
  • List Uma ou mais colunas, separadas por ;, para mostrar na lista de lookup. Se a primeira coluna for identificada como chave primária de source, não é mostrada.
  • Source Tabela que tem as colunas especificadas em List ou comando (Select <col1>... From <table>) para obter as colunas (se List não for especificado, todas as colunas do comando são mostradas)
  • Filter Filtro a aplicar na tabela especificada em Source, pode ter variáveis que relacionam com outras seções (o nome da variável é o nome de uma seção) ou pode conter variáveis Argow (como :AR_UserName). Os parâmetros começam com :
  • Caption Rótulo, se não especificado é usado o dicField.fieldAlias
  • Hint Dica
  • Required Se for ou não obrigatório informar o valor (T/F), se não especificado é F
  • Range Exibir duas linhas por coluna, para selecionar maior/menor que, se não especificado é T
  • Size Quando for string, o tamanho da coluna. Se não especificado, é utilizado o indicado em dicField.DataEditor se houver; se não, a source é aberto e examinado

Por exemplo, para filtrar pela coluna DATA, o mais simples é:

  [DATA]

As colunas não necessariamente devem pertencer a tabela que será filtrada, mas sim o último galho da árvore. Por exemplo, no arDemo é possível selecionar as cidades de "Centro América", com o filtro:

[ZONA]
field=pk_zona
list=pk_zona,zona
source=tbZona
caption=Continente

[PAIS_CODE]
field=pais_code
list=pais_code
source=tbPais
filter=zona=:zona
caption=País
Filtro Interativo

Para especificar um filtro fixo e um interativo, utilize a seção especial [$Table]:

[$Table]
Filter= ( YEAR( DATA ) = YEAR( getDate() )) AND ( ENTREGUE = 'F' )

Filtro Dinâmico

Em dicAppMenu.TableFilter é possível especificar filtros dinâmicos. Antes de mostrar a tabela o script é executado e o resultado da função (que deve ser string) é adicionado a clausula where.

[$script]
onOpen=
bFilter=

O script de onOpen é executado somente uma vez, antes de abrir a tabela. Por outra lado, bFilter é associado ao botão de filtro é executado cada vez que este botão é clicado.

Exemplo

O seguinte script utiliza variáveis globais para solicitar ao usuário o número de dias passados de Notas Fiscais que deseja ver, filtrando a coluna data de emissão (tbNOTASFISCAL.EMISSAO):

dicAppMenu
applicationtableNametableFilter
GESTAOtbNOTASFISCAL[$script]
bFilter=pedeDias;
dicScript
scriptNamescriptAliasscriptBody
pedeDiasPede diasfunction pedeDias: string;...
function pedeDias(): string;
begin
  result:= '';
  if arVarEmpty( sf.gVars['grupo1', 'Dias'] ) then sf.gVars['grupo1', 'Dias']:= 15;
  if sf.gVars.getFromUser( 'Mostrar até', 'grupo1', '' ) then begin
    result:= 'DATEDIFF(day, EMISSAO, getdate()) <= ' + intToStr( sf.gVars['grupo1', 'Dias'] );
  end;
end;