Home > Artikel > Ausgabe 12/2013 > Autowerte

Autowerte

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Access macht es dem Datenbankprogrammierer bei Anlegen von neuen Datensätzen sehr leicht: Es vergibt, wenn man dies so definiert hat, automatische Werte für bestimmte Felder eines Datensatzes. In der Regel ist dieses Feld identisch mit dem Primärschlüsselfeld, was auch durchaus sinnvoll ist – liefert die Autowert-Funktion von Access doch standardmäßig einen Wert, der um eins größer als der bisher größte Wert ist. Es gibt aber auch andere Einstellungen. Dieser Artikel wirft einen genauen Blick auf Autowerte in Access.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1312_Autowerte.mdb.

Autowert anlegen

Wer schon ein paar Tabellen unter Access angelegt hat, verwendet diese Funktion wahrscheinlich bereits wie im Schlaf: Sie legen eine neue Tabelle an und fügen zunächst ein Feld hinzu, das als Primärschlüsselfeld dient und somit als Feld mit eindeutigen Werten.

Dies gewährleistet, dass jeder Datensatz zumindest anhand eines Feldes eindeutig identifiziert werden kann.

Damit dieses Feld auch zuverlässig mit einem bisher noch nicht vorhandenen Wert gefüllt wird, gibt es unter Access den Felddatentyp Autowert. Diesen legen Sie für das Primärschlüsselwert fest, in der Beispieldatenbank etwa für das Feld AutowertID der Tabelle tblAutowerte (siehe Bild 1).

Anlegen einer Tabelle mit einem Autowert

Bild 1: Anlegen einer Tabelle mit einem Autowert

Nachdem Sie dies erledigt haben, können Sie zur Datenblattansicht der Tabelle wechseln. Dort finden Sie nicht nur einen leeren Datensatz vor, sondern auch noch den Text (Neu) im Feld AutowertID (siehe Bild 2).

Das Autowert-Feld zeigt den Eintrag (Neu) an.

Bild 2: Das Autowert-Feld zeigt den Eintrag (Neu) an.

Dieser ändert sich auch erst, nachdem Sie das erste Feld des frischen Datensatzes geändert haben. Das Autowert-Feld erhält dann, wenn die Tabelle bis dahin noch jungfräulich war, den Wert 1 (siehe Bild 3).

Er wird eingefügt, sobald der Datensatz geändert wurde.

Bild 3: Er wird eingefügt, sobald der Datensatz geändert wurde.

Dieser Wert ist allerdings, wie der komplette Datensatz, noch nicht in der Tabelle gespeichert – dies geschieht erst, wenn Sie den Datensatz tatsächlich entweder durch einen Mausklick auf den Datensatzmarkierer des betroffenen Datensatzes oder durch Verlassen des geänderten Datensatzes in der zugrunde liegenden Tabelle speichern (siehe Bild 4).

Weitere Datensätze erhalten den bisher größten Wert plus eins als Autowert.

Bild 4: Weitere Datensätze erhalten den bisher größten Wert plus eins als Autowert.

Lückenlos?

Dies geht nun so weiter – und wenn Sie keinen Datensatz löschen, erhalten Sie eine wunderschöne lückenlose Reihe von Primärschlüsselwerten (siehe Bild 5).

Schön durchnummerierte Datensätze

Bild 5: Schön durchnummerierte Datensätze

Dummerweise ist es damit vorbei, sobald Sie den ersten Datensatz löschen (siehe Bild 6). Aber was soll man an dieser Stelle sonst erwarten – wohl kaum, dass Access die Nummerierung der nachfolgenden Datensätze so ändert, dass sich die Lücke wieder schließt.

Aber wehe, ein Datensatz wird gelöscht!

Bild 6: Aber wehe, ein Datensatz wird gelöscht!

