none
Formular mit Timer macht Probleme RRS feed

  • 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: &#43;49-(0)30-303286770 fax: &#43;49-(0)30-303286779

    Mittwoch, 23. Januar 2019 14:54

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 Then

    If 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

    Samstag, 9. Februar 2019 23:17
    Moderator

Alle Antworten

  • Schreib doch mal mit dem Timer Event in eine Textdatei Datum Uhrzeit rein - ohne das ganze andere und schau nach ob das durchläuft

    evtl liegt es ja gar nicht an dem Timer Event

    Donnerstag, 7. Februar 2019 13:38
  • 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 Then

    If 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

    Samstag, 9. Februar 2019 23:17
    Moderator