No vídeo de hoje, vamos demonstrar em como copiar filtros do Profile de Usuários.
A dúvida de hoje, nos perguntaram, se seria possível criar alguma customização para copiar os filtros do Profile de um Usuário para outros.
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como fazer esse procedimento através de um atalho acionado via p.e. ChkExec onde vamos copiar as informações da MP_SYSTEM_PROFILE.
Obs.: Existe um recurso nativo no Configurador para criar filtro para todos os usuários, mas nesse exemplo o foco é copiar filtros já criados pelos próprios usuários.
Segue abaixo o vídeo exemplificando:
E abaixo o código fonte desenvolvido:
//Bibliotecas #Include "TOTVS.ch" #Include "TopConn.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) FWAlertInfo("Shift + F8: Filtra Profile" + CRLF + "Shift + F9: Copia Profile", "Atalhos manutenção Profile") SetKey(K_SH_F8, {|| u_zFiltProf() }) SetKey(K_SH_F9, {|| u_zCopyProf() }) 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 @see https://terminaldeinformacao.com/2023/12/18/como-filtrar-mais-facil-os-registros-dentro-da-tela-de-manutencao-de-profile-do-protheus/ /*/ 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 /*/{Protheus.doc} User Function zCopyProf Copia a regra atual para outros usuários @type Function @author Atilio @since 22/08/2024 /*/ User Function zCopyProf() Local aArea := FWGetArea() Local aPergs := {} Local cUsrDe := Space(6) Local cUsrAt := StrTran(cUsrDe, " ", "Z") //Adiciona os parâmetros a serem confirmados pelo usuário aAdd(aPergs, {1, "Usuário De", cUsrDe, "", ".T.", "USR", ".T.", 80, .T.}) aAdd(aPergs, {1, "Usuário Até", cUsrAt, "", ".T.", "USR", ".T.", 80, .T.}) //Se a tela de parâmetros for confirmada If ParamBox(aPergs, "Informe os parâmetros", /*aRet*/, /*bOk*/, /*aButtons*/, /*lCentered*/, /*nPosx*/, /*nPosy*/, /*oDlgWizard*/, /*cLoad*/, .F., .F.) Processa({|| fCopia()}, "Aguarde...") EndIf FWRestArea(aArea) Return Static Function fCopia() Local aArea := FWGetArea() Local cTabProfile := "PROFALIAS" Local cQryUsers := "" Local cProg := "" Local cTask := "" Local cType := "" Local cDefs := "" Local cEmpr := "" Local cFili := "" Local nAtual := 0 Local nTotal := 0 Local cMensagem := "" //Busca os usuários conforme os filtros colocados cQryUsers := " SELECT " + CRLF cQryUsers += " USR_ID AS CODIGO, " + CRLF cQryUsers += " USR_NOME AS NOME " + CRLF cQryUsers += " FROM " + CRLF cQryUsers += " SYS_USR " + CRLF cQryUsers += " WHERE " + CRLF cQryUsers += " D_E_L_E_T_ = ' ' " + CRLF cQryUsers += " AND USR_ID >= '" + MV_PAR01 + "' " + CRLF cQryUsers += " AND USR_ID <= '" + MV_PAR02 + "' " + CRLF cQryUsers += " AND USR_ID != '" + Alltrim((cTabProfile)->P_NAME) + "' " + CRLF cQryUsers += " ORDER BY " + CRLF cQryUsers += " 1 " + CRLF TCQuery cQryUsers New Alias "QRY_USR" //Se houver dados If ! QRY_USR->(EoF()) //Busca as informações o registro atual cProg := (cTabProfile)->P_PROG cTask := (cTabProfile)->P_TASK cType := (cTabProfile)->P_TYPE cDefs := (cTabProfile)->P_DEFS cEmpr := (cTabProfile)->P_EMPANT cFili := (cTabProfile)->P_FILANT //Define o tamanho da régua DbSelectArea("QRY_USR") Count To nTotal ProcRegua(nTotal) QRY_USR->(DbGoTop()) //Enquanto houver dados no resultado da query, percorre todos os usuários While ! QRY_USR->(EoF()) //Incrementa a régua nAtual++ IncProc("Copiando informações, registro " + cValToChar(nAtual) + " de " + cValToChar(nTotal) + "...") //Cria o novo registro RecLock(cTabProfile, .T.) (cTabProfile)->P_NAME := QRY_USR->CODIGO (cTabProfile)->P_PROG := cProg (cTabProfile)->P_TASK := cTask (cTabProfile)->P_TYPE := cType (cTabProfile)->P_DEFS := cDefs (cTabProfile)->P_EMPANT := cEmpr (cTabProfile)->P_FILANT := cFili (cTabProfile)->(MsUnlock()) //Incrementa a mensagem cMensagem += QRY_USR->CODIGO + " - " + QRY_USR->NOME + CRLF QRY_USR->(DbSkip()) EndDo //Exibe mensagem ShowLog("Registro foi copiado para os seguintes usuários: " + CRLF + CRLF + cMensagem) Else FWAlertError("Não foi encontrado usuários com os filtros informados!", "Falha") EndIf QRY_USR->(DbCloseArea()) FWRestArea(aArea) Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Fala, Dan! tudo joia?
Como podemos puxar um relatório em planilha que traga todas as informações do perfil de usuário? (grupos, papel de trabalho, restrições [acessos, ambientes, horários, filiais], timeout, módulos, menus [nomes e rotinas] etc..
Bom dia Yuri, tudo joia graças a Deus e você?
Do profile, não sei dizer se tem algum relatório.
Mas quanto aos acessos, ai você pode gerar o relatório padrão, e escolher o tipo Planilha e no formato Tabela: https://centraldeatendimento.totvs.com/hc/pt-br/articles/360001053728-Framework-Linha-Protheus-Imprimir-relat%C3%B3rio-avan%C3%A7ado-do-Cadastro-de-Usu%C3%A1rios
Tenha uma ótima e abençoada quarta feira.
Um forte abraço.