Der Berichtsmappengenerator im Publisher erlaubt die automatische, systematische und strukturierte Generierung von neuen Berichten und Ordnern innerhalb einer DeltaMaster-Sitzung. Dabei sind auch Verschachtelungen der Iteratoren erlaubt!
Fortsetzung Berichtsmappengenerator
Der heutige Beitrag ist eine Fortsetzung des Artikels Berichtsmappengenerator im Publisher, den Sie zum besseren Verständnis zuerst lesen sollten.
In oben genannten Beitrag haben wir die grundlegenden Konzepte des Berichtsmappengenerators im Publisher beschrieben. Der Publisher ist eine Komponente unserer Business-Intelligence-Software DeltaMaster, die die automatisierte, zeitgesteuerte und an den Empfänger adaptierte Erstellung und Verteilung von Berichten in diversen Formaten (z. B. DeltaMaster-Sitzung, mobiler Bericht, Word, PDF, Excel, HTML, …) und Formen (z. B. E-Mail, Dateiablage, Repository, FTP, Service, …) ermöglicht.
Der erste Beitrag dieser zweiteiligen Reihe konzentrierte sich auf das grundsätzliche Vorgehen beim Iterieren einzelner Berichte. Darüber hinaus hatten wir Mechanismen zur Sortierung und Ablage der erzeugten Berichte in Ordnern beschrieben. Berichte iterierten wir dabei jeweils über Elemente einer Dimensionshierarchie.
In dieser Fortsetzung geht es zunächst um die Verschachtelung von Iteratoren. Berichte können auch für sämtliche Kombinationen zweier (oder mehr) Elementmengen verschiedener Dimensionen durchgespielt werden.
Danach beschrieben wir, wie wir gesamte Ordner inklusive der enthaltenen Berichte, die sich auch in Unterordnern befinden dürfen, vervielfältigen. Auch hier sind Verschachtelungen möglich.
Zur Illustration habe ich wieder die oben sichtbare Beispielanwendung verwendet, die auch schon im ersten Teil herangezogen wurde, um Details der Funktionsweise des Berichtsmappengenerators im Publisher zu erläutern.
Iteratoren ohne Verschachtelung
Schauen wir zunächst noch einmal in einer Wiederholung auf einfache Iteratoren. Wir haben im Bericht mit der ID 4 eine Rangfolge (Top-10 der umsatzstärksten Produkte) vorliegen. Diese möchten wir nun einmal für jede der vier Kundenregionen (Nord, Ost, Süd, West) und unabhängig davon für jede Produkthauptgruppe (Luxusmodelle, Sondermodelle, Standardmodelle) erzeugen:
Hier haben wir im ersten Eintrag mit Child einen Unterordner erzeugt, in dem dann die Berichte der vier Regionen abgelegt werden. Der zweite Eintrag verwendet diesen Ordner als Ziel – durch Ziel-ID 7 – und fügt dann die drei Berichte über die Produkthauptgruppen richtig sortiert am Ende an. Dies erreichen wir durch die Angabe von Ziel-Index = 5, damit die neuen Berichte an der 5. Position – also nach den vier Regions-Berichten – “en bloc” eingefügt werden.
Hier müssen wir daran denken, dass die Ordner-ID 7 dynamisch erzeugt wird und nur dann entsteht, wenn wir die Ausgangssitzung unverändert lassen und keine weiteren Ordner mehr anlegen oder bestehende Ordner löschen. Gegebenenfalls müssen wir die Ziel-ID bei Änderungen anpassen oder leere Ordner bereits in der Ausgangssitzung anlegen.
Nun hätten wir gerne eine Liste von Berichten erzeugt, die alle 4 x 3 = 12 Kombinationen von Regionen und Produkthauptgruppen enthält.
Verschachtelungen im Berichtsmappengenerator
Wenn wir zwei Iteratoren kombinieren, können wir von einer äußeren und einer inneren Schleife sprechen. Hier möchten wir die Kombinationen Regionen/Produkthauptgruppen jeweils pro Region sammeln. Als Ordner haben wir auf der Hauptseite den Umsatzordner ausgewählt. Dann stellen wir Typ und ParentID folgendermaßen ein (die Vorschau ist noch inaktiv!):
Um nur die 2er-Kombinationen zu sehen, stellen wir den Typ des Iterators über die Regionen auf “Ohne”. Nur die Angaben in Dimension/Hierarchie/Elemente werden dann genutzt, um aus der benannten Menge (interner Name [namedset]) eine Liste der Regionen in der Reihenfolge Nord – Ost – Süd – West zu generieren. Die anderen Angaben dieser Zeile haben dann keinen Effekt.
Wenn wir für IteratorID 196 den Typ Bericht wählen, können wir zusätzlich en passant auch Berichte nur über die Regionen erzeugen, die entweder auf der gleichen Höhe (Sibling) oder in einem Ordner (Child) abgelegt werden. Darauf verzichten wir hier einmal.
Um eine Verschachtelung zu erreichen, geben wir beim inneren Iterator als ParentID die IteratorID der äußeren Schleife an, also hier die 196 des ersten Eintrags.
Zielordner Child
Für die Ausgabe können wir nun wählen, ob pro Region ein Ordner angelegt werden soll oder nicht. Wir hätten gerne Ordner und wählen deshalb als Zielordner Child aus. So sieht das Ergebnis aus:
Wir haben somit 4 Ordner für die Regionen generiert und jeweils drei Rangfolge-Berichte der Produkthauptgruppen abgelegt. Die Logik ist hier, dass wir in der äußeren Schleife über die vier Regionen in der Reihenfolge Nord – Ost – Süd – West iterieren. Für jede gerade aktive Region iterieren wir dann über die drei Produkthauptgruppen Luxusmodelle – Sondermodelle – Standardmodelle in der inneren Schleife.
Dabei speichern wir die Berichte zu der aktiven Region in einem neu angelegten Ordner sofort und unmittelbar nach dem Ausgangsbericht mit der ID 4 ab.
Ein neuer Ordner schiebt die bereits bestehenden Ordner nach unten. Dabei kehrt sich die Reihenfolge der Regionen um.
Original-Reihenfolge der Regionen herstellen
Möchten wir diese Umkehrung nicht, gibt es zwei Optionen: Wir können eine weitere benannte Menge in der Reihenfolge West – Süd – Ost – Nord anlegen und diese bei der Iteration verwenden. Nord wird dann der erste Ordner, West der unterste Ordner sein.
Weiterhin kann alternativ durch Angabe von Ziel-Index = 6 erreicht werden, dass wir neue Ordner auf jeden Fall am Ende einfügen.
Warum die Zahl 6? Vor der ersten Iteration gibt es zwei Berichte in diesem Ordner. Hier muss somit ein Ziel-Index = 3 (oder höher) vergeben werden, damit der neue Ordner hinter den Berichten eingehängt wird. In der zweiten Iteration benötigen wir nun schon einen Ziel-Index = 4 (oder höher), in der dritten Ziel-Index = 5 (oder höher) und in der letzten somit 6 oder höher.
Da wir nur einen Ziel-Index vergeben können, erfüllt eine 6 (oder höher) alle Bedingungen:
Wir haben nun wieder die Regionen in der Original-Reihenfolge. Im Unterschied zum Benannte-Mengen-Ansatz befinden sie sich nun hinter dem Comparator-Bericht. Oft wollen wir Quellberichte nach der Iteration löschen (“Original löschen”), dann ist hinterher kein Unterschied zwischen den beiden Ansätzen mehr sichtbar.
Ordner im Berichtsmappengenerator als Quelle
Einleitung
Bisher haben wir nur Berichte als Quellmaterial verwendet. Wir konnten wählen, ob die Vervielfältigungen direkt oder in neu angelegten Unterordnern gespeichert werden.
Nun schauen wir auf Ordner als Input für den Berichtsmappengenerator. Wir replizieren also nicht einen einzelnen Bericht, sondern gleich einen gesamten Ordner mit Berichten, optional auch mit Unterordnern.
Wo wollen wir die Ordner anlegen?
Bei den erzeugten Kopien gibt es bei Typ Ordner eine zusätzliche Option “Root” für den Zielordner. Um die Unterschiede zu verdeutlichen, stellen wir auf der Hauptseite unter “Berichte und Ordner” den Ordner Analysen ein, der selbst weitere Unterordner besitzt. Wir nehmen als Vorlage nun den gesamten Ordner Umsatz mit der ID 3 – inklusive der beiden Berichte Rangfolge und Comparator.
Wir möchten den Ordner über die drei Produkthauptgruppen Luxusmodelle – Sondermodelle – Standardmodelle iterieren.
Option Child
Die Option Child ist oftmals die plausible Wahl. Mit Child werden die neu generierten Ordnerkopien direkt im ausgewählten Ordner immer am Ende hinter allen bereits vorhandenen Berichten und Ordnern abgelegt:
Da wir immer am Ende einfügen, behalten die Ordner die richtige Reihenfolge bei. Sollten wir den Ordner wiederholt über mehrere Iteratoren vervielfältigen, entspricht die Reihenfolge der Einträge auch der Reihenfolge im Ergebnis.
Die Felder Ziel-ID und Ziel-Index werden nur bei Berichten als Input, nicht aber bei Ordnern eingesetzt.
Vorsicht bei der Option “Original löschen” in Verbindung mit “Child”. Hier hieße das, dass Ordner Umsatz mit ID = 3 im Anschluss gelöscht wird. Ordner Umsatz enthält aber auch unsere gerade neu angelegten Ordner – unsere Arbeit wäre somit bei Aktivierung der Option umsonst gewesen.
Option Sibling
Mit der Option Sibling werden die generierten Ordner in der gleichen Ebene wie der Ausgangsordner am Ende, hinter den anderen Berichten und Ordnern angehängt:
Hier muss daran gedacht werden, dass die Einstellungen von “Berichte und Ordnern” auf der Hauptseite für die generierte Ausgabe ebenfalls berücksichtigt werden. Unsere drei neuen Ordner über die Produkthauptgruppen werden hinter den Ordnern “Umsatz”, “Absatz” und “Multiples” der gleichen Ebene platziert.
Die neuen Ordner sind nun aber auch nur deshalb sichtbar, weil auf der Hauptseite das übergeordnete “Analysen” ausgewählt wurde! Wäre hier nur der Umsatz-Ordner aktiviert worden, lägen die neuen Ordner außerhalb des erlaubten Ordners und würden nicht angezeigt werden.
Option Root
Die Option Root ist nur bei Ordnern anwendbar. Hier hilft zum besseren Verständnis ein Blick auf die erzeugte Ordnerstruktur, wenn bei “Berichte und Ordner” auf der Hauptseite mehrere Ordner aus unterschiedlich tiefen Ebenen aktiviert wurden. Dazu haben wir zusätzlich unter Umsatz einen weiteren Ordner Stoffgruppe mit einer Rangfolge angelegt.
Allein durch die Wirkung der “Berichte und Ordner”-Einstellungen ergibt sich das folgende Bild:
Die Ordner werden hier in der Reihenfolge der “Tiefe” sortiert. Zuerst erscheinen die Ordner, die direkt unter dem Wurzelknoten verankert sind: Diese Ordner befinden sich in der DeltaMaster-Sitzung auf der obersten Ebene, stellen also “wahre” Rootebenen-Ordner dar. Sie sind hier durch “Mobile Berichte” und “Obsolet” gegeben.
Dann folgt ein Ordner aus der zweiten Ebene: Absatz aus dem Analyse-Ordner. Da Analyse selbst nicht in die Berichte-und-Ordner-Auswahl inkludiert wurde, wird Absatz künstlich in die Rootebene angehoben. An letzter Position kommt dann mit “Stoffgruppen” ein Ordner aus der dritten Ebene.
Wird nun etwa der Ordner “Stoffgruppen” über die Vertriebsabteilungen mit der Option Zielordner = Root iteriert, werden die zwei erzeugten Ordner direkt hinter den “wahren” Rootebenen-Ordnern eingereiht, aber vor den Ordnern, die eigentlich aus tieferen Ebenen stammen:
Kehren wir nun zur ursprünglichen Sitzung zurück und wählen in “Berichte und Ordner” nur den Ordner Analysen aus, der sich direkt unter dem Wurzelknoten befindet. Bei einer Iteration des Ordners Umsatz über die drei Produkthauptgruppen mit Zielordner = Root werden die neu erzeugten Ordner nun direkt hinter dem einzigen Rootebenen-Ordner Analysen angefügt:
Keine wahren Rootebenen-Ordner?
Was passiert, wenn es in der Vorauswahl in “Berichte und Ordner” gar keinen wahren Rootebenen-Ordner gibt?
Wir wählen unter “Berichte und Ordner” nur den Unterordner Umsatz aus. Wiederholen wir nun diesen Ordner mit Zielordner = Root über die drei Produkthauptgruppen, erscheinen die drei neuen Ordner direkt hinten den wahren Rootebenen-Ordnern – es gibt hier bloß keine, – aber noch vor den Ordnern aus tieferen Ebenen:
Da keine wahren Rootebenen-Ordner vorkommen, führen die drei neuen Ordner letztendlich die Liste der Ordner an.
Verschachtelungen von Ordnern
Auch Ordner können verschachtelt werden. Im Vergleich zur Verschachtelung von Berichten hat man hier sogar noch mehr Möglichkeiten. Wir wollen nun den Ordner “Umsatz” über Kombinationen von Regionen und Produkthauptgruppen vervielfältigen. Als Zieltyp liegen hier vor allem “Sibling” und “Child” nahe.
Zunächst schränken wir aber die “Berichte und Ordner” auf Analysen (ohne Unterordner!) und Umsatz ein. Dann legen wir schon einmal zwei Einträge über Regionen und Produkthauptgruppen fest, jeweils mit Typ Ordner, aktivieren sie aber noch nicht. Beide Einträge werden verschachtelt, indem wir beim inneren Iterator über die Produkthauptgruppen als ParentID die IteratorID des äußeren Iterators über die Regionen angeben:
Siblings des Ordners Umsatz werden nur sichtbar sein, wenn der übergeordnete Ordner Analysen in die “Berichte und Ordner”-Auswahl eingeschlossen wird. Durch die Deaktivierung von “mit Unterordnern” erreichen wir, dass wir die Ordner “Absatz” und “Multiples” ausschließen.
Sibling/Sibling
Stellen wir beide Zielordner auf Sibling ein, wird folgende Berichtsmappe erzeugt:
An den Ordner-IDs lässt sich sehr schön die Reihenfolge der Abarbeitung erkennen. Zuerst wird in der äußeren Schleife ein Ordner Umsatz (Nord) mit den zwei darin enthaltenen, auf Nord gefilterten Berichten erzeugt, der sich wegen “Sibling” auf der gleichen Ebene wie der Ordner Umsatz befindet und am Ende einsortiert wird. Dann werden erst einmal für Nord die Produkthauptgruppen durchiteriert. Da immer Siblings vorliegen, werden auch diese Ordner in der gleichen Ebene immer hinten eingereiht. Dann folgt die nächste Region Ost, dann die Kombinationen mit den Produkthauptgruppen usw.
Stellt man den ersten Eintrag auf “Ohne” anstelle “Ordner”, verschwinden die vier reinen Regionsordner.
Sibling/Child
Wird nun nur die innere Schleife auf Zielordner = Child gesetzt, bleiben die Regions-Ordner weiterhin auf der Ebene des Umsatz-Ordners und werden hinten eingereiht. Die Ordner der Produkthauptgruppen werden nun aber innerhalb des Ordners der jeweiligen Region abgelegt, auch jeweils am Ende:
Wird hier der erste Eintrag auf “Ohne” geändert, sind die reinen Regionsordner nicht mehr sichtbar und die gemischten Ordner werden als Kinder des Umsatz-Ordners angelegt.
Child/Child
Eine stimmig und vielleicht am besten einsetzbare Kombination entsteht, wenn beide Zielordner auf Child stehen:
Regions-Ordner werden als Kinder des Umsatz-Ordners angelegt und die 2er-Kombinationen landen jeweils im passenden Regions-Ordner.
Mit Berichten aus dem Absatz-Ordner könnte man analog vorgehen und hätte dann jeweils zusammengehörige Berichte in hierarchisch angeordneten Ordnern zusammengefasst.
Auch drei Dimensionsebenen lassen sich mit Child kombinieren, beim dritten Eintrag wird bei der ParentID auf den zweiten Eintrag verwiesen.
Weitere Kombinationen sind möglich! Etwas aufpassen muss man bei der Option “Original löschen”, die man bei den gezeigten Beispielen nicht einsetzen sollte, da bei Child mit Löschen des Ausgangsordners auch angehängte Unterordner verschwinden.