Página 1 de 1

control de usuarios

Publicado: Mar Feb 23, 2016 4:13 am
por jjgp2
Buenas noches

Hay alguna forma de controlar el numero de usuarios a entrar en un sistema

por su ayuda mil gracias

Re: control de usuarios

Publicado: Mar Feb 23, 2016 5:10 pm
por bingen
Buenas tardes, se puede hacer de diversas maneras, pero antes de nada ¿el programa usa MySql o MariaDb? por que de eso depende la mejor respuesta.

Salu2.

Re: control de usuarios

Publicado: Mié Feb 24, 2016 12:46 am
por jjgp2
bingen escribió:Buenas tardes, se puede hacer de diversas maneras, pero antes de nada ¿el programa usa MySql o MariaDb? por que de eso depende la mejor respuesta.

Salu2.
Gracias por responder uso mariadb

Re: control de usuarios

Publicado: Mié Feb 24, 2016 7:28 pm
por bingen
Pues entonces puedes preguntar a la base de datos cuanta gente hay conectada a ella y listo, en cuanto salen del programa se desconectan. Es el método más sencillo y seguro.

A ver si te vale con esto, tendrás que adaptarlo a tu sistema.


//------------------------------------------------------------------------------
//
// NetUsers(lActivos, lMenosYo , lShow, lDetailed)
// Función ......: Devuelve todos los usuarios de la base de datos o solo aquellos que estén activos (que tengan la BD en uso)
// Parámetros ...: lActivos Por defecto .F.
// lMenosYo Elimina el usuario activo que efectua la pregunta de la lista
// lShow Muestra una ventana con el resultado solo en caso de que lActivos = .T.
// lDetailed Añade al array información de la estación.usuario de Windows del PC utilizado por el usuario el último acceso
// Returns .....: aUsuarios
//
METHOD NetUsers(lActivos, lMenosYo, lShow, lDetailed) CLASS tMySqlInitial
Local oSqlDb, aUsuarios:={}, nItem:=0, lExit:=.F., cUserList:=""

Default lActivos To .F.
Default lMenosYo To .F.
Default lShow To .F.
Default lDetailed To .F.

aUsuarios:=Appdata:oSqlDb:QueryArray("show processlist")

If !lActivos
aUsuarios:=ArrayCol(Appdata:oSqlDb:QueryArray("select distinct user from mysql.user where user<>'root' order by user"),1)
Else
Do While !lExit
aUsuarios := Appdata:oSqlDb:QueryArray("show processlist")

For nItem := 1 to Len(aUsuarios)
IF ((!Appdata:lMultiSqlDb .And. Lower(Allstring(aUsuarios[nItem,4]))<>Lower(Allstring(Appdata:cSqlDbName))) .Or. ;
(Appdata:lMultiSqlDb .And. Lower(Left(Allstring(aUsuarios[nItem,4]),Len(Allstring(aUsuarios[nItem,4]))-4))<>Lower(Left(Allstring(Appdata:cSqlDbName),Len(Allstring(Appdata:cSqlDbName))-4)) )) .Or. ;
Lower(Allstring(aUsuarios[nItem,2]))="root" .Or. Lower(Allstring(aUsuarios[nItem,2]))="event_scheduler"
ArrayDel(aUsuarios,nItem,.T.)
nItem--
ElseIF lMenosYo .And. Lower(Allstring(aUsuarios[nItem,2]))=Lower(Appdata:cUserName)
ArrayDel(aUsuarios,nItem,.T.)
nItem--
Else
aUsuarios[nItem,2]:=NameCase(aUsuarios[nItem,2])
Endif

Next
aUsuarios:=ArrayUnique(ArrayCol(aUsuarios,2),1)
aUsuarios:=Asort(aUsuarios)

If lDetailed
cUserList:=""
for nItem:= 1 to Len(aUsuarios)
aUsuarios[nItem]:={aUsuarios[nItem],NameCase( Appdata:oSqlDb:Queryvalue( "select DeskTopName from " + Appdata:cControlDatabase + ".Usuarios where Usuario='"+aUsuarios[nItem]+"'" ) )}
cUserList+="Usuario: "+aUsuarios[nItem,1]+" Puesto: "+aUsuarios[nItem,2]+CRLF
Next
Else
cUserList:=Concat(aUsuarios,CRLF)
Endif

If lShow
MsgWait(IF(AppData:nLicence>0,"/ Licencias "+AllTrim(Str(Int(AppData:nLicence)))+CRLF+CRLF,"")+;
"Total de usuarios activos: <b>"+AllString(Len(aUsuarios))+"</b>"+CRLF+CRLF+;
cUserList+CRLF+CRLF+"Pulse y mantenga <b>[Esc]</b> para salir.",;
"Usuarios activos de la BBDD "+IF(!Appdata:lMultiSqlDb,Allstring(Appdata:cSqlDbName),Left(Allstring(Appdata:cSqlDbName),Len(Allstring(Appdata:cSqlDbName))-4)+"%"))
lExit:=lAnd( GetAsyncKeyState( 27 ), 0xFFF0 )
Else
Exit
Endif
Enddo