So mancher mag aber erwarten, dass zumindest der folgende Datensatz einen Autowert erhält, der die lückenlose Nummierung wiederherstellt. Das ist jedoch mitnichten der Fall: Der folgende Autowert orientiert sich brav an dem bisher größten vergebenen Wert und fügt diesem noch den Wert 1 hinzu (siehe Bild 7).

Die entstandene Lücke wird durch einen neuen Datensatz nicht geschlossen.

Bild 7: Die entstandene Lücke wird durch einen neuen Datensatz nicht geschlossen.

Anfügen nach Löschen?

Wenn Sie nun den zuletzt angefügten Datensatz löschen, könnten Sie zumindest theoretisch erwarten, dass Access den neuen Datensatz – wie auch die vorherigen Datensätze – wieder mit dem aktuell größten Primärschlüsselwert plus eins versieht.

Das Löschen des letzten und das erneute Anfügen eines Datensatzes liefert allerdings eine Enttäuschung: Der neue Datensatz erhält nicht den Primärschlüsselwert des zuvor gelöschten Datensatzes, sondern den um eins erhöhten Wert (siehe Bild 8).

Nach dem Löschen des letzten Datensatzes wird dessen Autowert nicht neu vergeben.

Bild 8: Nach dem Löschen des letzten Datensatzes wird dessen Autowert nicht neu vergeben.

Tabelle zurücksetzen

Dummerweise geschieht das Gleiche nicht nur, wenn Sie nur ein oder mehrere Datensätze am Ende einer Tabelle löschen, sondern auch dann, wenn Sie alle Datensätze löschen – beispielsweise, um eine bislang mit Testdaten gefüllte Datenbank zu leeren und diese dem Kunden zu übergeben.

Zum Glück gibt es eine Möglichkeit, um dies zu erledigen – nämlich durch Komprimieren der Datenbank. Unter Access 2010 erledigen Sie dies beispielswiese durch einen Mausklick auf den Reiter Datei des Ribbons und anschließendes Betätigen der Schaltfläche Daten komprimieren und reparieren im Backstage-Bereich von Access.

Nach dem Komprimieren der Datenbank fügt Access wieder den Autowert am Ende der Tabelle an, der tatsächlich dem um eins erhöhten bisherigen größten Wert entspricht. Access füllt allerdings auch nach dem Komprimieren keine Lücken, die durch gelöschte Datensätze entstehen, die sich nicht am Ende der Tabelle befinden.

Lücken füllen

Wie können wir nun diese Lücken füllen? Eigentlich sollten Sie das gar nicht tun – dazu gleich mehr. Wenn es allerdings doch einmal notwendig sein sollte, gibt es einen Trick. Dabei müssen Sie allerdings den Wert für das Autowert von Hand festlegen.

Dies gelingt allerdings nicht direkt im Datenblatt – wenn Sie dort versuchen, den Autowert eines neuen Datensatzes zu überschreiben, geschieht schlicht und einfach nichts.

Sie können dies jedoch per VBA erledigen, und zwar mit einer Prozedur wie der aus Listing 1. Damit fügen Sie einen neuen Datensatz zur Tabelle hinzu, dessen Autowert- beziehungsweise Primärschlüssel-Feld den Wert 3 enthält – genau den Wert, den wir zum Füllen der vorhandenen Lücke benötigen. Und es funktioniert – Access fügt den Datensatz ohne Murren in die Tabelle ein!

Public Sub DatensatzInLuecke()

     Dim db As DAO.Database

     Set db = CurrentDb

     db.Execute "INSERT INTO tblAutowerte(AutowertID, WeiteresFeld) VALUES(3, 'Aufgefüllt!')", dbFailOnError

     Set db = Nothing

End Sub

Listing 1: „Manuelles” Anfügen eines neuen Datensatzes mit individuellem Autowert.

Sie können so übrigens auch negative Werte als Primärschlüsselwert verwenden.

Das Ergebnis zeigt Bild 9 – allerdings sehen Sie dort auch eine eher weniger angenehme Folge der Einfüge-Aktion.

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!