Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Probleme mit verschiedenen Ereignissen

Begonnen von Gutewicht, August 05, 2024, 14:37:52

⏪ vorheriges - nächstes ⏩

Gutewicht

Hallo zusammen,

ich bin noch ein ziemlicher Neuling (und auch nur Quereinsteigerin mit gefährlichem Halbwissen :o ) in Access und VBA und muss seit einiger Zeit diverse (teils leider sehr alte) Access-Datenbanken betreuen. Eine der Datenbanken macht ständig Probleme und ich weiß nicht so recht weiter. Ich habe schon versucht, an diversen Stellschrauben zu drehen, die ich online gefunden habe (Donkarl u.ä.) und komprimiere das Backend 1x die Woche.

Seit neustem kommt es vor allem bei einer Userin immer wieder zu Problemen mit verschiedenen Ereignissen.

Es tauchen Fehlermeldungen auf wie:
  • Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Vor Aktualisierung eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Automatisierungsfehler
  • Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Bei Geändert eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Fehler beim Verweisen auf eine Eigenschaft oder Methode eines Objekts
  • Sie haben als Einstellung der Ereigniseigenschaft den Ausdruck Bei Zeitgeber eingegeben. Dieser Ausdruck hat einen Fehler verursacht: Ihr Netzwerkzugriff wurde unterbrochen
  • Sie können diesen Datensatz momentan nicht speichern. Möglicher Fehler in DB beim Versuch, einen Datensatz zu speichern.

Als Beispiel mal den Code von einem BeforeUpdate und einem Zeitgeber Ereignis:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    'Bei jeder Datensatzänderung wird das Änderungsdatum aktualisiert
    Forms!Haupt.AendDat = Now()
End Sub

Private Sub Form_Timer()
'Stand 28.09.2023
'Die Datenbank soll regelmäßig komprimiert werden. Dazu muss sie exklusiv geöffnet sein. Mit dieser Prozedur erscheint zu den Wartungsintervallen ein Hinweisfenster, dass die
'User dazu auffordert, die Datenbank zu schließen.

'Außerdem können mit dieser Funktion alle aktiven Benutzer aus der Datenbank geworfen werden. Dazu muss in der Tabelle tblAdmin der Wert des Feldes admDBGesperrt auf "Ja" gesetzt
'werden. Sobald dies der Fall ist, werden alle Benutzer (nach Ablauf des Timer-Intervalls) aus der Datenbank gekickt. Wenn alle wieder rein können, muss der Wert wieder auf
'"Nein" gesetzt werden. Die Funktion wird über das Zeitgeber-Intervall im Formular Haupt gesteuert (wenn dort z.B. 60000 eingestellt ist, wird 1x pro Minute geprüft,
'ob die Bedingung erfüllt ist.

    Dim currentTime As Date
    Dim maintenanceTime1 As Date
    Dim maintenanceTime2 As Date
    Dim kickAllUsers As Boolean

   
    kickAllUsers = DLookup("admDBgesperrt", "tblAdmin")
    'Debug.Print "kickAllUsers " & kickAllUsers
    'Überprüfen, ob in der tblAdmin der Wert admDBGesperrt = Wahr ist. Falls ja, wird DB geschlossen.
    If kickAllUsers = True Then
        Application.Quit
    End If

    ' Setzen Sie hier die gewünschten Wartungszeiten ein
    maintenanceTime1 = #11:38:00 AM#
    maintenanceTime2 = #11:59:00 AM#

    ' Überprüfen, ob der aktuelle Tag ein Mittwoch ist
    If Weekday(Date) = vbWednesday Then
        ' Überprüfen, ob die aktuelle Uhrzeit mit der Wartungszeit übereinstimmt
        currentTime = Time
        If currentTime >= maintenanceTime1 And currentTime <= maintenanceTime2 Then
            ' Blinken des Access-Symbols in der Windows-Taskleiste
            FlashWindow Application.hWndAccessApp, True
            'Anzeige des Warnhinweises. Die Anweisung vbSystemModal bewirkt, dass der Warnhinweis vor allen anderen Windows-Fenstern angezeigt wird, also auch wenn die DB gerade minimiert ist o.ä.
            MsgBox "Achtung: Die Datenbank wird mittwochs zwischen 11.45 Uhr und 12.00 Uhr gewartet. Bitte schließen Sie bis spätestens 11.45 Uhr und starten Sie sie erst wieder ab 12 Uhr!", vbExclamation + vbSystemModal, pcProgTitel & " " & pcProgVers
        End If
     End If

