Como filtrar mais fácil os registros dentro da tela de Manutenção de Profile do Protheus

No artigo de hoje, vamos demonstrar um facilitador que criamos, para filtrar os registros na tela de Manutenção de Profile.

Imagina que você tem que dar manutenção em um profile com inúmeros registros, e apesar de ter um botão pesquisar, não tem um de filtrar, então você acaba tendo que usar o pesquisar várias vezes.

Pensando nisso, montamos a seguinte lógica:

  1. Usando o ponto de entrada ChkExec, verificamos se é a rotina de manutenção de profile
  2. Se for, adicionamos o atalho Shift F11 apontando para a nossa função chamada zFiltProf
  3. Dentro dessa função, nós pegamos o alias da tabela de profile, montamos uma estrutura de campos e acionamos a BuildExpr para montar a tela de filtro
  4. Caso tenha filtro, é aplicado um DbSetFilter na tabela, caso o usuário clique em cancelar, é limpado o filtro

Abaixo um gif do funcionamento da rotina:

Filtrando o Profile

 

E um ponto importante pessoal, é de que, se você usar o atalho para fazer o filtro, logo depois de acabar as manutenções, lembre de acionar o atalho e limpar o filtro.

Abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function ChkExec
Ponto de Entrada acionado ao clicar em alguma opção no menu
@type  Function
@author Atilio
@since 04/11/2023
@see https://tdn.totvs.com/display/public/framework/CHKEXEC+-+Dispara+ponto+de+entrada
/*/

User Function ChkExec()
    Local lContinua := .T.
    Local cFuncao	:= Upper(ParamIXB)

    //Se for a função de manutenção do profile
    If ("PROFMGR" $ cFuncao)
        SetKey(K_SH_F11, {|| u_zFiltProf() })
    EndIf

Return lContinua

/*/{Protheus.doc} User Function zFiltProf
Função para abrir uma tela de filtros na manutenção do Profile dos Usuários
@type  Function
@author Atilio
@since 04/11/2023
/*/

User Function zFiltProf()
    Local cTabProfile := "PROFALIAS"
    Local cFiltro     := ""
    Local aCamposTab  := {}
    Local aCampos     := {}
    Local nAtual      := 0

    //Se a tabela de Profile tiver aberta
    If Select(cTabProfile) > 0

        //Monta o Array de Campos que será passado na BuildExpr
        aCamposTab := (cTabProfile)->(DbStruct())
        For nAtual := 1 To Len(aCamposTab)
            aAdd(aCampos, {;
                aCamposTab[nAtual][1],; // Nome do Campo
                aCamposTab[nAtual][1],; // Título
                "",;                    // Usado
                nAtual,;                // Ordem
                aCamposTab[nAtual][3],; // Tamanho
                "",;                    // Máscara
                aCamposTab[nAtual][2],; // Tipo
                aCamposTab[nAtual][4];  // Tamanho de Decimais
            })
        Next

        //Abre a tela de montagem de filtro
        cFiltro := BuildExpr(cTabProfile, /*oWnd*/, /*cFilter*/, /*lTopFilter*/, /*bOk*/, /*oDlg*/, /*aUsado*/, /*cDesc*/, /*nRow*/, /*nCol*/, aCampos)
    
        //Se tiver filtro, usa o DbSetFilter para filtrar a tabela
        If ! Empty(cFiltro)
            (cTabProfile)->(DbSetFilter({|| &(cFiltro)}, cFiltro))
            
        //Senão, limpa qualquer filtragem
        Else
            (cTabProfile)->(DbClearFilter())
        EndIf
        (cTabProfile)->(DbGoTop())
    EndIf
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