Forcer une fermeture propre des formulaires avant la fermeture de l'accès
-
21-12-2019 - |
Question
J'ai une base de données Access 2010 qui utilise un formulaire frmTimeKeeper
pour garder une trace des utilisateurs dans la base de données.Le formulaire lui-même a une largeur de 0 et ne peut donc pas être vu.C'est le premier formulaire ouvert à l'ouverture de la base de données et se ferme à la fermeture de l'accès.Il comporte 2 événements, ouvert et fermé :
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
est une variable globale
Essentiellement, le formulaire s'ouvre (lorsque la base de données s'ouvre) et écrit dans tblUserLogs
le nom d'utilisateur et la date et l'heure.Ensuite, lorsque la base de données est fermée, le sous-ferme écrit dans ce même enregistrement en utilisant UserLogID
pour garantir que c'est le bon enregistrement.Et cela fonctionne très bien jusqu'à ce que j'utilise un bouton sur un autre formulaire qui exécute la commande DoCmd.Quit acQuitPrompt
qui ferme la base de données.Lorsque cela se produit, il n'y a pas timeOut
saisi pour cet enregistrement.J'ai pu faire apparaître une msgbox à partir du Form_Close
événement dans frmTimeKeeper s'il se trouve avant l'instruction SQL mais pas lorsqu'il se trouve après l'instruction SQL.Existe-t-il un moyen de fermer proprement tous les autres formulaires avant de quitter Access ?
tblUserLogs
pour référence:
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
Disparus timeOut
les valeurs sont dues à cette erreur
Merci
La solution
En cliquant sur le bouton qui appelle DoCmd.Quit, fermez manuellement le formulaire timeKeeper.Comme,
Private Sub yourOtherButtonName_Click()
DoCmd.Close acForm, "frm_TimeKeeper"
DoCmd.Quit
End Sub