Kreuztabellenabfragen erlauben die zweidimensionale Gruppierung und Berechnung von Daten. Leider ist standardmäßig nur die Datenblattansicht vorgesehen. Mit ein paar Tricks zeigen Sie das Ergebnis von Kreuztabellenabfragen jedoch auch in Berichten an. Dieser Beitrag zeigt, wie Sie Berichte für verschiedene Kreuztabellen erstellen, und erläutert, welche besonderen Kniffe für die Darstellung von Daten mit dynamischen Spaltenüberschriften nötig sind.
Das erste Beispiel soll die Umsätze der Mitarbeiter über die einzelnen Kategorien auflisten. Das gewünschte Ergebnis finden Sie in Bild 2.

Bild 1: Darstellung einer Kreuztabelle in einem Access-Bericht

Bild 2: Diese Kreuztabelle dient als Datenherkunft für den Bericht
Aufbau des Berichts
Wie bekommen wir nun die Daten der Kreuztabellenabfrage in den Bericht Grundsätzlich gelingt dies wie bei einem herkömmlichen Bericht. Dazu fassen wir das Abfrageergebnis unabhängig davon, dass es sich hierbei um eine Kreuztabellenabfrage handelt, als ganz normales Abfrageergebnis mit Feldnamen und Datensätzen auf.
Der erste Unterschied zu einem herkömmlichen Bericht ist, dass die Spaltenüberschriften nicht den Feldnamen der zugrunde liegenden Abfrage entsprechen, sondern den per Kreuztabellenabfrage ermittelten Spaltenüberschriften.
Der zweite Unterschied ist, dass auch die Textfelder zur Anzeige der Daten im Detailbereich nicht an echte Felder einer Tabelle gebunden werden, sondern an Ausdrücke, die auf den Spaltenüberschriften der Kreuztabellenabfrage basieren – in diesem Fall also beispielsweise Getränke, Gewürze et cetera.
Bedeutet das nun Mehraufwand Nein! Sie brauchen der Eigenschaft Datenherkunft des Berichts einfach nur den Namen der Kreuztabellenabfrage zuzuweisen. Danach stehen die generischen Felder in der Feldliste zur Verfügung, sodass Sie diese einfach nur wie gewohnt in den Detailbereich des Berichtsentwurfs ziehen und anschließend anordnen müssen (s. Bild 3). Fertig – der erste Bericht auf Basis einer Kreuztabellenabfrage steht!

Bild 3: Entwurfsansicht des Kreuztabellenberichts
Spaltenüberschriften einschränken
Steigern wir den Schwierigkeitsgrad ein wenig. Zum Beispiel, indem wir den Benutzer festlegen lassen, welche Kategorien im Bericht berücksichtigt werden sollen. Wenn der Benutzer nun also entscheidet, dass statt der vorhandenen acht Kategorien nur zwei Kategorien in der Kreuztabelle und somit auch im Bericht abgebildet werden sollen, können wir den soeben erstellten Bericht nicht so einfach weiterverwenden. Immerhin wäre ein Eingriff in den Entwurf des Berichts notwendig, da ja nur noch sechs Felder mit Umsätzen angezeigt werden sollen.
Zunächst einmal muss dazu die zugrunde liegende Abfrage angepasst werden. Dies erreichen Sie, indem Sie ein Kriterium für das Feld Kategoriename festlegen (s. Bild 4). Dies können Sie direkt unter dem als Spaltenüberschrift festgelegten Element im Entwurf der Kreuztabellenabfrage erledigen, indem Sie dort einen Ausdruck wie IN("Getränke";"Gewürze") eintragen.

Bild 5: Kreuztabellenabfrage mit eingeschränkter Spaltenzahl
Das Kriterium wird aber nach dem Speichern und erneuten Öffnen der Abfrage in ein eigenes Feld mit der Funktion Bedingung ausgegliedert.
Das Ergebnis der Abfrage in der Datenblattansicht liefert schon einmal die gewünschten Werte (s. Bild 5). Nun müssen wir dieses noch in den Bericht übertragen. Dass dies in der aktuellen Konfiguration nicht funktioniert, war abzusehen – es erscheint eine Fehlermeldung, dass einer der Kategorienamen nicht als gültiger Feldname erkannt werden kann.

