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.