Benutzer mit den meisten Antworten
Formular mit Timer macht Probleme

Frage
-
Hallo an alle
Ich habe eine Datenbank von Access 2003 auf 2013 migriert (Frontend Access; Datenhaltung MS SQL 2014). So weit, so gut. Nur eine "Kleinigkeit" funktioniert nicht mehr.
In meinem Hauptformular ist ein Timer hinterlegt, welcher einmal pro Sekunde in der Datenbank nachschaut, ob der User einen anderen Auftrag ausgewählt hat. Der User kann in einer separaten Kalender-App einen Auftrag anwählen. Dieser soll dann in dem Hauptprogramm (eben diese Access DB) bearbeitet werden können. Unter Access 2003 hat alles tadellos funktioniert. Unter Access 2013 funktioniert es nur direkt nach Programmstart. Nach x Minuten scheint dieser Timer ins Nirvana zu laufen.
Hier mal der Timer-Code (ich habe noch einige Log-Infos eingebaut, daher habe ich gemerkt, dass der Timer nicht läuft):
Private Sub Form_Timer() Dim strMess As String 'WENN NumLock aus ist DANN wieder einschalten If Nz(GetParameterStr("ini_Debug"), 0) = 1 Then If (LCase(ben) = "aga") Or (LCase(MUserName) = LCase(Trim(Nz(DLookup("ParameterWert", "Parameter", "ParameterName = 'ini_Debug_User'"), vbNullString)))) Then 'strMess = "Formular 'Auftrag_Grafik': NumLock-Status = " + CStr(IsNumLockOn) strMess = "User: " + ben + " | Aktive Form: " + Screen.ActiveForm.Name + " | Aktueller Auftrag: " + CStr(auftr) Log strMess End If End If If Not IsNumLockOn Then ToggleNumLock 'strMess = "NumLock aktiviert" 'Log strMess End If 'Fall im OverviewDotNET ein Auftrag ausgewählt wurde, diesen auswählen If Nz(GetParameterStr("ini_Debug"), 0) = 1 Then If Second(Now) = 0 Then If Application.CurrentObjectType = acForm Then If Nz(Screen.ActiveForm.Name, "n/a") <> "n/a" Then If (LCase(ben) = "aga") Or (LCase(MUserName) = LCase(Trim(Nz(DLookup("ParameterWert", "Parameter", "ParameterName = 'ini_Debug_User'"), vbNullString)))) Then Log "User: " + ben + " | Aktive Form: " + Screen.ActiveForm.Name End If End If End If End If End If info_zurück_aufträge_2018 End Sub
Das Komische ist ja, das die Logs teilweise erzeugt werden, er aber die Funktion "info_zurück_aufträge_2018" NICHT aufruft.
Kann es sein, dass das Timer-Event irgendwann überläuft? Und wenn ja, warum und wie kann ich das verhindern? Wie gesagt unter Access 2003 läuft alles.
In diesem Zusammenhang noch eine andere Frage: Ich habe noch ein verstecktes Formular welches per Timer regelmäßig schaut, ob der User abgemeldet werden soll (z.B. wegen Wartungsarbeiten). Da schein der Timer überhaupt nicht zu funktionieren.
Funktionieren die Timer nur noch in aktiven Formularen? Oder wo ist hier mein Fehler?
Viele Grüße
Thorsten
Thorsten Schröer Dipl-Inform (FH) - EDV, Beratung & Service - double-D-IT -Office- / Information system support Bismarckstraße 18a Germany-12169 Berlin Steglitz phone: +49-(0)30-303286770 fax: +49-(0)30-303286779
Antworten
-
Hallo,
In meinem Hauptformular ist ein Timer hinterlegt, welcher einmal pro Sekunde in der Datenbank nachschaut, ob der User einen anderen Auftrag ausgewählt hat.
Private Sub Form_Timer()
… If Nz(GetParameterStr("ini_Debug"), 0) = 1 ThenIf Second(Now) = 0 Then
Du schreibst zwar, "welcher einmal pro Sekunde in der Datenbank nachschaut". An dieser Stelle prüfst du aber auf Sekunde 0 ab, und da es diese jede Minute nur einmal gibt, heisst das, dass die Prüfung einmal pro Minute stattfindet. Dann kommt hinzu, dass es sein kann, dass dein System etwas langsamer reagiert, deshalb die Prozedur vielleicht erst in Sekunde 1 wieder läuft und als Konsequenz die nachfolgenden Schritte gar nicht ausgeführt werden.
Du hast 2 Möglichkeiten:
1) Lass die Zeile "If Second(Now)=0" und das dazugehörige "End If" weg, dann wird wirklich jede Sekunde geprüft.
oder 2), wenn jede Minute geprüft werden soll:
Leg auf Modul-Ebene eine Variable an, in der du die Zeit der letzten Prüfung speicherst und beim nächsten Form_Timer prüfst, ob die Minute rum ist:
Dim dLastTime As Date Private Sub Form_Timer() ... 'If Second(Now) = 0 Then If DateDiff("s", dLastTime, Now()) >=60 Then ... dLastTime=Now() End If
Gruss - Peter
--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
- Bearbeitet Peter DoeringMVP, Moderator Sonntag, 10. Februar 2019 00:19
- Als Antwort markiert Peter DoeringMVP, Moderator Dienstag, 15. Oktober 2019 08:48
Alle Antworten
-
Hallo,
In meinem Hauptformular ist ein Timer hinterlegt, welcher einmal pro Sekunde in der Datenbank nachschaut, ob der User einen anderen Auftrag ausgewählt hat.
Private Sub Form_Timer()
… If Nz(GetParameterStr("ini_Debug"), 0) = 1 ThenIf Second(Now) = 0 Then
Du schreibst zwar, "welcher einmal pro Sekunde in der Datenbank nachschaut". An dieser Stelle prüfst du aber auf Sekunde 0 ab, und da es diese jede Minute nur einmal gibt, heisst das, dass die Prüfung einmal pro Minute stattfindet. Dann kommt hinzu, dass es sein kann, dass dein System etwas langsamer reagiert, deshalb die Prozedur vielleicht erst in Sekunde 1 wieder läuft und als Konsequenz die nachfolgenden Schritte gar nicht ausgeführt werden.
Du hast 2 Möglichkeiten:
1) Lass die Zeile "If Second(Now)=0" und das dazugehörige "End If" weg, dann wird wirklich jede Sekunde geprüft.
oder 2), wenn jede Minute geprüft werden soll:
Leg auf Modul-Ebene eine Variable an, in der du die Zeit der letzten Prüfung speicherst und beim nächsten Form_Timer prüfst, ob die Minute rum ist:
Dim dLastTime As Date Private Sub Form_Timer() ... 'If Second(Now) = 0 Then If DateDiff("s", dLastTime, Now()) >=60 Then ... dLastTime=Now() End If
Gruss - Peter
--
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
- Bearbeitet Peter DoeringMVP, Moderator Sonntag, 10. Februar 2019 00:19
- Als Antwort markiert Peter DoeringMVP, Moderator Dienstag, 15. Oktober 2019 08:48