/Banco de dados

voltar
/Banco de dados

Montando um menu dinâmico com banco de dados

Mauricio Junior em .NET SQL Server
Mauricio Junior em .NET SQL Server
A- A+

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.

Mauricio Junior em .NET SQL Server

Dê Sua Opinião

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

2 comentários em “Montando um menu dinâmico com banco de dados”

  1. 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 ???!!!

leia mais
Este projeto é mantido e patrocinado pelas empresas:
Hospedado por: