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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top