Bild 6: Entwurf des Berichts mit nur noch zwei Kategorien der Kreuztabellenabfrage
Kein Wunder: Der Bericht enthält immer noch sechs Textfelder, deren Eigenschaft Steuerelementinhalt auf die Felder der per Kriterium ausgeblendeten Spaltenüberschriften der Kreuztabellenabfrage zeigt. Wenn Sie die notwendigen änderungen manuell durchführen wollten, müssten Sie schlicht und einfach die überzähligen Felder entfernen, in diesem Fall also alle Felder außer Getränke und Gewürze.
Der Entwurf sieht nun wie in Bild 6 aus. Damit wäre das Problem grundsätzlich gelöst, allerdings nur für diese spezielle Konstellation. Für jede andere Zusammenstellung der Kategorien müssen Sie nun erneut in den Entwurf des Berichts eingreifen.

Bild 4: Einschränkung der Spaltenüberschriften einer Kreuztabellenabfrage
Dynamische Berichtserstellung
Der erste Ansatz, dieses Problem zu lösen, ist das dynamische Erstellen eines Berichts in Abhängigkeit von den gewählten Kategorien. Das heißt, dass der Bericht bei jedem Aufruf gelöscht und neu erstellt wird. Diese Lösung finden Sie in Listing 1.
Listing 1: Erstellen eines Kreuztabellenberichts per VBA
Public Sub Kreuztabellenbericht_Erstellen(strDatenherkunft As String, intAnzahlZeilenueberschriften As Integer)
Dim db As DAO.Database
Dim rst As DAO.Recordset
Dim rpt As Report
Dim ctl As Control
Dim i As Integer
Dim strBericht As String, strBerichtTemp As String
Dim sngSpaltenbreite As Single
strBericht = Replace(strDatenherkunft, "qry", "rst")
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT * FROM " & strDatenherkunft & " WHERE 1=2", dbOpenDynaset)
Set rpt = Application.CreateReport
On Error Resume Next
DoCmd.Close acReport, strBericht
DoCmd.DeleteObject acReport, strBericht
On Error GoTo 0
strBerichtTemp = rpt.Name
rpt.RecordSource = strDatenherkunft
rpt.Section(acPageHeader).Height = 400
rpt.Section(acDetail).Height = 330
sngSpaltenbreite = 1400
For i = 0 To rst.Fields.Count - 1
Set ctl = Application.CreateReportControl(strBerichtTemp, acLabel, acPageHeader, , , _
i * sngSpaltenbreite, 200, sngSpaltenbreite, 300)
ctl.FontSize = 9
ctl.TextAlign = 2
ctl.ForeColor = &H0
ctl.FontBold = True
ctl.Caption = rst.Fields(i).Name
ctl.Name = "lbl" & rst.Fields(i).Name
ctl.BorderStyle = 0
If i < intAnzahlZeilenueberschriften Then
ctl.TextAlign = 1
End If
Set ctl = Application.CreateReportControl(strBerichtTemp, acTextBox, acDetail, , , _
i * sngSpaltenbreite, 0, sngSpaltenbreite, 300)
ctl.FontSize = 9
ctl.TextAlign = 2
ctl.ForeColor = &H0
ctl.ControlSource = rst.Fields(i).Name
ctl.Name = "txt" & rst.Fields(i).Name
ctl.BorderStyle = 0
If i < intAnzahlZeilenueberschriften Then
ctl.FontBold = True
ctl.TextAlign = 1
Else
ctl.TextAlign = 3
End If
Next i
rpt.Printer.Orientation = acPRORLandscape
DoCmd.Save acReport, strBerichtTemp
DoCmd.Close acReport, strBerichtTemp
DoCmd.Rename strBericht, acReport, strBerichtTemp
DoCmd.OpenReport strBericht, acDesign
End Sub
Die Prozedur erwartet als Parameter den Namen der Kreuztabellenabfrage, deren Daten der Bericht anzeigen soll, sowie die Anzahl der enthaltenen Zeilenüberschriften. Ein Beispielaufruf könnte etwa so aussehen:
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