End Sub

Die Datenbank wird von mehreren Usern gleichzeitig verwendet. Sie ist in Front- und Backend aufgeteilt, wobei das Frontend lokal bei jedem User liegt und das Backend auf einem Server (was genau für einer weiß ich leider nicht, das läuft über unsere IT und da stecke ich nicht drin).

Seitdem die o.g. Fehler auftreten, habe ich versucht, im Code auf "Me.irgendwas" zu verzichten und stattdessen immer "Forms!Haupt.irgendwas" zu verwenden, da ich irgendwo gelesen hatte, dass das schonmal zu Problemen führen kann.

Ich bin auch darauf gestoßen, dass solche Fehler daran liegen können, dass irgendwelche Verweise fehlen. Kann das denn sein, wenn dass Frontend für die User eine .accde ist?

Kann es sein, dass die Fehler auf eine instabile Netzwerkverbindung zurückzuführen sind, da sie gehäuft bei dieser einen Userin auftreten? Bei anderen Usern tritt das auch hin und wieder auf, aber nicht so oft. Anwenderfehler will ich natürlich auch nicht ausschließen, aber was könnte das sein?

Ich befürchte, das sind so allgemeine Fehlermeldungen, dass eine Ferndiagnose da schwierig ist, aber vielleicht hat ja jemand noch hilfreiche Tipps, was ich sonst noch tun könnte.

Vielen Dank schon einmal im Voraus!  :)

Beaker s.a.

Na ja, vielleicht eigene Fehlerbehandlungen einbauen.
Wird bei .accde eh empfohlen.
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.

MzKlMu

#2
Hallo,
Zitatwenn dass Frontend für die User eine .accde ist?
An einer .accde kannst Du grundsätzlich nachträglich gar nichts mehr ändern.
Änderungen/Anpassungen können nur an der originalen .accdb gemacht werden. Anschließend muss die .accdb wieder zu einer .accde kompiliert werden.
Eine .accde erfordert auch komplett eine eigene Fehlerbehandlungen, denn eine accde steigt bei einem Fehler meist kommentarlos aus.

Zitathabe ich versucht, im Code auf "Me.irgendwas" zu verzichten und stattdessen immer "Forms!Haupt.irgendwas" zu verwenden,
Diese Aussage ist so pauschal auch nicht richtig.

Zitat'Die Datenbank soll regelmäßig komprimiert werden.
Das wäre auch zu hinterfragen. Warum ist eine regelmäßige Komprimierung erforderlich ?
Auch der Timer (minütlich !) kann Probleme machen. Auf solche Funktionen würde ich verzichten.
Gruß
Klaus

Gutewicht

Erstmal vielen Dank für die Rückmeldungen!

Zitat von: Beaker s.a. am August 05, 2024, 15:27:52Na ja, vielleicht eigene Fehlerbehandlungen einbauen.
Wird bei .accde eh empfohlen.

Meinst du damit, die generischen Fehlermeldungen in konkretere Fehlermeldungen "umzuwandeln" und wenn ja, wie stelle ich das an? Ich kenne OnError GoTo und habe eine grundsätzliche Idee, wie ich eine Fehlerbehandlung umsetzen müsste. Mir ist aber nicht klar, welche Fehler ich da abfangen muss und wie ich die rauskriege.

Zitat von: MzKlMu am August 05, 2024, 17:04:05An einer .accde kannst Du grundsätzlich nachträglich gar nichts mehr ändern.
Änderungen/Anpassungen können nur an der originalen .accdb gemacht werden. Anschließend muss die .accdb wieder zu einer .accde kompiliert werden.
Eine .accde erfordert auch komplett eine eigene Fehlerbehandlungen, denn eine accde steigt bei einem Fehler meist kommentarlos aus.

Sprich, wenn in der .accdb alle notwendigen Verweise drin sind, können die in der .accde auch nicht verschwinden?

Zitat
Zitat'Die Datenbank soll regelmäßig komprimiert werden.
Das wäre auch zu hinterfragen. Warum ist eine regelmäßige Komprimierung erforderlich ?
Auch der Timer (minütlich !) kann Probleme machen. Auf solche Funktionen würde ich verzichten.

