Pergunta

Eu tenho um banco de dados Access 2010 que está usando um formulário frmTimeKeeper para acompanhar os usuários no banco de dados.O próprio formulário tem largura 0, portanto não pode ser visto.É o primeiro formulário aberto quando o banco de dados abre e fecha quando o acesso é fechado.Possui 2 eventos, aberto e fechado:

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 é uma variável global

Essencialmente, o formulário é aberto (quando o banco de dados é aberto) e grava em tblUserLogs o nome de usuário e a data e hora.Então, quando o banco de dados é fechado, o close sub grava no mesmo registro usando UserLogID para garantir que seja o registro correto.E funciona muito bem até eu usar um botão em outro formulário que execute o comando DoCmd.Quit acQuitPrompt que fecha o banco de dados.Quando isso acontece não há timeOut inserido para esse registro.Consegui fazer com que uma msgbox aparecesse no Form_Close evento em frmTimeKeeper se for antes da instrução SQL, mas não quando for depois da instrução SQL.Existe uma maneira de fechar todos os outros formulários antes de sair do Access?

tblUserLogs para referência:

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

Os desaparecidos timeOut os valores são por causa deste erro

Obrigado

Foi útil?

Solução

Ao clicar no botão que chama o DoCmd.Quit feche manualmente o formulário timeKeeper.Como,

Private Sub yourOtherButtonName_Click()
    DoCmd.Close acForm, "frm_TimeKeeper"
    DoCmd.Quit
End Sub
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top