Gruppierung von Zeilen in Report

Aufgabenstellung
Die fachliche Aufgabe war, in einem Report sowohl Fälle als auch die enthaltenen Scheine optisch zu trennen (bessere Lesbarkeit etc.).
Ein Break im Report wäre eine Lösung. Und APEX bietet "von Haus aus" die Möglichkeit, Berichte zu gruppieren (break on first column) -> eigentlich nicht schlecht, ABER grottenlangsam!!!


Also improvisieren: Ziel sollte sein,
a) einzelne Fälle durch wechselnde Hintergrundfarben voneinander abzuheben -> ähnlich dem standardmäßigem Alternating Row Colors, jedoch nicht für einzelne Zeilen, sonder für Blöcke von Zeilen
und
b) innerhalb der Fälle einzelne Scheine anhand von Trennlinien abzugrenzen (Nach der letzten Zeile eines Scheins soll eine verstärkte Trennlinie gesetzt werden).

Vermutlich gibt es noch andere Möglichkeiten Berichte aufzuhübschen - ich habe mich für folgende Variante entschieden:
- zwei zusätzliche Spalten in den Bericht einfügen
und
- Report-Template anpassen

1) Zusätzliche Spalten
Die zusätzlichen Spalten dienen der Steuerung des Templates, um die unterschiedlichen Zustände zu beschreiben.
a) wechselnder Fall:
     , MOD (DENSE_RANK () OVER (PARTITION BY part_key ORDER BY fall_nr), 2) col
Die Spalte col (wie color = Farbe) bestimmt, welche Hintergrundfarbe gewählt wird. DENSE_RANK zählt die einzelnen Fälle innerhalb der Partition (im Gegensatz zu RANK liefert DENSE_RANK lückenlose Ranking-Werte). MOD sorgt für den Wechsel zwischen 0 und 1.


b) letzte Zeile eines Scheins
     , DECODE (LEAD (schein_nr) OVER (ORDER BY schein_nr, gop ASC), schein_nr, 0, 1) lst
Die Spalte lst (wie last = letzte Zeile) bestimmt, ob die Trennlinie gerendert wird oder nicht. LEAD erzeugt  die nachfolgende schein_nr. DECODE vergleich die aktuelle mit der nachfolgenden schein_nr und setzt entsprechend 0 oder 1.

Durch Auswertung dieser Spalten können Reports flexibel formatiert werden.

2) Report-Template anpassen
Für das Report-Template am besten ein bestehendes kopieren und das dann anpassen.
Wesentlicher Trick dabei: Anhand der zusätzlichen Spalten wird unterschieden, welches Spaltentemplate (Column Templates) verwendet wird:

Column Template 1
#COLUMN_VALUE#
Column Template 1 Condition
Use Based on PL/SQL Expression
Column Template 1 Expression
'#LST#' = 0 AND '#COL#' = 0

alle Kombinationen durchgehen bis

Column Template 4
#COLUMN_VALUE#
Column Template 4 Condition
Use Based on PL/SQL Expression

Column Template 4 Expression

'#LST#' = 1 AND '#COL#' = 1
 

Ergebnis:
So könnte der Report dann aussehen:

Im konkreten Beispiel werden einzelne Scheine (Schein_Nr) durch eine Linie getrennt. Gleichzeitig werden einzelne Fälle (Fall_Nr) anhand der Hintergrundfarbe unterschieden.

Vorteil:
Dank der analytischen Funktionen bleibt die einmal definierte Formatierung (Hintergrundfarbe und Trennlinie) auch dann korrekt erhalten, wenn der Bericht gefiltert wird - auch die wechselnde Hintergrundfarbe bleibt erhalten.

Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen