Avaliação do Usuário

Estrela ativaEstrela ativaEstrela ativaEstrela ativaEstrela ativa
 

 

ACOMPANHE A SÉRIE

Sistema de Login e Senha no Access/VBA - Parte 1/5
Sistema de Login e Senha no Access/VBA - Parte 2/5
Sistema de Login e Senha no Access/VBA - Parte 3/5
Sistema de Login e Senha no Access/VBA - Parte 4/5
Sistema de Login e Senha no Access/VBA - Parte 5/5

EXEMPLO DO ARTIGO

Faça o download do exemplo do artigo para estudo: LoginSeguro.zip
O exemplo está completo, então, não se assuste caso você encontre códigos diferentes do que está sendo ensinado nesta parte do artigo.
Para compreendê-lo completamente estude primeiro todas as 5 partes do artigo.

DICA IMPORTANTE PARA ELEVAR SEU CONHECIMENTO

Assista as vídeo-aulas do Curso de Access 2010 (OfficeGuru) e também as do Curso de Programação em Access/VBA.
Para os leigos o Curso de Programação em Access/VBA é obrigatório.


INTRODUÇÃO

Além da funcionalidade, os sistemas devem ser elaborados pensando-se na organização e nos modelos eficientes de projeto, de modo a tornar a manutenção dos códigos uma tarefa um pouco mais fácil e agradável.

Esta é a segunda parte da série de 5 artigos sobre a implantação de um sistema básico de Login e Senha utilizando Access e VBA, na qual abordaremos a remodelagem dos códigos, atribuindo tarefas específicas a funções e procedimentos. Além disso daremos início aos procedimentos de verificação de conteúdo. 

FUNÇÕES DE BUSCA E ATRIBUIÇÃO DE USUÁRIOS E GRUPOS

Todo desenvolvedor experiente deve ter em mente que os códigos não podem ficar dispersos pelo sistema. Tarefas específicas devem ser executadas utilizando-se funções e procedimentos. Dependendo da situação e da linguagem utilizada isto deve ser até mesmo atribuído às classes de objetos e seus métodos.

Em nosso exemplo vamos utilizar todos estes recursos. Então por onde começar?

Criaremos, em primeiro lugar, as funções de busca e atribuição de valores para usuários e grupos. Para isto crie um novo módulo chamado ControleAcesso.

Agora será necessário criar uma variável privada, neste mesmo módulo ControleAcesso, para armazenar o valor do usuário atual:

Private strUsuarioAtual As String

Agora vamos criar as funções para buscar e atribuir os valor a esta variável, já que ela é privada e, por isso, inacessível a partir de outros módulos:

Function getUsuarioAtual() As String

  getUsuarioAtual = strUsuarioAtual

End Function

Sub setUsuarioAtual(argLogin As String)

  strUsuarioAtual = argLogin

End Sub

Inclua também uma função para obter o valor do grupo do usuário atual, que retornará o número do grupo ou então o valor “” (string vazia), caso não haja usuário logado no momento.

Function getGrupoUsuarioAtual() As String
  
  getGrupoUsuarioAtual = Nz(DLookup("grupo", "Usuario", _
                    "login='" & strUsuarioAtual & "'"), "")
  
  Select Case getGrupoUsuarioAtual
    Case 0
      getGrupoUsuarioAtual = "Administradores"
    Case 1
      getGrupoUsuarioAtual = "Gerentes"
    Case 2
      getGrupoUsuarioAtual = "Usuários"
    Case 3
      getGrupoUsuarioAtual = "Visitantes"
    Case Else
      getGrupoUsuarioAtual = ""
  End Select
  
End Function

Estas funções serão úteis para executarmos procedimentos de liberação ou restrição de acesso aos elementos do nosso sistema. Como exemplo, suponha que o acesso ao formulário de cadastro de usuários somente será permitido aos usuários do grupo Administradores. Bastaria incluir, no botão que aciona tal formulário, uma verificação do grupo do usuário atual, antes de executar o comando de abertura do mesmo. Veja o exemplo:

Private Sub btnCadastroUsuario_Click()

  If getGrupoUsuarioAtual = "Administradores" Then
    DoCmd.OpenForm "FCadastroUsuario"
  Else
    MsgBox "Acesso permitido somente aos administradores!", _
          vbExclamation, "Acesso Negado"
  End If
  
End Sub

Caso tivéssemos, por exemplo, um relatório financeiro, cujo acesso fosse permitido apenas para os membros dos grupos Gerentes e Administradores, faríamos da seguinte forma:

Private Sub btnRelatorioFinanceiro_Click()

  If getGrupoUsuarioAtual = "Administradores" Or getGrupoUsuarioAtual = "Gerentes" Then
    DoCmd.OpenReport "RFinanceiro"
  Else
    MsgBox "Acesso permitido somente aos administradores e gerentes!", _
          vbExclamation, "Acesso Negado"
  End If
 
End Sub

Com isto podemos restringir o acesso aos formulários e relatórios do sistema de acordo com a permissão de cada grupo de usuários, conforme a necessidade. Criar outras alternativas de utilização das permissões será uma tarefa do caro leitor e desenvolvedor. Deixe a imaginação tomar conta.



{ads1} 