Seit ich die DB regelmäßig komprimiere läuft der Betrieb jedenfalls stabiler. Irgendeine Form von Erinnerung brauche ich aber, damit die User nicht jede Woche vergessen, dass sie zu dem Zeitpunkt aus der DB raus müssen. Ich könnte mir vorstellen, statt des Timers Form_Activate oder Form_Load zu nehmen und dann zu prüfen, ob der Wartungszeitraum da ist und nur dann ein Popup anzuzeigen. Wäre das besser? Das kickAllUsers wird dadurch natürlich schlechter nutzbar, wenn da einer die DB offen gelassen hat und Kaffee trinken gegangen ist, aber das wäre verschmerzbar. Oft brauche ich das nicht. 

Beaker s.a.

ZitatMeinst du damit, die generischen Fehlermeldungen in konkretere Fehlermeldungen "umzuwandeln" und wenn ja, wie stelle ich das an?
Ja, das meine ich.
Zur Umsetzung findest du hier im Forum so Einiges.
--
Frauen aller Länder vereinigt euch! Wir brauchen eine Wiedergeburt des Matriarchats.
Und schickt den Papst in die Wüste! Da kann er 40 Tage auf God(o)t warten.

PhilS

Zitat von: Gutewicht am August 05, 2024, 14:37:52Seitdem die o.g. Fehler auftreten, habe ich versucht, im Code auf "Me.irgendwas" zu verzichten und stattdessen immer "Forms!Haupt.irgendwas" zu verwenden, da ich irgendwo gelesen hatte, dass das schonmal zu Problemen führen kann.
Das ist keine gute Idee.

Wenn es mit Me.Eigenschaftsname ein Problem gibt, dann hat das eine konkrete Ursache, die man lösen sollte, anstatt das Problem zu verschleiern.
Mit der Forms!...-Syntax tauscht du da im besten Fall nur einen Kompilierungsfehler (der beste Fehler, weil er dem Entwickler direkt vorgesetzt wird!), gegen einen Laufzeitfehler, der vielleicht irgendwann abhängig von irgendwas bei irgendwem mal auftritt.
Außerdem machst du deinen Code schlechter wartbar.


Zitat von: Gutewicht am August 05, 2024, 14:37:52Ich bin auch darauf gestoßen, dass solche Fehler daran liegen können, dass irgendwelche Verweise fehlen. Kann das denn sein, wenn dass Frontend für die User eine .accde ist?
"Verweise fehlen" ist eine sehr schwammige Formulierung.
Natürlich kann es in einer ACCDE nicht passieren, dass ein Verweis aus der ACCDE-Datei verschwindet. Aber ein Verweis ist eine Referenz auf eine externe Bibliothek, also eine andere Datei. Diese andere Datei kann vorhanden sein oder nicht. Daran kann auch die ACCDE nichts ändern.

Und ja, ein Problem mit den Verweisen kann die beschriebenen Probleme auslösen, aber die sollten dann konstant auf einem bestimmten Rechner bei einer bestimmten Funktionalität immer auftreten. - Das ist bei dem Betroffenen Benutzer nicht der Fall, oder?

Zitat von: Gutewicht am August 05, 2024, 14:37:52Kann es sein, dass die Fehler auf eine instabile Netzwerkverbindung zurückzuführen sind, da sie gehäuft bei dieser einen Userin auftreten?
Auch das wäre möglich. Deine oben angeführte Fehlermeldung "Netzwerkzugriff wurde unterbrochen" deutet in diese Richtung.
Hier wäre dann die bereits angesprochene Fehlerbehandlung nötig, um evtl. genauere Information zu bekommen, was das Problem ist.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Gutewicht

ZitatDas ist keine gute Idee.

Wenn es mit Me.Eigenschaftsname ein Problem gibt, dann hat das eine konkrete Ursache, die man lösen sollte, anstatt das Problem zu verschleiern.
Mit der Forms!...-Syntax tauscht du da im besten Fall nur einen Kompilierungsfehler (der beste Fehler, weil er dem Entwickler direkt vorgesetzt wird!), gegen einen Laufzeitfehler, der vielleicht irgendwann abhängig von irgendwas bei irgendwem mal auftritt.
Außerdem machst du deinen Code schlechter wartbar.

Good point, sehe ich ein. Vielen Dank, dann werde ich mich jetzt mal intensiv mit dem Thema Fehlerbehandlung auseinandersetzen und probieren, diese in die DB zu implementieren.

ebs17

Was mich irritiert: Das Application.Quit erfolgt vor allen Zeitüberprüfungen. Da müsste man schauen, was ein solcher harter Abbruch bewirkt.
Mit freundlichem Glück Auf!

Eberhard