Menues Configurables

Post Reply
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Menues Configurables

Post by jose_murugosa »

Hola a todos!!!!

Como siempre me han ayudado mucho, me tomo el atrevimiento de tirar este tema para saber sus sugerencias y como lo han hecho.

Tengo aplicaciones en las que cada usuario tiene sus menúes y barras de botones personalizadas, pero (Rústico yo) :shock: , las he armado con varias secuencias de:
IF tal usuario
tal menu
ELSEIF tal usuario
tal menu
....

Ya sé, es muy elemental :lol: , por eso me gustaría saber como lo han resuelto Uds. en sus aplicaciones, para darme algunas ideas.

si hay porciones de código con la explicación mucho mejor. :wink:

Gracias desde ya por sus invalorables aportes a mi rustiquez :D :D
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
sildata
Posts: 38
Joined: Thu May 11, 2006 7:41 pm

Saludos JOSE

Post by sildata »

JOSE: yo creo que la solucion estaria en poder generar a travez de una matriz la cual seria primeramente muy facil de corregir, modificar y editar
lamentablemente yo solo hice una parte pero no se hacer lo demas, si consigues la solucion por favor avisame.
Saludos y feliz navidad
Rodolfo Silva
sildata@cantv.net
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Post by jose_murugosa »

Gracias por tu respuesta Rodolfo :D ,

Estoy viendo varias ideas......, veré que resulta de esto y si recibo más feedback de los colegas del foro. :wink:

Te tendré al tanto...
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
Raymundo Islas M.
Posts: 590
Joined: Tue Mar 14, 2006 11:34 pm
Location: Acapulco, Gro. MEXICO

Post by Raymundo Islas M. »

Hola Jose

Por el moment lo estoy manejando de esta manera :

Tengo un modulo donde "muestro" todas las opciones mas importantes que quiero o no asignar a X usuario.


Image

Image

Dichas selecciones, las guardo en un archivo y las aplico al usuario que se haya "logeado".

Creo que la unica diferencia mayor entre lo que quieres hacer y lo que hago, es que en tu caso, quieres crear las opciones personalizadas segun el usuario y sus privilegios, en mi caso, el menu y los botones siguen igual solo que algunas estan desactivados.


Espero te sirva


SALUDOS
FWH 10.6 + xHarbour + Borland 582
User avatar
Silvio
Posts: 3107
Joined: Fri Oct 07, 2005 6:28 pm
Location: Teramo,Italy

Post by Silvio »

Dear jose_murugosa,
do you see the fsdi2006 ?
I have a small function to create an acces to usuarios for all the program molules

it run ok and it is easy...
you can create level user...


OR

you can go to samples of fivewin
there is an sample to put button on button bar (configurable drop and drag ) it save on ini files
here you can create many ini files for each usuarios ... this is an good idea...
Best Regards, Saludos

Falconi Silvio
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Post by jose_murugosa »

Raymundo:

Que bella solución :D , solo una pregunta: ¿Que función cumple el botón "act. todo"?

Silvio:

Muy interesante, me gustaría ver algo de ese código o de la idea sobre la que lo has basado :roll: .
respondiendo a la pregunta de fsdi2006. acabo de llegar de entregar un sistema que me tenía los tiempos apretados, así que lo veré hoy o mañana seguramente.

Te tendré al tanto.... :wink:
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
ramirezosvaldo
Posts: 101
Joined: Mon Oct 10, 2005 6:48 pm
Location: Cd. Juarez Chihuahua
Contact:

Post by ramirezosvaldo »

Hola Jose

En mi caso, yo tengo una tabla donde guardo los usuarios que accesan al sistema. y en un campo de esa tabla guardo un archivo texto donde tengo la definicion de los menus.

Como tu dices es algo rustico pero me funciona por cada usuario.

Saludos
Osvaldo Ramirez

P.S. Si necesitas el codigo dime, pues aun lo tengo desde Clip53 hasta Xbase++ 1.9
User avatar
Patricio Avalos Aguirre
Posts: 1028
Joined: Fri Oct 07, 2005 1:56 pm
Location: La Serena, Chile
Contact:

