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 pro Jahr getrennt auswertet und die Ergebnisse einem Report zusammenfasst.
Grob umrissen funktioniert das so, dass die Gesamtzahl der verkauften Artikel eines Jahres von einer Main-Query ermittelt wird und die Einschränkung auf die jeweilige Artikelgruppe in den Sub-Queries stattfindet.
Die Ausgangsdaten in der Datenbank für dieses Beispiel sehen Sie hier:
Das Ziel ist eine Auswertung als PDF, der etwa so aussehen sollte:
Query für den Main-Report
Für diesen Bericht 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 für dieses Beispiel nicht unbedingt notwendig, da alle in der Datenbank vorhandenen Datensätze ausgewertet werden sollen. Das Ergebnis kann man dann als Summe aller verkauften Artikel im Report verwenden. Daher kann man auch schreiben:
SELECT COUNT(*) FROM article WHERE angelegt = ${jahr};
Der in der Query verwendete Parameter ${jahr} wird später an die Sub-Queries durchgereicht. Angelegt wird er folgendermaßen:
Die Query wird gespeichert und über File > New > Report from Query wird das Layout erstellt.
- In H0/1 wird der Parameter ${jahr} eingefügt, um später das ausgewählte Jahr anzuzeigen, für das die Asuwertung 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 Ergebisse der Sub-Queries. Diese werden später in die Zeilen D3, D6 und D9 eingefügt.
Queries für die Sub-Reports
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. Der Parameter ${jahr} wird in den Sub-Queries nicht angelegt, da er von der Main-Query übergeben wird. 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 der Datenzeile D0 besteht. Die überflüssigen Zeilen werden gelöscht.
Sub-Reports in den Main-Report einfügen
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.
Die fertige Auswertung als PDF ausgegeben sieht dann so aus:
Die Linien habe ich in den Sub-Reports erzeugt.
Formatierung der Jahreszahl
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.
Ähnliche Beiträge:
-> Multiple Parameter in NextReports verwenden
1 Comment