Beruflich Dokumente
Kultur Dokumente
Die bisher behandelten Exits sind zweifellos sehr mächtig und bieten Ihnen
die Möglichkeit, die Daten so aufzubereiten, dass viele typische Reporting-
Anforderungen damit erfüllt werden können. Jedoch gibt es immer wieder
Anforderungen, die Berichte durch die Eingabe von Variablen flexibler zu
gestalten. So würde beispielsweise kein SAP NetWeaver BW-Berater emp-
fehlen, pro Kostenstelle im Unternehmen einen eigenen Bericht zu definie-
ren, sondern die Kostenstelle als einzugebende Variable zu bestimmen.
Andererseits soll diese Flexibilität aber nicht auf den Anwender abgewälzt
werden, sodass er mit einer Vielzahl von Variablen überfordert wird. Daher
können Sie versuchen, dem Anwender möglichst die Kostenstelle(n) vorzu-
schlagen, die er abhängig von seiner Position und Verantwortung vermutlich
in dem Bericht sehen möchte.
103
4 User-Exits und BAdIs im Reporting
lösen. Das können Sie zum Beispiel tun, indem Sie aus dem Variablennamen
den Namen eines Funktionsbausteins ableiten.
왘 I_STEP = 1
Der erste Aufruf des User-Exits dient dazu, Vorschlagswerte zu berech-
nen, das heißt die Werte, die in den eingabebereiten Variablen als Vor-
schlag für den Benutzer angezeigt werden. Dazu wird der Exit einmal pro
Variable des Typs Customer-Exit aufgerufen. Dies ist zugleich eine große
Schwäche des Exits. Möchten Sie einer bestehenden Eingabevariablen
nachträglich einen Vorschlagswert geben, sind Sie gezwungen, eine neue
Variable vom Typ Customer-Exit anzulegen und diese eingabebereit zu
machen. Es wäre wünschenswert, wenn in diesem Schritt auch die ande-
ren eingabebereiten Variablen versorgt werden könnten.
Auch wenn in diesem Schritt normalerweise Vorschlagswerte bestimmt
werden, können ebenso Variablen gefüllt werden, die nicht eingabebereit
sind. Dies ist jedoch nur interessant, wenn Sie die Werte in Schritt 2 benö-
tigen, um weitere Variablen abzuleiten.
왘 I_STEP = 2
Dieser Schritt wird nicht für alle Variablen vom Typ User-Exit aufgerufen,
sondern nur für die Variablen vom Typ User-Exit, die nicht eingabebereit
sind. In diesem Schritt werden die endgültigen Variablenwerte bestimmt.
Dazu wird für jede nicht eingabebereite Variable der User-Exit einmal auf-
gerufen. Sie können daher in diesem Schritt keine Eingaben des Benutzers
überschreiben. Dies ist generell nicht möglich, weil ein derartiges Verhal-
ten meist zu einer starken Verunsicherung des Anwenders führt. Daher
sollten Sie entweder gar keine Benutzereingabe zulassen oder die Benut-
zereingabe mit einer Fehlermeldung zurückweisen.
왘 I_STEP = 3
Der dritte Schritt wird im Gegensatz zu den ersten beiden Schritten nicht
pro Variable aufgerufen, sondern nur einmal insgesamt. Dabei werden
Ihnen sämtliche Variableninhalte übergeben, um diese zu validieren. Sie
können demnach überprüfen, ob die »Periode von« kleiner gleich der
104
Variablen-Exit RSR00001 4.1
»Periode bis« ist, wenn sie nicht als Intervall, sondern in zwei verschiede-
nen Variablen eingegeben werden. Diese Technik ist für eine flexible Vali-
dierung unerlässlich, das heißt eine Überprüfung, ob die Eingabewerte
zueinander passen, jedoch für eine saubere Trennung nach Querys oder
wenigstens Projekten hinderlich, da Variablen möglichst projektübergrei-
fend verwendet werden sollten, um ihre Anzahl zu reduzieren. Daher
müssen Sie ein anderes Feld verwenden, um eine Trennung in der Imple-
mentierung zu erreichen.
왘 I_STEP = 0
Der Schritt 0 wird nur selten eingesetzt. Er wird bei allen Aufrufen ver-
wendet, die nicht in Zusammenhang mit dem Variablenbild stehen. In
SAP NetWeaver 7.x und in SAP BW 3.x gibt es dazu drei Anwendungen:
왘 Zum einen nutzen Sie diesen Schritt, wenn Variablen im InfoPackage für
die Selektion verwendet werden.
왘 Zum anderen wird der Schritt für die Bestimmung der Filterwerte im
Navigationsblock der Query angewendet.
왘 Zum dritten und vielleicht wichtigsten dient er dazu, Variablen zu fül-
len, die in Berechtigungen genutzt werden. Dies ist besonders dann
nützlich, wenn Berechtigungen aus Tabellen gefüllt werden sollen, die
in ein DataStore-Objekt geladen wurden, oder wenn die Berechtigun-
gen aus Stammdaten abgeleitet werden sollen.
In diesem Buch wird ausschließlich der letzte Fall behandelt, da die ande-
ren Fälle in der Praxis zu selten vorkommen.
FUNCTION EXIT_SAPLRRS0_001.
*"---------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_VNAM) LIKE RSZGLOBV-VNAM
*" VALUE(I_VARTYP) LIKE RSZGLOBV-VARTYP
*" VALUE(I_IOBJNM) LIKE RSZGLOBV-IOBJNM
*" VALUE(I_S_COB_PRO) TYPE
*" RSD_S_COB_PRO
*" VALUE(I_S_RKB1D) TYPE
*" RSR_S_RKB1D
105
4 User-Exits und BAdIs im Reporting
왘 I_VNAM
Dieser Parameter enthält in Step 0, 1 und 2 den Variablennamen, der
berechnet werden soll.
왘 I_VARTYP
Dieser Parameter gibt in Step 1 und 2 an, um welchen Variablentyp es sich
handelt, das heißt, ob als Rückgabe ein Merkmalswert, Text, Formelwert,
Hierarchieknoten oder eine Hierarchie erwartet wird.
왘 I_IOBJNM
Dieser Parameter gibt das InfoObjekt an, auf das sich die Variable bezieht.
왘 I_S_COB_PRO
Dieser Parameter enthält verschiedene Informationen über das InfoObjekt,
auf das sich die Variable bezieht. ATRNAVFL gibt beispielsweise an, ob es sich
bei der Variablen um ein Navigationsattribut handelt, oder ATRTIMFL, ob
das Navigationsattribut zeitabhängig ist. Des Weiteren gibt er ähnliche
Informationen, die nur in speziellen Situationen benötigt werden, weil sie
normalerweise zum Zeitpunkt der Programmierung feststehen und nicht
verändert werden. Dieser Parameter wird deshalb nur selten benötigt.
왘 I_S_RKB1D
Dieser Parameter enthält Informationen wie den Query-Namen, den Auf-
rufer etc. Er ist vor allem in Step 3 von Bedeutung, um zu bestimmen, wel-
che Validierungen durchgeführt werden sollen. Wichtige Felder dafür
sind INFOCUBE (der Name des InfoProviders, auf dem der Bericht ausge-
führt wird) und COMPID (der Query-Name, der gerade ausgeführt wird).
106
Variablen-Exit RSR00001 4.1
왘 I_PERIV
Dieser Parameter enthält die Geschäftsjahresvariante, sofern sie in der
Query eindeutig bestimmt werden kann. Dies ist immer dann wichtig,
wenn aus einem Datum eine Periode bestimmt, beispielsweise die aktuelle
Buchungsperiode als Vorschlagswert gezeigt werden soll. Da aber nur sel-
ten mehrere unterschiedliche Geschäftsjahresvarianten in einem System
vorhanden sind, wird der Parameter auch entsprechend selten benötigt.
왘 I_T_VAR_RANGE
Dieser Parameter enthält eine Tabelle, die sämtliche weiteren Variablen-
werte beinhaltet. Dies ist besonders in Step 2 und 3 sinnvoll.
왘 I_STEP
Der Schritt für die Variablenbestimmung wurde bereits ausführlich erläu-
tert.
왘 E_T_RANGE
In dieser Tabelle müssen die Rückgabewerte in Step 0, 1 und 2 zurückge-
geben werden. Sie ist im Prinzip wie eine Ranges-Tabelle aufgebaut, die
weiteren Felder können ignoriert werden. Abhängig von der Art der Vari-
ablen, müssen dabei folgende Beschränkungen berücksichtigt werden:
왘 Das Feld LOW enthält bei Merkmalswertvariablen den Wert oder die
Wertuntergrenze (bei Intervallen), bei Textvariablen den Text, bei Hie-
rarchievariablen die Hierarchie, bei Knotenvariablen den Knotennamen
und bei Formelvariablen den Rechenwert.
왘 Das Feld HIGH enthält bei Merkmalswertvariablen für Intervalle oder
Selektionsoptionen die Obergrenze des Intervalls. Bei Hierarchieknoten-
variablen beinhaltet dieses Feld das InfoObjekt des Hierarchieknotens.
Dieses kann entfallen, wenn es sich bei dem Knoten um ein Blatt der Hie-
rarchie handelt. Bei anderen Variablen ist es immer leer.
왘 Das Feld SIGN enthält in der Regel immer ein I (für include: einschlie-
ßen). Einzige Ausnahme können Selektionsoptionen sein, bei denen
auch ein E (für exclude: ausschließen) erlaubt ist. SAP NetWeaver Busi-
ness Warehouse erlaubt ein E auch bei Intervallen. Da dies aber nicht der
Logik von Intervallen entspricht, sollten Sie solche Variablen als Selek-
tionsoptionen implementieren.
왘 Das Feld OPT wird in der Regel mit EQ (für equal: gleich) gefüllt. Bei Inter-
vallen können Sie auch BT (für between: zwischen) oder NB (für not bet-
ween: nicht zwischen) verwenden. Bei Selektionsoptionen sind sämtli-
che in Ranges-Tabellen zulässigen Operatoren möglich, die Sie zum Bei-
spiel in der ABAP-Dokumentation zum Schlüsselwort IF finden können.
107
4 User-Exits und BAdIs im Reporting
108
Variablen-Exit RSR00001 4.1
NUMBER SY-MSGNO
WITH
SY-MSGV1 SY-MSGV2
SY-MSGV3 SY-MSGV4
RAISING ERROR_IN_VARIABLE.
ENDIF.
CATCH CX_SY_DYN_CALL_ILLEGAL_FUNCTION.
* Nichts machen, weil kein Exit implementiert wurde,
* zum Beispiel in Step 1, wenn nur Step 2 implementiert wurde.
ENDTRY.
109
4 User-Exits und BAdIs im Reporting
110
Variablen-Exit RSR00001 4.1
In dem Eintrag mit KEY = 'LASTCPER' wird dabei manuell die letzte abge-
schlossene Periode gepflegt. Das Coding zur Abfrage der Tabelle sieht wie in
Listing 4.4 aus.
Aus der gewünschten Art der Vorbelegung ergibt sich, welche Art der Imple-
mentierung Sie nutzen. Häufig wird die tabellenabhängige Vorbelegung auch
für eine Vorbelegung abhängig vom Benutzernamen oder gar von bestimm-
ten Benutzerberechtigungen verwendet. Da das Handling von Reporting-
Berechtigungen nicht ganz einfach ist, wird im Folgenden noch anhand eines
etwas komplexeren Beispiels gezeigt, wie Sie Reporting-Berechtigungen der
Klasse RSR oder die neuen Analyseberechtigungen lesen, ohne für jeden
Stammdateneintrag einen AUTHORITY-CHECK durchzuführen.
111
4 User-Exits und BAdIs im Reporting
Zweidimensionales Berechtigungsobjekt
Es ist sicherlich eher eine Ausnahme, dass zwei InfoObjekte in einer Reporting-
Berechtigung Verwendung finden, und vielen ist bestimmt nicht bewusst, dass dies
möglich ist. Aber sowohl Reporting als auch Planung laufen in dem System ein-
wandfrei und verproben die Berechtigungen korrekt.
Dieses Konzept bereitet eine große Schwierigkeit: Ruft ein Mitarbeiter einen
Bericht in der externen Sicht auf, soll ihm automatisch seine Gesellschaft 100
als Vorschlagswert eingeblendet werden. Lassen Sie die Variable jedoch aus
der Berechtigung füllen, wird dem Benutzer immer die erweiterte Ausprä-
gung * vorgeschlagen; in diesem Fall eine leere Selektion.
Die Implementierung in Listing 4.5 liest die Berechtigungen und füllt den
Vorschlagswert entsprechend. Dabei werden im ersten Schritt die existie-
renden Berechtigungen zu dem InfoObjekt 0BUS_AREA gelesen. Anschlie-
ßend werden diese überprüft. Handelt es sich um eine allgemeine Berechti-
gung (*-Berechtigung), wird diese ignoriert. Handelt es sich um einen
konkreten Geschäftsbereich, wird dieser in die Vorbelegung der Variablen
zurückgegeben.
112
Variablen-Exit RSR00001 4.1
c_attrinm_busarea TYPE
rssb_sx_auth_values_user_iobj-iobjnm
VALUE '0BUS_AREA'.
IF i_step = 1.
113
4 User-Exits und BAdIs im Reporting
INTO w_sx_auth_values_iobjnm
WITH KEY iobjnm = c_attrinm_company.
IF sy-subrc = 0.
* Gesellschaft gefunden
LOOP AT w_sx_auth_values_iobjnm-ranges
INTO w_sx_auth_values_range.
IF ( w_sx_auth_values_range-sign = 'I' )
AND ( w_sx_auth_values_range-opt = 'CP' )
AND ( w_sx_auth_values_range-low = '*' ).
* Existiert eine *-Berechtigung für 0COMPANY?
* Geschäftsbereich bestimmen.
READ TABLE w_sx_auth_values_auth-values_iobjnm
INTO w_sx_auth_values_iobjnm
WITH KEY iobjnm = c_attrinm_busarea.
IF sy-subrc = 0.
* Berechtigung zum Geschäftsbereich
LOOP AT w_sx_auth_values_iobjnm-ranges
INTO w_sx_auth_values_range.
MOVE-CORRESPONDING w_sx_auth_values_range
TO l_s_range.
APPEND l_s_range TO e_t_range.
ENDLOOP. "w_sx_auth_values_iobjnm_range
ENDIF. "sy-subrc = 0
ENDIF. "*-Berechtigung für 0COMPANY
ENDLOOP. " w_sx_auth_values_iobjnm-ranges
ENDIF. "sy-subrc = 0
ENDLOOP. "w_sx_auth_values_user-auth
ENDLOOP. "v_tsx_auth_values_user
114
Variablen-Exit RSR00001 4.1
Die Implementierung dazu finden Sie in Listing 4.6. Dabei wird zuerst die
Berichtsperiode REP_PER gelesen. Anschließend wird der letzte Tag der
Berichtsperiode bestimmt. Nach den Vorgaben der Tabelle 4.1 wird dann
der Rückgabewert bestimmt.
115
4 User-Exits und BAdIs im Reporting
EXPORTING
I_GJAHR = l_d_year
I_PERIV = i_periv
IMPORTING
E_DATUM = l_d_datum
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
* Nicht bestimmbar (aber Periode war
* bestimmbar?) => Default setzen
l_s_range-low = 'ACT'.
ELSE.
IF l_d_datum > sy-datum.
* Geschäftsjahr noch nicht begonnen
l_s_range-low = 'PLN'.
ELSE.
l_s_range-low = 'PRE'.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
ELSE.
* Variable wurde irrtümlich verwendet, sinnvollen
* Default setzen (zum Beispiel ACT)
l_s_range-low = 'ACT'.
ENDIF.
l_s_range-sign = 'I'.
l_s_range-opt = 'EQ'.
APPEND l_s_range TO e_t_range.
116
Variablen-Exit RSR00001 4.1
Bei der Bestimmung der Berechtigungen wird die Rückgabetabelle wie eine
Berechtigung aufgefasst, daher müssen auch hier die Einschränkungen wie
bei Berechtigungen berücksichtigt werden. Dementsprechend muss SIGN
immer den Wert I haben, OPT muss einen der Werte EQ oder BT annehmen.
Ausschließende Berechtigungen, zum Beispiel »alle Gehälter außer den Vor-
standsbezügen«, sind nicht erlaubt.
117
4 User-Exits und BAdIs im Reporting
Perioden liegt. Wenn ja, darf der Benutzer nur bestimmte Regionen sehen,
im Übrigen darf er alles sehen.
Die IF-Abfrage in Listing 4.7 würde normalerweise nicht direkt in die Vari-
able geschrieben, sondern in eine separate Check-Funktion ausgelagert,
eventuell sogar in einer Customizing-Tabelle hinterlegt werden. In der Praxis
würden diese Zeilen sonst regelmäßig geändert.
118