MaximoAccess

Caro Usuário, antes de postar pela primeira vez, leia as regras do fórum.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access


    [Resolvido]Comparar Usuário Logado x Usuário no formulário

    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 578
    Registrado : 25/05/2011

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty [Resolvido]Comparar Usuário Logado x Usuário no formulário

    Mensagem  vileman em 1/2/2020, 04:35

    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.
    DamascenoJr.
    DamascenoJr.
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 1366
    Registrado : 22/11/2016

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty Re: [Resolvido]Comparar Usuário Logado x Usuário no formulário

    Mensagem  DamascenoJr. em 1/2/2020, 16:58

    não sei se mexer para torná-las globais

    Private Sub
    Private Function

    mudaria apenas o escopo de private para public

    Public Sub
    Public Function

    --------------

    Não estou dizendo que isso resolveria toda a sua questão. Apenas passando a dica de como alterar o escopo de uma função.


    .................................................................................
    Ajude-se a ser ajudado, anexe seu projeto.
    Sempre tente entender o código,
    não somente copie e cole.
    Positive as mensagens que achar útil clicando no '+' no canto superior direito delas.
    avatar
    renpv
    Avançado
    Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 318
    Registrado : 12/01/2015

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty Re: [Resolvido]Comparar Usuário Logado x Usuário no formulário

    Mensagem  renpv em 2/2/2020, 01:05

    Siga a sugestão do mestre Avelino e use a coleção TempVars
    https://www.usandoaccess.com.br/tutoriais/video-colecao-tempvars.asp?id=1
    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 578
    Registrado : 25/05/2011

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty Comparar Usuário Logado x Usuário no formulário

    Mensagem  vileman em 2/2/2020, 02:50

    Boa noite,

    DamascenoJr: Vou testar para meu caso e informo depois, obrigado.

    renpv: vi o vídeo do mestre Avelino, conforme sua sugestão, mas como minha BD está totalmente diferente do que é apresentado no Maestro, por exemplo, eu não uso a macro Autoexec, bem como o sistema de login e totalmente diferente, pois copiei de outro colega Plinio Mabesi, que usa outro caminho, então no momento essa ideia não me serviria, pois teria que rever todo meu sistema, mas é bastante interessante a coleção TempVars mostrada pelo Avelino, quem sabe um dia eu possa utilizar.
    Mesmo assim agradeço pelo seu interesse em ajudar, se tiver mais alguma sugestão, fique a vontade.
    avatar
    vileman
    Super Avançado
    Super Avançado

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 578
    Registrado : 25/05/2011

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty Comparar Usuário Logado x Usuário no formulário

    Mensagem  vileman em 7/2/2020, 00:13

    Boa noite, Damasceno

    Coloquei as variáveis como públicas, mas o erro continua o mesmo. Então após fazer mais testes verifiquei que a rotina que estava causando o erro era ao clicar no botão "GravaRegistro", visto que o formulário tem uma rotina que salva apenas o registro se clicar nesse botão, então fiz uma mudança e resolveu o meu problema, ou seja, se o usuário logado no momento for diferente do usuário responsável, ou seja, se estiver nulo como acontecia antes, não executa e sai, senão salva o registro. Antes dessa alteração era assim:

    Private Sub GravaRegistro_Click()            'ROTINA: 24/07/2019
    booS = True 'Defino como True para o evento antes de atualizar saber que o botão salvar foi clicado
    DoCmd.RunCommand acCmdSaveRecord 'Salvo o registro
    End Sub

    Agora ficou assim:

    Private Sub GravaRegistro_Click()            'ROTINA: 24/07/2019
           If txtUsuarioAtual <> Usuario Then  'NOVA ROTINA: 02/02/2020
              Beep
              MsgBox "ALERTA !! Usuário Logado é diferente do Usuário responsável pelo Registro atual!" & vbCr & " " & vbCr & "ATT: 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
           Else
              booS = True                      'Defino como True para o evento antes de atualizar saber que o botão salvar foi clicado
              MsgBox "Registro Salvo com Sucesso!", vbInformation, "Informação" 'Somente se dados forem atualizados/inseridos, o sistema exibe a informação de sucessso
              DoCmd.RunCommand acCmdSaveRecord 'Salvo o registro
           End If
    End Sub

    PS: Coloquei um positivo pra você e pra Renpv (clicando no '+' Thanks), mas quando atualizei só ficou o último positivo de Renpv, mas considere que também tem o meu positivo.

    Embora ache que precisa de mais testes em execução com os usuários, mesmo assim darei como resolvido, caso haja mais alguma inconsistencia, reabro o tópico.

    Obrigado a vocês pelas dicas.

    Conteúdo patrocinado

    [Resolvido]Comparar Usuário Logado x Usuário no formulário Empty Re: [Resolvido]Comparar Usuário Logado x Usuário no formulário

    Mensagem  Conteúdo patrocinado


      Data/hora atual: 28/2/2020, 04:35