Tipps und Tricks 6/2006

Berichte und Reporting

Wie seinen Rechner, sein Auto oder das Design seiner Internetseite wird man gelegentlich auch mal das Aussehen seines Briefkopfes leid und tauscht diesen kurzerhand aus. Kurzerhand Nicht wirklich: Wenn Sie etwa mehrere Access-Anwendungen anpassen müssen, die wiederum mehrere Berichte mit Ihrem Briefkopf enthalten, wartet eine Menge Handarbeit auf Sie.

Dabei geht es doch viel leichter: Erstellen Sie doch einfach einen Unterbericht mit dem Briefkopf und fügen Sie diesen in alle anderen Berichte, die einen Briefkopf benötigen, ein. Damit brauchen Sie änderungen nur noch an einer Stelle vorzunehmen. Selbst wenn Sie mehrere Anwendungen haben, die Berichte mit einem Briefkopf enthalten, ist die Aufgabe schnell erledigt, denn Sie müssen ja nur den angepassten Bericht mit dem Briefkopf in alle relevanten Access-Datenbanken kopieren.

Und so funktioniert es: Legen Sie einen Bericht an und platzieren Sie darin die Elemente Ihres Briefkopfes. Entfernen Sie die Berichtskopfelemente aus einem vorhandenen Bericht. Fügen Sie dann den Bericht mit dem Briefkopf in den Zielbericht ein – das geht am einfachsten, wenn Sie den Zielbericht in der Entwurfsansicht öffnen und den einzufügenden Bericht aus dem Datenbankfenster an die gewünschte Stelle des Zielberichts ziehen.

VBA und Programmiertechnik

Wer keine Arbeit hat, der macht sich welche. Zum Beispiel, indem er funktionierende Codepassagen aus einer Routine in eine andere Routine kopiert. Funktioniert per Copy and Paste und liefert auch funktionell das gewünschte Ergebnis.

Manchmal programmiert man auch unbewusst an zwei Stellen innerhalb des gleichen Moduls oder zumindest innerhalb der gleichen Anwendung Codezeilen, die entweder völlig identisch sind oder zumindest genau die gleiche Funktion haben. Stehen dann einmal änderungen innerhalb dieser Code-Dubletten an, hat man direkt die doppelte (oder x-fache) Arbeit: Jede änderung müssen Sie an mehreren Stellen durchführen, damit alles wieder wie gewünscht funktioniert. Dabei lassen sich solche Probleme ganz einfach lösen: “Klammern” Sie den doppelten Code einfach aus, indem Sie ihn in einer eigenen Routine anlegen und von den ursprünglichen Routinen darauf verweisen. Im einfachsten Fall funktioniert das nach dem folgenden Schema: Nehmen wir an, dass Sie bei bestimmten Aktionen eine Reihe von Steuerelementen in einem Formular aktivieren oder deaktivieren möchten und dass a im ganzen Modul bekannt ist:

Private Form_Load()
     If a Then
         Me!txt1.Enabled = True
         Me!txt2.Enabled = True
         Me!txt3.Enabled = True
     Else
         Me!txt1.Enabled = False
         Me!txt2.Enabled = False
         Me!txt3.Enabled = False
     End If
     ...
End Sub
Private cmdBeispiel_Click()
     If a Then
         Me!txt1.Enabled = True
         ...
End Sub

Wenn Sie dies nun bei verschiedenen Gelegenheiten tun – etwa beim öffnen des Formulars, beim Anzeigen eines neuen Datensatzes oder beim Klick auf eine bestimmte Schaltfläche – haben Sie den gleichen Code an mehreren Stellen stehen. Kommt nun noch ein weiteres Steuerelement hinzu, müssen Sie den Code an mehreren Stellen anpassen. Stattdessen erstellen Sie eine neue Funktion mit einem sinnvollen Namen, etwa SteuerelementeAnpassen.

Private Sub SteuerelementeAnpassen
     If a Then
         Me!txt1.Enabled = True
         Me!txt2.Enabled = True
         Me!txt3.Enabled = True
     Else
         Me!txt1.Enabled = False
         Me!txt2.Enabled = False
         Me!txt3.Enabled = False
     End If
End Sub

Ersetzen Sie dann diese “extrahierten” Zeilen an allen betroffenen Stellen durch einen einfachen Aufruf der neuen Routine SteuerelementeAnpassen, etwa so:

Private Form_Load()
     SteuerelementeAnpassen
     ...
End Sub
Private cmdBeispiel_Click()
     SteuerelementeAnpassen
     ...
End Sub

Nun können Steuerelemente hinzukommen oder wegfallen, wie sie wollen, die Anpassung müssen Sie immer nur an einer Stelle vornehmen.

Etwas komplizierter wird die Angelegenheit, wenn Variablen ins Spiel kommen. Dazu können wir wiederum die Ausgangsposition des ersten Beispiels verwenden – mit dem kleinen Unterschied, dass wir davon ausgehen, dass a nur innerhalb der einzelnen Routinen bekannt ist.

Dann müsste man a mit einem Parameter übergeben, was bei der neuen extrahierten Routine wie folgt aussähe:

Private Sub SteuerelementeAnpassen(a As Boolean)
     If a Then
         Me!txt1.Enabled = True
         Me!txt2.Enabled = True
         Me!txt3.Enabled = True
     Else
         Me!txt1.Enabled = False
         Me!txt2.Enabled = False
         Me!txt3.Enabled = False
     End If
End Sub

Der Aufruf in den Ausgangsroutinen sieht dann wie folgt aus:

Private Form_Load()
     SteuerelementeAnpassen a
     ...
End Sub
Private cmdBeispiel_Click()
     SteuerelementeAnpassen a
     ...
End Sub

Noch komplizierter wird es, wenn die zu extrahierenden Zeilen ein Ergebnis liefern, das in den Folgezeilen weiter verwendet wird. Als Beispiel dient die folgende Routine, die nacheinander die Anführungszeichen und die Hochkommata aus einem String entfernt:

Private Sub Ausgangsroutine1
     Dim strAlt As String
     Dim strNeu As String
     ...
     strNeu = Replace(strAlt, Chr(34), Chr(34) & Chr(34))
     strNeu = Replace(strNeu, Chr(39), Chr(39) & Chr(39))
     ... 
End Sub

Die neu zu erstellende Routine muss nicht nur eine Variable in Empfang nehmen, sondern auch noch einen Wert zurückliefern:

Private Function ZeichenErsetzen(strOriginal As String) As String
     Dim strTemp As String
     strTemp = Replace(strOriginal, Chr(34), Chr(34) & Chr(34))
     strTemp = Replace(strTemp, Chr(39), Chr(39) & Chr(39))
     ZeichenErsetzen = strTemp
End Function

Der Ersatz für die Zeilen in der Ursprungsroutine sieht dann so aus:

Private Sub Ausgangsroutine1
     Dim strAlt As String
     Dim strNeu As String
     ...
     strNeu = ZeichenErsetzen(strAlt)
     ... 
End Sub

Es gibt noch eine weitere Ausbaustufe, bei der mehr als ein Wert zurückgegeben wird – diesen behandeln wir aber an anderer Stelle. Die Beispieleliefern neben der möglichen Zeitersparnis noch einen weiteren großen Vorteil: Die ursprünglichen Routinen wirken wesentlich aufgeräumter. Dadurch, dass mehrere Zeilen mit teilweise schwer lesbaren Anweisungen einfach in eine weitere Routine ausquartiert wurden und einen aussagekräftigen Namen erhielten, ist der Code in der Ausgangsroutine nun sehr viel lesbarer geworden.

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

Schreibe einen Kommentar