Neben den verschiedenen Bereichen und Steuerelementen liefern Berichte auch eine Reihe von Ereigniseigenschaften, für die Sie wie bei Formularen Ereignisprozeduren hinterlegen können. Eines dieser Ereignisse wird beim öffnen des Berichts ausgelöst. Es ist eine gute Gelegenheit, verschiedene Dinge zu prüfen und darauf zu reagieren. Beispiele sind das Auswerten von öffnungsargumenten oder das Abbrechen des öffnungsvorgangs.
Beispiele für den Einsatz der Berichts- und Bereichsereignisse in der Seitenansicht
Die Berichtsereignisse lassen sich teilweise für recht spezielle Aktionen einsetzen. In diesem und weiteren Beiträgen finden Sie einige Beispiele, damit Sie ein Gefühl für das richtige Einsetzen der Berichtsereignisse erhalten.
Beim öffnen: Auswertung von öffnungsargumenten
Der richtige Zeitpunkt zum Auswerten eines öffnungsarguments ist das Ereignis Beim öffnen. Mit dem öffnungsargument der DoCmd.OpenReport-Anweisung lässt sich beispielsweise ein Parameter zum Filtern der Datensatzquelle übergeben.
Da dies aber relativ langweilig ist, finden Sie nachfolgend ein Beispiel, wie Sie die Gruppierung eines Be-richts beim öffnen verändern können. Voraussetzung ist der Bericht rptGruppierungenTauschen, der wie in Bild 1 aufgebaut ist.
Bild 1: Bericht mit zwei Gruppierungen, die dynamisch getauscht werden sollen
Der Clou an diesem Bericht ist, dass Sie mit wenigen Zeilen Code die Gruppierungsebenen vertauschen können. Dazu sind folgende, in der Abbildung nicht sichtbare Ei-gen-schaf-ten einzustellen:
- Name des Beschriftungsfeldes im Berichtskopf: lblUeberschrift
- Name des LieferantID-Kopfbereichs: Gruppenkopf0
- Name des Beschriftungsfeldes im LieferantID-Kopfbereich: lblUeberschrift Grup-pie-rung0
- Name des Textfeldes im LieferantID-Kopfbereich: txtUeberschriftGruppierung0
- Name des KategorieID-Kopfbereichs: Gruppenkopf1
- Name des Beschriftungsfeldes im KategorieID-Kopfbereich: lblUeberschrift Grup-pie-rung0
- Name des Textfeldes im KategorieID-Kopfbereich: txtUeberschriftGruppierung1
Wie bringen Sie nun Dynamik ins Spiel Betrachten Sie den reinen Ablauf, so rufen Sie den Bericht auf und übergeben mit dem öffnungsargument Informationen über die im Bericht anzuzeigenden Daten. Das sieht etwa folgendermaßen aus (in einer Zeile):
DoCmd.OpenReport "rptGruppierungenTauschen", View:=acViewPreview, OpenArgs:="Artikel nach Kategorien und Lieferanten;KategorieID;LieferantID;Kategorie; Lieferant"
Das öffnungsargument enthält sogar mehrere Argumente, die durch Semikola voneinander getrennt sind. Das erste enthält den Text, der im Berichtskopf als überschrift angezeigt werden soll, das zweite und dritte enthalten die Beschriftungen der Bezeichnungsfelder in den beiden Gruppenköpfen und das vierte und fünfte die Felder der Datensatzquelle, nach denen gruppiert werden soll.
Bericht mit zwei Gruppierungsebenen
Fehlt noch eine Routine, die diese Informationen auseinandernimmt und den entsprechenden Eigenschaften zuweist. Diese wird – wer hätte es gedacht – durch das Beim öffnen-Ereignis des Berichts ausgelöst.
Diese Prozedur sortiert die Gruppierungen nach den Vorgaben im öffnungs-argu-ment.
Die Prozedur Report_Open zerlegt zunächst die im öffnungsargument übergebene Liste mit der Split-Funktion und speichert die einzelnen Elemente in einem Array namens str-Grup-pierungen (s. Listing 1).
Private Sub Report_Open(Cancel As Integer) Dim strOpenArgs As String Dim strGruppierungen() As String Dim i As Integer If IsNull(Me.OpenArgs) Then Exit Sub End If strGruppierungen() = Split(Me.OpenArgs, ";") Me!lblUeberschrift.Caption = strGruppierungen(0) For i = 1 To 2 Me("lblUeberschriftGruppierung" & i - 1).Caption = strGruppierungen(i + 2) Me.GroupLevel(i - 1).ControlSource = strGruppierungen(i) Next i End Sub
Listing 1: Auswertung der öffnungsargumente zum Einstellen der Gruppierung
Warum so umständlich und gleich fünf Parameter mit OpenArgs übergeben Die Rei-hen-folge der Gruppierungen wird doch in einem Formular festgelegt und da könnte man beim öffnen des Berichts die Einstellungen des Formulars auslesen und entsprechend reagieren.
Dagegen spricht allerdings folgender Grundsatz: Je weniger Abhängigkeiten zwischen zwei Objekten bestehen, desto besser. Und weniger Ab-hän-gig-keit, als alle notwendigen Informationen beim öffnen zu übergeben, ist fast nicht mög-lich.
Die folgende For…Next-Schleife wird genau zweimal durchlaufen – für jede Grup-pie-rung einmal. Die erste Anweisung weist zunächst dem Beschriftungsfeld der äußeren Grup-pie-rung die erste Gruppierungsbezeichnung zu – in diesem Fall Kategorie. Die zweite An-weisung legt das Feld fest, nach dem die äußere Gruppierung erfolgen soll – hier Ka-te-gorieID.
Das gleiche Spiel wiederholt die Schleife noch für die innere Gruppierung – fertig! Mit dem obigen DoCmd.OpenReport-Befehl erhalten Sie eine nach Kategorien und Lieferanten gruppierte Artikelliste.
Le-diglich die Angabe der aktuellen Kategorie beziehungsweise des aktuellen Lieferanten im Kopfbereich der Gruppierungen fehlt noch.
Dazu verwenden Sie die folgenden Pro-ze-duren und er-halten gleichzeitig ein gutes Anwendungsbeispiel für den Einsatz des Er-eignisses Beim Formatieren:
Private Sub Gruppenkopf1_Format(Cancel As Integer, _ FormatCount As Integer) Me!txtUeberschriftGruppierung1 = _ Me(Me.GroupLevel(1).ControlSource).Text End Sub Private Sub Gruppenkopf0_Format(Cancel As Integer, _ FormatCount As Integer) Me!txtUeberschriftGruppierung0 = _ Me(Me.GroupLevel(0).ControlSource).Text End Sub
Nun erstellen wir ein kleines Formular mit zwei Schaltflächen, welche den Bericht einmal mit der Gruppierungsreihenfolge LieferantID–KategorieID und einmal mit der Reihenfolge KategorieID–LieferantID öffnet.
Das Formular sieht in Aktion so aus wie in Bild 2. Hier tritt leider ein häufiger Fehler auf: Wir haben dem Bericht nicht explizit die beiden Felder hinzugefügt, nach denen die angezeigten Datensätze gruppiert werden sollen.
Bild 2: Formular zum Anzeigen von Berichten mit flexibler Gruppierungsreihenfolge
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