Verificando se o usuário está online no sistema
Um amigo semanas atrás me perguntou:
_ Como consigo ver quem está online no Protheus e se posso ver alguns detalhes dos usuários?
Então respondi a ele, “_ Porque você não usa o Monitor e o Configurador? “
Mas ele me disse que o problema dele era que, como prestador de serviços, a empresa não liberava o acesso total a ele ao Configurador e Monitor, apenas criaria o programa e repassasse para o pessoal de TI que eles compilavam. Situação difícil né? Já passei por isso, e fiz algo parecido, juntei dados do configurador e do monitor.
Mas essas informações não são difíceis de se mostrar, pois a Totvs disponibiliza no portal.
Abaixo algo que montei, tem mais coisas que isso, como gerar relatórios de acessos, menus, módulos, etc…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
Static Function VerOnline() aOnline := {} aUsuarios := allusers() ProcRegua(Len(aUsuarios)) oUsuarios:SetOrder(1) oUsuarios:GoTop() For nx := 1 to Len(aUsuarios) PSWOrder( 1 ) If PSWSeek( aUsuarios[nx][1][1], .T.) //Incproc("Processando "+Alltrim(PswRet()[1,4])) aLogon := FWUsrUltLog(PswRet()[1,1]) if(aLogon[1]==dDatabase) nDuracao := SubtHoras(aLogon[1],aLogon[2],dDataBase,Left(Time(),5)) If nDuracao < 0 nDuracao := 0 EndIf cDuracao := SUBSTR(STRZERO(nDuracao, 5, 2), 1, 2) + ":" + STRZERO((nDuracao - INT(nDuracao) )* 60, 2) aadd(aOnline,{Alltrim(PswRet()[1,4]),dtoc(aLogon[1]),aLogon[2],cDuracao,aLogon[3],aLogon[4],aLogon[5]}) Endif Endif Next cSayOn1 := "Usuários OnLine ("+Alltrim(Str(nx))+"):" oSayOn1:Refresh() oOnline:SetOrder(1) oUsuarios:GoTop() oOnline:Refresh() Return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Static Function fAtuOn(nLinha) IncProc("Iniciando…") UsrArray() oOnline:SetOrder(1) oUsuarios:GoTop() aOnline := {} ProcRegua(len(aUsrOn)) For i := 1 to len(aUsrOn) ProcRegua(len(aUsrOn[i])) For y := 1 to len(aUsrOn[i]) IncProc("Lendo"+aUsrOn[i][y][1]) aadd(aOnline,{aUsrOn[i][y][1],aUsrOn[i][y][2],aUsrOn[i][y][3],aUsrOn[i][y][4],aUsrOn[i][y][5],aUsrOn[i][y][6],aUsrOn[i][y][7],; aUsrOn[i][y][8],aUsrOn[i][y][9],aUsrOn[i][y][10],aUsrOn[i][y][11],aUsrOn[i][y][12],aUsrOn[i][y][13]}) Next Next oOnline:SetOrder(1) oUsuarios:GoTop() oOnline:Refresh() CursorArrow() Return |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Static Function UsrArray() local oSrv := nil local cEnv := GetEnvServer() //Ambiente local aUsers := {} local nIdx := 0 local aServers := {} local aTmp := {} Local cSrvIp := GETSERVERIP() Local aPortas := {2280,2281,2282,2283}) CURSORWAIT() IncProc("Localizando balances...") // neste caso, quero apenas o balance, que me retorna todos os slaves conectados. aadd(aServers, {cSrvIp, aPortas[1]}) aadd(aServers, {cSrvIp, aPortas[2]}) aadd(aServers, {cSrvIp, aPortas[3]}) aadd(aServers, {cSrvIp, aPortas[4]}) aUsrOn := {} For nIdx := 1 to len(aServers) IncProc("Ambiente: "+cEnv+" | Servidor: "+aServers[nIdx,1]+"/"+Alltrim(Str(aServers[nIdx,2]))) // conecta no slave via rpc oSrv := rpcconnect(aServers[nIdx,1], aServers[nIdx,2], cEnv, "01", "01") if valtype(oSrv) == "O" oSrv:callproc("RPCSetType", 3) // chama a funcao remotamente no server, retornando a lista de usuarios conectados aTmp := oSrv:callproc("GetUserInfoArray") aadd(aUsrOn, aclone(aTmp)) aTmp := nil // limpa o ambiente oSrv:callproc("RpcClearEnv") // fecha a conexao rpcdisconnect(oSrv) else return "Falha ao obter a lista de usuarios." endif Next nIdx CursorArrow() Return varInfo("usr",aUsers) |
Espero que tenha sido útil!
allusers FWUsrUltLog GetEnvServer GETSERVERIP PSWOrder PSWSeek RPCSetType
16 comentários
Olá, boa tarde!
Excelente, gostaria de utilizar, qual o nome do fonte principal para poder adicionar o mesmo em algum menu?
Agradecemos o seu elogio, enviei para seu e-mail o fonte. Esperamos que seja útil.
No menu usuários do SIGACFG.XNU coloque a sintaxe:
Boa noite!
Parabéns! Excelente site!
Estará fazendo parte das minhas consultas!
Poderia enviar esse fonte pra mim também
Obrigado
Boa tarde,
Poderia enviar para o meu e-mail também? Muito Obrigado e está de Parabéns, seu blog é muito bom.
Enviado para seu email. abraços
poderia disponibilizar fonte alejopulido030@gmail.com ¡¡ muito interesante !! Saludos desde Colombia
Caro colega,
Achei interessante esta documentação sobre as permissões e acessos dos usuários.
Se possível, envie o fonte do CFGR0006 para meu email (claudio_avb@ig.com.br)
Obrigado e parabéns pelo blog. Muito útil.
Um dúvida ainda,
Estas funcionalidades que vc postou (VeronLine, FatuOn e Usrarray) já estão sendo chamadas pelo fonte ou tem-se que fazer algum link para chama-las?
Olá!
As funções:
VeronLine = verifica quais usuarios do sistema estão online (pode chamar de qualquer lugar)
FatuOn = pega os usuarios
Usrarray = Mostra os usuarios nos balances disponiveis, é preciso especificar a porta dos balances
Boa noite,
Parabéns pelo site! Muito bom!
Poderia enviar esse fonte pra mim também?
Muito bom o seu trabalho. Gostaria de receber também esse fonte. Abs
Fonte anexado a pagina.
Muito bom mesmo, principalmente para quem tem ambientes diferente e não utiliza balanceamento de carga!
Poderia enviar pra mim tbm?
Olá, anexamos o fonte ao artigo.
Muito ótimo esse fonte.
Excelente meu amigo.
O que mais me interessou foi a rotina de imprimir os acessos que cada usuário possui…
Porém quanto eu tentei usar essa opção deu um erro… Percebi então que no arquivo que você anexou está faltando um fonte.
cannot find function U_RCFG0005 in AppMap
Essa referida função não se encontra no arquivo fonte que você disponibilizou.
Você pode me enviar-la por e-mail.
Obrigado desde já.
Olá, anexamos o fonte ao artigo, lembrando que a parte de senha não funciona mais a partir da versao 11 do protheus