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...
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! [sdm_download id="2534" fancy="1" new_window="1" button_text="Copiar agora!"] [sdm_download id="2737" fancy="1" new_window="1" button_text="Copiar agora!"]