Liebe/-r Experte/-in,
Guten Tag,
ich habe Access 2007 unter Windows 7 im Einsatz. Die Tabellen sind von den Formularen in einer separaten Datenbank getrennt. Die Anwendung entwickle ich für die Seniorenhilfe in Langen (das ist tolle gemeinnützige Initiative, der ich natürlich kostenlos zuarbeite)
Im Einzelbetrieb läuft die Anwendung. Sobald ich aber mit 2 Benutzern gleichzeitig arbeite, kommt es manchmal zu Konflikten. Damit meine ich auch (aber nicht nur) dass ein Datensatz von 2 Benutzern gleichzeitig geändert werden soll und sich Access dann folgerichtig meldet.
Ich glaube 3 Probleme zu haben, die alle mit einem (fast) zeitgleichen Zugriff auf gleiche Tabellen oder Datensätze zusammenhängen. Ich bekomme falsche Anzeigen von der Anwendung in den Formularen oder Warnmeldungen von Access. Wenn ich die gleiche Aktion nicht fast zeitgleich oder bei falscher Anzeige nach einer Minute wiederhole, dann stimmt wieder alles.
Problem 1:
Offensichtlich kann der VBA-Befehl DoCmd.RunSQL „Delete * from AuswahlTabMNr;“ nicht ausgeführt werden, weil ein anderer Benutzer diese Aktion gerade für die Tabelle ausführt. In der weiteren VBA-Befehlsfolge wird die Tabelle (die jetzt gelöscht bzw. leer sein sollte) mit einer passenden Auswahl gefüllt und Im Formular wird später gezählt, wie viel Einträge die Tabelle AuswahlTabMNr aufgrund der passenden Auswahl hat.
Der Teil des VBA-Codes:
DoCmd.SetWarnings False 'Warnmeldungen ausschalten
DoCmd.RunSQL „Delete * from AuswahlTabMNr;“
DoCmd.RunSQL „Delete * from BankenTab;“
Me.Refresh
AnzahlAuswahlTabMNr = „“
Im Fehlerfall werden die Einträge für die Tabelle AuswahlTabMNr nicht gelöscht und dann aber trotzdem gefüllt – die gezählten Einträge sind dann also doppelt so hoch.
Meine Frage: wie kann ich erreichen, dass die Tabellensätze trotzdem gelöscht werden? Soll ich die Tabelle aus der getrennten Datenbank trennen und zu den Formularen packen, damit jeder Benutzer seine eigene Tabelle aufbaut? Ich zögere nämlich, die Tabelle ganz zu sperren, da diese auch noch in anderen Formularen gebraucht wird.
Problem 2:
Aufgrund einer Vorlage (das ist ein normales Formular) kann ich per Button auslösen, dass aufgrund dieser Vorlage in einer anderen Tabelle der höchste Ordnungsbegriff gesucht und dann ein neuer Satz in dieser anderen Tabelle mit einem Ordnungsbegriff +1 angelegt wird. Der Ordnungsbegriff ist gleichzeitig der Index.
Auch hier führt der fast zeitgleiche Zugriff dazu, dass beide Benutzer den gleichen höchsten Ordnungsbegriff genannt bekommen. Beide wollen danach einen neuen Satz in die Tabelle speichern – es kommt zwangsläufig zu einem (verbotenen) gleichen Indexeintrag, der natürlich von Access per Fehlermeldung verhindert wird. Aber der unbedarfte Benutzer ist verunsichert.
Meine Frage: wie kann ich das verhindern. Mein (umständlicher??) Lösungsansatz wäre, sich den höchsten Ordnungsbegriff geben zu lassen und vor dem endgültigen Schreiben des neuen Satzes nochmal abzufragen, ob es diesen Index inzwischen gibt – und dem Benutzer dann die Aktion per Fehlermeldung von mir abzubrechen.
Problem 3a:
Benutzer A und B haben das gleiche Mitglied in Bearbeitung. Jeder will den Datensatz ändern. Ich habe die Datensätze nicht gesperrt. Access merkt den Konflikt und gibt dem Benutzer B eine entsprechende Fehlermeldung. Benutzer B kann dann die Änderung auf der von Access angezeigten Fehlermeldung durch Auswahl des entsprechenden Buttons verwerfen. Dabei kommt es aber zu einer weiteren Fehlermeldung, die der Benutzer ebenfalls quittieren kann. Soweit so gut.
Meine Frage: kann ich diese Situation vermeiden? Sätze möchte ich dabei ungern sperren. Kann ich die Fehlermeldung abfangen?
Problem 3b:
Wenn es schon eine Fehlermeldung gibt (sie kann auch anderen Gründen auftreten), dann gehen der Anwendung globale Variablen verloren. Das ist unschön und führt anschließend zu einer Division durch Null – also zu einer weiteren Fehlermeldung. Viel unschöner ist aber, dass der Benutzer nicht zu dem Formular zurückkehren kann, das den Fehler ausgelöst hat. (Ich zeige alle geöffneten Formulare als Registerreiter an). Letztlich bleibt dem Anwender oft nur, das Register mit der rechten Maustaste anzuklicken und dann zu schließen. Dazu sind die Benutzer (alles ältere Leute!) häufig nicht qualifiziert genug. Es genügt da schon die kleinste Störung/Abweichung vom gewohnten Ablauf, um sofortige Konfusion auszulösen.
Es ist also meine Aufgabe, solche Störungen abzufangen. Vielleicht gibt es aber irgendwo eine Einstellung, dass das fehlerauslösende Formular wieder angesprochen (aktiviert) werden kann?
Auch wenn das Vorstehende professionell klingt – ich bin trotzdem kein geübter Accessanwender. Ich kann nur von Excel her auch VBA. Darum bitte ich die erbetene Hilfen/Lösungen/Erklärungen meinem niederen Niveau anzupassen. Danke!!