Pregunta

Tengo una base de datos de Access 2010 que utiliza un formulario frmTimeKeeper para realizar un seguimiento de los usuarios en la base de datos.El formulario en sí tiene un ancho de 0 por lo que no se puede ver.Es el primer formulario que se abre cuando se abre la base de datos y se cierra cuando se cierra el acceso.Tiene 2 eventos, apertura y cierre:

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 es una variable global

Básicamente, el formulario se abre (cuando se abre la base de datos) y escribe en tblUserLogs el nombre de usuario y la fecha y hora.Luego, cuando se cierra la base de datos, el subscriptor cercano escribe en ese mismo registro usando UserLogID para garantizar que sea el registro correcto.Y funciona muy bien hasta que uso un botón en otro formulario que ejecuta el comando DoCmd.Quit acQuitPrompt que cierra la base de datos.Cuando esto sucede no hay timeOut ingresado para ese registro.He podido hacer que aparezca un cuadro de mensaje desde el Form_Close evento en frmTimeKeeper si está antes de la declaración SQL pero no cuando está después de la declaración SQL.¿Hay alguna manera de hacer que todos los demás formularios se cierren limpiamente antes de salir de Access?

tblUserLogs para referencia:

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

Los desaparecidos timeOut Los valores se deben a este error.

Gracias

¿Fue útil?

Solución

En el clic del botón que llama a DOCMD.QUIT, cierre manualmente la forma del tiempo.Como,

Private Sub yourOtherButtonName_Click()
    DoCmd.Close acForm, "frm_TimeKeeper"
    DoCmd.Quit
End Sub

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top