Verificando se o usuário está online no sistema

Blog Advpl - Share knowledge

Verificando se o usuário está online no sistema

Controle de Usuarios

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…

Relatorio de Acessos

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
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 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!

Controle de Usuários
Mapeia Acessos dos Usuarios no Sistema

 

 

 

16 comentários

  1. Olá, boa tarde!

    Excelente, gostaria de utilizar, qual o nome do fonte principal para poder adicionar o mesmo em algum menu?

  2. Boa tarde,

    Poderia enviar para o meu e-mail também? Muito Obrigado e está de Parabéns, seu blog é muito bom.

  3. poderia disponibilizar fonte alejopulido030@gmail.com ¡¡ muito interesante !! Saludos desde Colombia

  4. Claudio disse:

    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.

  5. Claudio disse:

    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?

    • Moderador disse:

      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

  6. Teo disse:

    Boa noite,

    Parabéns pelo site! Muito bom!

    Poderia enviar esse fonte pra mim também?

  7. Muito bom o seu trabalho. Gostaria de receber também esse fonte. Abs

  8. Teo disse:

    Muito bom mesmo, principalmente para quem tem ambientes diferente e não utiliza balanceamento de carga!
    Poderia enviar pra mim tbm?

  9. joaomendes disse:

    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á.

Português Português Español Español English English