Der SQL-Dialekt von Access bietet einige Möglichkeiten, die in der Entwicklergemeinde nur wenig beachtet werden. Der Hauptgrund dafür ist die schlechte Dokumentation dieser Features durch Microsoft. Einige dieser “geheimen” Funktionen können in der Praxis durchaus nützlich sein.
SQL-änderungen in Jet 4
Jet-SQL hat sich über die fast 15 Jahre ihres Bestehens relativ wenig verändert. Die stärksten änderungen und Erweiterungen des Sprachumfangs hat Microsoft 1999 mit dem Erscheinen von Access 2000, also mit Jet 4, vorgenommen. Access 2000 war bekanntlich die Version mit den meisten Neuerungen in der Access-Geschichte.
Unter anderem wurde mit den Access Projekten (ADP) und der Einführung von ADO die Verbindung zum hauseigenen SQL Server verstärkt. Die meisten änderungen in Jet-SQL dienten demselben Ziel.
Sie sollten den SQL-Dialekt von Access näher an den ANSI 92-Standard heranführen und vor allem kompatibler mit dem SQL Server machen. Microsoft wollte damit in erster Linie den Umstieg oder das spätere Upsizing auf ein SQL Server-Backend erleichtern.
Aus diesem Grund und wohl auch, weil Microsoft damals die Verwendung von ADO vorantreiben wollte, lassen sich viele der Neuerungen nur über den OLE-DB-Provider und ADO aufrufen, nicht über DAO oder im Abfrageentwurfsfenster von Access.
Dennoch können sie natürlich auch in reinen Access/Jet-Applikationen verwendet werden. Sie brauchen zur Ausführung des SQL-Statements immer dann einen Verweis auf die ADO-Bibliothek, wenn es sich auf eine andere als die aktuelle Datenbank bezieht, um ein neues Connection-Objekt instanzieren zu können.
Dazu aktivieren Sie in der VBE unter Extras/Verweise den Eintrag Microsoft ActiveX Data Objects 2.x Library. Das x kann sich je nach installierter Access- oder MDAC-Version unterscheiden, spielt hier aber keine Rolle. Der Code für die Ausführung des SQL-Statements sieht dann zum Beispiel so aus:
Dim cnn As New ADODB.Connection Dim strSQL As String 'für die aktuelle Datenbank 'Set cnn = Application.CurrentProject.Connection 'für eine andere Datenbank cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=C:\Pfad\MeineExterne.mdb;" strSQL = "HierDasSQLStatement" cnn.Execute strSQL cnn.Close Set cnn = Nothing
ALTER COLUMN
Der wichtigste neue Befehl in Jet 4, der inzwischen auch die größte Bekanntheit erlangt hat, ist ALTER COLUMN. Ich erwähne ihn hier, weil ich durchaus noch oft DAO-Code sehe, der Tabellenfelder ändert, und sich durch einen einfachen und effizienten ALTER COLUMN-Befehl ersetzen lässt. Es geht dabei meist um die änderung des Datentyps eines Feldes oder um die änderung der Feldgröße.
Bis Access 97 musste man dazu per DAO-Code das alte Feld umbenennen, ein neues mit dem gewünschten Datentyp oder der gewünschten Feldgröße erzeugen, die Daten in das neue Feld übernehmen und abschließend das alte Feld löschen.
Ab Access 2000 geht das alles mit einem schlichten SQL-Befehl. Folgendes Code-Beispiel ändert die Feldgröße eines Textfeldes in einer Tabelle der aktuellen Datenbank auf 100 (in einer Zeile):
Currentdb.Execute "ALTER TABLE Tabelle ALTER COLUMN Feld VARCHAR(100)"
Bei der üblichen Backend/Frontend-Aufteilung muss das Execute natürlich in der externen Backend-Datenbank ausgeführt werden. Der Code im Frontend lautet dann:
Dim db As DAO.Database Set db = DBEngine.Workspaces(0).OpenDatabase("c:\Pfad\Andere.mdb") db.Execute "ALTER TABLE Tabelle " _
& "ALTER COLUMN Feld VARCHAR(100)"
ALTER COLUMN funktioniert also mit DAO. Sie können auch den bloßen SQL-Befehl in die SQL-Ansicht einer Abfrage schreiben, also (in einer Zeile)
ALTER TABLE Tabelle ALTER COLUMN Feld
VARCHAR(100)
dort ausführen und auch als DDL-Abfrage (Data Definition Language) zur späteren Verwendung speichern.
Autowerte
In der Theorie sollten Autowerte nur für Mechanismen verwendet werden, die der Anwender nie zu sehen bekommt – vor allem als Primärschlüssel von Tabellen, wenn sich keine anderen Felder dafür anbieten. Für sichtbare Zählungen sollte man hingegen selbst verwaltete Zahlenfelder verwenden. Daher sollte der konkrete Wert eines Autowertfeldes eigentlich nie eine Rolle spielen. In der Praxis jedoch verwenden viele Anwender Autowertfelder als sichtbaren Zähler.
Erfahrene Entwickler verwenden Autowertfelder zwar meistens richtig. Oft möchten sie aber einen bestimmten Startwert für Tests einstellen oder bei der Erstinstallation beim Kunden den Autowert wieder mit 0 beginnen lassen – etwa, um später auf den ersten Blick zu sehen, ob sich in einer Tabelle viel tut.
Bis zum Service Pack 4 von Jet 4 konnte man alle Autowerte durch einfaches Komprimieren der Datenbank auf den niedrigsten freien Wert zurücksetzen. Seit dem SP 4 funktioniert das nicht mehr.
Microsoft liefert dazu den KnowledgeBase-Artikel 287756, der einen umständlichen Workaround mit viel Code anbietet. Wesentlich einfacher ist das Einstellen des Startwertes per SQL:
ALTER TABLE Tabelle ALTER COLUMN MeinAutowertFeld COUNTER (1)
Damit beginnt der Autowert in der Tabelle wieder bei 1 zu zählen.
Neben dem Startwert lässt sich mit einem zweiten Parameter auch die Schrittweite des Feldes einstellen:
ALTER TABLE Tabelle ALTER COLUMN MeinAutowertFeld COUNTER (100,3)
Der nächste Autowert der Tabelle lautet 100, dann folgen 103, 106 und so weiter. Diese Option wird man in der Praxis wohl nur selten einsetzen.
Synonyme
Statt COUNTER wären für den Datentyp Autowert im vorigen Beispiel ebenso gut die Synonyme AUTOINCREMENT oder IDENTITY einsetzbar. Generell gibt es seit Jet 4 für jeden Datentyp mehrere Synonyme, von denen mindestens eines aus dem Sprachumfang von T-SQL stammt. Also wieder der Versuch, den Umstieg auf den Microsoft SQL Server zu erleichtern.
Bei diesen Synonymen wurde sogar mehr Wert auf diesen Aspekt gelegt als auf den ANSI SQL Standard. So gibt es beispielsweise für den Datentyp OLE-Objekt vier mögliche Varianten: OLEOBJECT, IMAGE, LONGBINARY, GENERAL. Sie können also zum Beispiel ein OLE-Objekt-Feld wie folgt zu einer Tabelle hinzufügen:
ALTER TABLE Tabelle ADD COLUMN NeuesFeld IMAGE
IMAGE ist T-SQL. Im ANSI Standard heißt der Typ hingegen BLOB.
Eine Auflistung der Synonyme samt Vergleich mit ANSI und T-SQL gibt es in allen Onlinehilfen ab Access 2000, Suchbegriff ANSI SQL-Datentypen. Manche der Synonyme sind nur per OLE DB/ADO einsetzbar.
Standardwerte
Bis Access 97 kann man Standardwerte für Tabellenfelder nur per DAO-Code einstellen. Ab Access 2000 gibt es das SQL-Schlüsselwort DEFAULT. Es ist nur per OLE DB/ADO einsetzbar.
Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...
den kompletten Artikel im PDF-Format mit Beispieldatenbank
diesen und alle anderen Artikel mit dem Jahresabo