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:
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.
- ö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.
Bild 2: Meldung, wenn die Summe der Spaltenbreiten die Breite des Berichts überschreitet
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).
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:
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).
Bild 5: Anpassen der Hintergrundfarbe
Wenn Sie nun erneut in die Seitenansicht wechseln, sieht das Bild schon besser aus (siehe Bild 6).
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.
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).
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.
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
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: