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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top