Post by Patricio Avalos Aguirre »

Hola Jose

Mira yo lo hago de la siguiente manera, envio el menu y de ahi hago los acceso, te adjunto los fuentes

http://hyperupload.com/download/0274c3f ... o.zip.html

Dentro de la carpeta dbf\ esta el ejecutable

usuario=admin
clave=admin

usuario=prueba
clave=1

Espero que te sirva

Saludos
Patricio
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Post by jose_murugosa »

Gracias Patricio y Osvaldo por compartir sus soluciones!!!!!!! :D

Les agradezco su bondad al compartir sus ideas conmigo y los demás del foro. :D
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
cmsoft
Posts: 653
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Post by cmsoft »

Estimado Jose:
Yo desarrolle una solucion, poniendo los items del menu en una tabla, con el siguiente formato:
USUARIO: Clave del usuario
MODULO: Modulo que debe ejecutar
DETALLE: Item que va a salir como item del menu
SUBMENU: Esto indica: N no es submenu. S: Es un submenu. - Es separador.
ORDEN1: El orden dentro del menu, en forma similar a una cuenta contable de orden gerarquico. Ejemplo:
USUARIO MODULO DETALLE SUBMENU ORDEN1
CESAR Archivos S 100000
CESAR ABMCLIE Clientes N 110000
CESAR ABMPROV Proveedores N 120000
CESAR --------------- - 130000
CESAR Listados S 140000
CESAR REPCLIE Listar clientes N 141000
CESAR REPPROV Listar provee. N 142000
CESAR Procesos S 200000
CESAR FACTURA Facturacion N 210000
JUAN Archivos S 100000
JUAN ABMCLIE Clientes N 110000

Obviamente, esta tabla es autogestionable por el usuario, puede cargar nuevos usuarios y asignarle los permisos. Como se ve en el ejemplo, CESAR tiene acceso a todo y JUAN solo a cargar clientes.
Luego, el modulo que genera el menu segun el usuario que accede es el siguiente:

// --------------------------------------------------------------------//
// ------------- Funcion men£ de la pantalla principal ----------------//
// --------------------------------------------------------------------//
STATIC FUNCTION HazMenu(musuario,nItems)
LOCAL i, oMenu, j, oMenuItem, nivel, nivel1, ult
MEMVAR oWPpal
IF !abrirar("menues",1,"menu1") && Abrir menues con alias MENU1
RETURN oMenu
ELSE
SET INDEX TO menues
ENDIF
menu1->(DBSEEK(musuario))
MENU oMenu
j := 0
aproce :={}
nItems := 1
nivel := 1
ult := "N"
DO WHILE menu1->usuario = musuario
IF menu1->submenu = "S" && Si es submenu
MENUITEM ALLTRIM(menu1->detalle)
ult := "S"
MENU
ELSE
ult := "N"
IF menu1->submenu = "-" && Si un separador
SEPARATOR
ELSE && Si un proceso
j++
AADD(aproce,menu1->modulo) && Cargo la tabla de procesos
MENUITEM oMenuItem PROMPT ALLTRIM(menu1->detalle);
ACTION ejecfunc(oMenuItem:nHelpid) HELPID j
ENDIF
ENDIF
IF nivel = 1 && Si es un titulo
nItems++ && Cuento los items del menu principal
ENDIF
nivel1 := AT("0",menu1->orden1) - 1
menu1->(DBSKIP(1))
nivel := AT("0",menu1->orden1) - 1
IF nivel < nivel1 .and. menu1->usuario = musuario && Si retrocedo
FOR i := nivel TO (nivel1 - 1) && en nivel pongo
ENDMENU && los ENDMENU
NEXT i
IF ult = "S" .and. nivel = 1 && Si es titulo
ENDMENU && solo tambien
ENDIF
ELSE
IF ult = "S" .and. nivel = 1 && Si es titulo
ENDMENU && solo tambien
ENDIF
ENDIF
ENDDO
ENDMENU
** Esta parte del menu siempre va
MENUITEM "&Salir"
MENU
MENUITEM "&Salir" ACTION (oWPpal:end)
SEPARATOR
MENUITEM "&Acerca" ACTION MsgInfo("Sistema de Gestion " +CHR(10)+;
"Esta licencia pertenece a"+CHR(10)+memvar->xnomb_emp+CHR(10)+;
"Direccion de sistemas"+CHR(10)+;
"Municipalidad de Mercedes"+CHR(10)+;
"Todos los derechos reservados","Acerca de Gestion Plus")
SEPARATOR
MENUITEM "&Cascada" ACTION oWppal:oWndClient:Cascade() ;
WHEN(LEN(MEMVAR->aVentanas)>0)
MENUITEM "&Mosaico" ACTION oWppal:oWndClient:Tile() ;
WHEN(LEN(MEMVAR->aVentanas)>0)
MENUITEM "&Minimizar Todas" ACTION oWppal:oWndClient:IconizeAll() ;
WHEN(LEN(MEMVAR->aVentanas)>0)
ENDMENU
ENDMENU
CLOSE ALL
RETURN oMenu
// --------------------------------------------------------------------//
// ------------- Funcion que ejecuta las funciones del menu -----------//
// --------------------------------------------------------------------//
FUNCTION ejecfunc(mifunc)
DO &(aproce[mifunc])
RETURN NIL

