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:
- Usando o ponto de entrada ChkExec, verificamos se é a rotina de manutenção de profile
- Se for, adicionamos o atalho Shift F11 apontando para a nossa função chamada zFiltProf
- 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
- 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:
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.
