Gruppierung mit Seitenzahl

Das Anzeigen der Seitenzahl und der Gesamtzahl der Seiten eines Berichts ist kein Hexenwerk. Viel komplizierter wird es, wenn Sie einzelne Gruppierungen innerhalb eines Berichts mit Seitenzahlen versehen möchten – und noch anspruchsvoller ist das Ermitteln der Gesamtseitenzahl der Gruppierung. Access im Unternehmen zeigt, wie das funktioniert.

Ein gutes Beispiel für den Einsatz einer Seitennummerierung gruppierter Daten ist das Kassenbuch aus dem gleichnamigen Artikel mit dem Shortlink 486. Dort zeigt ein Bericht nach Konten getrennt alle Buchungen an und beginnt jeweils eine neue Seite für jedes Konto. Konten können natürlich mehr Einträge enthalten, als auf eine Seite passen. Damit der Leser direkt weiß, dass die aktuelle Seite nicht die letzte Seite für das aktuelle Konto ist, sollten Sie ihn durch die Angabe der Seitenzahl darauf hinweisen – am besten sogar noch durch die passende Gesamtzahl der Seiten dieses Kontos.

So sollen Gruppierungen, die auf nur einer Seite Platz finden, etwa den Eintrag “Seite 1/1” erhalten, während andere mit mehreren Seiten beispielsweise mit “Seite 2/3” versehen werden (siehe Bild 1).

abb001.tif

Bild 1: Berichte mit Seitenzahlen für die Seiten der enthaltenen Gruppierungen

Page und Pages

Bezogen auf einen kompletten Bericht ist das einfach. Hier reicht die Angabe des folgenden Ausdrucks für die Eigenschaft Steuerelementinhalt eines Textfelds:

="Seite " & [Seite] & "/" & [Seiten]

Die Funktionen Seite und Seiten (unter VBA Page und Pages) lassen sich allerdings von vorhandenen Gruppierungen wenig beeindrucken. Da müssen härtere Geschütze ran – zum Beispiel eine passende VBA-Funktion, die beim Formatieren des jeweiligen Gruppierungsbereichs aufgerufen wird.

Beim Formatieren

Die einzelnen Berichtsbereiche lösen jeweils das Ereignis Beim Formatieren aus – und das je nach der aktuellen Konfiguration einmal oder mehrmals.

Um Gruppierungen mit eigenen Seitenzahlen zu versehen, reicht diese Erkenntnis jedoch nicht aus. Das Wissen, wie die VBA-Funktionen Page und Pages eines Berichts arbeiten, hilft da schon eher weiter – gemixt mit einer weiteren Zutat: Und die lautet, dass Access beim Anzeigen von Berichten nur so viele Seiten im Voraus rendert, wie unbedingt nötig. Sprich: Wenn ein Bericht einfach nur ein paar Datensätze im Detailbereich anzeigen soll, wird auch zunächst nur die erste Seite aufbereitet. Erst beim Blättern zur zweiten Seite stellt Access deren Inhalt zusammen.

Wenn man das auf das Ziel dieses Beitrags ummünzt, nämlich das Nummerieren der Seiten einer Gruppierung und die Angabe der gesamten Seitenzahl dieses Bereichs, dann könnte man zumindest schon einmal die aktuelle Seite einer Gruppierung ausgeben – und zwar, indem man prüft, ob eine Seite die erste Seite einer Gruppierung ist oder eine der folgenden Seiten.

In Access-Berichten gruppiert man Daten nach einem bestimmten Wert der Datenherkunft, im Beispiel ist dies das Feld KontoID. Der Inhalt dieses Feldes ist das Kriterium, dass die Datensätze einer Gruppierung und damit auch der Seiten, auf denen diese ausgegeben werden, vereint. Um herauszufinden, ob eine Seite die erste Seite einer Gruppierung ist, vergleichen Sie einfach den Inhalt des Feldes KontoID mit dem passenden Wert der vorherigen Seite. Ist dieser nicht gleich, ist die Seite die erste Seite, sonst eine der folgenden Seiten.

Im Ereignis Beim Formatieren eines Gruppierungsbereichs erlaubt Access allerdings ausschließlich Zugriff auf den ersten Datensatz der Gruppierung, nicht auf Daten der vorherigen und schon gar nicht auf die Daten der folgenden Seiten.

Also speichern Sie den die aktuelle Gruppe charakterisierenden Wert in einer Variablen zwischen. Die Variable deklarieren Sie modulweit im Klassenmodul des Berichts:

Dim lngKonto As Long

Außerdem brauchen Sie noch eine Variable, in der Sie die aktuelle Seite des gruppierten Bereichs speichern:

Dim intSeiteGruppe As Integer

Die Routine, die durch das Ereignis Beim Formatieren ausgelöst wird, sieht schließlich wie in Listing 1 aus und funktioniert wie folgt:

Listing 1: Anzeigen der Seite einer Gruppierung in einem Textfeld

Private Sub Gruppenkopf0_Format(Cancel As Integer, FormatCount As Integer)
     If lngKonto = Me!KontoID Then
         intSeiteGruppe = intSeiteGruppe + 1
     Else
         intSeiteGruppe = 1
     End If
     Me!txtSeitenGruppe = "Seite " & intSeiteGruppe
     lngKonto = Me!KontoID
End Sub

Beim ersten Aufruf, also der ersten Seite des Berichts überhaupt, hat lngKonto logischerweise noch den Wert 0. Dementsprechend legt die Routine den Wert 1 als intSeiteGruppe fest, der auch in dem im Gruppenkopf befindlichen Textfeld txtSeitenGruppe angezeigt wird. Das Gleiche passiert auch jedesmal, wenn die Routine auf die erste Seite einer Gruppierung stößt.

Wenn die aktuelle Seite nicht die erste Seite einer Gruppierung ist, liefert der Ausdruck lngKonto = Me!KontoID den Wert True und die Routine erhöht den in intSeiteGruppe gespeicherten Wert für die Seitenzahl um 1 und das Textfeld txtSeitenGruppe gibt den ermittelten Wert aus.

Gesamtseiten einer Gruppe

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