You are on page 1of 4

blogadvpl.

com

http://blogadvpl.com/v2/verificando-se-o-usuario-esta-online-no-sistema/

Verificando se o usurio est online no sistema

Um amigo semanas atrs me perguntou:


_ Como consigo ver quem est online no Protheus e se posso ver alguns detalhes dos usurios?
Ento respondi a ele, _ Porque voc no usa o Monitor e o Configurador?
Mas ele me disse que o problema dele era que, como prestador de servios, a empresa no liberava o acesso
total a ele ao Configurador e Monitor, apenas criaria o programa e repassasse para o pessoal de TI que eles
compilavam. Situao difcil n? J passei por isso, e fiz algo parecido, juntei dados do configurador e do
monitor.
Mas essas informaes no so difceis de se mostrar, pois a Totvs disponibiliza no portal.
Abaixo algo que montei, tem mais coisas que isso, como gerar relatrios de acessos, menus, mdulos, etc

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 := "Usurios OnLine ("+Alltrim(Str(nx))+"):"
oSayOn1:Refresh()
oOnline:SetOrder(1)
oUsuarios:GoTop()
oOnline:Refresh()
Return
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
Static
local
local
local
local
local
local
Local
Local

Function
oSrv
cEnv
aUsers
nIdx
aServers
aTmp
cSrvIp
aPortas

UsrArray()
:= nil
:= GetEnvServer() //Ambiente
:= {}
:= 0
:= {}
:= {}
:= GETSERVERIP()
:= {2280,2281,2282,2283})

CURSORWAIT()
IncProc("Localizando balances...")
// neste caso,
aadd(aServers,
aadd(aServers,
aadd(aServers,
aadd(aServers,

quero apenas o balance, que me retorna todos os slaves conectados.


{cSrvIp, aPortas[1]})
{cSrvIp, aPortas[2]})
{cSrvIp, aPortas[3]})
{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!
519 Visita(s) esta semana 4 Visita(s) hoje

You might also like