In Formularen ist die Sache bei unserer Beispieldatenbank „Bücherverwaltung“ klar: Sollen zu jedem Leser seine Ausleihen erscheinen, legen wir ein Hauptformular für die Leser an und setzen ein Unterformular für die Ausleihen hinein. Wer diesen Weg in einen Bericht übertragen will, sucht folgerichtig nach dem Unterbericht – und fährt damit einen Umweg. Berichte lösen das Problem anders, nämlich mit einer einzigen Abfrage und einer Gruppierung. Warum das so ist, wie es Schritt für Schritt gelingt und welche Stolpersteine dabei auf uns warten, liest Du in diesem Artikel.
Beispieldatenbank
Die Beispiele dieses Artikels findest Du in der Datenbank BerichteBasics_1nDaten.accdb.
Das Szenario: Leser und ihre Ausleihen
Wir bleiben bei der Bücherverwaltung. Die Tabelle tblLeser speichert die Leser, die Tabelle tblAusleihen hält fest, wer wann welches Buch ausgeliehen und wann er es zurückgebracht hat.
Verknüpft sind beide über das Fremdschlüsselfeld LeserID – eine klassische 1:n-Beziehung.
Ein Leser hat also keine, eine oder viele Ausleihen; eine Ausleihe gehört hingegen immer zu genau einem Leser. Das Datenmodell zeigt Bild 1.
Bild 1: Die 1:n-Beziehung zwischen tblLeser und tblAusleihen
Der Bericht soll die Leser untereinander ausgeben, unter jedem Leser dessen Ausleihen auflisten und je Leser die Anzahl der Ausleihen nennen.
Das wird in Formularen durch Haupt- und Unterformular realisiert, aber in Berichten sieht dies anders aus.
Warum kein Unterbericht?
Unterberichte gibt es in Access durchaus, und wir könnten damit die Struktur eines Formulars nachbauen. Nur brauchen wir sie hier nicht.
Der Grund ist einfach: Ein Formular dient dem Bearbeiten von Daten, und eine Datensatzquelle bleibt nur dann bearbeitbar, wenn sie überschaubar bleibt. Deshalb bekommt dort jede Tabelle ihr eigenes Formular.
Ein Bericht gibt Daten hingegen nur aus. Er muss nicht aktualisierbar sein. Also dürfen wir ihm eine Abfrage unterschieben, die mehrere Tabellen zusammenführt – und die Aufteilung, die im Formular das Unterformular leistet, übernimmt im Bericht die Gruppierung.
Dieses Prinzip haben wir im Artikel Berichte [basics]: Grundlagen (www.access-basics.de/526) bereits benannt. Jetzt führen wir es vor.
Die Mechanik der Gruppierung selbst – Gruppenkopf einblenden, Gruppenfuß, Bereich wiederholen – setzen wir dabei als bekannt voraus. Sie steht ausführlich im Artikel Berichte [basics]: Berichte gruppieren (www.access-basics.de/691).
Dort gruppieren wir allerdings eine Tabelle nach einem ihrer Felder. Hier ist es etwas anderes: Hier stehen zwei verknüpfte Tabellen in der Datensatzquelle, und die Eins-Seite wandert in den Gruppenkopf, die n-Seite in den Detailbereich.
Die Abfrage als Datensatzquelle
Eine Ausleihe ohne Buchtitel nützt niemandem. Also holen wir uns über die Tabelle tblBuecher noch das Feld Buchtitel dazu.
Damit stehen zwar drei Tabellen in der Abfrage – an der Struktur ändert das aber nichts: Strukturbildend ist allein die 1:n-Beziehung zwischen Leser und Ausleihe.
Die Tabelle tblBuecher hängt an der n-Seite und liefert nur einen Klartext zum Fremdschlüssel. Die Abfrage heißt qryLeserUndAusleihen und sieht in der Entwurfsansicht wie in Bild 2 aus.
Bild 2: Die Abfrage qryLeserUndAusleihen verbindet Leser, Ausleihen und Bücher
Die Felder LeserID und AusleiheID nehmen wir mit auf, obwohl sie im Bericht nirgends erscheinen sollen.
Beide brauchen wir gleich noch – das eine zum Gruppieren, das andere am Ende des Artikels.
Der Preis des Joins: Redundanz
Bevor wir weitermachen, schauen wir uns das Ergebnis an – und zwar in der Datenblattansicht, nicht in der Vorstellung. Denn hier passiert etwas, das viele überrascht (siehe Bild 3).
Bild 3: Die Abfrage liefert die Leserdaten in jeder Ausleihzeile erneut
Der Leser Martin Kleinert steht nicht ein einziges Mal da, sondern in jeder seiner Ausleihzeilen erneut. Das ist kein Fehler, sondern die unvermeidliche Folge des Joins: Eine Abfrage liefert immer eine flache Tabelle, und in der muss die Eins-Seite in jeder Zeile der n-Seite wiederholt werden.
Würden wir diese Abfrage unverändert als Datensatzquelle nutzen und alle Felder in den Detailbereich legen, sähe der Bericht genau so aus wie das Datenblatt: der Lesername in jeder Zeile.
Genau hier setzt die Gruppierung des Berichts an. Sie holt die wiederholten Werte aus dem Detailbereich heraus und schreibt sie ein einziges Mal in den Gruppenkopf.
Den Bericht anlegen
Wir erstellen über Erstellen|Berichte|Berichtsentwurf einen neuen, leeren Bericht (siehe Bild 4).
Unser exklusives Angebot für Dich!
(Das Abo ist jederzeit monatlich kündbar)
Hier geht’s weiter →Die ersten 4 Wochen kostenlos testen – voller Zugriff auf alle Artikel, vollständigen Code und Beispieldatenbanken. Kein Risiko: Wenn es nicht passt, kündigst Du einfach innerhalb der ersten vier Wochen.
Oder hast Du eine konkrete Frage zu Deiner eigenen Access-Anwendung?
Vielleicht stellt Deine Anwendung Dich vor eine Herausforderung, zu der Du bisher keine Lösung findest. Schlechte Performance, kein ausreichender Zugriffsschutz, Du bist unsicher über Dein Datenmodell oder Dein Code liefert unerklärliche Fehler?
In unserem kostenlosen Access-Audit schaut sich André Minhorst persönlich gemeinsam mit Dir Deine Lösung per Zoom an – und zeigt Dir, wo Datenmodell, VBA-Code, Ergonomie und Sicherheit Optimierungspotenzial bieten.
Jetzt kostenloses Access-Audit anfordern →![Access [basics]](https://access-basics.de/wp-content/uploads/2021/02/logo400.png)


