/ / Schermata di accesso in Access con moduli, macro e queryms- - ms-access, ms-access-2007

Schermata di accesso in Accesso con moduli, macro e query - - ms-access, ms-access-2007

Ho una domanda imbarazzante su Access. Posso costruire database relazionali nel sonno, ma ho sempre usato PHP, mySQL e HTML per costruire le mie applicazioni.

Ho odiato Access con passione per vari motivi da quando ho memoria, ma ora sono bloccato a usarlo per un progetto particolare.

Ho un certo numero di tavoli, uno dei quali è customer, che tra l'altro ha un username e password campo.

Quando avvio il database, voglio che appaia un modulo di accesso, cosa che posso fare usando il AutoExec macro, ho creato il modulo con un campo nome utente e password. Successivamente, rimango bloccato con la logica di interrogare il nome utente/password e quindi mostrare un nuovo modulo se corretto o un errore in caso contrario.

Qualcuno potrebbe aiutarmi a far funzionare insieme macro e query?

Chiarimento: sto cercando di farlo senza codificare intere macro di Visual Basic, se possibile, voglio essere in grado di farlo utilizzando il generatore di macro.

Grazie

risposte:

1 per risposta № 1

Malfa -

In realtà è possibile farlo senza usareVBA, ma mi chiedo se il motivo per cui non si desidera utilizzare VBA sia dovuto al problema di attendibilità. In tal caso, ciò non sarà possibile, poiché le azioni macro Vicino e Smettere non sono consentiti se il database non è attendibile.

Mentre puoi eseguire azioni in in AutoExec macro oltre il punto in cui si utilizza il OpenForm comando, penso che sia più ordinato continuare ilazioni successive sul modulo stesso. Primo perché non è possibile eseguire realmente la ramificazione in una macro; secondo perché è più modulare mantenere le azioni da eseguire con il modulo effettivamente nel modulo.

Nell'esempio seguente, viene chiamato il mio modulo di accesso di esempio Modulo di accessoe la casella di testo del nome utente è txtNomeUtentee viene chiamata la casella di testo della password txtPassword.

La prima cosa da fare è proteggere il dialogo dal semplice atto di consentire all'utente di chiudere il dialogo e fuggire nella schermata di progettazione del database. Il modo migliore per farlo è impostare un flag chiamato ValidLogin quando il modulo viene caricato. Questo flag verrà impostato durante il processo di accesso. Quando il form è chiuso, controlla se il flag è vero. Se ValidLogin è false, chiudere il database.

Sul OnLoad evento del modulo di accesso, fare clic sul pulsante con i puntini di sospensione e scegliere Generatore di macro Macro. Nella schermata Macro, utilizzare le seguenti azioni (si noti che il Condizione la colonna è nascosta per impostazione predefinita, ma ti serviranno solo per le prossime due macro):

Line Condition     Action/Arguments

1                  SetTempVar, Name = ValidLogin, Expression = False

Sul OnUnload evento del form di Login, fare come sopra e aggiungere:

Line Condition     Action/Arguments

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

Se lo esegui ora, non appena chiudi il modulo, il database si chiuderà. Per essere utile, devi aggiungere le seguenti azioni macro all'evento OnClick del tuo Accesso pulsante:

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

Nota che in tutti questi esempi, ho usatomacro incorporate, non macro denominate, in modo da poterle tenere insieme al modulo. Notare anche i puntini di sospensione (...) nell'ultima macro, che rappresenta il valore dell'ultima condizione.


3 per risposta № 2

Dato un form frmLogin, con 2 caselle di testo, txtUserName e txtPassword, e un pulsante di comando, puoi provare quanto segue

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 per risposta № 3

Una leggera modifica a quanto sopra poiché il codice sopra sarebbe aperto agli attacchi di SQL injection (sì, lo so che è solo accesso ma non fa mai male)

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