Menüs

Mehrere Reports in NextReports kombinieren

Im letzten Beitrag zu NextReports hatte ich beschrieben, wie man einen Chart mit mehreren Graphen erstellt, um Wertevergleiche darzustellen. An dem dort verwendeten Beispiel möchte ich hier zeigen, wie man Verkaufszahlen von Artikeln aus unterschiedlichen Produktgruppen getrennt auswertet und in einem Report zusammenfasst.

Die Ausgangsdaten in der Datenbank für dieses Beispiel sehen Sie hier:

Testdaten

Testdaten
Das Ziel ist ein Report als PDF, der etwa so aussehen sollte:

Report
Reportentwurf

Für den Main-Report wird zunächst eine Query (ich nenne das nachfolgend Main-Query) erzeugt, die alle Datensätze oder zumindest die Datensätze durchläuft, die in den einzelnen Sub-Reports später ausgewertet werden sollen.

SELECT COUNT(*)
FROM article
WHERE ArtGruppe >= 1 AND ArtGruppe <= 3
AND Preisklasse >= 1 AND Preisklasse <= 3
AND angelegt = ${jahr};

Die Einschränkung auf die Artikel- und Preisgruppen ist nicht unbedingt notwendig  und es könnte genauso notiert werden:

SELECT COUNT(*)
FROM article
WHERE angelegt = ${jahr};

Der Parameter ${jahr} wird später an die Sub-Reports durchgereicht und wird in der Main-Query angelegt:

NextReports Parameter
NextReports Parameter

Die Query wird gespeichert und über File > New > Report from Query wird das Layout erstellt.

Layout Main-Report
Layout Main-Report

In H0/1 wird der Parameter eingefügt, um später das ausgewählte Jahr anzuzeigen, für das der Report erstellt wurde.
In D0/1 wird das Ergebnis der Main-Query eingefügt, das die Gesamtzahl der durchlaufenen Datensätze anzeigt.
Die Zeilen D2, D5 und D8 sind lediglich die Überschriften für die Sub-Reports. Die Sub-Reports werden später in die Zeilen D3, D6 und D9 eingefügt.

Die Sub-Queries werden für unsere Beispieldaten in NextReports erstellt. Hier die Sub-Query für die Artikelgruppe 1.

SELECT
(CASE
WHEN Preisklasse = 1 THEN 'Preisgruppe 1'
WHEN Preisklasse = 2 THEN 'Preisgruppe 2'
WHEN Preisklasse = 3 THEN 'Preisgruppe 3'
END) as "Preisgruppe",
CONVERT( CONCAT( COUNT(*), " / " ,
(SELECT COUNT(*) FROM article WHERE ArtGruppe = 1 AND angelegt = ${jahr} ) ,
" (" , ( COUNT(*) /
(SELECT COUNT(*) FROM article WHERE ArtGruppe = 1 AND angelegt = ${jahr} )) * 100 , "%) ")
USING UTF8) as "Anzahl/von/%-Anteil"

FROM article
WHERE ArtGruppe = 1 AND angelegt = ${jahr}
GROUP BY Preisgruppe;

Die Sub-Queries für die Artikelgruppen 2 und 3 unterscheiden sich davon  nur durch die entsprechend geänderten Werte der Spalte ArtGruppe. Die Sub-Queries dürfen auch nicht den Parameter ${jahr} enthalten, denn der wird von der Main-Query übergeben. Daher können die Sub-Queries auch nicht in NextReports getestet werden. Entweder man fügt zum Testen den Parameter kurz ein oder man testet in z.B. phpMyAdmin und ersetzt den Parameter der Query dabei durch die Jahreszahl.
Für jede Sub-Query wird wieder über über File > New > Report from Query ein Report erstellt, der nur aus einer Zeile besteht. Die überflüssigen Zeilen werden gelöscht.

Report für die Sub-Query
Report für die Sub-Query

Ich habe für dieses Beispiel die Sub-Queries mit den Namen SUB_PG1 bis SUB-PG3 abgespeichert und füge sie nun in den Main-Report ein.

Einfügen der Sub-Reports in den Main-Report
Einfügen der Sub-Reports in den Main-Report

Der fertige Report sieht dann so aus:

Der fertige Report
Der fertige Report

Die Linien habe ich in den Sub-Reports erzeugt.
Da die Parameter ${jahr} ein Integer ist, schreibt NextReports je nach Konfiguration anstatt 2017 die Jahreszahl mit einem Trennpunkt als 2.017. Ich habe das einfach mit der automatischen Typenangleichung umgangen, die in den Expressions die Integer-Jahreszahl in einen String wandelt, sofern ein weiterer String vorhanden ist. Alternativ kann man den Parameter ${jahr} natürlich als String definieren und die Queries entsprechend anpassen.

Typenangleichung in Expressions
Typenangleichung in Expressions

Buy Me a Coffee at ko-fi.com

Kommentare 1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.