Montando filtros de tabela em tela com BuildExpr – Maratona AdvPL e TL++ 069

Nesse vídeo demonstraremos a utilização da função BuildExpr que abre uma tela para montar um filtro de um alias.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zExe069
Exemplo para filtrar tabelas através e uma tela de filtro
@type Function
@author Atilio
@since 06/12/2022
@see https://tdn.totvs.com/display/public/framework/BuildExpr
@obs 
    Função BuildExpr
    Parâmetros
        + cAlias            , Caractere         , Alias da Tabela
        + oWnd              , Objeto            , Objeto que chamou a função
        + cFilter           , Caractere         , String já contendo o filtro
        + lTopFilter        , Lógico            , Utiliza expressão SQL (.T.) ou AdvPL (.F.)
        + bOk               , Bloco de Código   , Bloco de código executado ao clicar no botão Confirmar
        + oDlg              , Objeto            , Dialog onde será apresentado o construtor de filtros
        + aUsado            , Array             , Array com os campos que poderão ser usados nos filtros
        + cDesc             , Caractere         , Título da Janela
        + nRow              , Numérico          , Posição da linha inicial para exibir a tela de filtro
        + nCol              , Numérico          , Posição da coluna inicial para exibir a tela de filtro
        + aCampo            , Array             , Array com os campos que serão apresentados
        + lVisibleTopFilter , Lógico            , Verifica expressão do filtro como TopConnect
        + lExpBtn           , Lógico            , Permite habilitar ou desabilitar o botão Expressão
        + cTopFilter        , Caractere         , Expressão do filtro do TopConnect
    Retorno
        + cRet              , Caractere         , Expressão do filtro

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe069()
    Local aArea   := FWGetArea()
    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

    FWRestArea(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.

2 Responses

  1. Divair Zarpelon disse:

    posso usar essa função para montar uma query ? pelo que vi o retorno ele monta expressoes nao compativeis com o SQL

    • Bom dia Divair, tudo joia?

      Até onde sei, a BuildExpr é exclusiva para comandos em AdvPL / TLPP, então ela deve ser usada em conjunto por exemplo com a DbSetFilter.

      Pode ser que até tenha alguma função que converta filtro de expressões em AdvPL / TLPP para SQL, mas eu desconheço.

      Vou tentar pesquisar e se encontrar algo te aviso.

      De antemão, você poderia pegar o resultado da BuildExpr e tratar, por exemplo, usar StrTran substituindo .And. por AND, .Or. por OR, $ por IN e assim por diante.

      Um grande abraço.

Deixe uma resposta

Terminal de Informação