Kontenmodell zu Kennzahlenmodell zu Kontenmodell umwandeln
In einem früheren Beitrag habe ich den Unterschied zwischen dem Kontenmodell und Kennzahlenmodell erläutert. In diesem Beitrag stelle ich verschiedene Möglichkeiten vor, Daten von einem Modell in das andere zu transferieren. Man spricht auch vom „Kippen des Datenmodells“.
- Kontenmodell zu Kennzahlenmodell
- Kennzahlenmodell zu Kontenmodell
Kontenmodell zu Kennzahlenmodell mit Transformationregeln
Eine Möglichkeit besteht darin die Transformationsregeln zu nutzen. Das Vorgehen möchte ich anhand eines Beispiels erläutern.
In der Quelle sind folgende Werte im Kontenmodell hinterlegt:
Diese sollen im Ziel nach folgenden Regeln transformiert werden. Dabei bekommt jedes Konto eine eigene Kennzahl.
Kennzahl | Konto ZITEM | Beschreibung | Wert |
ZNETS1 | 3000 | Nettoumsatz | 3.000 € |
ZCOST1 | 2000 | Kosten | 2.000 € |
ZSALM1 | 1000 | Umsatzmarge | 1.000 € |
Um dieses Ziel zu erreichen, nutzen wir die Regeln in der Transformation. So wird, neben dem Betrag, auch das Konto an die Kennzahl Nettoumsatz übertragen.
In den Regeldetails legen wir Routine als Regeltyp fest.
Falls das Konto „3000“ lautet, wird der Wert in die Kennzahl Nettoumsatz geschrieben, ansonsten passiert nichts.
IF SOURCE_FIELDS-/BIC/ZITEM = '3000'.
RESULT = SOURCE_FIELDS-AMOUNT.
ENDIF.
Die Regeln für Kosten und Umsatzmarge sehen analog aus (mit dem jeweiligen Konto 2000 und 1000).
Nach dem Ladeprozess stehen die Werte im Ziel als Kennzahlen zur Verfügung:
Kontenmodell zu Kennzahlenmodell mit Endroutine
Eine andere Möglichkeit stellt der Weg über eine ABAP Endroutine dar. Um die Quell- und Zielinfoobjekte verarbeiten zu können, wird eine InfoSource dazwischen geschaltet, die beide (Konten und Kennzahlen) enthält.
Als Vorlage dient der Cube mit dem Kontenmodell, anschließend wird die InfoSource um die Kennzahlen aus dem Kennzahlenmodell erweitert.
Die Transformation zur InfoSource sieht wie folgt aus.
In der Endroutine der Transformation stehen alle Felder zur Verfügung. Wir gehen über alle Datensätze und weisen die Werte dem Konto entsprechend zu.
LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.
IF <result_fields>-/bic/zitem = '3000'.
<result_fields>-/bic/znets1 = <result_fields>-amount.
ELSEIF <result_fields>-/bic/zitem = '2000'.
<result_fields>-/bic/zcost1 = <result_fields>-amount.
ELSEIF <result_fields>-/bic/zitem = '1000'.
<result_fields>-/bic/zsalm1 = <result_fields>-amount.
ENDIF.
ENDLOOP.
Nach der InfoSource werden die Felder 1:1 in den Cube mit den Kennzahlen übertragen.
Das Ergebnis stimmt mit dem aus Transformationregeln überein.
Kennzahlenmodell zu Kontenmodell mit Transformationregeln
Nachdem wir die Werte nun im Kennzahlenmodell zur Verfügung haben, möchte ich die Umwandlung zu Kontenmodell demonstrieren. Eine Möglichkeit sind die Transformationsregeln mit Regelgruppen. Dabei wird pro Konto eine Regelgruppe angelegt, die Konten sind als Konstanten hinterlegt und mit der jeweiligen Kennzahlen verlinkt. So schaut die Transformation für den Nettoumsatz aus.
Um die Kennzahl Kosten in das Kontenmodell umzuwandeln, legen wir eine neue Regelgruppe an.
Dabei wird das Kostenkonto 2000 als Kostante hinterlegt.
Diese Übung für auch für die Umsatzmarge wiederholt.
Beim Laden der Daten werden nun aus einem Datensatz in Kennzahlenmodell drei im Kontenmodell.
Das Ergebnis sieht wie folgt aus. Die Konten werden mit den entsprechenden Werten angezeigt.
Kennzahlenmodell zu Kontenmodell mit Endroutine
Auch bei der Umwandlung zum Kontenmodell können wir eine ABAP Endroutine nutzen. Analog zum Umwandlung zum Kennzahlenmodell wird eine InfoSource dazwischen geschaltet, die beide InfoObjekte (Konten und Kennzahlen) enthält. So können wir in der Endroutine auf Quell- und Zielinfoobjekte zugreifen.
Im Coding gehen wir über alle Datensätze. Dabei erstellen wir pro Datensatz im Kennzahlenmodell drei neue im Kontenmodell. Die Konten werden hardgecodet und der Wert aus der jeweiligen Kennzahl übernommen.
DATA lt_result TYPE STANDARD TABLE OF _ty_s_tg_1.
LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.
*create new line per account
<result_fields>-/bic/zitem = '3000'.
<result_fields>-amount = <result_fields>-/bic/znets1.
APPEND <result_fields> TO lt_result.
<result_fields>-/bic/zitem = '2000'.
<result_fields>-amount = <result_fields>-/bic/zcost1.
APPEND <result_fields> TO lt_result.
<result_fields>-/bic/zitem = '1000'.
<result_fields>-amount = <result_fields>-/bic/zsalm1.
APPEND <result_fields> TO lt_result.
*delete original data set
DELETE RESULT_PACKAGE.
ENDLOOP.
*replace the result package with new entries
APPEND LINES OF lt_result TO RESULT_PACKAGE.
Nach der InfoSource werden die Felder 1:1 in den Kontencube übertragen.
Nach dem Ladeprozess werden die Daten im Kontenmodell angezeigt.
Diese ABAP Tricks machen Ihr Leben leichter!
- In meinem Newsletter gebe ich eine Menge Tipps und Kniffe rund um ABAP.
- Die Mini-Tutorials unterstützen Sie dabei, Software in ABAP effizienter zu entwickeln.
- Praktische Anleitungen ermöglichen Ihnen schnelle Erfolge bei der Optimierung Ihrer Arbeit.
- Bei der Anmeldung zu meinem Newsletter erhalten Sie das Buch „ABAP Tipps und Tricks“ als Willkommensgeschenk.
Falls Ihnen dieser Beitrag weitergeholfen hat, wäre es eine sehr nette Anerkennung meiner Arbeit wenn Sie z.B. Ihre Bücher über Amazon bestellen würden. Wenn Sie ein Produkt kaufen, erhalte ich dafür eine Provision. Für Sie ändert sich am Preis des Produktes gar nichts. Ich möchte mich an dieser Stelle jetzt schon für Ihre Unterstützung bedanken.
Gut, mit einer Expertenroutine hätte man den Fall Kennzahlenmodell -> Kontenmodell auch ohne InfoSource hinbekommen ;-)
Ich bin nicht unbedingt ein Fan von Expertenroutinen.
Ich auch nicht :)
Die InfoSource erleichtert die Maintenance, jeder kann relativ leicht nachvollziehen was vor sich geht.