Ok Comprendo
Yo administro eso de la siguiente forma:
Tabla: Tab Usuarios
Campos
Id Pk Int Not nULL
Usuario VarChar(25) NOT NULL
Id_tab_perfiles int not null
Tabla Tab_Perfiles
Campos
Id Pk Int Not null
Perfil varchar(50) && Administrador, Cajero, Bodeguero, Secretaria ...etc
Tabla Tab_procesos
Campos
Int PK int not null
Proceso varchar(50) &&aca identifico cada proceso al cual voy a controlarle el acceso por Ejemplo
&& Actualiza Saldo de Cuenta Corriente
&& Actualiza Saldo de Stock, etc
Tabla Tab_Autorizaciones
Campos
Id Pk Int not null
Id_Perfiles int not null
Id_Proceso
Acceso_total Bit not null
Leer Bit not null
escribir not null
borrar bit not null
Y el codigo que administra todo es asi: Se pasa como parametros el id_Usuario y la Descripcion del proceso que quiero verificar si el usuario tiene o no el acceso
ej ver_permiso (2, "Actualiza Saldo de Cuenta Corriente")
Esto en caso de tablas dbf
* ------------------------------------------------
* DETERMINA SI EL USUARIO PUEDE EJECUTAR UN PROCESO O CUENTA CON AUTORIZACION
* USO: VER_PERMISO(ID_USUARIO,PROCESO)
* RETORNA: RET SI PUEDE O NO (T/F)
* ------------------------------------------------
Function ver_permiso(m.id_usuario,m.proceso)
If Pcount() != 2
Messagebox("No se puede determinar si puede hacer el cambio porque falta un parametro",0,"Atencion")
Else
Local ret
ret=.F. &&asumo que no puedo
Select id From TAB_PROCESOS ;
WHERE Upper(Alltrim(procesos)) = Upper(Alltrim(m.proceso)) ;
INTO Cursor MI_PROC
If _Tally = 1 &&DEBE EXISTIR SINO NO ENTRA NO MAS
Select
tab_usuario.id , tab_autorizaciones.acceso_total, tab_autorizaciones.escribir ,;
tab_autorizaciones.leer, tab_autorizaciones.borrar ,tab_autorizaciones.id_proceso;
FROM tab_usuario;
INNER Join tab_autorizaciones On tab_usuario.Id_Perfil = tab_autorizaciones.Id_Perfil ;
WHERE
tab_usuario.id = M.id_usuario And tab_autorizaciones.id_proceso = MI_PROC.ID_PROCESOS;
INTO Cursor MI_AUTORIZAC
*BROW
If _Tally != 0
Select MI_AUTORIZAC
Go Top
If MI_AUTORIZAC.acceso_total = .T. Or (MI_AUTORIZAC.leer = .T. Or MI_AUTORIZAC.escribir = .T.)
ret=.T.
Else
Msg="USTED NO PUEDE "+Alltrim(Upper(M.proceso))
Centrado(Msg,2)
Endif
Else
Msg="NO ENCONTRE AUTORIZACION PARA EVALUAR "+Alltrim(Upper(M.proceso))
Centrado(Msg,2)
Endif
Else
Centrado("AVISE AL ADMINISTRADOR PUES EL PROCESO NO ESTA DEFINIDO",2)
Endif
Endif
Retu(ret)
Para acceso a sql Server (uso la libreria Foxydb)
Igual paso como parametros el id Perfil del usuario y id del proceso
Function pide_autorizacion(m.Id_Perfil,m.id_proceso)
Store .F.To m.acceso_total,m.leer,m.escribir,m.borrar
TEXT TO _sql_Tab_Autorizaciones TEXTMERGE PRETEXT 7 NOSHOW
SELECT TOP 1 TAB_AUTORIZACIONES.ACCESO_TOTAL,TAB_AUTORIZACIONES.LEER,
TAB_AUTORIZACIONES.ESCRIBIR,TAB_AUTORIZACIONES.BORRAR from TAB_AUTORIZACIONES
WHERE ID_PROCESO = <<m.id_proceso>> and id_perfil = <<m.Id_Perfil>>
ENDTEXT
oDb.Sql(_sql_Tab_Autorizaciones , "Tab_autorizaciones","Tab_autorizaciones")
If Reccount('tab_autorizaciones') = 1 && solo debe haber un proceso por perfil
Select tab_autorizaciones
m.acceso_total=tab_autorizaciones.acceso_total
m.leer=tab_autorizaciones.leer
m.escribir=tab_autorizaciones.escribir
m.borrar=tab_autorizaciones.borrar
Endif
Return
Esta función busca el id del proceso que quiero verificar
* nombre :Busca_proceso
* Objetivo :Buscar un Proceso y rescatar el id
* Parametro:Descripcion del proceso
* Devuelve :EL Id_Proceso
FUNCTION busca_proceso(m.proceso)
*aca ver si tiene permiso y cargar el form
TEXT TO _sql_Tab_Procesos TEXTMERGE PRETEXT 7 NOSHOW
SELECT Tab_Procesos.id,Tab_Procesos.Procesos, Tab_Procesos.nom_Form
from Tab_Procesos
where Tab_Procesos.procesos = <<m.proceso>>
ENDTEXT
oDb.Sql(_sql_Tab_Procesos , "Tab_Procesos","Tab_Procesos")
If Reccount("Tab_Procesos") = 0
centrado("No esta definido el Proceso ["+ m.proceso+ " ] , Avise al Soporte",2)
m.id_tab_procesos = 0
Else
m.id_tab_procesos = Tab_Procesos.id
Endif
RETURN (m.id_tab_procesos)
En cada Form defino como propiedades
ACCESO_TOTAL tipo logica Leer Logica, Escribir Logica, Borrar Logica
de esa forma obtengo para cada uno de los procesos y perfil de usuario si puede leer, escribir Borrar