Gravar em tabela itens do Menu
Frederico Brigatte***
Respostas
Daniel Santos
30/03/2013
Rafael Cunha
30/03/2013
Frederico Brigatte***
30/03/2013
Codigo
Nome
Teria alguma sugestão? É a primeira vez que faço isso, por isso, me avisem se estiver faltando algo. Podem dar sugestões para alteração que faço.
Obrigado.
Frederico Brigatte***
30/03/2013
Codigo - integer
Nome - varchar(30)
CodPai - integer
Rafael Cunha
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Rafael Cunha
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
frederico.brigatte@gmail.com, ok?
Meu msn é: frederico.brigatte@itelefonica.com.br
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Rafael Cunha
30/03/2013
Frederico Brigatte***
30/03/2013
Rafael Cunha
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Deixa te perguntar uma coisa. Desse jeito que quero, dá pra fazer assim:
Monto os menus num TreeView e vou clicando o que o usuário tem acesso. Vamos supor que ele tem acesso só para consultar, então gostaria que somente o botão de consulta fique liberado.
Mas pode montar do seu jeito ai. Pode fazer também, pra me ajudar, montar o treeview com os menus.
Entendeu o que preciso?
Frederico Brigatte***
30/03/2013
Será que vc consegue mandar hoje pra mim?
Rafael Cunha
30/03/2013
[url]https://www.devmedia.com.br/forum/montar-treeview-com-mainmenu/407171[/url]
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Vamos fazer por parte que fica mais facil, não concorda?
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
procedure MontaTreeMenu(mnuMenu: TMenu; treeMenu: TTreeView);
var
i: integer;
No: TTreeNode;
procedure MontaTreeItem(mnuItem: TMenuItem; NoPai: TTreeNode = nil);
var
x: integer;
NoFilho: TTreeNode;
begin
// enquanto houver filhos...
for x := 0 to mnuItem.Count - 1 do
begin
// adiciona um nó ao treeview
NoFilho := treeMenu.Items.AddChild(NoPai, StringReplace(mnuItem.Items[x].Caption,'&','',[rfReplaceAll, rfIgnoreCase]));
if mnuItem.Items[x].Count > 0 then // se o item tiver 'filhos'...
MontaTreeItem(mnuItem.Items[x], NoFilho); // adiciona esses filhos
end;
end;
begin
treeMenu.Items.BeginUpdate; // prepara para manipulação
treeMenu.Items.Clear; // elimina todos os itens
for i := 0 to mnuMenu.Items.Count - 1 do
begin
// adiciona um nó ao treeview
No := treeMenu.Items.Add(nil, StringReplace(mnuMenu.Items[i].Caption,'&','',[rfReplaceAll, rfIgnoreCase]));
if mnuMenu.Items[i].Count > 0 then // se o menu tiver 'filhos'...
MontaTreeItem(mnuMenu.Items[i], No); // adiciona esses filhos
end;
treeMenu.Items.EndUpdate; // finaliza a manipulação
end;
E no botão coloquei isso:
MontaTreeMenu(MainMenu1 ,TreeView1); TreeView1.FullExpand;
No evento onGetImageIndex do TreeView, coloquei isso:
var
idxImagem_0, idxImagem_1: Integer;
begin
idxImagem_0 := 0;
idxImagem_1 := 1;
if not Node.HasChildren then
idxImagem_0 = 0;
Node.ImageIndex := idxImagem_0;
Node.SelectedIndex := idxImagem_1;
Node.StateIndex := idxImagem_0;
O que acontece é o seguinte:
A imagem que coloquei só aparece quando clico no item do TreeView, quando clico em outro, o anterior fica desmarcado. Tenho duas imagens, uma marcada e outra desmarcada.
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Aqui na empresa nós usamos essa forma e está dando muito certo.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Ah, claro que você vai precisar de um campo para referenciar o nome do usuário para quem está cadastrando os direitos de acesso.
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
dm.perfis_conf.edit;
if dm.perfis_confpermissao.value = 'S' then
dm.perfis_confpermissao.value = 'N'
else
dm.perfis_confpermissao.value = 'S';
dm.perfis_conf.ApplyUpdates(0);
Minha tabela MENU esta assim:
Descricao TEXTO
Codigo_Pai TEXTO
Nome_Pai TEXTO
A dúvida é a seguinte, como carregar para o grid os dados dessa tabela usando o componente CLIENTDATASET. O código de cima do grid já grava na tabela? Mas gostaria que gravasse com o ID do Usuário. Como seria a tabela para gravar as permissões?
Joel Rodrigues
30/03/2013
- Quando se fala em campo booleano em bancos de dados, na maioria das vezes utiliza-se BIT (0 ou 1);
- Sua tabela só tem 3 campos, logo, você vai precisar de mais 2: USUARIO (nome/login do usuário) e PERMISSAO (campo booleano/bit representando a permissão do usuário para acessar aquele menu);
- Esse código que você postou serve, mas é preciso adaptar de acordo com os campos do seu dataset;
- Você tem dúvida de como listar isso num DBGrid? É da forma mais simples possível: um dataset com um select, ligado a um datasource, ao qual se liga o DBGrid;
Joel Rodrigues
30/03/2013
Ah, eu pelo que eu me lembro do outro tópico, esse campo Codigo_Pai deveria ser apenas Codigo, não? Pois como eu disse, foi um código que nós criamos para cada item, e não para seu item pai. Pense nisso.
Frederico Brigatte***
30/03/2013
1 - Firebird nem Access, pois estou fazendo de teste no Access não aceita Boolean, como fazer;
2 - Renomeei para Codigo_Pai o campo Codigo;
3 - Os campos USUARIO (nome/login do usuário) e PERMISSAO (campo booleano/bit representando a permissão do usuário para acessar aquele menu) crio na tabela MENUS, certo?
Frederico Brigatte***
30/03/2013
Descricao - TEXTO
Codigo_Pai - TEXTO // era para ser Codigo, mudei para Codigo_Pai
Nome_Pai TEXTO - TEXTO
Login_Usuario - TEXTO
Permissao - SIM / NÃO
Tabela arrumada. Qual o próximo passo?
Joel Rodrigues
30/03/2013
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
select * from menu
Pode ser assim?
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
dm.perfis_conf.edit; if menu2Permissao.value = 'S' then menu2Permissao.value = 'N' else menu2Permissao.value = 'S'; menu2Permissao.Post; // to usando Access // dm.perfis_conf.ApplyUpdates(0);
Fica assim?
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Faça o teste e veja no que dá.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
procedure TForm1.DBGrid1CellClick(Column: TColumn); begin Menu2.edit; if menu2Permissao.AsString = 'Sim' then Begin menu2Login_Usuario.AsString := edtLogin.Text; menu2Permissao.AsString := 'Não' end else Begin menu2Permissao.AsString := 'Sim'; menu2.Post; // to usando Access end; end;
Frederico Brigatte***
30/03/2013
Nela teria:
Codigo_Menu
Codigo_Usuario
Permissao
Aqui poderia também definir os botões do form, não poderia?
Joel Rodrigues
30/03/2013
Com essa tabela que nós estamos trabalhando dá pra tratar o controle de acesso ao mainmenu.
Qual foi o erro que deu?
Frederico Brigatte***
30/03/2013
Menu2.edit; if menu2Permissao.AsVariant = -1 then Begin menu2Login_Usuario.AsString := edtLogin.Text; menu2Permissao.AsVariant := 0 end else Begin menu2Permissao.AsVariant := -1; menu2.Post; // to usando Access end;
Permissão SIM Menu Administração para o usuário AAAAA, eu coloquei um editText la e coloquei AAAAA e não faz nada se clicar no grid
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
Menu2.edit; if menu2Permissao.AsBoolean = True then Begin menu2Login_Usuario.AsString := edtLogin.Text; menu2Permissao.AsBoolean := False end else Begin menu2Permissao.AsBoolean := True; menu2.Post; // to usando Access end;
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Aí é melhor você pesquisar a respeito, por que se eu for passar os passos aqui pra você depurar, não sairemos daqui hoje.
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Mas antes, preciso saber: qual é sua experiência com Delphi? Para eu saber como escrever e comentar o código, de forma a evitar duvidas .
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Ok, acho que seria melhor, mais interessante isso que sugeriu. Agradeço e fico no aguardo.
Frederico Brigatte***
30/03/2013
Já que vai montar um exemplo, poderia fazer o seguinte:
Um exemplo de controle de usuário com perfil. O perfil pode ser em grupos, exemplo: Administrador (Faz tudo), Usuário (Consultar), etc. Quero controlar o Menu e os botões dos forms: Novo, Alterar, Excluir e Consultar.
Liberar o acesso dos botões de acordo com o perfil do usuário, ok? Com Login, Alteração de senha e Logoff.
Isso que preciso. Obrigado
Daniel Santos
30/03/2013
Vai ser mais facil desenvolver o sistema e entregar para ele, ele ate ja passou os requisitos.. hahahahha!
Frederico Brigatte***
30/03/2013
Não é bem assim. Estou TENTANDO fazer isso faz muito tempo. O que acontece é que me perdi no meio de tanta coisa.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Eu ia fazer a parte do MainMenu, aí já apareceu mais coisa. Se eu já não tinha tempo pra fazer o mais básico, imagine agora.
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Tabela Usuários:
Login Varchar(10) not null
Nome Varchar(30)
Senha Varchar(10)
Perfil Varchar(20)
Tabela Permissoes
Login Varchar(10) not null
Menu Varchar(20) not null
Permissao Char(1)
Nome_Menu Varchar(20)
Obs.: Nessa tabela, não sei se iria os menus e botões do form que o usuario teria acesso. E como definiria os botões.
Tabela Perfil
Perfil Varchar(20) not null
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Até pra respirar tá difícil hoje. E essa sua questão requer tempo e dedicação.
Frederico Brigatte***
30/03/2013
Daniel Santos
30/03/2013
Sério cara, se tu acha que teu conhecimento é intermediario a avançado, tens que rever seus conceitos.
Não sei se voce prometeu que iriar fazer isso pra algum chefe seu, sei la, pelo nivel de apavoramento seu deve ser isso. Voce so nao pode esquecer que somos profissionais aqui e precisamos trabalhar pra comer e sustentar a familia, com isso com muita boa vontade ajudamos as pessoas que "tem dúvidas", mais isso ai ja é ridiculo!
Os moderadores podem ficar brabos com isso, mais tenham o bom senso.
Joel Rodrigues
30/03/2013
Sério cara, se tu acha que teu conhecimento é intermediario a avançado, tens que rever seus conceitos.
Não sei se voce prometeu que iriar fazer isso pra algum chefe seu, sei la, pelo nivel de apavoramento seu deve ser isso. Voce so nao pode esquecer que somos profissionais aqui e precisamos trabalhar pra comer e sustentar a familia, com isso com muita boa vontade ajudamos as pessoas que "tem dúvidas", mais isso ai ja é ridiculo!
Os moderadores podem ficar brabos com isso, mais tenham o bom senso.
Está corretíssimo, Daniel. Infelizmente, pela primeira vez em vários meses como usuário mais atuante do fórum, eu digo que cansei de um tópico. Por isso já prometi fazer um exemplo prático pra ele. Mas não sei quando vou poder fazer isso.
Estou tentando ajudar, mas está difícil.
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Por isso eu já propus lhe enviar um exemplo, pois analisando o código e vendo a coisa funcionando, talvez fique mais fácil de você conseguir seguir adiante.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Já adianto que vou mandar com um banco Access, pois é o que tenho aqui no momento.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Aqui eu tenho 2007, 2009 e XE2. Qual é a mais adequada pra você?
Frederico Brigatte***
30/03/2013
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Abraço.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Mas é importante que você saiba conectar a uma base de dados Access e manipular suas tabelas usando a paleta ADO, pois é o que vou usar.
Frederico Brigatte***
30/03/2013
Joel Rodrigues
30/03/2013
Segue o link para download: https://dl.dropboxusercontent.com/u/78226427/ControleAcesso.rar
Boa sorte.
Frederico Brigatte***
30/03/2013
As alterações solicitadas para a tabela não foram satisfatórias já que criaram valores duplicados no índice, chave primária ou relação. Altere os dados no campo ou campos que contêm os dados duplicados, remova o índice ou redefina o índice para possibilitar entradas duplicadas e tente novamente.
Isso é erro de banco de dados, certo?
*PERFIL
*NOME_MENU
DESCRICAO_MENU
HABILITADO
Joel Rodrigues
30/03/2013
É o seguinte: já tem dados no banco, então quando você manda criar os menus de novo, há uma tentativa de inserir valores duplicados no banco, quebrando a chave que eu defini.
Para resolver isso, execute um delete antes de criar os menus (que são vários inserts). Ou seja: no botão de criar os menus para o perfil, antes de fazer o loop e chamar a função, execute o seguinte delete:
delete from acesso_menu where perfil = :perfil
Abraço.
Frederico Brigatte***
30/03/2013