Add in and find out

Bei jeder Access-Datenbank kommt irgendwann einmal ein Analysetool zum Einsatz. Doch es ist kaum praktikabel, ein Analysetool mit seinen Tabellen, Abfragen, Formularen, Berichten und Modulen jedes Mal in die zu untersuchende Datenbank hineinzukopieren. Ein Add-In hilft hier weiter.

Neben dem Problem, dass nicht zwei Datenbanken gleichzeitig sichtbar geöffnet sein können, müssen Sie beim Einsatz eines Analysetools darauf achten, dass nicht die mitgebrachten Analyseobjekte versehentlich auch analysiert werden – ganz abgesehen davon, dass gleichnamige Objekte beim Kopieren leicht überschrieben oder entscheidende Daten wie die Datenbankgröße verändert werden.

Zwei Datenbanken gleichzeitig

Sie müssen also von außen in die Datenbank hineinsehen. Und dafür ist ein Add-In optimal, denn der Benutzer kann jederzeit auf dessen Fähigkeiten zugreifen, während seine eigene Datenbank geöffnet ist.

Dabei unterscheidet sich eine Add-In-Datenbank erst einmal gar nicht von anderen Datenbanken. Es wird genauso ein Startformular vorhanden sein, welches alle Aufgaben erledigt oder weitere Formulare (oder Berichte) öffnet.

Mit der Beispieldatenbank AddIn.mdb soll die Größe der gesamten Datenbank, die Anzahl der Datensätze aller Tabellen und Abfragen sowie die Anzahl der Controls auf allen Formularen ermittelt werden. Das zeigt mit geringem technischem Aufwand alles Notwendige.

Erstellen Sie in AddIn.mdb eine neue Tabelle tblAnalyse mit dem AutoWert-Feld AID sowie den drei Textfeldern AName, AInhalt und AWert. Hierin werden die Analysedaten zwischengespeichert und anschließend vom Formular angezeigt.

Außerdem benötigen Sie noch ein leeres Formular frmStart ohne Datenbindung mit einem Label lblAnalyse und einer Listbox lstAnalyse. Die Listbox wird auf den Herkunftstyp:Wertliste und die Spaltenanzahl: 3 gestellt.

Die eigentliche Analyse findet beim EreignisForm_Load wie in Listing 1 statt.

Option Compare Database
Option Explicit
Private Sub Form_Load()
Dim dbsAddIn As Database
Dim rcsAddIn As Recordset
Dim dbsAnalyse As Database
Dim prjAnalyse As CurrentProject
Dim rcsAnalyse As Recordset
Dim frmAnalyse As Form
Dim strName As String
Dim intAnzahl As Integer
Dim i As Integer
Set dbsAddIn = CodeDb
Set rcsAddIn = dbsAddIn.OpenRecordset("tblAnalyse")
Set dbsAnalyse = CurrentDb
Set prjAnalyse = CurrentProject
On Error Resume Next
'vorherige Analyse-Daten löschen
dbsAddIn.Execute "DELETE * FROM tblAnalyse"
'Name der Datenbank ermitteln
Schreibe rcsAddIn, "Datenbank " & String(50, "_"), _
dbsAnalyse.Name, "dbs"
'Größe der Datenbank ermitteln
Schreibe rcsAddIn, "Größe ", _
Format(FileLen(dbsAnalyse.Name) / 1024, "#,## kB"), "dbs"
'Überschrift für die Tabellen
Schreibe rcsAddIn, "", "", ""
Schreibe rcsAddIn, dbsAnalyse.TableDefs.Count & _
" Tabellen " & String(50, "_"), String(50, "_"), "tbl"
'Anzahl Datensätze in Tabellen
intAnzahl = 0
For i = 0 To dbsAnalyse.TableDefs.Count - 1
strName = dbsAnalyse.TableDefs(i).Name
Set rcsAnalyse = dbsAnalyse.OpenRecordset(strName)
Schreibe rcsAddIn, strName, rcsAnalyse.RecordCount & _
" Datensätze", "tbl"
intAnzahl = intAnzahl + 1
Next
'Überchrift für die Abfragen
Schreibe rcsAddIn, "", "", ""
Schreibe rcsAddIn, dbsAnalyse.QueryDefs.Count & _
" Abfragen " & String(50, "_"), String(50, "_"), "qry"
'Anzahl Datensätze in Abfragen
For i = 0 To dbsAnalyse.QueryDefs.Count - 1
strName = dbsAnalyse.QueryDefs(i).Name
Set rcsAnalyse = dbsAnalyse.OpenRecordset(strName)
'Abfragen müssen wenigstens einmal bis zum Ende gehen:
If Not rcsAnalyse.EOF Then rcsAnalyse.MoveLast
Schreibe rcsAddIn, strName, rcsAnalyse.RecordCount & _
" Datensätze", "qry"
intAnzahl = intAnzahl + 1
Next
'Überschrift für Formulare
Schreibe rcsAddIn, "", "", ""
Schreibe rcsAddIn, prjAnalyse.AllForms.Count & " Formulare " & _
String(50, "_"), String(50, "_"), "frm"
'Anzahl Kontroll-Elemente in Formularen
For i = 0 To prjAnalyse.AllForms.Count - 1
strName = prjAnalyse.AllForms(i).Name
'nicht sich selber in Entwurf umschalten!
If strName <> "frmStart" Then
DoCmd.OpenForm strName, acDesign
Set frmAnalyse = Forms(strName)
Schreibe rcsAddIn, strName, frmAnalyse.Controls.Count & _
" Kontroll-Elemente", "frm"
intAnzahl = intAnzahl + 1
DoCmd.Close acForm, strName
Else
Schreibe rcsAddIn, strName, "<nicht ermittelbar>", "frm"
intAnzahl = intAnzahl + 1
End If
Next
'Listbox aktualisieren
Me.lstInhalte.Requery
Me.lblInhalte.Caption = intAnzahl & " Analysen"
End Sub
Private Sub Schreibe(RS As Recordset, strName As String, _
strInhalt As String, strTyp As String)
With RS
.AddNew
.Fields("AName").Value = strName
.Fields("AInhalt").Value = strInhalt
.Fields("ATyp").Value = strTyp
.Update
End With
End Sub