FUNÇÃO DE VERIFICAÇÃO DE SENHA

Agora vamos retirar o código que realiza a validação da senha no formulário FLogin e transferir esta responsabilidade para uma função, que se chamará verificaLogin(). Ela deverá ser criada no módulo ControleAcesso, ou em outro módulo padrão. Veja o código:

Function verificaLogin(argLogin As String, argSenha As String) As Boolean

    Dim criterio As String
    
    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

Esta função recebe como parâmetros o nome de usuário, na variável argLogin, e a senha, na variável argSenha. Como resultado, a função retorna os valores True ou False, conforme a senha esteja correta ou incorreta, respectivamente. A função atribui, ainda, o valor da variável que armazena o nome do usuário atual.

Este método de verificação da senha é extremamente flexível, já que nos permite executá-lo a partir de qualquer parte do sistema, ao contrário do método anterior, no qual a verificação somente poderia ocorrer dentro do formulário FLogin. Além disso a manutenção do nosso código ficará facilitada, já que estará centralizada na função. Qualquer erro encontrado ou funcionalidade a ser implantada, deverão ser corrigidos ou incluídos em um único local, na função verificaLogin().

Devemos, então, alterar o código do botão btnLogin, no formulário FLogin, para que a verificação seja feita através de uma chamada à função criada anteriormente. Vamos deixá-lo da seguinte maneira:

Private Sub btnLogin_Click()
  
  If verificaLogin(cbxLogin, txtSenha) Then
    DoCmd.Close
    DoCmd.OpenForm "FPrincipal"
  Else
    MsgBox "Senha incorreta! Por favor, tente novamente.", vbExclamation, "Login"
    txtSenha.SetFocus
  End If
  
End Sub

Agora nós passamos os valores contidos nas caixas de login e senha diretamente para a função.

Faça o teste e veja como funciona.


Piscando Dica: Caso queira acompanhar passo-a-passo a execução do código, crie um ponto de interrupção. Para isto basta posicionar o cursor na linha desejada e pressionar F9. Quando ocorrer a parada vá pressionando F8 para ver cada momento do fluxo do programa. Você pode, inclusive, verificar o valor atual de cada variável posicionando o ponteiro do mouse sobre ela.



Não podemos nos esquecer de ajustar o código do botão btnLogout, do formulário FPrincipal, para limpar o valor da variável que armazena o usuário atual quando ele realizar o logout. Deixe o código assim:

Private Sub btnLogout_Click()
  
  If MsgBox("Deseja efetuar Logout?", vbQuestion + vbYesNo, "Logout") = vbYes Then
    setUsuarioAtual ""
    DoCmd.Close
    DoCmd.OpenForm "FLogin"
  End If
  
End Sub

VALIDAÇÃO DE CAMPOS PREENCHIDOS

Até agora não nos preocupamos com a possibilidade de o usuário tentar realizar o login sem informar o usuário ou a senha. Vamos atualizar o código do botão btnLogin para que isto seja verificado.

Private Sub btnLogin_Click()
  
  If IsNull(cbxLogin) Then
    MsgBox "Por favor, informe um nome de usuário!", vbExclamation, "Login Inválido"
    cbxLogin.SetFocus
  ElseIf IsNull(txtSenha) Then
    MsgBox "Por favor, informe a senha!", vbExclamation, "Senha Inválida"
    txtSenha.SetFocus
  ElseIf verificaLogin(cbxLogin, txtSenha) Then
    DoCmd.Close
    DoCmd.OpenForm "FPrincipal"
  Else
    MsgBox "Senha incorreta! Por favor, tente novamente.", vbExclamation, "Login"
    txtSenha.SetFocus
  End If
  
End Sub

Desta maneira, caso um dos itens não seja informado, uma mensagem será exibida e o foco será enviado para a caixa correspondente.

Experimente fazer o login sem informar o usuário ou a senha. Veja o que acontece. Depois execute o procedimento informando um usuário e senha corretos. Veja o nome do usuário atual e o seu grupo sendo exibidos no rodapé do formulário principal.


PiscandoDica: Boa prática de programação

Espero que o leitor tenha notado que não é necessário comparar as funções de verificação com o valor True ou False. Muito comum entre iniciantes, a atitude de comparar o resultado de uma expressão ou de uma função booleana com True ou False é totalmente desnecessária, já que a instrução If necessita apenas de um valor booleano para funcionar. Lembre-se, realizar esta comparação apenas obriga o processador a trabalhar mais.

Veja o que acontece quando a comparação é solicitada, no caso de senha correta, por exemplo:

If verificaLogin(cbxLogin, txtSenha) = True Then

==> Função verificaLogin() é executada e devolve o valor True:

If True = True Then

==> Comparação True = True é executada e devolve o valor True:

If True Then

==> Instrução If encontra valor True e executa o bloco para resultado verdadeiro.

A execução leva 3 etapas para concluir o processamento. Já se você omitir a comparação serão necessários apenas dois passos. Gostou?!?



Agora sim, nosso sistema está pronto, não é mesmo? A resposta é não.

Na terceira parte da série iremos implementar a tela e as funções de gerenciamento de usuários, como inclusão, exclusão e alteração de suas informações.

Encontro vocês no próximo. Até lá...

Seja social. Compartilhe!