Häufige Probleme mit Access

Verknüpfungen zu Bibliotheken

Speziell in Access 2000 gibt es ein Problem mit den Bibliotheken. Um die Beispiele zu nutzen, sollten einige Einstellungen überprüft werden:

  • Ein beliebiges Modulblatt öffnen (Alt+F11).

  • In der Menüleiste den Eintrag 'Extras' wählen

  • Den Menüpunkt 'Verweise' anklicken.

Dort sind üblicherweise mehrere Objektbibliotheken ausgewählt:

  • Visual Basic for Applications

  • Microsoft Access 9.0 Object Library

  • OLE Automation

  • Microsoft ActiveX Data Objects 2.1 Library

Leider fehlt hier regelmäßig die 'Microsoft DAO 3.6 Object Library', die in allen früheren Versionen von Access zu den wichtigsten Bibliotheken überhaupt gehörte. Sie muß nachgewählt werden und so verschoben werden, daß sie über der 'Microsoft ActiveX Data Objects 2.1 Library' steht.
Beginnt eine der angekreuzten Objektbibliotheken mit 'NICHT VORHANDEN…', dann muß das Kreuzchen vor dem Eintrag entfernt werden.
Die Objektbibliothek 'Microsoft ActiveX Data Objects 2.1 Library' ist für meine Anwendungen nicht erforderlich.

Löschen von Objektvariablen

Hat man einen Code, wie den folgenden

 Public Sub MachWas()
    Dim A As Object
    Set A = CurrentDb.TableDefs("Hallo")
    ...
  End Sub

Dann sollte nach Ende der Prozedur eigentlich die lokal definierte Objektvariable A gelöscht werden. Dies geschieht auch, aber nicht sofort. Daher sollte man, wenn man das Objekt (hier: CurrentDb.TableDefs("Hallo")) noch braucht, das Programm mit Set A = Nothing abschließen.

MDB und MDE

Gelegentlich macht man aus einer MDB eine MDE-Datei: Die MDB enthält noch den Quellcode und ist für die Entwicklung gedacht, die MDE ist für die Benutzer gedacht und soll Anwender an Änderungen des Codes und der Formulare hindern.

Wenn allerdings beide Dateien im gleichen Verzeichnis stehen und den gleichen Namen haben, dann benutzen sie die gleiche LDB-Datei. Wenn nun ein Anwender die MDE geöffnet hat und ein Entwickler an der MDB arbeitet, bekommt der Entwickler dauernd Fehlermeldungen, weil Access glaubt, daß die MDB (und auch die MDE) von zwei Benutzern bearbeitet wird.

Gänsefüßchen in Objektnamen

Will man in VBA mit Namen von Access-Objekten arbeiten, dann können diese Namen Gänsefüßchen (") enthalten - der Absturz des Programme droht, den VBA erwartet die Verdoppelung der Gänsefüßchen, sonst werden sie nicht als " ine einem String, sondern als Ende eines Strings verstanden. ´Zur Abhilfe habe ich eine VBA-Routine  geschrieben.

Gänsefüßchen in SQL

Wenn man in VBA SQL-Abfragen konstruiert, dann ergibt sich nach WHERE manchmal ein Ausdruck, der vom Typ String ist. Dann muß man diesen Ausdruck wieder in doppelte Gänsefüßchen setzen. SQL erlaubt zwar als Ersatz von " auch ein ' aber wenn dieses auch innerhalb des Textes vorkommen kann, könnte es wieder ein Problem geben, der Code wäre an dieser Stelle nicht sicher.
Fazit: Abfragen in SQL mit doppelten " ausführen und Strings auf " prüfen.

SQL: Namen in [...] setzen

Wenn man SQL-Abfragen in VBA konstruiert, sollte man die Namen von Tabellen, Spalten und Alias-Namen in eckige Klammern setzen, insbesondere, wenn diese Namen vom Anwender zur Laufzeit eingegeben werden können. Das hat den Vorteil, daß Namen auch dann akzeptiert werden, wenn sie Leerzeichen enthalten oder zufällig mit SQL-Bezeichnern identisch sind. So kann gerade im deutschen Sprachraum der Spaltenname [Alter] vorkommen, aber ALTER ist auch ein SQL-Schlüsselwort

Unnötige Indexfelder

Standardmäßig ist Access darauf eingestellt, bei Feldnamen, die auf …ID enden, automatisch auch einen Index zu vergeben. Wenn solche Felder später mit einem Primärschlüssel versehen werden, legt Access diesen einfach an, ohne den vorherigen Index zu löschen. Daher sollte man seine Tabellen prüfen, ob unnötige Indizes angelegt wurden. Auch der Nachschlageassistent erstellt jedes Mal eine neue Beziehung, unabhängig ob schon eine geeignete Beziehung zwischen Tabellen besteht, oder nicht. Um zu prüfen, ob unnötig viele Beziehungen bestehen, habe ich eine Abfrage erstellt, die auf der Systemtabelle 'MSysRelationships' beruht.

Das CurrentDb-Objekt

Speziell das CurrentDb-Objekt hat eine wechselvolle Geschichte: Mal wurde es in einer Accessversion statt DBEngine empfohlen, dann war es wieder einmal ein Auslaufmodell, dann wurde es wieder empfohlen …
Speziell mit dem Transaktiosnschutz (BeginTrans, CommitTrans, Rollback) gibt es beim Konvertieren von Access 95 VBA-Modulen Probleme, denn diese Methoden laufen nur noch mit DBEngine.
Durch einige Bugs in Access kann es ein, dass bestimmte VBA-Anweisungen (z.B. in Zusammenhang mit der Fields-Auflistung des CurrentDb-Objektes) mit DBEngine(0)(0) laufen, mit CurrentDB aber nicht.