Seções iMasters
.NET + SQL Server

Montando um menu dinâmico com banco de dados

Olá, pessoal!

Neste artigo, veremos como montar “menu” com os dados vindo diretamente do banco de dados. Sabemos que muitos aplicativos montam o seu “menu” cadastrado no banco de dados, cada um com seu perfil e sua permissão. Para isso, é necessário ter primeiro uma boa estrutura de banco de dados e campos para montá-lo.

Em momentos anteriores, escrevi outros artigos que montam “menu” diretamente de um XML, e com o componente diferente, ou seja, que precisa ser referenciado no projeto. Este artigo será um pouco diferente, pois os dados são de um banco de dados, e o componente para montar o menu é o nativo da ferramenta.

Referências:

  • Visual Studio .NET 2008
  • Banco de dados SQL Server
  • Linguagem C#.NET
  • Plataforma Web ASP.NET

Vou mostrar o banco de dados montado para que entenda desde o começo o
passo a passo, pegando os dados do menu vindo do banco de dados.

O primeiro passo é criar uma tabela no banco de dados. Dei o nome de dbo.Objeto. Essa tabela terá o menu, links, ordenação e informações necessárias para montar o menu.

O campo ObjetoId é autoincremento e o objetoPaiId é um auto-relacionamento indicando o menu principal. Por exemplo: se o “menu” for o principal, esse campo ObjetoPaiId será NULL. Para o submenu, o objetoPaiId terá um número indicando o ObjetoId. Segue a imagem preenchida para que tenha uma outra boa referência:

Produção

  • Formaliza Conta

Note que, na imagem, na primeira linha, o ObjetoPaiId está NULL (o último campo da primeira linha). E que na segunda linha e no último campo existe um número referenciado, é o mesmo da primeira linha; ou seja; um auto-relacionamento.

Foram inseridos também alguns campos que, no momento, não serão utilizados, mas podem ser futuro. Os campos são ExibeImagem e URLImagem. Isso é para caso o seu menu tenha alguma imagem que precise ser mostrada.

No campo endereço, o nome da página está com a extensão. Veja que não coloquei o endereço completo, só o nome da página propriamente dito. Todas as minhas páginas estão no diretório raiz. Dessa forma, coloquei só o nome da página. Se tivesse dentro de uma pasta, colocaria o nome da pasta barra o nome da página. (Isso é só para que entenda como funciona).

O objeto que vou usar para mostrar o “menu” é o do próprio Visual Studio .NET 2008. A versão da ferramenta não importa, pois o <ASP:MENU> é o mesmo das versões anteriores.

E esse objeto funciona em todos os browsers sem qualquer problema. Pelo menos em meus testes todos abriram.

Além do objeto <ASP:MENU>, vou usar CSS e Imagens para ficar bonito o menu montado na tela.

Tabelas de vínculo

Agora, vamos ver a criação das tabelas de vínculo e um pouco de codificação em C#.NET.

Lembrando que não vamos mostrar aqui a forma de conectar ao banco de dados, nem
mesmo fazer o select para validar o usuário logado, isso porque estou partindo
do pressuposto que você sabe fazer isso. O objetivo é mostrar como carregar o
menu vindo do banco de dados de acordo com o usuário logado no sistema.

O menu precisa ser carregado de acordo com o perfil do
usuário, depois que ele entra com o usuário e senha. Dessa forma, o sistema
busca no banco de dados o perfil e com ele busca os dados no menu, que, no nosso
caso, é a tabela Objeto.

Se
o seu caso for apenas carregar o menu sem distinção de usuário, o caminho está
fácil. Mas se você precisa carregar o menu de acordo com o grupo
do usuário, é necessário criar mais algumas tabelas específicas.

Criando
tabelas para vincular o perfil do usuário

A
primeira tabela para gerar o perfil do usuário foi a Grupo.

Tabela Grupo