Endif

Return aUsuarios

Re: control de usuarios

Publicado: Mié Feb 24, 2016 9:01 pm
por jjgp2
Muchas gracias voy a realizar los cambios pertinentes para aplicarlo a mi sistema y te aviso como me fue
bingen escribió:Pues entonces puedes preguntar a la base de datos cuanta gente hay conectada a ella y listo, en cuanto salen del programa se desconectan. Es el método más sencillo y seguro.

A ver si te vale con esto, tendrás que adaptarlo a tu sistema.


//------------------------------------------------------------------------------
//
// NetUsers(lActivos, lMenosYo , lShow, lDetailed)
// Función ......: Devuelve todos los usuarios de la base de datos o solo aquellos que estén activos (que tengan la BD en uso)
// Parámetros ...: lActivos Por defecto .F.
// lMenosYo Elimina el usuario activo que efectua la pregunta de la lista
// lShow Muestra una ventana con el resultado solo en caso de que lActivos = .T.
// lDetailed Añade al array información de la estación.usuario de Windows del PC utilizado por el usuario el último acceso
// Returns .....: aUsuarios
//
METHOD NetUsers(lActivos, lMenosYo, lShow, lDetailed) CLASS tMySqlInitial
Local oSqlDb, aUsuarios:={}, nItem:=0, lExit:=.F., cUserList:=""

Default lActivos To .F.
Default lMenosYo To .F.
Default lShow To .F.
Default lDetailed To .F.

aUsuarios:=Appdata:oSqlDb:QueryArray("show processlist")

If !lActivos
aUsuarios:=ArrayCol(Appdata:oSqlDb:QueryArray("select distinct user from mysql.user where user<>'root' order by user"),1)
Else
Do While !lExit
aUsuarios := Appdata:oSqlDb:QueryArray("show processlist")

For nItem := 1 to Len(aUsuarios)
IF ((!Appdata:lMultiSqlDb .And. Lower(Allstring(aUsuarios[nItem,4]))<>Lower(Allstring(Appdata:cSqlDbName))) .Or. ;
(Appdata:lMultiSqlDb .And. Lower(Left(Allstring(aUsuarios[nItem,4]),Len(Allstring(aUsuarios[nItem,4]))-4))<>Lower(Left(Allstring(Appdata:cSqlDbName),Len(Allstring(Appdata:cSqlDbName))-4)) )) .Or. ;
Lower(Allstring(aUsuarios[nItem,2]))="root" .Or. Lower(Allstring(aUsuarios[nItem,2]))="event_scheduler"
ArrayDel(aUsuarios,nItem,.T.)
nItem--
ElseIF lMenosYo .And. Lower(Allstring(aUsuarios[nItem,2]))=Lower(Appdata:cUserName)
ArrayDel(aUsuarios,nItem,.T.)
nItem--
Else
aUsuarios[nItem,2]:=NameCase(aUsuarios[nItem,2])
Endif

Next
aUsuarios:=ArrayUnique(ArrayCol(aUsuarios,2),1)
aUsuarios:=Asort(aUsuarios)

If lDetailed
cUserList:=""
for nItem:= 1 to Len(aUsuarios)
aUsuarios[nItem]:={aUsuarios[nItem],NameCase( Appdata:oSqlDb:Queryvalue( "select DeskTopName from " + Appdata:cControlDatabase + ".Usuarios where Usuario='"+aUsuarios[nItem]+"'" ) )}
cUserList+="Usuario: "+aUsuarios[nItem,1]+" Puesto: "+aUsuarios[nItem,2]+CRLF
Next
Else
cUserList:=Concat(aUsuarios,CRLF)
Endif

If lShow
MsgWait(IF(AppData:nLicence>0,"/ Licencias "+AllTrim(Str(Int(AppData:nLicence)))+CRLF+CRLF,"")+;
"Total de usuarios activos: <b>"+AllString(Len(aUsuarios))+"</b>"+CRLF+CRLF+;
cUserList+CRLF+CRLF+"Pulse y mantenga <b>[Esc]</b> para salir.",;
"Usuarios activos de la BBDD "+IF(!Appdata:lMultiSqlDb,Allstring(Appdata:cSqlDbName),Left(Allstring(Appdata:cSqlDbName),Len(Allstring(Appdata:cSqlDbName))-4)+"%"))
lExit:=lAnd( GetAsyncKeyState( 27 ), 0xFFF0 )
Else
Exit
Endif
Enddo

Endif

Return aUsuarios

Re: control de usuarios

Publicado: Jue Feb 25, 2016 8:25 am
por bingen
NOTA: Solo te servirá si haces como nosotros que abrimos una conexión contra la BBDD nada más entrar en la aplicación y la cerramos al final.