Como se ve en el modulo, el arreglo aProce guarda las funciones que deben ejecutarse segun el item del menu y luego son llamadas en la funcion EjecFunc

Espero que se entienda y te pueda servir. Cualquier cosa me avisas
Atte.
Cesar
Jairo Centeno
Posts: 13
Joined: Thu Mar 08, 2007 6:04 pm
Location: Zaragoza, España

Post by Jairo Centeno »

Hola José,

Yo lo hago "semi-rústico" asi:


/* 23/Marzo/2005 - Construye el Menú desde una base de datos - Jcenteno */
FUNCTION BldMenu()
*----------------------------------------------------------------*
LOCAL oMainMenu, oMnuItem
LOCAL cMnuAlias, i:= 1, nRec, fAction, cFileBmp, cResName
LOCAL lRight

IF Len( cMnuAlias := OpenDbf( aSysVar( cSysMenus ), 2, .T., .F., .F.,,"ADS",.T. ) ) = 0
MsgStop( "Ha ocurrido un error en el sistema y deberá cerrarse" )
oWnd:End()
ENDIF

nRec := ( cMnuAlias )->( LastRec() ) //RecCount()
( cMnuAlias )->( OrdSetFocus(1) )

MENU oMainMenu

FOR i := 1 To nRec

IF ( cMnuAlias )->FldSeparat = TRUE
SEPARATOR
ENDIF

IF ( cMnuAlias )->FldVirtKey = 0
MENUITEM oMnuItem PROMPT ALLTRIM(( cMnuAlias )->fldTxtOpt) ;
MESSAGE ALLTRIM(( cMnuAlias )->fldMessage)
ELSE
MENUITEM oMnuItem PROMPT ALLTRIM(( cMnuAlias )->fldTxtOpt) ;
MESSAGE ALLTRIM(( cMnuAlias )->fldMessage) ;
ACCELERATOR ( cMnuAlias )->FldnState, ( cMnuAlias )->FldVirtKey
ENDIF

oMnuItem:lChecked := ( cMnuAlias )->fldCheck

lRight:= Eval( {|| &( ALLTRIM( ( cMnuAlias )->fldCondi ) ) } )
oMnuItem:lActive := lRight

IF ! EMPTY( fAction := ALLTRIM( ( cMnuAlias )->fldAction ) )
oMnuItem:bAction := &( fAction )
// ??? fAction // Debug
ENDIF
IF FILE( cFileBmp := aGraphs(cMnuImgPath) + ALLTRIM( ( cMnuAlias )->FldFileBmp ) )
oMnuItem:hBitmap:= ReadBitmap( 0, cFileBmp )
ENDIF
IF ! EMPTY( cResName := ALLTRIM( ( cMnuAlias )->FldResBmp ) )
oMnuItem:hBitmap:= LoadBitmap( GetResources(), cResName )
ENDIF

