CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Exception Reporting mit DeltaMaster II

Wie im vorangegangen Blogbeitrag Exception Reporting mit DeltaMaster dargestellt, lässt sich durch eine geschickte Kombination von DeltaMaster und Berichtsserver ein Exception Reporting sowohl in multidimensionalen, als auch in relationalen Modellen abbilden. Ist die Konfiguration eines solchen Reportings im multidimensionalen Umfeld weitgehend intuitiv und per toolgesteuerten Dialogen durchzuführen, so erfordert die relationale Umgebung ein wenig mehr Handarbeit. Und genau diese Handarbeit soll im Folgenden um ein paar weitere Schritte ergänzt werden.

Parametrierung des Berichtsserver-Jobs

Um den Bedarfsfall eines solchen Ausnahmeberichts zu modellieren, sind die Bereiche SQL-Aktualisierungs-Befehl und Berichtsgenerator die Einstellungsmittel der Wahl. Ist der gewünschte Job mit der entsprechenden Ausgabe erstellt, so sollte sich der Inhalt des Berichtsgeneratorelements individuell an die Ausnahme anpassen, oder eben nicht. Ganz wörtlich ist hier der Freitext über dem Berichtsgeneratorenbereich zu nehmen: „Neue Berichte generieren für…“, denn genau an dieser Stelle erstellen wir den Ausnahmeindikator. Ist der Bereich mit Elementen gefüllt, werden Berichte erstellt und publiziert. Bei einer leeren Ergebnismenge wird der Job zwar ausgeführt, liefert jedoch kein Ergebnis zurück.

Um die etwas technisch anmutende Syntax von Hierarchie’ElementID’ (vgl. Abb. 1) automatisiert abbilden zu können, ist der SQL-Aktualisierungs-Befehl vonnöten.

Berichtsgeneratorelement_im_BerichtsserverAbb. 1: Berichtsgeneratorelement im Berichtsserver

Auswahl des richtigen Generatorelements

Wie auch in OLAP-Modellen, kann mittels dieses SQL-Aktualisierungs-Befehls direkt auf den relationalen Inhalt von Berichtssevrer-Jobs eingewirkt werden. In diesem speziellen Fall ist dies zunächst die Berichtsservertabelle Iterator. In dieser werden die Elemente des Berichtsgenerators gespeichert. Um nun ein vernünftiges, relationales Exception Reporting aufbauen zu können, benötigen wir eine Ergebnismenge, welche nur unter bestimmten Bedingungen Datensätze zurückliefert. Beispielsweise eine View, welche genau die Niederlassungen zeigt, deren Planeingabe noch nicht vollständig erfolgt ist.

SELECT
       NiederlassungID
FROM
       V_Eingabeprüfung
WHERE
       Anzahl_Planeingaben < 1

Die somit erhaltenen IDs müssten nun möglichst variabel und automatisiert in die Elementauswahl des Berichtsserver-Jobs geschrieben werden. Hierfür empfiehlt sich das Anlegen einer eigenen Pro-zedur in der Berichtsserver-Datenbank. Diese soll die Ergebnismenge der View in das Format der relationalen Elementauswahl bringen und in die Iteratortabelle zurückschreiben. Hierbei sollte auch eine mögliche Konkatenation der Elemente berücksichtigt werden für den Fall, dass mehrere Niederlassungen pro Durchlauf ihre Planeingaben noch nicht vollständig durchgeführt haben.

In mehreren Projekten hat sich folgender Aufbau bewährt:

Code
Hierbei ist wichtig, dass in der @sql- Variablen die IteratorID verwendet wird, welche der zugeordneten Nummer des Berichtsserver-Jobs entspricht.

Aufruf der Prozedur

Um vor jedem Aufruf des Jobs diese Liste der Elemente zu aktualisieren, muss die Prozedur dem Job zugeordnet und im Bereich SQL-Aktualisierungs-Befehl aufgerufen werden.

SQL_Aktualisierungs_BefehlAbb. 2: SQL-Aktualisierungs-Befehl im Berichtsserver-Job

Je nachdem, welche Elemente nach der Aktualisierung im Bereich des Generatorenelements ausgewählt sind, wird der Ausgabebericht des Jobs entweder an mehrere Niederlassungen, eine Niederlassung oder keine Niederlassung verschickt.