Hola:
Pretendo hacer un control de permisos de usuarios para las opciones del Menú.
¿Hay alguna forma de recuperar el Array con todos los elementos del Menú?.
Es decir, estos datos:
MENU oMenu
MENUITEM "&Ficheros"
MENU
MENUITEM "&Auxiliares"
MENU
MENUITEM OemToAnsi( "C¢digos P&ostales" ) ;
RESOURCE "MNUPOSTAL" ;
ACTION Postal() ;
MESSAGE OemToAnsi( "Mantenimiento de C¢digos Postales" )
MENUITEM "P&rovincias" ;
RESOURCE "MNUPROVINCIAS" ;
ACTION Provincias() ;
MESSAGE "Mantenimiento de Provincias"
MENUITEM "&Zonas" ;
RESOURCE "MNUZONAS" ;
ACTION Zonas() ;
MESSAGE OemToAnsi( "Mantenimiento de Zonas de facturaci¢n" )
Muchas gracias. Un saludo
duda de Menú y permisos de usuarios
duda de Menú y permisos de usuarios
Saludos,
Eduardo
Eduardo
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: duda de Menú y permisos de usuarios
Hola...
Yo lo hago así:
Luego en otro Array paralelo cargo valores lógicos para cada opción del menú. (.t. o .f.) según corresponda para ese usuario.
Y hago lo siguiente:
Espero te sirva la idea.
Saludos desde Argentina, Esteban.
Yo lo hago así:
Code: Select all
MENU oMenu
MENUITEM aMenuItem[1] PROMPT "&Ventas"
MENU
MENUITEM aMenuItem[2] PROMPT "ABM de clientes"+CHR(9)+"CTRL+A";
RESOURCE "CLIEN16";
ACCELERATOR ACC_CONTROL,ASC("A");
MESSAGE "ABM de clientes CTRL+A";
ACTION BrowClientes(oBrush1,oWnd,Empresa,aMenuItem,oBtn1,2)
MENUITEM aMenuItem[3] PROMPT "Listados";
RESOURCE "LIST16";
MESSAGE "Listados de clientes"
MENU
MENUITEM aMenuItem[4] PROMPT "Clientes por código";
RESOURCE "LIST16";
MESSAGE "Clientes por código";
ACTION ListClientes(oBrush1,oWnd,Empresa,1,aMenuItem,4)
MENUITEM aMenuItem[5] PROMPT "Clientes por descripción";
RESOURCE "LIST16";
MESSAGE "Clientes por descripción";
ACTION ListClientes(oBrush1,oWnd,Empresa,2,aMenuItem,5)
MENUITEM aMenuItem[6] PROMPT "Clientes por domicilio";
RESOURCE "LIST16";
MESSAGE "Clientes por domicilio";
ACTION ListClientes(oBrush1,oWnd,Empresa,3,aMenuItem,6)
MENUITEM aMenuItem[7] PROMPT "Clientes por localidad";
RESOURCE "LIST16";
MESSAGE "Clientes por localidad";
ACTION ListClientes(oBrush1,oWnd,Empresa,4,aMenuItem,7)
MENUITEM aMenuItem[8] PROMPT "Clientes por teléfono";
RESOURCE "LIST16";
MESSAGE "Clientes por teléfono principal";
ACTION ListClientes(oBrush1,oWnd,Empresa,5,aMenuItem,8)
MENUITEM aMenuItem[9] PROMPT "Clientes por lista de precio";
RESOURCE "LIST16";
MESSAGE "Clientes por lista de precio";
ACTION ListClientes(oBrush1,oWnd,Empresa,6,aMenuItem,9)
ENDMENU
SEPARATOR
MENUITEM aMenuItem[10] PROMPT "Cuenta corriente";
RESOURCE "CUENTA16";
MESSAGE "Cuenta corriente de clientes"
MENU
MENUITEM aMenuItem[11] PROMPT "Facturación de pedidos";
RESOURCE "FACTU16";
MESSAGE "Facturación de pedidos por cuenta corriente";
ACTION FacturaCtaCte(oBrush1,oWnd,Empresa,aMenuItem,oBtn3,oBtn6,11,63)
MENUITEM aMenuItem[12] PROMPT "Nota de débito";
RESOURCE "FACTU16";
MESSAGE "Nota de débito";
ACTION NotaDebito(oBrush1,oWnd,Empresa,aMenuItem,12)
MENUITEM aMenuItem[13] PROMPT "Nota de crédito";
RESOURCE "FACTU16";
MESSAGE "Nota de crédito";
ACTION NotaCredito(oBrush1,oWnd,Empresa,aMenuItem,oBtn11,13)
MENUITEM aMenuItem[14] PROMPT "Ingreso de cobranzas";
RESOURCE "COBRO16";
MESSAGE "Emisión de recibos de cobranzas";
ACTION ReciboCobranza(oBrush1,oWnd,Empresa,aMenuItem,oBtn7,14)
SEPARATOR
MENUITEM aMenuItem[15] PROMPT "Anulación de comprobantes";
RESOURCE "DEPURA16";
MESSAGE "Anulación de comprobantes de venta";
ACTION Depura_Ventas(oBrush1,oWnd,Empresa,aMenuItem,oBtn10,15)
MENUITEM aMenuItem[16] PROMPT "Reimpresión de comprobantes";
RESOURCE "PRINT16";
MESSAGE "Reimpresión de comprobantes de venta";
ACTION RemprimeVentas(oBrush1,oWnd,Empresa,aMenuItem,oBtn8,16)
SEPARATOR
MENUITEM aMenuItem[17] PROMPT "Actualización de envases";
RESOURCE "VACIOS16";
MESSAGE "Actualización de envases";
ACTION ActualizaVacios(oBrush1,oWnd,Empresa,Datos,aMenuItem,oBtn9,17)
MENUITEM aMenuItem[18] PROMPT "Listado de envases por cliente";
RESOURCE "LIST16";
MESSAGE "Listado de envases";
ACTION ListEnvaces(oBrush1,oWnd,Empresa,aMenuItem,18)
SEPARATOR
MENUITEM aMenuItem[19] PROMPT "Listados de cuenta corriente";
RESOURCE "LIST16";
MESSAGE "Listados de cuenta corriente"
MENU
MENUITEM aMenuItem[20] PROMPT "Detalle de cuenta corriente";
RESOURCE "LIST16";
MESSAGE "Listado de cuenta corriente detallada";
ACTION ListCtaCli(oBrush1,oWnd,Empresa,aMenuItem,oBtn12,20)
MENUITEM aMenuItem[21] PROMPT "Listados de saldos por clientes";
RESOURCE "LIST16";
MESSAGE "Listado de saldos de clientes";
ACTION ListSaldosCli(oBrush1,oWnd,Empresa,aMenuItem,21)
ENDMENU
ENDMENU
SEPARATOR
MENUITEM aMenuItem[22] PROMPT "Precios Especiales";
RESOURCE "PRECIOS16";
MESSAGE "Precios especiales"
MENU
MENUITEM aMenuItem[23] PROMPT "Carga de precios especiales";
RESOURCE "PRECIOS16";
MESSAGE "Carga de precios especiales por cliente";
ACTION PrecioEspecial(oBrush1,oWnd,Empresa,aMenuItem,23)
MENUITEM aMenuItem[24] PROMPT "Clientes con precio especial";
RESOURCE "LIST16";
MESSAGE "Listado de clientes con precio especial";
ACTION ListCliEspecial(oBrush1,oWnd,Empresa,aMenuItem,24)
MENUITEM aMenuItem[25] PROMPT "Precios especiales por cliente";
RESOURCE "LIST16";
MESSAGE "Listado de precios especiales por cliente";
ACTION ListEspecialDet(oBrush1,oWnd,Empresa,aMenuItem,25)
ENDMENU
SEPARATOR
MENUITEM aMenuItem[26] PROMPT "Estadísticas";
RESOURCE "ESTA16";
MESSAGE "Estadísticas"
MENU
MENUITEM aMenuItem[27] PROMPT "Ventas por cliente y fecha";
RESOURCE "ESTA16";
MESSAGE "Listado de ventas por cliente y fecha";
ACTION LisVentasxCli(oBrush1,oWnd,Empresa,aMenuItem,27)
MENUITEM aMenuItem[28] PROMPT "Ventas por producto y fecha";
RESOURCE "ESTA16";
MESSAGE "Listado de ventas por producto y fecha";
ACTION LisVentasxProd(oBrush1,oWnd,Empresa,aMenuItem,28)
MENUITEM aMenuItem[29] PROMPT "Ventas por cliente, producto y fecha";
RESOURCE "ESTA16";
MESSAGE "Listado de ventas por cliente, producto y fecha";
ACTION LisVentasxCliyProd(oBrush1,oWnd,Empresa,aMenuItem,29)
ENDMENU
ENDMENU
oMenu:AddMdi()
ENDMENU
Y hago lo siguiente:
Code: Select all
FOR Q=1 TO LEN(AutorizaSis[Q])
IF !AutorizaSis[Q]
aMenuItem[Q]:Disable()
ELSE
aMenuItem[Q]:Enable()
ENDIF
NEXT
Saludos desde Argentina, Esteban.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: duda de Menú y permisos de usuarios
Hola,
Muchas gracias, pero para definir las opciones me gustaría coger el Array existente. El menú tiene muchas opciones, así me ahorro introducir en una Base de Datos todas.
Muchas gracias, pero para definir las opciones me gustaría coger el Array existente. El menú tiene muchas opciones, así me ahorro introducir en una Base de Datos todas.
Saludos,
Eduardo
Eduardo
- jrestojeda
- Posts: 543
- Joined: Wed Jul 04, 2007 3:51 pm
- Location: Buenos Aires - Argentina
Re: duda de Menú y permisos de usuarios
Entiendo.
Pero luego los permisos debes guardarlos en algún lado. (supongo que en una tabla)
Pero luego los permisos debes guardarlos en algún lado. (supongo que en una tabla)
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
Re: duda de Menú y permisos de usuarios
Sí, pero creo que hay unas funciones para cargar y salvar Arrays a disco!!.
Saludos,
Eduardo
Eduardo
Re: duda de Menú y permisos de usuarios
Hola Mgsoft,
En una dbf tengo los permisos de los usuarios, al iniciar la aplicación los guardo en un arreglo de memoria.
Luego construyo el menú desde otra dbf, en un campo de ésta, guardo el permiso para activar o desactivar cada item.
Iguamente lo hago con la toolbar.
Ejemplo:
FUNCTION BldBar()
*----------------------------------------------------------------*
LOCAL cTbarAlias, i:= 1, nRec, fAction, lRight, cMess, aBmp[3], aRes[3]
IF !AbreDbf( @cTbarAlias, aSysVar(cSysTBar), 1 ) ; oWnd:PostMsg(WM_CLOSE) ; ENDIF
nRec := (cTbarAlias)->( LastRec() )
IF ValType( oApp:oBtnBar ) == "O"
FOR i := 1 To nRec
lRight:= Eval( {|| &(ALLTRIM((cTbarAlias)->FLDCONDI)) } ) // contiene una función que verifica si el usuario tiene el permiso asignado
EnableWindow( oWnd:oBar:aControls:hWnd, lRight )
(cTbarAlias)->(dbSkip())
NEXT i
ELSE
DEFINE BUTTONBAR oApp:oBtnBar SIZE 42,42 ;
3D TOP OF oWnd ;
CURSOR oApp:oCursorHand
FOR i := 1 To nRec
cMess := ALLTRIM((cTbarAlias)->FLDMESSAGE)
aBmp[1] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP1)
aBmp[2] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP2)
aBmp[3] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP3)
aRes[1] := ALLTRIM((cTbarAlias)->FLDRES1)
aRes[2] := ALLTRIM((cTbarAlias)->FLDRES2)
aRes[3] := ALLTRIM((cTbarAlias)->FLDRES3)
IF (cTbarAlias)->FLDSEPARAT
DEFINE BUTTON oButton OF oApp:oBtnBar ;
MESSAGE cMess TOOLTIP cMess ;
GROUP FLAT UPDATE
ELSE
DEFINE BUTTON oButton OF oApp:oBtnBar ;
TOOLTIP cMess MESSAGE cMess ;
FLAT UPDATE
ENDIF
oButton:LoadBitMaps( aRes[1], aRes[2], aBmp[1], aBmp[2], aRes[3], aBmp[3] )
oButton:Refresh()
IF ! EMPTY( fAction := ALLTRIM((cTbarAlias)->FLDACTION) )
oButton:bAction := &(fAction)
ENDIF
lRight:= Eval( {|| &(ALLTRIM((cTbarAlias)->FLDCONDI)) } )
EnableWindow( oButton:hWnd, lRight )
IF ! EMPTY( ALLTRIM((cTbarAlias)->FLDSYS) )
AAdd( oApp:aObjSys, oButton )
ENDIF
(cTbarAlias)->(dbSkip())
NEXT
ENDIF
(cTbarAlias)->(dbCloseArea())
RELEASE cTbarAlias, i, nRec, fAction, lRight, cMess, aBmp, aRes
RETURN oApp:oBtnBar
En una dbf tengo los permisos de los usuarios, al iniciar la aplicación los guardo en un arreglo de memoria.
Luego construyo el menú desde otra dbf, en un campo de ésta, guardo el permiso para activar o desactivar cada item.
Iguamente lo hago con la toolbar.
Ejemplo:
FUNCTION BldBar()
*----------------------------------------------------------------*
LOCAL cTbarAlias, i:= 1, nRec, fAction, lRight, cMess, aBmp[3], aRes[3]
IF !AbreDbf( @cTbarAlias, aSysVar(cSysTBar), 1 ) ; oWnd:PostMsg(WM_CLOSE) ; ENDIF
nRec := (cTbarAlias)->( LastRec() )
IF ValType( oApp:oBtnBar ) == "O"
FOR i := 1 To nRec
lRight:= Eval( {|| &(ALLTRIM((cTbarAlias)->FLDCONDI)) } ) // contiene una función que verifica si el usuario tiene el permiso asignado
EnableWindow( oWnd:oBar:aControls:hWnd, lRight )
(cTbarAlias)->(dbSkip())
NEXT i
ELSE
DEFINE BUTTONBAR oApp:oBtnBar SIZE 42,42 ;
3D TOP OF oWnd ;
CURSOR oApp:oCursorHand
FOR i := 1 To nRec
cMess := ALLTRIM((cTbarAlias)->FLDMESSAGE)
aBmp[1] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP1)
aBmp[2] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP2)
aBmp[3] := aGraphs(cTBarPath) + ALLTRIM((cTbarAlias)->FLDBMP3)
aRes[1] := ALLTRIM((cTbarAlias)->FLDRES1)
aRes[2] := ALLTRIM((cTbarAlias)->FLDRES2)
aRes[3] := ALLTRIM((cTbarAlias)->FLDRES3)
IF (cTbarAlias)->FLDSEPARAT
DEFINE BUTTON oButton OF oApp:oBtnBar ;
MESSAGE cMess TOOLTIP cMess ;
GROUP FLAT UPDATE
ELSE
DEFINE BUTTON oButton OF oApp:oBtnBar ;
TOOLTIP cMess MESSAGE cMess ;
FLAT UPDATE
ENDIF
oButton:LoadBitMaps( aRes[1], aRes[2], aBmp[1], aBmp[2], aRes[3], aBmp[3] )
oButton:Refresh()
IF ! EMPTY( fAction := ALLTRIM((cTbarAlias)->FLDACTION) )
oButton:bAction := &(fAction)
ENDIF
lRight:= Eval( {|| &(ALLTRIM((cTbarAlias)->FLDCONDI)) } )
EnableWindow( oButton:hWnd, lRight )
IF ! EMPTY( ALLTRIM((cTbarAlias)->FLDSYS) )
AAdd( oApp:aObjSys, oButton )
ENDIF
(cTbarAlias)->(dbSkip())
NEXT
ENDIF
(cTbarAlias)->(dbCloseArea())
RELEASE cTbarAlias, i, nRec, fAction, lRight, cMess, aBmp, aRes
RETURN oApp:oBtnBar