Forçando um fechamento limpo dos formulários antes do encerramento do acesso
-
21-12-2019 - |
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
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