Home > Artikel > Ausgabe 6/2017 > Mehrere Datensätze pro Zeile im Bericht

Mehrere Datensätze pro Zeile im Bericht

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Mit Berichten kann man mehr anstellen, als dies bei Betrachtung der Entwurfsansicht und der Eigenschaften den Anschein macht. So können Sie mit Berichten auch durchaus mehrere Datensätze pro Zeile anzeigen, was durch reines Platzieren von Steuerelementen in den entsprechenden Bereichen allerdings nur in der mehrspaltigen Ansicht möglich ist. In diesem Artikel schauen wir uns die verschiedenen Möglichkeiten an.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1706_MehrereDatensaetzeProZeile.accdb.

Mehrspaltige Berichte

In diesem Beispiel wollen wir eine Reihe von Adressblöcken in einer mehrspaltigen Ansicht anlegen. Dazu verwenden wir die Tabelle tblKunden der Beispieldatenbank als Datenherkunft für die folgenden Beispielberichte. Der Bericht zur Darstellung der Kundendaten soll rptKundenadressen heißen und sieht im Entwurf wie in Bild 1 aus. Nachdem wir die Felder aus der Feldliste in den Bericht gezogen haben, sind noch folgende Schritte nötig, damit dieser in mehreren Zeilen angezeigt wird:

Einstellungen für einen mehrspaltigen Bericht

Bild 1: Einstellungen für einen mehrspaltigen Bericht

  • Wir stellen die Breite des Detailbereichs auf eine Breite ein, die maximal der Spaltenbreite einer Spalte entspricht. Wenn Sie dies nicht tun und die Breite des Detailbereichs multipliziert mit der Anzahl der gleich noch auszuwählenden Spalten ist größer als die gesamte Breite des Berichts, erhalten Sie die Meldung aus Bild 2.
  • Meldung, wenn die Summe der Spaltenbreiten die Breite des Berichts überschreitet

    Bild 2: Meldung, wenn die Summe der Spaltenbreiten die Breite des Berichts überschreitet

  • Öffnen des Dialogs Seite einrichten über den entsprechenden Ribbon-Befehl. Hier wechseln Sie zur Registerseite Spalten und stellen dort die Anzahl der Spalten mit der Eigenschaft Spaltenanzahl auf 3 ein. Unter Spaltenlayout behalten wir die Einstellung Quer, dann nach unten bei.

Damit der Bericht die Kunden nach dem Nachnamen sortiert ausgibt, haben wir diesem Bericht noch eine Sortierung nach dem Feld Nachname hinzufügt. Dies erledigen Sie durch einen Mausklick auf die Schaltfläche Sortierung hinzufügen unten im Access-Fenster. Hier wählen Sie dann die gewünschte Sortierung aus, in diesem Fall das Feld Nachname (siehe Bild 3).

Hinzufügen einer Gruppierung

Bild 3: Hinzufügen einer Gruppierung

Danach können wir einen ersten Versuch wagen und uns die Seitenansicht anschauen. Diese sieht wie in Bild 4 aus und zeigt zunächst abwechselnd weiß und grau hinterlegte Bereiche sowie eingerahmte Feldwerte. Dies ändern wir als Erstes:

Mehrspaltiger Bericht in der Seitenansicht

Bild 4: Mehrspaltiger Bericht in der Seitenansicht

  • Wechseln Sie in die Entwurfsansicht und markieren Sie alle gebundenen Felder im Detailbereich. Stellen Sie dann die Eigenschaft Rahmenart auf Transparent ein.
  • Anschließend markieren Sie den Detailbereich mit einem Mausklick auf den grauen Bereich mit der entsprechenden Beschriftung und stellen die Eigenschaft Alternative Hintergrundfarbe auf den gleichen Wert ein, der auch für die Eigenschaft Hintergrundfarbe eingestellt ist (siehe Bild 5).
  • Anpassen der Hintergrundfarbe

    Bild 5: Anpassen der Hintergrundfarbe

Wenn Sie nun erneut in die Seitenansicht wechseln, sieht das Bild schon besser aus (siehe Bild 6).

Bericht ohne Ränder und Textrahmen

Bild 6: Bericht ohne Ränder und Textrahmen

Die alternierenden Hintergrundfarben sind verschwunden und auch die Textrahmen sind ausgeblendet.

