André Minhorst, Duisburg
Wenn Sie Ihren Anwendern wahren Luxus gönnen möchten, spendieren Sie ihnen doch einfach mal die einfache Möglichkeit, einen Bericht nach eigenen Wünschen zu gruppieren, ohne sich gleich in Access einarbeiten zu müssen. Das brauchen Sie nicht, da Sie lieber zahllose unterschiedliche Berichte mit allen denkbaren Gruppierungs- und Sortierungskombinationen programmieren Und was passiert, wenn sich das Corporate Design Ihres Kunden einmal ändert Im vorliegenden Beitrag lernen Sie, wie Sie mit ein wenig VBA das Maximum aus einem einzigen Bericht herausholen können.
Der vorliegende Beitrag verwendet die in einem weiteren Beitrag dieser Ausgabe beschriebene Musterlösung Einnahmen-überschussrechnung mit Access als Beispieldatenbank. Dabei wird besonderes Augenmerk auf das Formular frmAuswertung und den Bericht rptAuswertungVBA gerichtet.
Hinweis
Sie finden die Beispieldatenbank in Versionen für Access 97 (Eü97.mdb), Access 2000 und höher (Eü2000.mdb) auf der beiliegenden Heft-CD.
Bevor Sie per VBA auf Berichtsbereiche oder darin enthaltene Steuerelemente zugreifen können, müssen Sie diese zunächst einmal mit Namen kennen. Dazu verwenden Sie die Prozedur aus Quellcode 1.
Die Prozedur gibt alle Section-Elemente des Berichtes mit dem angegebenen Namen aus. Die Ausgabe sieht beispielsweise wie in Bild 1 aus.
Mit der Kenntnis der Namen der einzelnen Bereiche eines Berichts können Sie beispielsweise einen Bereich ein- oder ausblenden. Wenn Sie dies zur Laufzeit tun möchten, benötigen Sie optimalerweise ein Formular, das alle Berichtsbereiche anzeigt und Steuerelemente zum Einstellen der gewünschten Eigenschaften bereitstellt.
Eine weitere interessante Information ist die Gruppierungsebene. Diese und weitere Informationen erhalten Sie mit der Prozedur aus Quellcode 2. Achten Sie bei ihrer Verwendung darauf, dass der gewünschte Bericht auch geöffnet ist.
Bild 1: Ausgabe der Bereiche eines Berichts
Obwohl das Einrichten von Gruppierungen über den herkömmlichen Weg nicht besonders kompliziert ist, erfordert es doch ein gewisses Maß an Know-how. Das können Sie von den Endanwendern Ihrer Datenbank natürlich nicht erwarten, sofern diese nicht über Access-Kenntnisse verfügen. Um die Anwender dennoch zufrieden zu stellen, haben Sie zwei Möglichkeiten:
Public Function BerichtsbereicheAusgeben(Bericht As _ String) On Error Resume Next Dim i As Integer i = 0 Do While Err.Number = 0 Debug.Print i, Reports(Bericht).Section(i).Name i = i + 1 Loop End Function
Quellcode 1
Public Sub GruppierungsinformationenAusgeben _ (Berichtsname As String) On Error Resume Next Dim i As Integer Dim rpt As Report Set rpt = Reports(Berichtsname) i = 0 Do While Not Err.Number > 0 Debug.Print i, _ rpt.GroupLevel(i).ControlSource, _ rpt.GroupLevel(i).GroupFooter, _ rpt.GroupLevel(i).GroupHeader i = i + 1 Loop End Sub
Quellcode 2
Da die erste Variante eher konventionell ist, lernen Sie hier die zweite Methode kennen. Dazu erstellen Sie zunächst ein Formular, mit dem Sie den Zeitraum sowie die Gruppierungen auswählen können.
Das Formular hat zwei Funktionen. Es dient der Auswahl eines Zeitraums für die auszugebenden Geschäftsvorfälle sowie der Festlegung von Gruppierungsoptionen.
Das Formular soll wie in Bild 2 aussehen. Der obere Bereich dient zum Festlegen des anzuzeigenden Zeitraums. Im unteren Bereich kann festgelegt werden, nach welchen Kriterien überhaupt gruppiert werden soll und in welcher Reihenfolge. Für das Gruppierungskriterium kann außerdem das Gruppierungsintervall festgelegt werden.
Die beiden Schaltflächen mit den Pfeilen dienen dem Vertauschen der Reihenfolge der Gruppierungskriterien. Man hätte auch einfach ein Textfeld zum Eintragen von Zahlen zur Angabe der Reihenfolge verwenden können, aber das Auge isst schließlich auch mit.
Wenn Sie mehr als zwei unterschiedliche Gruppierungen verwenden möchten, wird die Programmierung natürlich etwas aufwändiger.
Für weitere Informationen sehen Sie sich den Entwurf des Formulars und die darin verwendeten Prozeduren an.
Auswertung des Formulars
Die Einstellung des gewünschten Zeitraums im Bericht erfolgt über die Zuweisung einer entsprechenden WhereCondition beim Aufruf des Formulars.
Bild 2: Berichtsoptionen einstellen per Formular
Wesentlich interessanter ist die Einstellung der Gruppierungen anhand der im Formular festgelegten Informationen.
Bild 3: Der Bericht rptAuswertung_Rohfassung in der Entwurfsansicht
Der vorliegende Bericht rptAuswertungVBA soll zwischen null und zwei Gruppierungsebenen aufweisen, die mit dem im vorherigen Kapitel beschriebenen Formular festgelegt werden.
Es gibt zwei Möglichkeiten, einen Bericht dynamisch zu gruppieren:
Die erste Möglichkeit ist sehr viel programmieraufwändiger als die zweite. Jedes Steuerelement muss zentimetergenau eingesetzt werden und der Zeitaufwand für die Anpassung des Berichtes zur Laufzeit ist im Vergleich zur zweiten Lösung sehr hoch. Der wichtigste Punkt aber ist, dass der Bericht definitiv in der Entwurfsansicht geöffnet werden muss. Das ist aber beispielsweise in einer .mde-Datenbank nicht möglich. Daher wird nachfolgend die zweite Variante beschrieben.