Função para filtrar tabelas no Protheus utilizando o AdvPL

Olá pessoal…

Hoje vou mostrar como chamar a tela de filtragem padrão de registros de uma tabela utilizando o AdvPL.

Para utilizar esse recurso pessoal, nós chamamos a função SduExp dentro do fonte APSDU, essa função é aquela que quando você está no APSDU e você tem uma tabela aberta e você clica em filtrar ou dá um Ctrl+F, é mostrado aquela tela de pesquisa.

Tela de Filtragem

Tela de Filtragem

Para ela funcionar devidamente, abra o alias, e através do StaticCall nós iremos chamar essa função interna do APSDU, atribuindo o resultado em uma variável caracter. Se esse retorno tiver conteúdo, existe um filtro, e nós utilizamos no DbSetFilter, do contrário, não existe filtro, e nós poderemos limpar a tabela.

//Bibliotecas
#Include "Protheus.ch"
 
/*/{Protheus.doc} zTeste
Função de teste para abrir a filtragem de tabela
@author Atilio
@since 21/10/2017
@version 1.0
@type function
/*/
 
User Function zTeste()
    Local aArea   := GetArea()
    Local cFiltro := ""
     
    //Mostrando a tela de filtro
    DbSelectArea('SA1')
    cFiltro := StaticCall(APSDU, SduExp)
     
    //Se tiver filtro, usa o DbSetFilter para filtrar a tabela
    If ! Empty(cFiltro)
        SA1->(DbSetfilter({|| &(cFiltro)}, cFiltro))
         
    //Senão, limpa qualquer filtragem
    Else
        SA1->(DbClearFilter())
    Endif
     
    RestArea(aArea)
Return

Update Novembro de 2021:

Pessoal, como a função StaticCall foi desativada para compilações, eu pesquisei, e estou atualizando o artigo, no caso ao invés de usar essa SduExp, nós iremos utilizar a função BuildExpr. Abaixo o exemplo:

//Bibliotecas
#Include "Protheus.ch"
 
/*/{Protheus.doc} zTeste
Função de teste para abrir a filtragem de tabela
@author Atilio
@since 21/10/2017
@version 1.0
@type function
/*/
 
User Function zTeste()
    Local aArea   := GetArea()
    Local cFiltro := ""
     
    //Mostrando a tela de filtro
    DbSelectArea('SA1')
    cFiltro := BuildExpr('SA1')
     
    //Se tiver filtro, usa o DbSetFilter para filtrar a tabela
    If ! Empty(cFiltro)
        SA1->(DbSetfilter({|| &(cFiltro)}, cFiltro))
         
    //Senão, limpa qualquer filtragem
    Else
        SA1->(DbClearFilter())
    Endif
     
    RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação