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.

Durch einen Erfahrungsaustausch lässt sich viel voneinander lernen. Tauschen Sie sich deshalb jetzt mit Experten auf Ihrem Gebiet aus und erweitern Sie Ihr Netzwerk! Treten Sie jetzt der exklusiven Gruppe von SAP Experten bei.

Die Verwaltung von SAP-Erweiterungen erfolgt anhand von Projekten (Transaktion CMOD).

Projektverwaltung von SAP-Erweiterungen

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.

FUNCTION EXIT_SAPLRRS0_001

Funktionsexit

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 zu I_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. Auch I_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 Beispiel ATRNAVFL an, ob es sich bei der Variablen um ein Navigationsattribut handelt. ATRTIMFL gibt an, dass dieses zeitabhängig ist. Ein weiteres wichtiges Feld ist INFOPROV, 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 sind INFOCUBE (also der Name des Providers, auf dem der Bericht ausgeführt wird) sowie COMPID (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 Feld SIGN enthält in der Regel immer ein I (include, also einschließen). Einzige Ausnahme können Selektionsoptionen sein, die auch ein E (exclude, also ausschließen) erlauben.
    • OPT – dieses Feld wird normalerweise mit EQ (equal: gleich) gefüllt. Bei Intervallen können Sie auch BT (between: zwischen) oder NB (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.

Customer Exit Variable

Verarbeitung durch Customer-Exit

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.

Customer Exit Variable Details

Exit Variable Details

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“.

Object Navigator Funktionsgruppe

Funktionsgruppe anlegen

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.

Funktionsbaustein anlegen

Funktionsbaustein anlegen

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.

Stammdaten Buchungskreis

Stammdaten Buchungskreis

Wenn nun ein Planer in der Einstiegsselektion seinen Buchungskreis auswählt und beplant, werden die Werte automatisch unter der Währung des Buchungskreises ablegt.

Währung pro Buchungskreis

Planwerte

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.
ABAP Tipps und Tricks

Jetzt anfordern!

* Pflichtfeld
 
Kein SPAM. Ich hasse Spam genau so wie du.

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

3 Kommentare

Trackbacks & Pingbacks

  1. […] Geschäftsperiode) oder 0CMONTH (aktueller Monat) aus. Diese kann man als Inspiration für eigene Customer Exit Variablen nutzen. Aber wie finden Sie den Code hinter der Variable heraus? In diesem Beitrag zeige ich Ihnen […]

  2. […] diesem Beitrag zeige ich Ihnen, wie Sie mithilfe von Customer Exit Variablen ein flexibles Berechtigungskonzept umsetzen können. So können Sie die Pflege der Berechtigungen […]

Hinterlasse einen Kommentar

An der Diskussion beteiligen?
Hinterlasse uns deinen Kommentar!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.