Exit-Klasse für BI IP Merkmalsbeziehungen anlegen
In diesem How-To zeige ich Ihnen wie Sie mit Exit-Klassen bestimmte Anforderungen für Merkmalsbeziehungen (engl. Characteristic Relationships) umsetzen können. Neben der Theorie zeige ich auch ein Paar konkrete Anwendungsbeispiele. Kenntnisse in der objektorienterten Programmierung und ABAP sind wünschenswert, aber nicht zwingend nötig.
Grundsätzlich werden Merkmalsbeziehungen in der Planung für drei verschiedene Funktionen verwendet. Die möchte ich anhand eines Beispiels erklären. Angenommen, wir haben die Warengruppen Wasser und Saft sowie dazugehörigen Kundengruppen Wassertrinker und Safttrinker. Mit Merkmalsbeziehungen kann ich folgendes umsetzen:
- Kombinationsprüfung (
~CHECK
) – Sie können prüfen ob die zu beplanende Kombination erlaubt ist. So können Sie zum Beispiel nicht die Kundengruppe Safttrinker für die Warengruppe Wasser planen. Die Kombination Wasser und Wassertrinker wäre dagegen erlaubt. - Kombinationsvorschlag (
~CREATE
) – Sie können auch eine Liste von allen gültigen Kombinationen erzeugen. Zum Beispiel für ein Planungslayout welches alle möglichen Kombinationen anzeigt. - Merkmalsableitung (
~DERIVE
) – die dritte und die meiner Meinung nach wichtigste Funktion dient dazu, aus einem Merkmalswert einen Wert für ein anderes Merkmal abzuleiten. Dies ist wichtig, wenn dieses Merkmal nicht auf der Planungsebene vorhanden ist, aber trotzdem später im Reporting verwendet werden soll. Wenn Sie zum Beispiel die Warengruppe Wasser beplanen, wird im Hintergrund automatisch die Kundengruppe mit dem Wert Wassertrinker gefüllt.
Jede eingabebereite Query und jede Planungsfunktion berücksichtigt automatisch die Merkmalsbeziehungen.
Für die Merkmalsbeziehungen über ein Exit müssen Sie eine Klasse mit entsprechenden Interfaces inmplementieren. Diese Klasse tragen Sie dann in dem Planning Modeler (TA RSPLAN
) ein. Gehen Sie dabei wie folgt vor.
Rufen Sie die Transaktion SE80
(ABAP Workbench) auf. Legen Sie eine neue Klasse, z.B. ZCL_RSPLS_CR_EXIT_USER
, an. Wählen Sie dazu im Dropdownmenü „Klasse / Interface“ aus und geben Sie den Namen der Klasse ein. Bestätigen Sie die Abfrage mit „Ja“.
Geben Sie im nächsten Fenster eine Beschreibung ein und entfernen Sie das Häkchen bei „Final„.
Tragen Sie in Eigenschaften die Klasse CL_RSPLS_CR_EXIT_BASE
als Superklasse ein. Dadurch wird unsere Klasse „Erbe“ der SAP-Beispielklasse CL_RSPLS_CR_EXIT_BASE
. Das Konzept der Vererbung erlaubt es, Klassen bei ihrer Definition von bereits vorhandenen Klassen abzuleiten.
Aktivieren Sie nun die Klasse und alle Objekte.
Als nächstes können wir folgende Methoden aus dem Interface IF_RSPLS_CR_METHODS
redefinieren:
IF_RSPLS_CR_METHODS~CHECK
– dient der Implementierung der Prüfung von MerkmalskombinationenIF_RSPLS_CR_METHODS~CREATE
– mit dieser Methode können Sie Merkmalskombinationen erzeugenIF_RSPLS_CR_METHODS~DERIVE
– dient der Ableitung von Merkmalen
Wählen Sie dazu die jeweilige Methode mit Rechtsklick aus und klicken Sie auf „Redefinieren“.
Diese drei Methoden möchte ich nun genauer erläutern.
Kombinationsprüfung (~CHECK
)
Die Methode IF_RSPLS_CR_METHODS~CHECK
dient zur Prüfung, ob bestimmte Merkmalskombinationen gültig sind.
Der Parameter I_S_CHAS
enthält die Merkmale, die zurzeit beplant werden. Mithilfe des Parameters E_IS_VALID
wird die Rückgabe ausgeführt ob ein Wert gültig ist oder nicht. Dieser Parameter ist vom Typ RS_BOOL
und wird mit X
gefüllt, falls der Satz gültig ist. Andernfalls wird er mit SPACE
gefüllt. Wenn Sie bei ungültigen Sätzen eine Meldung ausgeben wollen, können Sie dies in der Tabelle E_T_MESG
vornehmen. Diese Methode wird besonders bei Planungsfunktionen häufig aufgerufen. Daher liegt es nahe, die Ergebnisse zu puffern, vor allem, wenn die Prüfung komplex ist und mehrere Schritte erfasst. In der Klasse CL_RSPLS_CR_EXIT_BASE
finden Sie ein Beispielcode für die Pufferimplementierung.
Kombinationsvorschlag (~CREATE
)
Die Methode IF_RSPLS_CR_METHODS~CREATE
generiert alle gültigen Merkmalskombinationen.
Die Tabelle I_TSX_SELDR
enthält die Merkmalsselektionen, die zum Beispiel in der Query hinterlegt sind. Es dürfen nur Kombinationen erzeugt werden, die auch in der Selektion enthalten sind. Zu jedem Merkmal mit einer Selektions-Option CHANM
enthält die Tabelle eine Zeile. Die Einschränkungen zu diesem Merkmal finden Sie im internen Format in der Tabelle RANGE-RANGE
. Die Tabelle E_T_MESG
kennen Sie schon aus der Methode CHECK
. Daneben existiert zur Rückgabe der Kombinationen die Tabelle E_TH_CHAS
. Diese Hash-Tabelle enthält die erzeugten Merkmalskombinationen.
Merkmalsableitung (~DERIVE
)
In der Methode IF_RSPLS_CR_METHODS~DERIVE
werden Merkmale gefüllt, die sich nicht auf der Aggregationsebene befinden.
Da Merkmalswerte verändert werden wird ein Chaning-Parameter C_S_CHAS
verwendet. Dieser Parameter enthält die Merkmalskombination. Die Merkmalswerte für die Quellmerkmale sind gefüllt. Die Methode muss aus diesen Werten alle Zielmerkmale ableiten und in die entsprechenden Felder des Parameters füllen. Die Werte für die Quellmerkmale dürfen nicht verändert werden.
Diese Funktion kann auf vielfältige Weise genutzt werden. So können Sie zum Beispiel mit einer Merkmalsableitung eine Change-Log Logik realisieren. Dadurch können Sie nachvollziehen, wer wann welchen Planwert geändert hat. Dazu füllen wir über ein Exit die Merkmale Benutzer 0USERNAME
, Datum 0DATE
und Uhrzeit 0TIME
. Beachten Sie dabei, dass immer ein Quellmerkmal für den Exit angegeben werden muss. In diesem Fall könnte es ein beliebiges Merkmal sein, zum Beispiel die Fiskalperiode 0FISCPER
.
In RSPLAN
habe ich folgende Merkmalsbeziehung angelegt.
Das Coding für die redefinierte Methode IF_RSPLS_CR_METHODS~DERIVE
könnte wie folgt aussehen.
METHOD if_rspls_cr_methods~derive. CLEAR e_t_mesg. FIELD-SYMBOLS: <ls_chavl> TYPE ANY. *Benutzer füllen ASSIGN COMPONENT 'USERNAME' OF STRUCTURE c_s_chas TO <ls_chavl>. IF sy-subrc = 0. <ls_chavl> = sy-uname. ENDIF. *Datum füllen ASSIGN COMPONENT 'DATE0' OF STRUCTURE c_s_chas TO <ls_chavl>. IF sy-subrc = 0. <ls_chavl> = sy-datum. ENDIF. *Uhrzeit füllen ASSIGN COMPONENT 'TIME' OF STRUCTURE c_s_chas TO <ls_chavl>. IF sy-subrc = 0. <ls_chavl> = sy-uzeit. ENDIF. ENDMETHOD.
Aktivieren Sie die Methode und alle dazugehörigen Objekte.
Wenn nun der User OPLANER (Operativer Planer) für den Buchungskreis 1000 einen Planwert speichert, werden Merkmalswerte für den Benutzer 0USERNAME
, Datum 0DATE
und Uhrzeit 0TIME
automatisch im Cube hinterlegt.
Wenn später der Benutzer SPLANER (Strategischer Planer) den geplanten Wert um 50 erhöht und überschreibt wird die Änderung auch im Cube getrackt.
Ein anderer, sehr cooler, Anwendungsfall wäre die Ableitung von Kalendermonaten 0CALMONTH
aus Fiskalperioden 0FISCPER
(oder auch Fiskalperioden mit der Fiskaljahresvariante aus Kalendermonaten). SAP hat schon von Haus aus eine Reihe von Merkmalsbeziehungen für Zeitmerkmale implementiert. Diese laufen automatisch im Hintergrund ab. Sie bekommen davon nichts mit. Wenn Sie zum Beispiel das Merkmal Kalenderjahr/Monat 0CALMONTH
in der Aggregationsebene haben und die Merkmale Kalendermonat 0CALMONTH2
sowie Kalenderjahr 0CALYEAR
im Cube, dann werden diese automatisch gefüllt.
Allerdings funktioniert es nicht bei Fiskalperioden und Kalendermonaten. Was auch verständlich ist, schließlich sind die Fiskaljahre und die Fiskaljahresvarianten je nach Unternehmen sehr unterschiedlich. Mithilfe einer Exit-Klasse können Sie diese Einschränkung elegant umgehen. In diesem Fall könnte eine Pufferung nützlich sein. Ein Beispiel finden Sie in der Klasse CL_RSPLS_CR_EXIT_BASE
.
Ich habe in dem Planning Modeler (TA RSPLAN
) folgende Merkmalsbeziehung angelegt.
Angenommen, dass wir in unserem Unternehmen folgende Fiskaljahresvariante benutzen.
Dann könnte das Coding für die redefinierte Methode IF_RSPLS_CR_METHODS~DERIVE
so aussehen.
METHOD if_rspls_cr_methods~derive. CLEAR e_t_mesg. FIELD-SYMBOLS: <ls_chavlp> TYPE ANY, <ls_chavlm> TYPE ANY. *Kalendermonat berechnen. Variante V9 2014001 = 201310; 2014012 = 201409 ASSIGN COMPONENT 'FISCPER' OF STRUCTURE c_s_chas TO <ls_chavlp>. IF sy-subrc = 0. CASE <ls_chavlp>+4(3). WHEN 001 OR 002 OR 003. <ls_chavlp>+4(3) = <ls_chavlp>+4(3) - 3 + 12. <ls_chavlp>+0(4) = <ls_chavlp>+0(4) - 1. WHEN OTHERS. <ls_chavlp>+4(3) = <ls_chavlp>+4(3) - 3. ENDCASE. *Kalendermonat füllen ASSIGN COMPONENT 'CALMONTH' OF STRUCTURE c_s_chas TO <ls_chavlm>. IF sy-subrc = 0. CONCATENATE <ls_chavlp>+0(4) <ls_chavlp>+5(2) INTO <ls_chavlm>. ENDIF. ENDIF. ENDMETHOD.
Die Werte werden nun automatisch unter dem richtigen Kalendermonat gespeichert.
Wenn wir nun auch die InfoObjekte Kalendermonat 0CALMONTH2
sowie Kalenderjahr 0CALYEAR
in den Cube aufnehmen werden diese vom System automatisch gefüllt.
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.

Quellen:
Dirk Herzog (2012): ABAP-Programmierung für SAP NetWeaver BW – Kundeneigene Erweiterungen, 3. Auflage, Bonn
SAP Hilfe – Vererbung – Finale Klasse
SAP Hilfe – Merkmalsbeziehungen für Zeitmerkmale
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.
Trackbacks & Pingbacks
[…] und die Fiskaljahresvarianten, je nach Unternehmen, sehr unterschiedlich. Mithilfe einer Exit-Klasse können Sie diese Einschränkung jedoch elegant […]
Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!