Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Action List + BD (https://www.clubdelphi.com/foros/showthread.php?t=75326)

mantraxer21 14-08-2011 02:36:11

Action List + BD
 
Estimados:

Estoy haciendo un form que permita administrar el o los accesos de cada usuario a las opciones del menu, segú su nivel de acceso.

Trabajo con Firebird 2.5.

La base de datos tiene.

tabla usuario compuesta asi.

iduser
username
password
email
name_user
idNivel

Tabla Nivel_Acceso compuesta así.

idNivel
Nivel

Alguien por ahi me recomendó trabajar con ActionList, pero la verdad nunca lo he ocupado, diciendo que podía dejar valores enabled:= false en cada opción del menú que el usuario no tenga acceso.

Nosé si alguién ha trabajado con esto, haciendo un recorrido al verificar el usuario y password del form logín, entonces, habilita o desabilita él o las opciones según su Nivel de Acceso.

Gracias

Saludos Cordiales

newtron 14-08-2011 09:41:37

Hola.

Te comento como lo hago yo.

Aparte del fichero de usuarios que ya tienes yo manejo un fichero de opciones activas del menú por cada usuario. Tengo un mantenimiento de este fichero en el cuál por cada usuario se activan o desactivan las opciones del menú a las que puede acceder el mismo. Para esto uso un treeview que creo en función a las opciones del menú y se pueden activar o desactivar las mismas que quedaría de la siguiente manera:

Uploaded with ImageShack.us

El código para componer las opciones a partir del menú es el siguiente:

Código Delphi [-]
procedure TNTFormUsuarios.ActualizoArbol;
var
LinMenu,LinHijos,N,M: SmallInt;
NodoPadre,NodoHijo: TTreeNode;
TablaLin: TedbTable;
sAux: String;
begin
  Screen.Cursor := CrSqlWait;
  TablaLin:=Bd.DameTabla('USUARIOSLINEAS');
  TablaLin.IndexName := 'USUARIO';
  TablaLin.SetRangeStart ;
  TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.DameValor;
  TablaLin.SetRangeEnd ;
  TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.DameValor;
  TablaLin.ApplyRange ;
  // Primero creo el arbol con las opciones del menú
  LinMenu:=FormMenu.MenuPrincipal.Items.Count;
  TreeView1.Items.Clear;
  for N:=0 To LinMenu-1 do begin
    // Inserto Nodo padre
    NodoPadre:=TreeView1.Items.Add(nil,StrTran(FormMenu.MenuPrincipal.Items[N].Caption,'&',''));
    LinHijos:=FormMenu.MenuPrincipal.Items[N].Count;
    for M:=0 To LinHijos-1 do begin
      if FormMenu.MenuPrincipal.Items[N].Items[M].Caption<>'-'  then begin
        NodoHijo:=TreeView1.Items.AddChild(NodoPadre,StrTran(FormMenu.MenuPrincipal.Items[N].Items[M].Caption,'&',''));
        NodoHijo.StateIndex := 1;
      end;
    end;
  end;
  // Desmarco todas las opciones
  NtButton2.Click;
  // Una vez creado compruebo si tiene lineas para chequear o quitar
  TablaLin.First;
  while not TablaLin.Eof do begin
    for N:=0 to Treeview1.Items.Count-1 do begin
      if (TreeView1.Items[N] as TTreeNode ).Level=0 then
        sAux:=TreeView1.Items[N].Text;
      if TablaLin.FieldByName('OPCION').AsString=sAux+'#'+TreeView1.Items[N].Text then begin
        TreeView1.Items[N].StateIndex := 2;
        break;
      end;
    end;
    TablaLin.Next;
  end;
  Screen.Cursor := CrDefault;
end;

Con este código creo el árbol de opciones del menú y las activo o desactivo en función de si está la opción en la tabla o no. En la misma linea del registro pongo el nombre del caption del MenuItem (el que sale en la parte superior)+ '#' + el caption de la opción del MenuItem que sale en el menú.

Cuando grabas el usuario con las opciones de menú chequeadas hago lo siguiente:

Código Delphi [-]
procedure TNTFormUsuarios.RegistroGrabado(Sender: TObject);
var
TablaLin: TedbTable;
N: SmallInt;
sAux: String;
begin
  // Borro y vuelvo a regenerar lineas de permisos
  DataModule1.EDBQuery1.SQL.Clear;
  DataModule1.EDBQuery1.SQL.Add('DELETE FROM USUARIOSLINEAS WHERE USUARIO='+QuotedStr(NtEditCodigo.Damevalor));
  DataModule1.EDBQuery1.ExecSQL;
  //
  TablaLin:=Bd.DameTabla('USUARIOSLINEAS');
  for N:=0 to Treeview1.Items.Count-1 do begin
    if (TreeView1.Items[N] as TTreeNode ).Level=0 then
      sAux:=TreeView1.Items[N].Text;
    // Solo incluyo los permitidos
    if TreeView1.Items[N].StateIndex = 2 then begin
      TablaLin.Append;
      TablaLin.FieldByName('USUARIO').AsString:=NtEditCodigo.Damevalor;
      TablaLin.FieldByName('OPCION').AsString:=sAux+'#'+TreeView1.Items[N].Text ;
      TablaLin.Post;
    end;
  end;
  Bd.CierraTabla(TablaLin);
end;

Con esto dejo en la tabla de lineas por usuario solo las opciones de menú permitidas para el usuario, las demás no las grabo.

Después de esto ya solo te queda poner en el menú principal las acciones para habilitar o deshabilitar las opciones de menú según te interese:

Código Delphi [-]
    // COMPONGO MENU SEGUN USUARIO
    Tablausuarios:=Bd.DameTabla ('USUARIOS');
    TablaUsuarios.IndexName:='CODIGO';
    TablaUsuarios.FindKey ([Ntlabel3.caption]);
    DataModule1.EDBQuery1.SQL.Clear;
    DataModule1.EDBQuery1.SQL.Add('SELECT * FROM USUARIOSLINEAS WHERE UPPER(USUARIO)='+QuotedStr(UpperCase(NtLabel3.Caption)));
    DataModule1.EDBQuery1.ExecSQL;
    DataModule1.EDBQuery1.First;
    while not DataModule1.EDBQuery1.Eof do begin
      sAux:=DataModule1.EDBQuery1.FieldByName('OPCION').AsString;
      for N:= 0 to MenuPrincipal.Items.Count-1 do begin
        if StrTran(MenuPrincipal.Items[N].Caption,'&','') = Copy(sAux,1,Pos('#',sAux)-1) then begin
          for M:=0 To MenuPrincipal.Items[N].Count-1 do begin
            if Copy(sAux,Pos('#',sAux)+1,100)=MenuPrincipal.Items[N].Items[M].Caption then begin
              MenuPrincipal.Items[N].Items[M].Enabled := True;
              break;
            end;
          end;
        end;
      end;
      DataModule1.EDBQuery1.Next;
    end;

Espero que todo este rollo te ayude.
Saludos

mantraxer21 15-08-2011 04:02:04

Okas

Muchas Gracias...

Revisando y entendiendo !!!


La franja horaria es GMT +2. Ahora son las 12:03:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi