Freitag, 17. Oktober 2014

Microsoft Access Tipp: Datensatznummern

In Microsoft Access gibt es keine Funktionen zum Auslesen von Datensatznummern in Abfragen oder VBA Skripten. Dies kann für Entwickler, die von anderen Datenbanken (xbase, foxpro etc.) auf Access umsteigen, zunächst befremdlich sein.
Es gibt hierfür jedoch eine Lösung, die zugegebener Maßen sehr quick und sehr sehr dirty ist ;-)

Die "reine Lehre" von Access sieht vor, dass man in jeder Tabelle einen eindeutigen Schlüssel hat, den man zum direkten Anspringen bestimmter Datensätze verwendet. Wer eine Satznummer zum Anzeigen benötigt, kann sich in Formularen mit den Konstrukten [CurrentRecord] bzw. [RecordCount] behelfen. Diese funktionieren jedoch nicht in Abfragen.

Innerhalb von Abfragen gibt es auch Möglichkeiten an Datensatznummern für die Ausgabe zu gelangen, nämlich mit Unterabfragen, bzw. mit DCount (DOM Anzahl) - siehe hierzu z.B. www.donkarl.com/FAQ...). Für beide Lösungsansätze muss die Tabelle jedoch über einen eindeutigen Schlüssel verfügen, was leider nicht immer der Fall ist (trotz der "reinen Lehre" ;-).

Nun war ich kürzlich genau in der Situation, eine eindeutige Satznummer in einer Tabelle zu benötigen, die keinen eindeutigen Schlüssel hat. Dabei kam ich auf folgende sehr einfache Lösung, die ich bedingt weiterempfehlen kann:

Statt eine virtuelle Satznummer über ein Funktion auszulesen, legt man schlicht eine physische Satznummer in Form einer zusätzlichen Tabellenspalte mit AUTOWERT an. In dieser zusätzlichen Spalte der Tabelle, nennen wir sie z.B. "lfd-nummer" befindet sich dann eine eindeutige, lineare Aufzählung beginnend mit 1. Das funktioniert mit folgendem Access SQL Kommando, das man einfach in den SQL-Entwurfsmodus einer neuen Abfrage packt:

SQL-/ Abfragecode:
ALTER TABLE tabellenname ADD lfd-nummer COUNTER

Gleichzeitig hat man damit natürlich auch einen eindeutigen Schlüssel geschaffen. Wer also eine Satznummer in einer bestimmten Reihenfolge benötigt, kann auf dieser Basis mit der bei www.donkarl.de beschriebenen Lösung fortfahren.

Übrigens ist dies gleichzeitig die Lösung dafür, wie man eine Autowert-Spalte durch eine separate Abfrage anlegt. Innerhalb einer Tabellenerstellungsabfrage geht dies mit den Mitteln des Entwurfsmodus nicht, sondern nur wenn man in den SQL-Code der Tabellenerstellungsabfrage eingreift.


Sollte man die Spalte später nicht mehr benötigen, kann man sie natürlich auch wieder mit einer weiteren SQL Abfrage löschen:

SQL-/ Abfragecode:
ALTER TABLE tabellenname DROP lfd-nummer


Bei sehr großen Tabellen kann es durch die o.g. SQL-Kommandos zu einer Access Fehlermeldung im Hinblick auf unzureichende Satzsperrungen kommen. In diesem Fall ist zuvor via VBA die entsprechende Access-Einstellung hochzusetzen:

VBA-Code:
DBEngine.SetOption dbMaxLocksPerFile, 90000


Wie immer erfolgt die Befolgung der Tipps und Tricks auf dieser Homepage auf eigene Gefahr!

For the english-speaking readers:
This article describes, how you can simulate a data set number in microsoft access tables. At the same time you can see, how to create an AutoNumber column by a separate query (because this is not possible in he design mode of a create-table query).


Bildquellenangabe:Tim Reckmann  / pixelio.de

1 Kommentar:

  1. Genial. Ich wußte nicht, dass es Datendefintionsabfragen in MSAccess gibt, das kann oft sehr helfen - Dank von PCMEDIEN.DE

    AntwortenLöschen