Customer Exit Variablen in SAP BI IP
Customer Exit Variablen bieten interessante Optionen in der Planung. In diesem How To erkläre ich die generelle Vorgehensweise bei SAP Customer Exits und zeige anhand eines konkreten Beispiels wie Sie jedem Buchungskreis eine eindeutige Währung zuordnen können. In der Planung ist es sehr wichtig, dass die Werte eindeutig sind. Durch Customer Exits soll vermieden werden, dass der Benutzer durch eine Vielzahl von Variablen überfordert wird.
Die Verwaltung von SAP-Erweiterungen erfolgt anhand von Projekten (Transaktion CMOD).
Dem Projekt wird eine Erweiterung zugeordnet. Erweiterungen für globale Variablen im Reporting werden mit dem Exit RSR00001 realisiert. Dazu gehört das Funktionsbaustein EXIT_SAPLRRS0_001.
Dieser Funktionsbaustein beinhaltet nur eine Zeile Code – INCLUDE ZXRSRU01. Dieser Include beinhaltet die eigentlichen Customer Exit Variablen. Es ist möglich das Coding für alle Variablen in dieses Include zu schreiben. Wenn sich aber in eine der Variablen ein Fehler einschleicht werden auch alle anderen Variablen nicht funktionieren. Mit zunehmender Anzahl von Variablen wird es auch schnell unübersichtlich. Daher bietet sich der folgende Weg an. Pro Variable wird ein Funktionsbaustein angelegt der sich aus den Teilen Z_CUSTEXIT_ und der Variable I_VNAM zusammensetzt. In dem Include ZXRSRU01 wird versucht diesen Funktionsbaustein aufzurufen. Das Coding könnte wie folgt aussehen.
*Pro Exit ein Fuba anlegen, der so aussieht
*Z_CUSTEXIT_ & I_VNAM
DATA:
l_d_fname(30) TYPE c,
o_cx_error TYPE REF TO cx_root.
STATICS:
lvs_fname_start(15) VALUE 'Z_CUSTEXIT_'.
CONCATENATE lvs_fname_start i_vnam INTO l_d_fname.
TRY.
* Aufruf des Funktionsbausteins
CALL FUNCTION l_d_fname
EXPORTING
i_vnam = i_vnam
i_vartyp = i_vartyp
i_iobjnm = i_iobjnm
i_s_cob_pro = i_s_cob_pro
i_s_rkb1d = i_s_rkb1d
i_periv = i_periv
i_t_var_range = i_t_var_range
i_step = i_step
IMPORTING
e_t_range = e_t_range
EXCEPTIONS
OTHERS = 1.
* Zuweisung der Exception
CATCH
cx_sy_dyn_call_illegal_func " FB nicht vorhanden/ aktiv
cx_sy_dyn_call_illegal_type " Falsche Typisierung
cx_sy_dyn_call_param_missing " Parameter fehlt
cx_sy_dyn_call_param_not_found " unbekannter Parameter
INTO o_cx_error.
ENDTRY.
Wenn Sie sich die Funktionsbausteine RSVAREXIT_* von der SAP-Entwicklung anschauen, dann werden sie feststellen, dass die SAP-Exit Variablen fast genauso implementiert werden. Neben dem Variablennamen I_VNAM ist der Aufrufschritt I_STEP entscheidend. Dabei handelt es sich um einen Zähler, denn der User-Exit wird mehrmals an verschiedenen Stellen aufgerufen. Je nach Zeitpunkt können Sie verschiedene Funktionen implementieren. Insgesamt werden folgende Schritte unterschieden:
I_STEP = 1– der erste Aufruf erfolgt vor der Variableneingabe. In diesem Schritt können Sie Vorschlagswerte für die eingabebereiten Variablen berechnen. Dazu wird der Exit einmal pro Variable des Typs Customer-Exit aufgerufen.I_STEP = 2– der Aufruf erfolgt direkt nach der Variableneingabe. Daher können wir die Eingaben des Benutzers benutzen um weitere Variablen abzuleiten. Im Gegensatz zuI_STEP = 1wird dieser Schritt nicht für alle Variablen vom Typ User-Exit aufgerufen, sondern nur für die nicht eingabebereiten Exit-Variablen. In diesem Schritt werden die endgültigen Variablenwerte festgelegt. Dazu wird der User-Exit einmal für jede nicht eingabebereite Variable aufgerufen. Sie können daher in diesem Schritt keine Eingaben des Benutzers überschreiben. Sie könnten jedoch im dritten Schritt die Benutzereingabe mit einer Fehlermeldung zurückweisen.I_STEP = 3– In diesem Aufruf können Sie die Werte der Variablen prüfen. Im Gegensatz zu den ersten beiden Schritten wird der dritte Schritt nicht pro Variable aufgerufen, sondern nur einmal insgesamt. Dabei werden Ihnen sämtliche Variableninhalte übergeben, um diese zu validieren. Das Auslösen einer Exception (RAISE) führt dazu, dass das Variablenbild noch einmal erscheint. AuchI_STEP = 2wird danach noch einmal ausgeführt.I_STEP = 0– der Schritt 0 wird bei allen Aufrufen verwendet, die nicht in Zusammenhang mit dem Variablenbild stehen. Es gibt drei Anwendungsfelder:- Zum einen nutzen wir diesen Schritt, wenn Variablen im InfoPackage oder DTP für die Selektion verwendet werden.
- Zum anderen wird der Schritt für die Bestimmung der Filterwerte im Navigationsblock der Query angewendet.
- Die wichtigste Verwendung ist allerdings in der Berechtigungsprüfung. Der Schritt
I_STEP = 0dient dazu, Variablen zu füllen, die in Berechtigungen genutzt werden. Dies ist besonders nützlich, wenn Berechtigungen aus einem DSO gefüllt werden oder aus Stammdaten abgeleitet werden sollen.
Die einzelnen Schritte spielen eine große Rolle. Daher ist auch ein Aufbau von ZXRSRU01 nach Steps denkbar. Auf diese Weise können Sie bereits am Namen des Funktionsbausteins erkennen, wozu er gedacht ist. Die generische Vorgabe könnte wie folgt aussehen:
DATA: l_d_fname(30) TYPE c.
CASE i_step.
WHEN 1.
CONCATENATE 'Z_VAR_PRE_POPUP_'
i_vnam INTO l_d_fname.
WHEN 2.
CONCATENATE 'Z_VAR_POST_POPUP_'
i_vnam INTO l_d_fname.
WHEN 0.
CONCATENATE 'Z_VAR_AUTHORITY_'
i_vnam INTO l_d_fname.
WHEN 3.
l_d_fname = 'Z_VAR_CHECK_VALIDITY'.
ENDCASE.
TRY.
CALL FUNCTION l_d_fname
EXPORTING
i_vnam = i_vnam
i_vartyp = i_vartyp
i_iobjnm = i_iobjnm
i_s_cob_pro = i_s_cob_pro
i_s_rkb1d = i_s_rkb1d
i_periv = i_periv
i_t_var_range = i_t_var_range
i_step = i_step
IMPORTING
e_t_range = e_t_range
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty
NUMBER sy-msgno
WITH
sy-msgv1 sy-msgv2
sy-msgv3 sy-msgv4
RAISING error_in_variable.
ENDIF.
CATCH cx_sy_dyn_call_illegal_func.
*nichts machen, wenn kein Exit implementiert wurde,
*z.B. in Step 1, wenn nur Step 2 implementiert wurde.
ENDTRY.
Die einzelnen Parameter haben dabei folgende Bedeutung:
I_VNAM– dieser Parameter enthält im Step 0, 1 und 2 den Namen der Variablen die berechnet werden soll.I_VARTYP– dieser Parameter gibt im Step 1 und 2 an, um welchen Variablentyp es geht. Wird als Rückgabe ein Merkmalswert, Text, Formel, Hierarchieknoten oder eine Hierarchie erwartet?I_IOBJNM– gibt das InfoObjekt an, auf das sich die Variable bezieht.I_S_COB_PRO– enthält die Eigenschaften des InfoObjekts, auf das sich die Variable bezieht. Dieser Parameter wird selten benötigt, da er Informationen angibt, die normalerweise zum Zeitpunkt der Programmierung fest sind und nicht verändert werden. So gibt zum BeispielATRNAVFLan, ob es sich bei der Variablen um ein Navigationsattribut handelt.ATRTIMFLgibt an, dass dieses zeitabhängig ist. Ein weiteres wichtiges Feld istINFOPROV, dass den InfoProvider angibt.I_S_RKB1D– dieser Parameter enthält die Reporting-Attribute der Query. Also Informationen wie den Query-Namen, den Aufrufer etc. Er ist vor allem in Step 3 von Bedeutung, um zu bestimmen, welche Validierungen durchgeführt werden sollen. Wichtige Felder sindINFOCUBE(also der Name des Providers, auf dem der Bericht ausgeführt wird) sowieCOMPID(der Query-Name).I_PERIV– dieser Parameter enthält die Geschäftsjahresvariante, sofern diese in der Query eindeutig bestimmt werden kann. Dies ist wichtig wenn aus einem Datum eine Periode bestimmt werden soll.I_T_VAR_RANGE– dieser Parameter enthält eine Tabelle, die sämtliche weiteren Variablenwerte beinhaltet. Dies ist besonders in Step 2 und 3 sinnvoll.I_STEP– der Schritt für die Variablenbestimmung wurde bereits weiter oben ausführlich erläutert.E_T_RANGE– in dieser Tabelle werden die Rückgabewerte in Step 0, 1 und 2 zurückgegeben. Dabei sind folgende Felder wichtig:LOW– dieses Feld enthält bei Mehrmalswertvariablen den Wert und bei Intervallen die Wertuntergrenze. Bei Textvariablen den Text, bei Hierarchievariablen die Hierarchie, bei Hierarchieknotenvariablen den Knotennamen und bei Formelvariablen den Rechenwert.HIGH– dieses Feld enthält die Obergrenze des Intervalls. Bei Hierarchieknotenvariablen beinhaltet dieses Feld das InfoObjekt des hierarchieknotens. Dies kann entfallen, wenn es sich bei dem Knoten um ein Blatt der Hierarchie handelt. Bei anderen Variablen bleibt das Feld immer leer.SIGN– das FeldSIGNenthält in der Regel immer einI(include, also einschließen). Einzige Ausnahme können Selektionsoptionen sein, die auch einE(exclude, also ausschließen) erlauben.OPT– dieses Feld wird normalerweise mitEQ(equal: gleich) gefüllt. Bei Intervallen können Sie auchBT(between: zwischen) oderNB(not between: nicht zwischen) verwenden. Bei Selektionsoptionen können sämtliche in Ranges-Tabellen zulässigen Operatoren verwenden.
E_MEEHT,E_MEFAC,E_WAERS,E_WHFAC,C_S_CUSTOMER– diese Parameter sind in der Schnittstelle zwar angegeben, werden jedoch nicht verwendet.
Bevor wir aber den Funktionsbaustein anlegen brauchen wir unsere Variable. Diese soll durch ein Customer Exit verarbeitet werden.
Wichtig dabei ist, dass diese nicht eingabebereit ist, da wir die Variable mit I_STEP = 2 füllen wollen. Da wir für unseren Plan auf jeden Fall eine gültige Währung brauchen ist die Variable verpflichtend und es sind keine Initialwerte erlaubt.
Als nächstes legen wir einen Funktionsbaustein an der diese Variable füllen wird. Funktionsbausteine werden in Funktionsgruppen gekapselt. Daher legen wir als erstes eine Funktionsgruppe an. Rufen Sie die Transaktion SE80 auf und legen Sie eine neue Funktionsgruppe an indem Sie „Funktionsgruppe“ im Dropdown auswählen und den gewünschten Namen eintragen. Unsere Funktionsgruppe soll Z_BW_CUSTOMER_EXIT heißen. Drücken Sie nun Enter und bestätigen Sie die Abfrage mit „Ja“.
Vergeben Sie als nächstes eine Beschreibung. Um ein syntaktisch korrektes Programm zu erhalten, müssen Sie den Typ-Pool im Bereich der globalen Daten der Funktionsgruppe deklarieren. Tragen Sie in den Top-Include folgenden Code ein und aktivieren Sie diesen.
TYPE-POOLS: RRO01, RRS0, RSR.
Legen Sie nun einen Funktionsbaustein nach der gewählten Konvention an (z.B. Z_VAR_POST_POPUP_ZCCODECURR). Nutzen Sie dabei den Rechtklick auf die Funktionsgruppe -> Anlegen -> Funktionsbaustein oder die Transaktion SE37.
Orientieren Sie sich bei Import- und Export-Parametern am Standardfunktionsbausteinbaustein EXIT_SAPLRRS0_001. Sie können die Parameter mit STRG + Y auswählen, kopieren und einfügen. Das eigentliche Coding für die Variable könnte wie folgt aussehen. Dabei lesen wir die Usereingabe aus der Variable für den Buchungskreis aus und suchen die dazugehörige Währung.
DATA: ls_range TYPE rsr_s_rangesid,
ls_var_range TYPE rrrangeexit,
lv_currency TYPE /bi0/oicurrency.
CASE i_vnam.
WHEN 'ZCCODECURR'. "unsere Variable
*Initialisieren
CLEAR ls_range.
IF i_step = 2. "Nach Pop-up
*Buchungskreis auslesen
READ TABLE i_t_var_range INTO ls_var_range
WITH KEY iobjnm = '0COMP_CODE'.
IF sy-subrc = 0.
*Währung aus Buchungskreis lesen
SELECT SINGLE currency
FROM /bi0/pcomp_code
INTO lv_currency
WHERE objvers EQ 'A' AND
comp_code EQ ls_var_range-low.
IF sy-subrc = 0.
*In Rückgabe übertragen
ls_range-low = lv_currency.
ls_range-sign = 'I'.
ls_range-opt = 'EQ'.
APPEND ls_range TO e_t_range.
ELSE.
*Hier könnte man einen Fehler ausgeben
ENDIF.
ENDIF.
ENDIF.
ENDCASE.
In Stammdaten von dem Merkmal Buchungskreis 0COMP_CODE sind folgende Werte gepflegt.
Wenn nun ein Planer in der Einstiegsselektion seinen Buchungskreis auswählt und beplant, werden die Werte automatisch unter der Währung des Buchungskreises ablegt.
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:
SAP Hilfe
Dirk Herzog (2012): ABAP-Programmierung für SAP NetWeaver BW – Kundeneigene Erweiterungen, 3. Auflage, Bonn
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.
Auch interessant:
Migration von kundeneigenen Implementierung für BW 7.4
Was Sie schon immer über die Verarbeitung von Customer Exit-Variablen wissen wollten, aber …
Koexistenz von BAdI RSROA_VARIABLES_EXIT_BADI und Customer-Exit EXIT_SAPLRRS0_001
BAdI RSROA_VARIABLES_EXIT_BADI












Man beachte: http://service.sap.com/sap/support/notes/1272242