Verificando se o usuário está online no sistema

Publicado por Equipe Blog Advpl em

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

 

 


Equipe Blog Advpl

Amantes da tecnologia

18 comentários

Junia Grasiela · 13 de maio de 2015 às 14:18

Olá, boa tarde!

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

    Moderador · 13 de maio de 2015 às 17:55

    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:

    Menu

      Teo · 31 de maio de 2015 às 19:27

      Boa noite!

      Parabéns! Excelente site!
      Estará fazendo parte das minhas consultas!

      Poderia enviar esse fonte pra mim também

      Obrigado

Ramilson C. Sobral de Moraes Júnior - TI · 20 de maio de 2015 às 15:36

Boa tarde,

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

Gabriel Pulido · 26 de maio de 2015 às 13:25

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

Claudio · 27 de maio de 2015 às 12:16

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.

Claudio · 27 de maio de 2015 às 12:19

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 · 2 de junho de 2015 às 12:42

    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

Teo · 31 de maio de 2015 às 20:08

Boa noite,

Parabéns pelo site! Muito bom!

Poderia enviar esse fonte pra mim também?

Alexandre Serinhano · 1 de junho de 2015 às 19:35

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

Moderador · 2 de junho de 2015 às 12:36

Fonte anexado a pagina.

Teo · 17 de agosto de 2015 às 16:02

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

joaomendes · 19 de agosto de 2015 às 08:58

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

Cleiton Genuino da Silva · 30 de março de 2020 às 13:27

cannot find function U_RCFG0005 in AppMap consegue me enviar para estudo ???

    Equipe Blog Advpl · 30 de março de 2020 às 20:44

    O programa foi criado na versão 11.5, para versões mais atuais será necessário sua atualização.
    Segue fonte para download Fonte RCFG0005

Deixe uma resposta