MaximoAccess

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

Obrigado

Administração do MaximoAccess

MaximoAccess

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

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 : 579
    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 : 2455
    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 : 323
    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 : 579
    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 : 579
    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.

      Data/hora atual: 3/12/2020, 22:10