FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour duda de Menú y permisos de usuarios
Posts: 422
Joined: Mon Aug 17, 2009 12:18 PM
duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 01:50 PM

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

Saludos,



Eduardo
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 02:24 PM
Hola...
Yo lo hago así:
Code (fw): Select all Collapse
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


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:

Code (fw): Select all Collapse
FOR Q=1 TO LEN(AutorizaSis[Q])
   IF !AutorizaSis[Q]
      aMenuItem[Q]:Disable()
   ELSE
      aMenuItem[Q]:Enable()
   ENDIF
NEXT


Espero te sirva la idea.
Saludos desde Argentina, Esteban.
Ojeda Esteban Eduardo.

Buenos Aires - Argentina.

FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport

Skype: jreduojeda
Posts: 422
Joined: Mon Aug 17, 2009 12:18 PM
Re: duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 08:22 PM

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.

:D

Saludos,



Eduardo
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 08:33 PM

Entiendo.
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
Posts: 422
Joined: Mon Aug 17, 2009 12:18 PM
Re: duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 08:42 PM

Sí, pero creo que hay unas funciones para cargar y salvar Arrays a disco!!.

Saludos,



Eduardo
Posts: 23
Joined: Thu Dec 10, 2009 06:07 AM
Re: duda de Menú y permisos de usuarios
Posted: Wed Feb 17, 2010 11:21 PM
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:aControls[i]: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

Continue the discussion