Pessoal, boa noite! * Access 2007
Utilizo o exemplo de Plinio Mabesi para abrir o sistema com Login e Senha dos Usuários.
A tabela chama-se “Usuario” com os campos:
IDUser (Autonumeração)
Nome_Usuario (Texto) – Nome completo do usuário
Login (Texto) – Login de acesso do usuário
Senha (Texto) – Senha do usuário
Grupo (Texto) – Grupo ao qual o usuário pertence
Em um formulário inicial que após checagem correta do Login e Senha do Usuário da tabela acima, abre o Menu Principal onde criei 02 Caixas de Texto: uma para mostrar o Usuário atual logado e outra para mostrar o Grupo ao qual o usuário pertence. Assim, respectivamente:
Nome: txtUsuarioAtual – Fonte de controle: getUsuarioAtual() * Para capturar o Login
Nome: txtGrupoUsuarioAtual – Fonte do Controle: getGrupoUsuarioAtual() * Para capturar o Grupo
Fiz os testes e está logando normal, mas, quando abre o form principal, tem vezes que mostra o usuário logado e o Grupo e momentos que não mostra nada nos dois controles. Criei os mesmos controles para outros 05 formulários, mas acontece a mesma coisa, ou seja, tem hora que mostra os 02 controles e tem hora que nada aparece nos controles.
Minha intenção é que em cada um desses 05 formulários (individualmente) preciso checar se o usuário atual logado é o mesmo usuário que fez o registro no qual o mesmo esteja posicionado no momento. Em cada um desses 05 formulários já está gravado em outro campo chamado ‘Usuario’ (outras tabelas) o login da pessoa após ela ter concluído a inclusão de um novo registro no formulário em questão. Mas, se um outro usuário diferente acessar esse mesmo registro preciso que o sistema através da comparação do usuário atual logado sendo diferente do usuário gravado no formulário, emita um alerta informando que não será possível nenhuma alteração nesse registro e sair sem salvar as alterações; salvo se o usuário logado atual for o mesmo que realizou tal operação, ou seja, apenas quem incluiu tal registro pode alterá-lo. Fiz essa rotina que estava funcionando, mas como às vezes não aparece o login do usuário citado no início deste tópico, a rotina não está mais funcionando por conta disso, ou melhor, só funciona quando o usuário atual logado é capturado e é possível fazer a comparação entre os 02 campos, conforme comandos abaixo:
Private Sub Form_BeforeUpdate(Cancel As Integer) 'NOVA ROTINA: 15/01/2020
If txtUsuarioAtual <> Usuario Then
Beep
MsgBox "ALERTA !! Usuário Logado é diferente do Usuário responsável pelo Registro atual!" & vbCr & "As alterações realizadas serão desfeitas", , "Sistema: Validação de Campo"
Cancel = True 'Cancela as alterações
Me.Undo 'Desfaz as alterações para assim poder mudar de registro, se for o caso
Exit Sub
End If
End Sub
PS: Dados usados na comparação da rotina acima:
txtUsuarioAtual = Controle não-acoplado criado por mim
Usuario = Nome do campo no formulário da tabela
Na rotina do Mabesi tem o Módulo ‘Controle de Acesso’ que tem os seguintes comandos:
Option Compare Binary
Option Explicit
'Função do arquivo LoginSeguro.mdb de MABESI - Copiada em 04/05/2017
Private strUsuarioAtual As String
Private Const SENHA_PADRAO = "123456"
Function getSenhaPadrao() As String
getSenhaPadrao = SENHA_PADRAO
End Function
Sub setUsuarioAtual(argLogin As String)
strUsuarioAtual = argLogin
End Sub
Function getUsuarioAtual() As String 'Variável Privada
getUsuarioAtual = strUsuarioAtual
End Function
Function getGrupoUsuarioAtual() As String 'Variável Privada
getGrupoUsuarioAtual = Nz(DLookup("grupo", "Usuario", _
"login='" & strUsuarioAtual & "'"), "")
Select Case getGrupoUsuarioAtual
Case 0
getGrupoUsuarioAtual = "Administradores"
Case 1
getGrupoUsuarioAtual = "Membros"
Case 2
getGrupoUsuarioAtual = "Secretaria"
Case 3
getGrupoUsuarioAtual = "ApoioTecnico"
Case 4
getGrupoUsuarioAtual = "LAF"
Case 5
getGrupoUsuarioAtual = "Inativo"
Case Else
getGrupoUsuarioAtual = ""
End Select
End Function
Function verificaLogin(argLogin As String, argSenha As String) As Boolean
Dim criterio As String
'Convertendo a senha clara 'em código hash MD5 para 'comparação e validação
argSenha = getMD5(argSenha)
criterio = "login='" & argLogin & "' And senha='" & argSenha & "'"
If Nz(DCount("login", "Usuario", criterio), 0) > 0 Then
verificaLogin = True
setUsuarioAtual argLogin
Else
verificaLogin = False
End If
End Function
Sub AlterarSenha(argLogin As String, argSenha As String)
Dim strSQL As String
'Convertendo a senha clara 'em código hash MD5 para 'armazenamento seguro
argSenha = getMD5(argSenha)
strSQL = "Update Usuario Set senha='" & argSenha & "'" & _
"Where login='" & argLogin & "'"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
End Sub
As funções Function getUsuarioAtual() e Function getGrupoUsuarioAtual() estão originalmente colocadas como Privadas, como não sei se mexer para torná-las globais isso afetaria de alguma forma o restante da rotina, mesmo porque foi outra pessoa que fez tal rotina: Plinio Mabesi, preferi não mexer nisso, se é que isso seria a solução que preciso.
Já li vários exemplos no fórum, mas, nada que tenha conseguido resolver ou adaptar a minha necessidade.
Caso alguém possa ajudar ou alguma outra ideia para tal funcionamento da minha rotina, agradeço.
PS: se for necessário posso enviar arquivo contendo as rotinas acima para melhor ajuda e entendimento.
Utilizo o exemplo de Plinio Mabesi para abrir o sistema com Login e Senha dos Usuários.
A tabela chama-se “Usuario” com os campos:
IDUser (Autonumeração)
Nome_Usuario (Texto) – Nome completo do usuário
Login (Texto) – Login de acesso do usuário
Senha (Texto) – Senha do usuário
Grupo (Texto) – Grupo ao qual o usuário pertence
Em um formulário inicial que após checagem correta do Login e Senha do Usuário da tabela acima, abre o Menu Principal onde criei 02 Caixas de Texto: uma para mostrar o Usuário atual logado e outra para mostrar o Grupo ao qual o usuário pertence. Assim, respectivamente:
Nome: txtUsuarioAtual – Fonte de controle: getUsuarioAtual() * Para capturar o Login
Nome: txtGrupoUsuarioAtual – Fonte do Controle: getGrupoUsuarioAtual() * Para capturar o Grupo
Fiz os testes e está logando normal, mas, quando abre o form principal, tem vezes que mostra o usuário logado e o Grupo e momentos que não mostra nada nos dois controles. Criei os mesmos controles para outros 05 formulários, mas acontece a mesma coisa, ou seja, tem hora que mostra os 02 controles e tem hora que nada aparece nos controles.
Minha intenção é que em cada um desses 05 formulários (individualmente) preciso checar se o usuário atual logado é o mesmo usuário que fez o registro no qual o mesmo esteja posicionado no momento. Em cada um desses 05 formulários já está gravado em outro campo chamado ‘Usuario’ (outras tabelas) o login da pessoa após ela ter concluído a inclusão de um novo registro no formulário em questão. Mas, se um outro usuário diferente acessar esse mesmo registro preciso que o sistema através da comparação do usuário atual logado sendo diferente do usuário gravado no formulário, emita um alerta informando que não será possível nenhuma alteração nesse registro e sair sem salvar as alterações; salvo se o usuário logado atual for o mesmo que realizou tal operação, ou seja, apenas quem incluiu tal registro pode alterá-lo. Fiz essa rotina que estava funcionando, mas como às vezes não aparece o login do usuário citado no início deste tópico, a rotina não está mais funcionando por conta disso, ou melhor, só funciona quando o usuário atual logado é capturado e é possível fazer a comparação entre os 02 campos, conforme comandos abaixo:
Private Sub Form_BeforeUpdate(Cancel As Integer) 'NOVA ROTINA: 15/01/2020
If txtUsuarioAtual <> Usuario Then
Beep
MsgBox "ALERTA !! Usuário Logado é diferente do Usuário responsável pelo Registro atual!" & vbCr & "As alterações realizadas serão desfeitas", , "Sistema: Validação de Campo"
Cancel = True 'Cancela as alterações
Me.Undo 'Desfaz as alterações para assim poder mudar de registro, se for o caso
Exit Sub
End If
End Sub
PS: Dados usados na comparação da rotina acima:
txtUsuarioAtual = Controle não-acoplado criado por mim
Usuario = Nome do campo no formulário da tabela
Na rotina do Mabesi tem o Módulo ‘Controle de Acesso’ que tem os seguintes comandos:
Option Compare Binary
Option Explicit
'Função do arquivo LoginSeguro.mdb de MABESI - Copiada em 04/05/2017
Private strUsuarioAtual As String
Private Const SENHA_PADRAO = "123456"
Function getSenhaPadrao() As String
getSenhaPadrao = SENHA_PADRAO
End Function
Sub setUsuarioAtual(argLogin As String)
strUsuarioAtual = argLogin
End Sub
Function getUsuarioAtual() As String 'Variável Privada
getUsuarioAtual = strUsuarioAtual
End Function
Function getGrupoUsuarioAtual() As String 'Variável Privada
getGrupoUsuarioAtual = Nz(DLookup("grupo", "Usuario", _
"login='" & strUsuarioAtual & "'"), "")
Select Case getGrupoUsuarioAtual
Case 0
getGrupoUsuarioAtual = "Administradores"
Case 1
getGrupoUsuarioAtual = "Membros"
Case 2
getGrupoUsuarioAtual = "Secretaria"
Case 3
getGrupoUsuarioAtual = "ApoioTecnico"
Case 4
getGrupoUsuarioAtual = "LAF"
Case 5
getGrupoUsuarioAtual = "Inativo"
Case Else
getGrupoUsuarioAtual = ""
End Select
End Function
Function verificaLogin(argLogin As String, argSenha As String) As Boolean
Dim criterio As String
'Convertendo a senha clara 'em código hash MD5 para 'comparação e validação
argSenha = getMD5(argSenha)
criterio = "login='" & argLogin & "' And senha='" & argSenha & "'"
If Nz(DCount("login", "Usuario", criterio), 0) > 0 Then
verificaLogin = True
setUsuarioAtual argLogin
Else
verificaLogin = False
End If
End Function
Sub AlterarSenha(argLogin As String, argSenha As String)
Dim strSQL As String
'Convertendo a senha clara 'em código hash MD5 para 'armazenamento seguro
argSenha = getMD5(argSenha)
strSQL = "Update Usuario Set senha='" & argSenha & "'" & _
"Where login='" & argLogin & "'"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
End Sub
As funções Function getUsuarioAtual() e Function getGrupoUsuarioAtual() estão originalmente colocadas como Privadas, como não sei se mexer para torná-las globais isso afetaria de alguma forma o restante da rotina, mesmo porque foi outra pessoa que fez tal rotina: Plinio Mabesi, preferi não mexer nisso, se é que isso seria a solução que preciso.
Já li vários exemplos no fórum, mas, nada que tenha conseguido resolver ou adaptar a minha necessidade.
Caso alguém possa ajudar ou alguma outra ideia para tal funcionamento da minha rotina, agradeço.
PS: se for necessário posso enviar arquivo contendo as rotinas acima para melhor ajuda e entendimento.