Campos:

  • GrupoId (int) auto incremento
  • Nome (varchar(60) notnull

A descrição do grupo pode ser colocada como você preferir. Na minha aplicação eu
tenho: Administrador, Usuário, Leitor.

Depois
de criar a tabela grupo, é necessário criar uma tabela chamada GrupoObjeto para
vincular a tabela Objeto com a tabela Grupo.

Tabela GrupoObjeto

Campos:

  • ObjetoId
    (int) notnull
  • GrupoId
    (int) notnull

O número do menu cadastrado fica no
campo ObjetoId, e o número do grupo cadastro fica no campo GrupoId.

A
próxima tabela para criar vínculo é a usuário grupo, ou seja, vincular o
usuário cadastro ao grupo. Para isso criei a tabela chamada UsuarioGrupo.

Tabela: UsuarioGrupo

Campos:

  • UsuarioId (int) notnull
  • GrupoId (int) notnull

Depois
de criar estas tabelas ficou simples fazer o select. Para facilitar, vou
colocar o select abaixou para carregar o menu do usuário que acabou de logar no
sistema.

Select
que retorna o menu para o usuário

   Select distinct Obj.*

From Objeto Obj

Inner join GrupoObjeto gob on obj.objetoId = gob.objetoId

Inner Join Grupo gru on gob.grupoId = gru.grupoId

Inner Join UsuarioGrupo ugp on ugp.grupoId = gru.grupoId

Where ugp.usuarioId=(NUMERO_DO_USUARIO_ID)

Order by obj.Ordem

Select 1.1

Este select retorna o menu de acordo com o
usuário logado e com ele basta construir o código para mostrar em tela.

Codificando

Agora vamos codificar o menu para ser mostrado em tela. Para facilitar,
eu vou criar uma classe chamada Sessão, que carrega todas as sessões do meu
sistema, inclusive a sessão de menu.

Esta
classe sessão só tem get e set.

    public static DataTable Menu
{
get
{
try
{
return (DataTable)HttpContext.Current.Session["Session:MENU"];
}
catch
{
return null;
}
}
set
{
HttpContext.Current.Session["Session:MENU"] = value;
}
}

public static decimal UsuarioId
{
get
{
try
{
return Conversion.ToDecimal(HttpContext.Current.Session["Session:USUARIOCOD"]);
}
catch
{
return 0;
}
}
set
{
HttpContext.Current.Session["Session:USUARIOCOD"] = value;
}
}  

Depois que o
usuário entrar no sistema com usuário e senha, eu preciso buscar o menu e
chamar o select 1.1. O retorno dela eu atribuo para a classe sessão atribuindo
o menu.

 Sessao.Menu = new ObjetoBRL().BuscaObjetosDoUsuario(Sessao.UsuarioId);

Assim,
eu fico com a sessão menu preenchida para montar na tela.

Na próxima parte do artigo veremos o restante da codificação. Espero que tenha entendido e
gostado, qualquer dúvida pode entrar em contato.

Comente também

2 Comentários

Vou tentar isso na prática hoje. Espero que o Visual Studio me ajude!
Valeu a ajuda Mauricio!

Luis Claudio

Teria uma solução meu trabalho e fazer isso até segunda
Mas os programas instalados não funcionam de forma alguma Sql Server 2005 e 2008
para que eu possa conectar.

> Claudio ,
construa uma tabela de
Paises
Cidades
Regioes
Estados

todos separados , mas com uma tabela secundaria a todos cruzando tudo ok
ou seja

Paises
Regioes
Estados
Cidades

TBPA0009 = este é o nome desta tabela

esta tabela relaciona os numeros oficiais dos arquivos acima
independente das particularidades dos mesmos
então
Tabela de (Paises) tem sua tabela , sua DLL
Tabela de Regioes tem sua tabela e sua dll
Tabela de estados tem sua tabela e sua dll
Tabela de Cidades tem sua tabela e sua dll

Tabela de curzamento geral tem sua tabela e dll

nomeclatura das tabelas e programas

TBPA0001
o que quer dizer
(TB) = Tabela
(PA)= a qual sistema pertence no caso PAConect
(0001)= numero da tabela

Então :
Tabela de Paises = TBPA0005
dll = tbpa0005.dll
Programa = PRGPA005

Tabela de Regioes = TBPA0006
dll tbpa0006.dll
Programa = PRGPA006

Tabela de Estados = TBPA0007
dll= tbpa0007.dll
Programa = PRGPA007

Tabela de Cidades = TBPA0008
dll = tbpa0008.dll
Programa PRGPA008

entendido ???!!!

Qual a sua opinião?