Es gibt verschiedene Wege und auch interessante Aspekte wenn es darum geht, Access-Datenbanken zu komprimieren. Einige möchte ich hier vorstellen:
Access-Datenbanken werden während der Arbeit größer und größer, sie blähen sich auf. Dies passiert auch, wenn Daten oder Objekte gelöscht werden. Dieser Effekt hängt damit zusammen wie Access intern Daten und Objekte verwaltet. Wenn Sie ein neues Objekt, z.B. eine Tabelle, erstellen, wird diese von Access gespeichert. Wenn Sie Datensätze eingegeben, werden diese ebenfalls von Access gespeichert. Wenn Sie ein Objekt, z.B. eine Tabelle, löschen oder wenn Sie Datensätze löschen, dann werden diese nicht von Access gelöscht. Access markiert diese nur intern als gelöscht. Physikalisch sind die Daten und Objekte immer noch vorhanden, sie werden nur nicht mehr angezeigt. Um sich endgültig von den als gelöscht markierten Daten und Objekten zu trennen müssen Sie die Datenbank komprimieren. Dabei werden die als gelöscht markierten Objekte und Daten auch physikalisch gelöscht. Der verwendete Speicherplatz wird wieder freigegeben und die Daten werden neu geordnet. Auf diese Weise schrumpft die Datenbankgröße wieder auf das erforderlich Mass. Über den Menüpunkt "Extras" / "Datenbank-Dienstprogramme" / "Datenbank komprimieren und reparieren..." wird die aktuell geöffnete Datenbank komprimiert. |
Die Option "Beim Schließen komprimieren" |
Seit der Version Access 2000 kann in den Optionen einer Datenbank eingestellt werden, dass diese beim Schliessen automatisch komprimiert wird. Dies führt zu einer Art "Selbstwartung" der Datenbank. Bei jedem Schliessen wird die Datenbank automatisch komprimiert. Alle als gelöscht markierte Daten und Objekte werden endgültig gelöscht. Die Datenbankgröße sinkt auf das erforderliche Mass. Die Option findet sich unter "Extras" / "Optionen" auf der Registerkarte "Allgemein". Die Option wird sofort wirksam, d. h. direkt beim Schliessen der Datenbank. Übrigens: Wenn die Datenbank durch ein Datenbank-Passwort geschützt ist, dann muss dieses nach dem Schliessen (und komprimieren) der Datenbank erneut eingegeben werden. Sonst wird die komprimierte Datenbank nicht gespeichert. |
AutoCompact per VBA einstellen |
Die Option "Beim Schliessen komprimieren" kann nicht nur über das Menü eingestellt werden. Die Änderung ist auch per VBA möglich. Dazu reicht die folgende Zeile Code:
Application.SetOption "Auto Compact", True Mit dem Parameter "True" wird die Option eingeschaltet, mit "False" wird sie ausgeschaltet.In alten Artikel in den Newsgroups findet man immer wieder Hinweise auf die Option "Auto Compact Percentage". Application.SetOption "Auto Compact Percentage", 20 Auch in der Online-Hilfe von Access 2000 wird diese Option genannt. Diese Option soll festlegen, dass die Datenbank beim Schliessen nur dann komprimiert wird, wenn die Datenbankgröße dabei um mindestens x % abnimmt. Leider funktioniert diese Option nicht. (Siehe auch MS Knowledge Base) |
Verschiedene Strategien für AutoCompact |
Die Nutzung der AutoCompact-Option führt dazu, dass die Datenbank bei jedem Schliessen komprimiert wird. Dies ist für den Anwender lästig und bringt keinen großen Mehrwert. Um die Datenbank trotzdem regelmäßig automatisch beim Schliessen zu komprimieren sind folgenden Strategien möglich:
|
Die DBEngine-Methode |
Eine nicht geöffnete Datenbank kann per VBA über die CompactDatabase-Methode des DBEngine-Objekts komprimiert werden:
Public Function fCompactJet(ByVal strDB As String, Leider werden nur die Objekte, die von der Jet-Engine verwaltet werden, berücksichtigt. Dies sind Tabellen, Abfragen und StoredProcedures. Die anderen Objekte kennt Jet nicht und kann Sie deswegen auch nicht komprimieren. |
PrivDBEngine bei geschützten DB's |
Die CompactDatabase-Methode des DBEngine-Objekts kann nur funktionieren, wenn die zu komprimierende Datenbank mit der selben MDW-Datei geschützt ist, mit der auch die bestehende Access-Instanz geöffnet wurde. Wenn die Datenbank mit einer anderen MDW-Datei geschützt ist, hilft die >PrivDBEngine<:
Public Function fCompactPrivDbEngine(ByVal strDB As String, _ Auch diese Fehlerbehandlungsroutine könnte noch ausgebaut werden. Für die PrivDBEngine gelten die selben Anmerkungen wie für die CompactDatabase-Methode. |
Der Windows Scripting Host |
Eine Lösung des Problems, dass Access mit der CompactDatabase-Methode nur Tabellen aber nicht die restlichen Objekte komprimiert, ist es Access mit dem Kommandozeilenparameter "/COMPACT" aufzurufen. Hierbei kann der WSH helfen:
Public Function fCompactWSH(ByVal strDB As String) As Boolean Die Fehlerbehandlungsroutine könnte natürlich noch ausgebaut werden.'Fehlerbehandlung definieren On Error GoTo Err_fCompactWSH 'Variablen deklarieren Dim strAccPfad As String Dim strShell As String Dim oWSH As Object 'Initialisieren fCompactWSH = False Set oWSH = CreateObject("WScript.Shell") 'String für Shell strAccPfad = """" & Application.SysCmd(acSysCmdAccessDir) strShell = strAccPfad & "msaccess.exe"" """ & strDB & """ /COMPACT" 'Komprimieren oWSH.Run strShell, 0, True 'Fertig fCompactWSH = True 'Ende Exit_fCompactWSH: On Error Resume Next Exit Function 'Fehlerbehandlung Err_fCompactWSH: MsgBox Err.Description, vbCritical, Err.Number Resume Exit_fCompactWSH End Function |
Der "geheime" SysCmd-Befehl |
Ein ähnliches Vorgehen ergibt sich, wenn man den "geheimen" SysCmd-Befehl verwendet:
Public Function fCompactSys(strDB As String) As Boolean
'Fehlerbehandlung definieren On Error GoTo Err_fCompactSys 'Variablen deklarieren Dim appAcc As Access.Application Dim strTemp As String 'Initialisieren fCompactSys= False Set appAcc = New Access.Application strTemp = strDB & ".temp.mdb" 'Komprimieren appAcc.SysCmd 602, strDB, strTemp Kill strDB Name strTemp As strDB 'Fertig fCompactSys= True 'Ende Exit_fCompactSys: On Error Resume Next Set appAcc = Nothing Exit Function 'Fehlerbehandlung Err_fCompactSys: MsgBox Err.Description, vbCritical, Err.Number Resume Exit_fCompactSys End Function Auch diese Fehlerbehandlungsroutine könnte noch ausgebaut werden. Der SysCmd-Befehl ist zwar bekannt, er ist jedoch von MS nicht dokumentiert. Das bedeutet, dass die Benutzung auf eigene Gefahr hin erfolgt. Bei meinen Test habe ich festgestellt, dass der Befehl unter Acc 2000 und unter Acc 2002 nicht funktioniert. |
Menüpunkte fernsteuern |
Basierend auf einem Hinweis aus der FAQ von Karl Donaubauer kann man das Komprimieren auch über einen Menübefehl ausführen:
Public Function fCompactMenu(strDB As String) As Boolean
'Fehlerbehandlung definieren On Error GoTo Err_fCompactMenu 'Variablen deklarieren Dim appAcc As Access.Application 'Initialisieren fCompactMenu = False Set appAcc = New Access.Application appAcc.OpenCurrentDatabase strDB 'Komprimieren appAcc.CommandBars("Menu Bar"). _ Controls("Extras"). _ Controls("Datenbank-Dienstprogramme"). _ Controls("Datenbank komprimieren und reparieren..."). _ accDoDefaultAction 'Fertig appAcc.Quit fCompactMenu = True 'Ende Exit_fCompactMenu: On Error Resume Next Set appAcc = Nothing Exit Function 'Fehlerbehandlung Err_fCompactMenu: MsgBox Err.Description, vbCritical, Err.Number Resume Exit_fCompactMenu: End Function Auch diese Fehlerbehandlungsroutine könnte noch ausgebaut werden. Bei dieser Variante wird beim öffnen der Datenbank ggfs. ein vorhandenes AutoExec-Makro gestartet. Wie man dieses durch programmatisches drücken der Shift-Taste verhindert zeigt Dev Ashish. (API: Bypassing Autoexec) |
Ergänzende Informationen und Links |
Artikel aus der KnowledgeBase: ACC2000: Auto Compact Percentage String in SetOption Does Not Function as Expected FAQ von Karl Donaubauer: Compactor von Dev Ashish: AutoExec umgehen: |