/Banco de dados

voltar
/Banco de dados

Montando um menu dinâmico com banco de dados

Mauricio Junior
em .NET

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

Formado pela Faculdade Anhanguera, Especialista pela FGV (Fundação Getúlio Vargas), Pós-Graduação em Docência Superior e Mestre em Engenharia Elétrica pela Universidade de Brasília. Com 30 anos, possui sete livros publicados pela editora Ciência Moderna. É certificado Microsoft MCP, MCAD e MVP. Trabalha como Analista Sênior na empresa ATP S.A. http://www.mauriciojunior.org

2 comentários Comente também

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

Dê Sua Opinião

O seu endereço de email não será publicado Campos obrigatórios são marcados *


oito × = 24

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