Erzwingen Sie ein sauberes Schließen von Formularen, bevor der Zugriff beendet wird
-
21-12-2019 - |
Frage
Ich habe eine Access 2010-Datenbank, die ein Formular verwendet frmTimeKeeper
um den Überblick über die Benutzer in der Datenbank zu behalten.Das Formular selbst hat eine Breite von 0 und ist daher nicht sichtbar.Es ist das erste Formular, das geöffnet wird, wenn die Datenbank geöffnet wird, und geschlossen wird, wenn der Zugriff geschlossen wird.Es gibt 2 Ereignisse, öffnen und schließen:
Private Sub Form_Close()
DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE tblUserLogs SET timeOut=#" & Date & " " & time() & "# WHERE id=" & UserLogID
DoCmd.SetWarnings True
MsgBox "time keeper close"
End Sub
Private Sub Form_Open(Cancel As Integer)
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO tblUserLogs(user, timeIn) VALUES ('" & Environ("Username") & "',#" & Date & " " & time() & "#)"
DoCmd.SetWarnings True
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT TOP 1 * FROM tblUserLogs WHERE user='" & Environ("Username") & "' AND timeOut IS NULL ORDER BY id DESC")
UserLogID = rst(0)
DoCmd.OpenForm "frmLogin"
End Sub
UserLogID
ist eine globale Variable
Im Wesentlichen öffnet sich das Formular (wenn die Datenbank geöffnet wird) und schreibt darauf tblUserLogs
den Benutzernamen und das Datum und die Uhrzeit.Wenn die Datenbank dann geschlossen wird, schreibt das Close-Sub mit in denselben Datensatz UserLogID
um sicherzustellen, dass es sich um die richtige Aufzeichnung handelt.Und es funktioniert großartig, bis ich eine Schaltfläche in einem anderen Formular verwende, die den Befehl ausführt DoCmd.Quit acQuitPrompt
wodurch die DB geschlossen wird.Wenn dies geschieht, gibt es keine timeOut
für diesen Datensatz eingegeben.Ich habe es geschafft, dass eine Msgbox angezeigt wird Form_Close
Ereignis in frmTimeKeeper, wenn es vor der SQL-Anweisung liegt, aber nicht, wenn es nach der SQL-Anweisung steht.Gibt es eine Möglichkeit, alle anderen Formulare sauber zu schließen, bevor ich Access beende?
tblUserLogs
als Referenz:
ID user timeIn timeOut
2 Evan 7/29/2014 3:41:58 PM 7/29/2014 3:42:11 PM
3 Evan 7/29/2014 3:42:50 PM 7/29/2014 3:42:57 PM
4 Evan 7/29/2014 3:43:10 PM 7/29/2014 3:43:22 PM
5 J 7/29/2014 3:45:06 PM 7/29/2014 3:46:35 PM
6 J 7/29/2014 3:46:57 PM 7/29/2014 3:47:20 PM
7 Evan 7/30/2014 7:16:43 AM 7/30/2014 7:17:49 AM
8 Evan 7/30/2014 7:36:56 AM 7/30/2014 7:38:56 AM
9 Evan 7/30/2014 10:42:36 AM 7/30/2014 10:42:42 AM
10 Evan 7/30/2014 10:51:56 AM 7/30/2014 10:52:06 AM
11 Evan 7/30/2014 10:55:07 AM
12 Evan 7/30/2014 11:05:25 AM 7/30/2014 11:05:42 AM
13 Evan 7/30/2014 11:06:00 AM
14 Evan 7/30/2014 11:07:20 AM
15 Evan 7/30/2014 11:08:21 AM
16 Evan 7/30/2014 11:14:42 AM
17 Evan 7/30/2014 11:17:50 AM 7/30/2014 11:18:02 AM
18 Evan 7/30/2014 11:19:28 AM
19 Evan 7/30/2014 11:23:06 AM 7/30/2014 11:23:08 AM
20 Evan 7/30/2014 11:23:55 AM 7/30/2014 11:24:22 AM
Das fehlende timeOut
Werte sind auf diesen Fehler zurückzuführen
Danke
Lösung
Durch Klicken auf die Schaltfläche, die DoCmd.Quit aufruft, schließen Sie das TimeKeeper-Formular manuell.Wie,
Private Sub yourOtherButtonName_Click()
DoCmd.Close acForm, "frm_TimeKeeper"
DoCmd.Quit
End Sub