Anfangsbuchstabe als Zeilenüberschrift

Nun wollen wir den Bericht noch etwas hübscher machen und die ausgegebenen Adressblöcke nach dem Anfangsbuchstaben gruppieren.

Dazu passen wir zunächst die Datenherkunft des Berichts an. Die Abfrage sieht nun wie in Bild 7 aus.

Datenherkunft für den Bericht mit Gruppierung nach Anfangsbuchstaben

Bild 7: Datenherkunft für den Bericht mit Gruppierung nach Anfangsbuchstaben

Wir haben alle Felder der Tabelle tblKunden zum Abfrageentwurf hinzugefügt und noch ein weiteres Feld namens Anfangsbuchstabe. Dieses enthält den Ausdruck Links(Nachname;1) als Wert. Es liefert jeweils den Anfangsbuchstaben des Nachnamens des aktuellen Datensatzes.

Gruppierung hinzufügen

Dem Berichtsentwurf fügen wir nun neben der Sortierung im unteren Bereich noch eine Gruppierung hinzu, indem wir auf die Schaltfläche Gruppierung hinzufügen klicken. Die Gruppierung wird standardmäßig unter den bereits bestehenden Sortierungen und Gruppierungen angelegt, sodass wir diese noch mit der Nach oben-Schaltfläche um eine Position nach oben verschieben müssen. Die Gruppierung soll nach dem Inhalt des Feldes Anfangsbuchstabe erfolgen. Das Feld Anfangsbuchstabe fügen wir dem automatisch erstellten Gruppenkopfbereich für diese Gruppe hinzu (siehe Bild 8).

Einfügen einer neuen Gruppierung nach dem Anfangsbuchstaben

Bild 8: Einfügen einer neuen Gruppierung nach dem Anfangsbuchstaben

Der Wechsel in die Seitenansicht bremst uns ein wenig: Die Gruppenkopfbereiche werden nämlich auf die gleiche Breite gesetzt wie die mehrspaltig angezeigten Adressblöcke. Außerdem befinden sich die Anfangsbuchstaben auch nicht über den dazu gehörenden Adressblöcken, sondern daneben (siehe Bild 9). Um es gleich festzuhalten: Es gibt keine Möglichkeit, unsere gewünschte Darstellung zu erhalten, ohne VBA einzusetzen.

Die Gruppierung nach dem Anfangsbuchstaben ist etwas missglückt.

Bild 9: Die Gruppierung nach dem Anfangsbuchstaben ist etwas missglückt.

Alternative mit VBA

Zu der hier erreichten Darstellungsart gibt es neben den Einstellungen für die Spaltenanzahl noch eine weitere Möglichkeit. Diese verwendet VBA, um anzugeben, ob ein Datensatz noch in der aktuellen Zeile gedruckt oder in die folgende Zeile verschoben werden soll. Die Grundlagen hierzu finden Sie im Artikel Zeilenvorschub in Berichten steuern.

Von dort haben wir den Großteil der folgenden Prozeduren. Zunächst deklarieren wir zwei Variablen. Die erste nimmt die aktuelle Spalte auf, die zweite die Breite einer Spalte:

Dim intSpalte As Integer

Dim intWidth As Integer

Die Breite der Spalte ermitteln wir aus der Breite des Feldes Anrede plus 100 als Abstand zwischen zwei Spalten:

Private Sub Report_Load()

intWidth = Me.Anrede.Width + 100

End Sub

Danach übernehmen wir die Prozedur aus dem oben genannten Artikel. Dort sorgen wir dafür, dass der komplette Datensatz nicht in die nächste Zeile rutscht, wenn noch nicht vier Datensätze in der aktuellen Spalte vorhanden sind. Im Gegensatz zum Beispiel des Kalenders aus dem genannten Artikel müssen wir hier sechs Steuer­elemente verschieben und nicht nur eines:

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)

Me.MoveLayout = False

intSpalte = intSpalte + 1

If intSpalte = 4 Then

Me.MoveLayout = True

End If

If intSpalte > 4 Then

intSpalte = 1

End If

Me!Anrede.Left = intWidth * (intSpalte - 1)

Me!Vorname.Left = intWidth * (intSpalte - 1)

Me!Nachname.Left = intWidth * (intSpalte - 1)

