No vídeo de hoje, vamos demonstrar como salvar em uma tabela as funções e módulos mais usados pelos usuários.
A dúvida de hoje, nos perguntaram, se seria possível extrair a informação de quais funções ou módulos os usuários mais usam, sem utilizar o MV_DIRLOG e MV_LOGSIGA).
Pensando nisso, montamos um exemplo, onde vamos demonstrar em como salvar essa informação em uma tabela customizada através do ponto de entrada ChkExec, e depois você poderá usar isso nas suas queries e relatórios.
Segue abaixo o vídeo exemplificando:
E 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 12/06/2024
@see https://tdn.totvs.com/display/public/framework/CHKEXEC+-+Dispara+ponto+de+entrada
/*/
User Function ChkExec()
Local aArea := FWGetArea()
Local lContinua := .T.
Local cFuncao := ParamIXB
//Se veio parênteses, tira
If "(" $ cFuncao
cFuncao := Left(cFuncao, At("(", cFuncao) - 1)
EndIf
//Aciona a rotina para criar o log
If ExisteSX2("ZL0")
u_zVid0165(cFuncao)
EndIf
FWRestArea(aArea)
Return lContinua
/*/{Protheus.doc} User Function zVid0165
Função para gravar um log quando um usuário acessa alguma rotina, pode ser adicionada em pontos de entrada como SDULogin ou ChkExec
@type Function
@author Atilio
@since 12/06/2024
@param cFuncao, Caractere, Nome da função
@obs É necessário criar uma tabela no Configurador, no nosso exemplo usamos a ZL0, sendo:
Tabela:
ZL0 - Logs de Acesso em Funções (pode ser compartilhada ou exclusiva, depende da sua regra de negócio)
Campos (todos com Contexto Real):
ZL0_FILIAL - Campo padrão
ZL0_CODIGO - Código Sequencial - Caractere - Tamanho 9
ZL0_USRCOD - Código do Usuário - Caractere - Tamanho 6
ZL0_USRNOM - Nome do Usuário - Caractere - Tamanho 30
ZL0_AMBIEN - Ambiente - Caractere - Tamanho 30
ZL0_DATA - Data - Data - Tamanho 8
ZL0_HORA - Hora - Caractere - Tamanho 8
ZL0_FUNCAO - Nome da Função - Caractere - Tamanho 20
ZL0_MODNUM - Número do Módulo - Numérico - Tamanho 2
ZL0_MODSIG - Sigla do Módulo - Caractere - Tamanho 3
Índices:
1: ZL0_FILIAL + ZL0_CODIGO
/*/
User Function zVid0165(cFuncao)
Local aArea := FWGetArea()
Local cCodUsr := RetCodUsr()
Local cCodSeq := ""
Default cFuncao := FunName()
//Busca o próximo sequencial
DbSelectArea("ZL0")
cCodSeq := GetSXENum("ZL0", "ZL0_CODIGO")
//Inclui o registro na tabela de logs
RecLock("ZL0", .T.)
ZL0->ZL0_FILIAL := FWxFilial("ZL0")
ZL0->ZL0_CODIGO := cCodSeq //Código sequencial
ZL0->ZL0_USRCOD := cCodUsr //Código do Usuário
ZL0->ZL0_USRNOM := UsrRetName(cCodUsr) //Nome do Usuário
ZL0->ZL0_AMBIEN := GetEnvServer() //Ambiente
ZL0->ZL0_DATA := Date() //Data
ZL0->ZL0_HORA := Time() //Hora
ZL0->ZL0_FUNCAO := cFuncao //Nome da Função
ZL0->ZL0_MODNUM := nModulo //Número do Módulo
ZL0->ZL0_MODSIG := cModulo //Sigla do Módulo
ZL0->(MsUnlock())
ConfirmSX8()
FWRestArea(aArea)
Return
Bom pessoal, por hoje é só.
Abraços e até a próxima.
Nos fontes premium tem isso? Voçê falo do Relatorio de Usuários?
Bom dia Mauro, tudo joia?
Ainda não. O fonte premium de análise de logs de usuários, irá ao ar em Setembro desse ano.
Mas se você precisar dele antes, nos mande um email que lhe enviamos o pacote com o fonte.
Tenha uma ótima e abençoada semana.
Um forte abraço.