Access 2007: Problem bei Betrieb mit mehr als 1 Benutzer

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!!

Problem 1:
Der Teil des VBA-Codes:
DoCmd.SetWarnings False 'Warnmeldungen ausschalten
DoCmd.RunSQL „Delete * from AuswahlTabMNr;“
DoCmd.RunSQL „Delete * from BankenTab;“

Versuch doch einmal anstelle von „DoCmd.RunSQL“ folgenden Kode:

dim connADO as ADODB.Connection
(…)
set connADO = CurrentProject.Connection
(…)
connADO.Execute „(Dein SQL-Statement)“

oder

dim dbDAO as DAO.Database
(…)
set dbDAO = CurrentDB()
(…)
dbDAO.Execute „(Dein SQL-Statement)“

Falls ADODB.Connection bzw. DAO.Database nicht erkannt werden, muß unter Verweise der entsprechende Eintrag noch hinterlegt werden.

Problem 2:

Um Sicherzustellen, daß in einer Mehrbenutzerumgebung nicht mehrmals derselbe Wert vergeben wird, ist der Felddatentyp „AutoWert“ (in früheren Access-Versionen hieß er „Zähler“) zu verwenden. Bereits beim Anlegen eines Datensatzes wird dann der Wert hochgezählt und „verbrannt“, d. h. auch wenn der Datensatz nicht gespeichert wird, ist der Wert verbraucht und kann auch nicht mehr verwendet werden. Dies ist zwar ärgerlich, wenn ein Anspruch auf lückenlose Verwendung der Zahlen besteht, aber immer noch besser als die von Dir beschriebene Situation durch doppelt vergebene Nummern.

Problem 3a:

Man kann auf Datenbankebene unter den Optionen einstellen, daß eine Sperrung auf Datensatzebene (anstelle von Sperrung auf Seitenebene) möglich ist. Dann lassen sich benachbarten Datensätze von anderen Benutzern bearbeiten, auch wenn diese in derselben physikalischen Seite gespeichert werden. Gerade in einer Mehrbenutzerumgebung sollte die Datensatzsperrung aktiviert werden, um zu verhindern, daß zwei Anwender sich gegenseitig Daten überschreiben.

Problem 3b:

Globale Variablen gehen nur verloren, wenn das Kommando „End“ ausgeführt wird, nicht wenn Fehlermeldungen erscheinen. Im VisualBasic-Editor kann man die Fehlerstelle durch klicken auf den gelben Pfeil (Abbruchstelle) und ziehen in eine andere Programmzeile überspringen. Dies sollte natürlich nur der Programmierer machen; der Anwender sollte im VBE gar nichts machen. Mit F5 läßt sich ein angehaltenes Programm fortsetzen.

Sorry: Access 2007: Problem bei Betrieb mit mehr als 1 Benutzer
Moin,

sorry, da kann ich Dir gerade auch nichts zu sagen.

Kristian

Hallo Stefan, vielen Dank für deine prompte Antwort.
Das werde ich ausprobieren.

Freundlicher Gruß
Harald