DO CASE
CASE ( cMnuAlias )->cNext == "M0"
MENU
CASE ( cMnuAlias )->cNext == "M1"
MENU
CASE ( cMnuAlias )->cNext == "E1"
ENDMENU
CASE ( cMnuAlias )->cNext == "E2"
ENDMENU
ENDMENU
CASE ( cMnuAlias )->cNext == "E3"
ENDMENU
ENDMENU
ENDMENU
CASE ( cMnuAlias )->cNext == "E4"
ENDMENU
ENDMENU
ENDMENU
ENDMENU
CASE ( cMnuAlias )->cNext == "E5"
ENDMENU
ENDMENU
ENDMENU
ENDMENU
ENDMENU
CASE ( cMnuAlias )->cNext == "E6"
ENDMENU
ENDMENU
ENDMENU
ENDMENU
ENDMENU
ENDMENU
ENDCASE
( cMnuAlias )->(dbSkip())
NEXT i

( cMnuAlias )->(dbCloseArea())

RETURN oMainMenu

Espero te sirva.

Saludos,
User avatar
jose_murugosa
Posts: 943
Joined: Mon Feb 06, 2006 4:28 pm
Location: Uruguay
Contact:

Post by jose_murugosa »

Gracias Jairo,

Por supuesto que sirve, todo aporte mejora y enriquece.

Gracias por compartirlo :D
Saludos/Regards,
José Murugosa
FWH + Harbour + Bcc7. Una seda!
User avatar
jacgsoft
Posts: 96
Joined: Fri Nov 24, 2006 9:03 pm
Location: Lima - Peru

Post by jacgsoft »

Hola Jose

Yo lo hago asi:

1. En una tabla tengo las opciones de todos los sistemas (opciones.dbf)
2. En otra tabla tengo a los usuarios (usuarios.dbf)
3. En otra tabla tengo la Relacion de Usuarios+Opciones (Accesos.dbf)

Asi se ve el mantenimiento de los accesos

Image




Luego para desplegar los menus lo hago asi:



Static _Amnp,_Asmn

***********************************************************
Function Main
If Check_clav()
Get_opc_men()

Define Brush oBru Style Bricks
Define Font oFon Name 'Arial' Weight -8

Define Window oWind Title 'Sistema De Planillas' ;
Brush oBru Menu Menu1(oWind)
Set Message Of oWind To 'Medicina Externa S.A.' Clock Date
Activate Window oWind Maximized

Endif

Return(Nil)
*********************************************************

Function Menu1(oWind)
Local oMenu,I,J

Menu oMenu
For I=1 To Len(_Amnp)
MenuItem Alltrim(Left(_Amnp,30))
Menu
For J=1 To Len(_Asmn)
If Subs(_Amnp,31,2)=Subs(_Asmn[J],31,2)
MenuItem Alltrim(Left(_Asmn[J],30))
Endif
Next I
EndMenu
Next I
EndMenu

Return oMenu

************************************************************

Function Get_opc_men()
_Amnp:={}
_Asmn:={}

Select A
Net_use('Men_opci',.F.,3)
Set Index To ('Men_opci')

Seek Vsystem
Do While !Eof() .And. A->Men_sist=Vsystem
If A->Status#' ' //.Or. Len(Alltrim(A->Men_nive))>2
Skip
Loop
Endif

If Len(Alltrim(A->Men_nive))=2
Aadd(_Amnp,Left(Alltrim(A->Men_dscr)+Space(30),30)+A->en_nive)
Endif

If Len(Alltrim(A->Men_nive))=4
Aadd(_Asmn,Left(Alltrim(A->Men_dscr)+Space(30),30)+A->Men_nive)
Endif

Skip
Enddo
Close DataBases

Return(Nil)
***********************************************************


y asi queda

Image
MOISES
Posts: 824
Joined: Wed Aug 22, 2007 10:09 am

Post by MOISES »

Sería muy bueno que Antonio implementara un control de acceso en la clase TMenu ;).

Un saludo,

Moisés
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Moisés,

Cada programador suele tener sus propias preferencias y es dificil construir un modelo que a todos satisfaga. Es por esto que FiveWin ofrece mucha libertad para que el programador lo construya como desee.
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply