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 = 1
wird 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 = 2
wird 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 = 0
dient 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 BeispielATRNAVFL
an, ob es sich bei der Variablen um ein Navigationsattribut handelt.ATRTIMFL
gibt 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 FeldSIGN
enthä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