Me!Strasse.Left = intWidth * (intSpalte - 1)

Me!PLZ.Left = intWidth * (intSpalte - 1)

Me!Ort.Left = intWidth * (intSpalte - 1)

End Sub

Wie Bild 10 zeigt, liefert der Bericht allerdings noch nicht das gewünschte Ergebnis. Dies hat vermutlich damit zu tun, dass wir, wenn Elemente mit einem Nachnamen, der mit A beginnt, nicht die ganze Reihe ausfüllen, die folgenden Elemente mit B nicht in der nächsten Zeile landen. Dies müssen wir noch in Form einer zusätzlichen Bedingung unterbringen. Dachte ich zumindest. In der Tat geraten wir mit unserem Vorhaben in einen Dschungel zunächst unerwarteter Ereignisabläufe, was aber ein schöner Anlass ist, sich die Ereignisse in einem Bericht einmal genau anzusehen.

Noch fehlt die Feinabstimmung ...

Bild 10: Noch fehlt die Feinabstimmung ...

Neuer Anlauf

Dazu verwerfen wir den bisherigen Entwurf und starten mit einem Bericht namens rptKundenadresseNachBuchstabe neu. Hier fügen wir wieder die Abfrage qryKunden­Mit­Anfangsbuchstabe als Datenquelle hinzu und ziehen die Felder Anrede, Vorname, Nachname, Strasse, PLZ und Ort in den Detailbereich des Entwurfs. Wir fügen die gleiche Gruppierung nach dem Anfangsbuchstaben hinzu.

Hier stellen wir allerdings nun nicht nur mit Kopfzeilenbereich ein, sondern auch mit Fußzeilenbereich. Wozu wir diesen benötigen, erfahren Sie weiter unten. Außerdem müssen wir hier noch Kopfzeile und ersten Datensatz auf einer Seite zusammenhalten aktivieren. Die zusätzliche Sortierung nach dem Nachnamen, die dafür sorgt, dass die Elemente innerhalb der Gruppen nach dem Nachnamen sortiert werden, fügen wir anschließend hinzu – so befindet sich diese Sortierung unterhalb der Gruppierung und wird auch in dieser Reihenfolge angewendet.

Das Feld Anfangsbuchstabe fügen wir nun dem Gruppenkopf hinzu.

Die Hintergrundfarbe für den Gruppenkopfbereich stellen wir so ein, dass diese immer grau hinterlegt wird – also erhält die Eigenschaft Hintergrundfarbe den gleichen Wert wie Alternative Hintergrundfarbe, beispielsweise Hintergrund 1, Dunkler 5%. Für das Textfeld im Gruppenkopf stellen wir die Eigenschaft Hintergrundart auf Transparent ein.

Gegebenenfalls erstreckt sich eine Gruppe über mehr als eine Seite. In diesem Fall soll der Gruppenkopf nicht nur auf der ersten Seite, sondern auch auf den folgenden Seiten über den Adressen ausgegeben werden.

Dazu stellen wir die Eigenschaft Bereich wiederholen im Eigenschaftsfenster wie in Bild 11 auf den Wert Ja ein.

Einstellen der Eigenschaft Bereich wiederholen

Bild 11: Einstellen der Eigenschaft Bereich wiederholen

Damit können wir uns an die Programmierung begeben. Wir benötigen die folgenden Variablen, die wir in verschiedenen Ereignisprozeduren einstellen und modulweit bereitstellen wollen:

Private intWidth As Integer

Private intSpalte As Integer

Private intGroupCount As Integer

Private intGroupIndex As Integer

Private intGroupHeaderCount As Integer

  • intWidth speichert die Breite einer Spalte.
  • intSpalte enthält die Position der jeweiligen Spalte.
  • intGroupCount enthält die Anzahl der Datensätze der aktuellen Gruppe.
  • intGroupIndex nimmt den Index des aktuell bearbeiteten Datensatzes der Gruppe auf.
  • intGroupHeaderCount speichert, wie oft die Format-Ereignisprozedur für einen Gruppenkopf bereits aufgerufen wurde.

Die Ereignisprozedur Report_Load wird durch das Ereignis Beim Laden des Berichts ausgelöst und sieht wie folgt aus:

Private Sub Report_Load()

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!