/ / Tela de Login no Access com formulários, macros e consultas - ms-access, ms-access-2007

Tela de login no Access com formulários, macros e consultas - ms-access, ms-access-2007

Eu tenho uma pergunta embaraçosa sobre o Access. Eu posso construir bancos de dados relacionais enquanto durmo, mas sempre usei PHP, mySQL e HTML para construir meus aplicativos.

Eu odiava o Access com uma paixão por vários motivos desde que me lembro, mas agora estou preso a usá-lo para um projeto em particular.

Eu tenho um número de tabelas, uma das quais é customer, que entre outras coisas tem um username e password campo.

Quando eu inicio o banco de dados, eu quero um formulário de login para aparecer, o que eu posso fazer usando o AutoExec macro, eu fiz o formulário com um campo de nome de usuário e senha. Depois disso, fico preso com a lógica de consultar o nome de usuário / senha e, em seguida, mostrando um novo formulário, se correto ou um erro se não.

Alguém poderia me ajudar com a macro e a consulta funcionarem juntas?

Esclarecimento: Estou tentando fazer isso sem codificar macros inteiras do Visual Basic, se possível, eu quero ser capaz de fazer isso usando o macro builder thingumy.

obrigado

Respostas:

1 para resposta № 1

Malphas -

Na verdade, é possível fazer isso sem usarVBA, mas eu estou querendo saber se a razão pela qual você não quer usar o VBA é por causa da questão de confiança. Nesse caso, isso não será possível, porque as ações de macro Perto e Sair não serão permitidos se o banco de dados não for confiável.

Enquanto você pode executar ações no AutoExec macro além do ponto em que você usa o OpenForm comando, eu acho que é mais puro para continuar opróximas ações no próprio formulário. Primeiro porque você não pode realmente fazer ramificações em uma macro, em segundo lugar porque é mais modular manter as ações relacionadas ao formulário, na verdade, no formulário.

No exemplo abaixo, meu formulário de login de amostra é chamado Forma de login, e a caixa de texto do nome de usuário é txtUserName, e a caixa de texto da senha é chamada txtPassword.

A primeira coisa a fazer é proteger o diálogo do simples ato de permitir que o usuário feche o diálogo e escape para a tela de design do banco de dados. A melhor maneira de fazer isso é definir uma bandeira chamada ValidLogin quando o formulário é carregado. Você definirá esse sinalizador durante o processo de login. Quando o formulário estiver fechado, verifique se o sinalizador é verdadeiro. Se ValidLogin for falso, feche o banco de dados.

No Carregando caso do formulário de Login, clique no botão de reticências e escolha Macros Builder. Na tela Macro, use as seguintes ações (observe que o Condição A coluna está oculta por padrão - mas você só precisará das próximas duas macros:

Line Condition     Action/Arguments

1                  SetTempVar, Name = ValidLogin, Expression = False

No OnUnload caso do formulário de Login, faça o mesmo acima, e adicione:

Line Condition     Action/Arguments

1  Not [TempVars]![ValidLogin]
Quit, Options = Exit.

Se você executar isso agora, assim que você fechar o formulário, o banco de dados será fechado. Para ser útil, você precisa adicionar as seguintes ações de macro ao evento OnClick do seu Entrar botão:

Line Condition     Action/Arguments

1                  SetTempVar, Name = Valid Login, Expression = DCount("*","Customer","[Username]=[Forms]![LoginForm]![txtUserName] And [Password]=[Forms]![LoginForm]![txtPassword]")>0

2 Not [TempVars]![ValidLogin]
MsgBox, Message = Invalid Login
3 ...              StopMacro

4                  OpenForm, Form Name = MainForm

5                  Close, Object Type = Form, Object Name = LoginForm, Save = No

Note que em todos esses exemplos, eu useimacros incorporadas, não macros nomeadas, para que você possa mantê-las junto com o formulário. Observe também as reticências (...) na última macro, que representa o valor da última condição.


3 para resposta № 2

Dado um formulário frmLogin, com 2 caixas de texto, txtUserName e txtPassword, e um botão de comando, você pode tentar o seguinte

Private Sub Command0_Click()
Dim rec As Recordset2

Set rec = CurrentDb.OpenRecordset("SELECT * FROM Customer WHERE username = """ & txtUserName.Value & """ AND password = """ & txtPassword.Value & """")
If (rec.RecordCount > 0) Then
DoCmd.OpenForm "frmMain"
DoCmd.Close acForm, "frmLogin"
End If
End Sub

-1 para resposta № 3

Um ligeiro ajuste ao acima, pois o código acima estaria aberto a ataques de injeção de SQL (sim, eu sei que é apenas acesso, mas nunca é demais)

Public Function CheckUserPassword(strUserName As String, strPassword As String) As Boolean
Dim rst As DAO.Recordset
Set rst = DBEngine(0)(0).OpenRecordset("tblUsers", dbOpenTable)
With rst
.Index = "UserName"
.Seek "=", strUserName
If .NoMatch = False Then
If !Password = strPassword Then
CheckUserPassword = True
Else
CheckUserPassword = False
End If
Else
CheckUserPassword = False
End If
End With
rst.Close
Set rst = Nothing

End Function