As tabelas podem ser filtradas antes de ser abertas nas janelas PAD, restringindo os dados trazidos do servidor, de forma fixa, interativa ou dinâmica. O filtro resultado é utilizado na cláusula WHERE. Utilize Argow Commander para editar os filtros.

Existem cinco lugares para especificar um filtro fixo:

e um para filtro interativo e dinâmico:

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:

  ( ( MONTH( DATA ) = MONTH( :PARAM.DATA_INICIO ) )
    AND
  ( YEAR( DATA ) = YEAR( :PARAM.DATA_INICIO ))

Filtro de Lookup com Parâmetros

Os filtros para colunas 1 ⇒ n (dicJoin.IsLookup ←true), especificados em dicJoin.TableFilter, podem conter referências a outras colunas da tabela detalhe:

  ( FK_CLIENTE = :CLIENTE )

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

  ( FK_CLIENTE = :$master.FK_CLIENTE )

Neste caso, a tabela detalhe é filtrada localmente (pelo ADO, ver ADO Filter Property). Notar que os nomes das colunas estão à esquerda do operador. Clausulas podem ser concatenadas com AND ou OR.

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 informr os valores das variáveis.

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

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

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 fixo, 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 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

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;