Koexistenz von BAdI RSROA_VARIABLES_EXIT_BADI und Customer-Exit EXIT_SAPLRRS0_001

Im Blog BAdI RSROA_VARIABLES_EXIT_BADI habe ich aufgezeigt wie Exit-Variablen unter Verwendung des BAdI RSROA_VARIABLES_EXIT_BADI verarbeitet werden können.

In diesem Blog will ich nun auf die Koexistenz von BAdI und Customer-Exit eingehen.

Zunächst sollte man immer überlegen, benötige ich den neuen technischen Weg den SAP mir hier zur Verfügung stellt oder kann ich auch mit dem (Customer-Exit) Leben!?

1.1 Strukturierung des Customer-Exits

Der Customer-Exit für BEx Variablen war schon immer ein guter Kandidat für unstrukturiertes, umfangreiches und historisch (häufig auch hysterisch) gewachsenes Coding. Das liegt zum einen daran, dass der Exit (Include ZXRSRU01) in der Regel von viele unterschiedliche Entwickler (häufig auch kurzfristig eingekaufte externe Berater) mit unterschiedlichen Programmieransichten (Funktional oder Objektorientier) bearbeitet wird. Nicht selten bringen diese ihre Verfahren und Ansätze zur Strukturierung des Customer-Exits (Aufruf dynamischer Funktionsbausteine / Methoden, Schachtelung von Includes, …) aus anderen Projekten mit ein.

Ein weiterer Grund der eine Strukturierung des Customer-Exits so kompliziert macht ist die Verschachtelung von zwei Fallunterscheidungen. Zum einen muss nach dem aktuellen Prozessschritt, dem I_STEP, und zum anderen nach der zu verarbeitenden Variable unterschieden werden. Diese verschachtelte Verzweigung macht nahezu unmöglich den Exit zu strukturieren.

Aus diesem Grunde haben sich bei Kunden inzwischen eine Menge unterschiedlicher Verfahren entwickelt wie man dem Problem begegnen kann. Folgende Verfahren findet man in der Praxis (teilweise leicht modifiziert):

–       Verschachtelte Includes

Die Implementierungen der einzelnen Fachbereiche werden hierbei in Includes ausgelagert und der Include ZXRSRU01 enthält nur noch die einzelnen Fachbereich-spezifischen Includes.

–       Dynamischer Aufruf von Funktionsbausteinen

Für jede Variable wird ein Funktionsbaustein angelegt. Mittels festgelegter Namenskonvention kann der Name des Funktionsbausteins aus dem Namen der Variablen abgeleitet und somit dynamisch aufgerufen werden.

–       Dynamischer Aufruf von Methoden von ABAP-OO Klassen

Für jede Variable wird eine Methode angelegt. Mittels festgelegter Namenskonvention kann der Name der Methode aus dem Namen der Variablen abgeleitet und somit dynamisch aufgerufen werden. Analog zum Verfahren beim Funktionsbaustein. Bei diesem Verfahren werden die fachlich zusammengehörenden Variablen / Methoden häufig in einer Klasse zusammengefasst. Das macht die Verknüpfung der Variablen mit der entsprechenden Methode zwar etwas aufwändiger hat aber den Vorteil, dass Hilfsmethoden in der Klasse leicht wiederverwendet werden können.

Häufig haben Kunden viel Arbeit in die Entwicklung eines solchen Konzeptes investiert und eine Migration in Richtung des BAdI RSROA_VARIABLES_EXIT_BADI wird durch diese Verfahren erschwert. Darum ist es wichtig, dass zunächst geklärt ist ob die Verwendung des neuen BAdI auch soviel Mehrwert bringt, dass sich der Migrationsaufwand lohnt.

Um zu verstehen wo der Mehrwert der Verwendung des BAdI’s gegenüber dem Customer-Exit liegt will ich hier die Verwendung und die interne Verarbeitung von Exit-Variablen und das zusammenspeil von dem BAdI RSROA_VARIABLES_EXIT_BADI und dem Customer-Exit noch einmal kurz beschreiben.

1.2     Interne Verarbeitung von Exit-Variablen

Um den internen Verarbeitungsprozess zu verstehen ist es zunächst notwendig zu verstehen wie der BAdI RSROA_VARIABLES_EXIT_BADI funktioniert.

Bei dem BAdI RSROA_VARIABLES_EXIT_BADI handelt es sich um einen „neuen“ BAdI. Neue BAdIs sind in Erweiterungsspots organisiert. Da in der Regel der BAdI Name und nicht der Erweiterungsspots bekannt sind steige ich immer über den BAdI Builder (Transaktion SE18) zur Bearbeitung von BAdI Implementierungen ein.

Des Weiteren ist der BAdI RSROA_VARIABLES_EXIT_BADI ist ein Filter basierter BADI. Als Filter verwendet der BAdI das InfoObjekt das die Basis für die BEx Variable bildet.

Figure 1.1 zeigt auf der linken Seite den SAP Code zur Verarbeitung von Variablen. Handelt es sich bei der aktuell zu verarbeitenden Variablen um eine Exit-Variable wird mittels

GET BADI variable_exit
  FILTERS           
    iobjnm = i_iobjnm.

geprüft ob eine aktive BAdI Implementierung existiert bei der die Filtereinstellungen mit dem InfoObjekt-Namen übereinstimmen. Das heißt der aufrufende Prozess, innerhalb der SAP Standard Variablenverarbeitung, prüft über das BAdI Framework ob für einen Filterwert eine aktive BAdI Implementierung existiert.

Wird eine aktive BAdI Implementierung gefunden wird PROCESS Methode der Klasse der BAdI Implementierung aufgerufen:

CALL BADI variable_exit->process         
  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         
  CHANGING           
    c_t_range     = e_t_range           
    c_no_screen   = e_no_screen           
    c_check_again = e_check_again           
    c_s_customer  = c_s_customer.

Die Definition des BAdIs RSROA_VARIABLES_EXIT_BADI erlaubt mehr als eine aktive Implementierung (Multible Use) zu einem Filterwert. Findet das BAdI Framework für einen Filterwert mehrere aktive Implementierungen werden alle nacheinander ausgeführt. Hierbei ist die Reihenfolge unbestimmt.

RSROA_VARIABLES_EXIT_BADI_01

Figure 1.1: Verarbeitung von Exit-Variablen

1.2      Standard Implementierung

Neben der BAdI RSROA_VARIABLES_EXIT_BADI Definition liefet SAP im Standard auch eine aktive BAdI Implementierung (SMOD_EXIT_CALL) aus. Der Filterwert ( IOBJNM <> ‘‘ OR IOBJNM = ‘‘ ) dieser Implementierung ist so definiert, dass diese BAdI Implementierung immer als aktive Implementierung verwendet wird.

Die BAdI Implementierung SMOD_EXIT_CALL ist in Release 7.30 als Default Implementation gekennzeichnet. Das hat zur Folge, dass diese Implementierung nur aufgerufen wird wenn keine andere aktive Implementierung gefunden wird. Hierbei muss beachtet werden, dass der Filterwert bei der Ermittlung der aktiven Implementierungen berücksichtigt wird.

Ich will das an einem kleinen Beispiel veranschaulichen. Im Rahmen eines Migrationsprojektes wollen wir die Verarbeitung der Exit-Variablen von der Verarbeitung im Customer-Exit auf die BAdI basierte Variante umstellen. Das Migrationsprojekt kann aber auf Grund des Umfangs nicht in einem Big-Bang umgesetzt werden. So dass einige Variablen im Customer-Exit und einige im BAdI verarbeitet werden.

Variablen und Basis InfoObjekte:

–       ZTKE_TODAY (0CALDAY)

–       ZTKE_YESTERDAY (0CALDAY)

–       ZTKE_CURWEEK (0CALWEEK)

BAdI Implementierungen für Variablen und die Filter

–       SMOD_EXIT_CALL [Default Implementierung]

o   BAdI Impl.: SMOD_EXIT_CALL

o   Filter:  IOBJNM <> ‘‘ OR IOBJNM = ‘‘

–       TKE_TODAY

o   BAdI Impl.:      ZTKE_IMPL_CALDAY

o   Filter:  IOBJNM = ‘0CALDAY‘ OR IOBJNM = ‘‘

–       ZTKE_YESTERDAY

o   Verarbeitung findet im Customer-Exit statt!

Query und Variable

–       ZTKE_Q_DAY (ZTKE_TODAY)

–       ZTKE_Q_WEEK (ZTKE_CURWEEK)

–       ZTKE_Q_YDAY (ZTKE_YESTERDAY)

Verarbeitung Query ZTKE_Q_DAY

Zunächst betrachten wir die Verarbeitung im I_STEP = 1.

Beim Aufruf der Query ZTKE_Q_DAY ermittelt die Standard SAP Verarbeitung alle aktiven Implementierung zu dem Filter 0CALDAY die nicht als Default Implementierung gekennzeichnet sind.

GET BADI variable_exit         
  FILTERS           
    iobjnm = i_iobjnm.

Hier findet das BAdI Framework nur die BAdI Implementierung ZTKE_IMPL_CALDAY (Filter: IOBJNM = ‘0CALDAY‘ ).

Im I_STEP = 3 findet das BAdI Framework wieder nur die BAdI Implementierung ZTKE_IMPL_CALDAY (Filter: IOBJNM = ‘‘ ). Im I_STEP = 3 stehen alle Variablen zur Validierung (i_t_var_range) zur Verfügung. Die Parameter i_vnam und i_iobjnm sind im I_STEP = 3 initial.

Verarbeitung Query ZTKE_Q_YESTERDAY

Auch hier betrachten wir zunächst die Verarbeitung im I_STEP = 1.

Beim Aufruf der Query ZTKE_Q_YESTERDAY ermittelt die Standard SAP Verarbeitung alle aktiven Implementierung zu dem Filter 0CALDAY die nicht als Default Implementierung gekennzeichnet sind.

GET BADI variable_exit         
  FILTERS           
    iobjnm = i_iobjnm.

Hier findet das BAdI Framework nur die BAdI Implementierung ZTKE_IMPL_CALDAY (Filter è IOBJNM = ‘0CALDAY‘ )! Wir wollen aber die Verarbeitung im Customer-Exit nutzen. Dies kann der Fall sein wenn, wie in unserem Beispiel, die Verarbeitung für diese Variable noch nicht migriert haben. Weiter unten zeige ich wie dies umgesetzt werden kann.

Im I_STEP = 3 findet das BAdI Framework wieder nur die BAdI Implementierung ZTKE_IMPL_CALDAY (Filter è IOBJNM = ‘‘ ). Hier gilt das gleiche wie im I_STEP = 1.

Verarbeitung Query ZTKE_Q_WEEK

Auch hier betrachten wir zunächst die Verarbeitung im I_STEP = 1.

Beim Aufruf der Query ZTKE_Q_WEEK ermittelt die Standard SAP Verarbeitung alle aktiven Implementierung zu dem Filter 0CALWEEK die nicht als Default Implementierung gekennzeichnet sind.

GET BADI variable_exit         
  FILTERS           
    iobjnm = i_iobjnm.

Hier findet das BAdI Framework keine aktive Implementierung die nicht als Default Implementierung gekennzeichnet ist!

Die Default Implementierung SMOD_EXIT_CALL wird als aktive Implementierung verwendet.

Im I_STEP = 3 findet das BAdI Framework die BAdI Implementierung ZTKE_IMPL_CALDAY (Filter: IOBJNM = ‘‘ ).

1.3      Erkenntnis

Folgende Punkte sind zu beachten:

  • In den einzelnen Implementierungen muss der I_STEP und die aktuelle Variable geprüft werden (Verlagerter CASE)

Im Beispiel oben wird für alle Variablen die auf dem InfoObjekt 0CALDAY basieren die Implementierung ZTKE_IMPL_CALDAY als aktive Implementierung herangezogen. D.h. innerhalb der Implementierung muss analog zum Customer-Exit eine Fallunterscheidung nach der aktuell zu verarbeitenden Variable unterschieden werden. Die Fallunterscheidung wird hier in der Regel mit Hilfe der CASE Anweisung umgesetzt.

  • I_STEP 0,1,2 und dem Sonderfall I_STEP = 3

Analog zum Variablennamen muss innerhalb der Implementierungen der I_STEP unterschieden werden.

Der I_STEP = 3 stellt hier einen Sonderfall da. Im I_STEP = 3 stehen alle Variablen zur Validierung zur Verfügung und die Parameter I_VNAM und I_IOBJNM sind initial. D.h. eine Fallunterscheidung nach dem Variablennamen ist hier nicht möglich.

Bei der Verarbeitung des I_STEP = 3 werden alle BAdI Implementierungen als aktive Implementierungen aufgerufen die im Filter IOBJNM = ‘‘ enthalten. D.h. es muss hier eine Unterscheidung nach der aktuell zu verarbeitenden Query erfolgen. Die aktuelle Query kann aus der Komponente COMPID der Struktur I_S_RKB1D ermittelt werden.

  • Mit Release 7.30 ist es nicht ohne weiteres Möglich eine BAdI Implementierung und parallel den Customer-Exit zu nutzen
  • Ab Release 7.40 SPS09 können BAdI und Customer-Exit ohne weiteres parallel verwendet werden. Für 7.40er Systeme vor SPS09 muss der Hinweis 2036773 implementiert werden

2      Koexistenz mit Release 7.30

In einem SAP BW /.3 System können der BAdI RSROA_VARIABLES_EXIT_BADI und der Customer-Exit EXIT_SAPLRRS0_001 nicht ohne weiteres parallel betrieben werden, siehe Beispiel oben. Um sicher zu stellen, dass der Customer-Exit immer durchlaufen wird ist es notwendig hierfür eine eigene BAdI Implementierung an zu legen. Für die BAdI Implementierung werden die Filterwerte analog zur SAP Standard Implementierung festgelegt.

Figure 2.1 zeigt eine BAdI Implementierung zum aufrufen des Customer-Exits.

BAdI-Implementierung

Figure 2.1: BAdI Definition für Customer-Exit

Figure 2.2 zeigt die Filterwerte der BAdI IMplementierung.

BAdI-Filter

Figure 2.2: Filterwerte der BAdI Implementierung

Listing 2.1 zeigt die Implementierung der PROCESS Methode der BAdI Implementierung. Innerhalb der Implementierung wird der Aufruf an den Customer-Exit weitergereicht. Hierbei ist zu beachten dass sichergestellt werden muss dass eventuell bereits ermittelte Wert nicht wieder gelöscht werden.

Der Parameter E_T_RANGE des Funktionsbausteins ist ein reiner Export Parameter, d.h. wenn der Parameter C_T_RANGE bereits in einer anderen BAdI Implementierung gefüllt wurde muss dieser Wert vor dem Aufruf des Exits gesichert werden.

METHOD if_rsroa_variables_exit_badi~process.   
  DATA: lt_range_tmp TYPE rsr_t_rangesid.   

  IF c_t_range IS NOT INITIAL.     
    APPEND LINES OF c_t_range TO lt_range_tmp.   
  ENDIF.   

  CALL FUNCTION 'EXIT_SAPLRRS0_001'     
    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     = c_t_range 
*  E_MEEHT       =
*     E_MEFAC       =
*     E_WAERS       =
*     E_WHFAC       =       
     e_no_screen   = c_no_screen       
     e_check_again = c_check_again     
   CHANGING       
     c_s_customer  = c_s_customer.   
   
  IF lt_range_tmp IS NOT INITIAL.     
    APPEND LINES OF lt_range_tmp TO c_t_range.   
  ENDIF.

ENDMETHOD.

Listing 2.1: Implementierung der PROCESS Methode

Veröffentlicht unter SAP | Verschlagwortet mit , , , , , | Schreib einen Kommentar

Der Countdown läuft

Veröffentlicht unter Sport | Schreib einen Kommentar

Auch dieses Jahr wird es wieder schmutzig

http://toughmudder.de/events/berlin-brandenburg-2014/?lang=de

Veröffentlicht unter Sport | Schreib einen Kommentar

BAdI RSROA_VARIABLES_EXIT_BADI

Zur Prüfung und Manipulation von Exit-Variablen stand bisher nur Erweiterung RSR00001 (Customer-Exit globale Variablen im Reporting), Transaktion SMOD, zur Verfügung. Über den Funktionsbaustein EXIT_SAPLRRS0_001 kann hier zur Laufzeit (Ausführungszeit eines Berichtes) mittels ABAP Programmierung auf die Variablenwerte zugegriffen und diese ggf. angepasst werden. Der Funktionsbaustein EXIT_SAPLRRS0_001 ruft den Include ZXRSRU01, der im Kundennamensraum liegt auf.

Im Rahmen der Verarbeitung muss neben dem Namen der Variablen (I_VNAM) noch der Ausführungszeitpunkt (I_STEP) unterschieden werden. Diese doppelte Verschachtelung führt sehr schnell zu unübersichtlichen und unstrukturierten Quelltext.  Typische Ansätze sind hier:

  • Verschachtelter Einsatz zweier CASE (I_VNAM und I_STEP) Anweisung
  • Kombination von CASE (I_VNAM) und IF ELSEIF (I_STEP) Anweisungen
  • Auslagerung von Sourcecode durch den Einsatz von Includes, dynamischen Funktionsbausteinen, dynamische Methodenaufrufe in ABAP-OO Klassen

Mit  BW 7.3 liefert SAP den BAdI RSROA_VARIABLES_EXIT_BADI (BADI zum Füllen von Variablen) aus. Der BAdI ist dem Customer Exit vorgeschaltet, das heißt der BAdI ruft den Customer Exit auf. Abbildung 1.1 zeigt die Aufrufreihenfolge und die Verwendung des BAdI’s in Kombination mit dem Customer Exit und BAdI Implementierungen durch den Kunden.

 BAdU RSROA_VARIABLES_EXIT_BADI Aufruf
Abbildung 1.1 BAdI RSROA_VARIABLES_EXIT_BADI Aufruf und Verwendung

Der SAP Standard Variablen Verarbeitungsprozess ermittelt über den Befehl GET BADI alle aktiven BAdI Implementierungen.

Bei dem BAdI RSROA_VARIABLES_EXIT_BADI handelt es sich um einen filterbasierten BAdI. Als Filter Objekt verwendet der BAdI das InfoObjekt auf dem die Variable basiert die aktuell prozessiert wird.

Achtung: Im I_STEP 3 haben wir keine eindeutige Variable und somit auch keinen eindeutigen InfoObjekt Namen. Der BAdI wird in den I_STEPs 0, 1 und 2 pro Variable aufgerufen. Eine Variable basiert immer auf einem Merkmal. Im I_STEP 3 stehen alle Variablen des aktuellen Berichtes in Form eines Tabellen-Parameters zur Verfügung. Wenn die BAdI Implementierung auch für die Verarbeitung im I_STEP 3 genutzt werden soll muss der Filter um den Wert IOBJNM = ‘‘ erweitert werden.

Die BAdI Klasse, die alle aktiven Implementierungen ermittelt, ermittelt zunächst alle aktiven Implementierungen des BAdI und stellt zusätzlich sicher, dass die Filterwerte der BAdI Implementierung mit den aktuell prozessierten Werten übereinstimmen.

Anschließend wird von jeder aktiven Implementierung eine Instanz erzeugt und mit dem Befehl CALL BADI die Methode IF_RSROA_VARIABLES_EXIT_BADI~PROCESS der einzelnen Implementierungen aufgerufen.

SAP liefert mit der BAdI Definition direkt die Default Implementierung SMOD_EXIT_CALL. Diese Implementierung ist aktiv und hat als Filterkombination IOBJNM = ‘‘ OR IOBJNM <> ‘‘. Die Filterkombination ist so gewählt, dass die BAdI Implementierung für alle I_STEP (0, 1, 2 und 3) als aktiv gewertet wird. Die Default BAdI Implementierung hat die Aufgabe den Customer Exit  (Funktionsbaustein) EXIT_SAPLRRS0_001 der Erweiterung RSR00001 aufzurufen, siehe Abbildung 1.1. Der Aufruf des Customer Exit erfolgt nur wenn die Komponente in der Erweiterung aktiv ist.

Es Empfiehlt sich die Verwendung von BAdI und Customer Exit nicht zu mischen.

Die Schnittstelle der Methode PROCESS des BAdI Interfaces ist identisch mit der Schnittstelle des Funktionsbausteins EXIT_SAPLRRS0_001 des Customer Exit. Das heißt der Quelltext des Customer Exit kann vollständig übernommen werden, dies reduziert den Migrationsaufwand.

Achtung: Eine Migration ist nicht notwendig! Der Customer Exit bleibt weiter bestehen. Mit dem BAdI stellt SAP eine zusätzliche parallele Objektorientierte Möglichkeit für die Verarbeitung von Exit Variablen zur Verfügung. Vorteil der BAdI Variante gegenüber dem Customer Exit ist die besser Strukturierung und Verwaltung der Implementierungen.

Bei dem BAdI RSROA_VARIABLES_EXIT_BADI handelt es sich um einen BAdI der neuen BAdI Technologie, das heißt der BAdI ist in einem Erweiterungsspot organisiert.

Im Folgenden will ich kurz die einzelnen Schritte aufzeigen die notwendig sind um eine Implementierung für eine Variable anzulegen. Für das Beispiel habe ich eine Variable (ZTKE_FISCPER) basierend auf dem Merkmal 0FISCPER angelegt. Die Variable ist vom Typ Customer Exit und hat als Selektionsmöglichkeit Selektions-Option.

Für das Anlegen einer BAdI Implementierung der neuen BAdI Technologie, existieren mehrere Wege.

  1. Über die BAdI Definition (Transaktion SE18)
  2. Über die BAdI Implementierung (Transaktion SE19)
  3. Über die ABAP Workbench (Transaktion SE80)

Für 3. Benötigen wir als Einstieg den Namen des Entwicklungspaketes den wir zunächst nicht haben. Für 1) und 2) benötigen wir lediglich den Namen der BAdI Definition. Da wir zunächst nur den Namen der BAdI Definition (RSROA_VARIABLES_EXIT_BADI) haben  empfiehlt sich der Weg über die SE18, siehe Abbildung 1.2.

Abbildung 1.2 Anlegen einer neuen BAdI Implementierung- Schritt 1

Zur Anzeige der BAdI Definition wechselt die Ansicht von der SE18 automatisch in die SE80 und öffnet dort den Erweiterungsspot RSROA_VARIABLES_EXIT. Durch klicken auf  (siehe Markierung in Abbildung 1.2.) kann eine neue BAdI Implementierung angelegt werden.

Eine BAdI Implementierung kann nicht direkt innerhalb einer BAdI Definition angelegt werden. Hierzu muss zunächst eine Erweiterungsimplementierung angelegt werden. Abbildung 1.3 zeigt in (1) den Dialog zur Auswahl einer Erweiterungsimplementierung. Nach Auswahl der Erweiterungsimplementierung kann innerhalb dieser die BAdI Implementierung angelegt werden, siehe (2).

BAdI Implementierung anlegen II
Abbildung 1.3 Anlegen einer neuen BAdI Implementierung – Schritt 2

(3) zeigt die Definition der Filterwerte in der neu angelegten BAdI Implementierung.

Anschließend kann die Implementierung der Methode PROCESS erfolgen, siehe (1) in Abbildung 1.4.

BAdI Implementierung anlegen III
Abbildung 1.4 Anlegen einer neuen BAdI Implementierung – Schritt 3

Nachdem die Implementierung abgeschlossen ist muss noch sichergestellt werden, dass alle beteiligten Objekte aktiv sind. Folgende Objekte müssen aktiviert werden:

  • ABAP-OO Klasse
  • BAdI Implementierung
  • Erweiterungsimplementierung

Bei aktivieren der ABAP-OO Klassen muss darauf geachtet werden, dass die gesamte Klasse aktiv ist. Beim aktiveren einer Methode wird lediglich die Deklaration und die Definition der Methode nicht aber die ABAP Klasse selbst aktiviert. Darum empfehle ich beim Aktivieren auf die Klassenebene zu wechseln (Goto è Class Definition).

Nachdem alles aktiviert  ist kann das Verhalten der Variablen über eine BEx Query getestet werden.

Veröffentlicht unter SAP | Schreib einen Kommentar

Veröffentlichungen hinzugefügt

Seite Veröffentlichungen hinzugefügt!

Veröffentlicht unter Uncategorized | Schreib einen Kommentar

BEx webbasierten Variablendialog kundenindividuell anpassen

1      Einführung

Die Möglichkeiten der Anpassung des Variablendialoges eines webbasierten Berichtes waren bisher stark eingeschränkt. Über Parameter des WebTemplate und mit Hilfe der Web Design API kann das zwar das Verhalten des WebTemplates bezüglich der Variablen beeinflusst werden aber nicht das Layout und die Verarbeitungslogik der Eingabe.

 SAP_Standard_Variable_Dialog
Abbildung 1.1: SAP Standard Variable Dialog

Mit dem Patch NW730 BI JAVA SP08 Patch 30 (siehe auch Hinweis 1622306) bietet SAP eine Möglichkeit das Layout und die Verarbeitungslogik für folgende Dialoge, bezüglich der Variablenverarbeitung,  anzupassen:

  • Variablendialog
  • Dialog für die F4 Hilfe einzelner Variablen
  • Filterdialog einzelner Merkmale

Für die kundenindividuelle Anpassung des Variablendialoges stehen zwei alternative Wege zur Verfügung:

  • Kundenindividuelle Formatierung und Positionierung
  • Kundenindividuelles Layout und Verarbeitungslogik

Das Prinzip der Implementierung ist für alle Arten der Anpassung identisch. Über ein Web Item vom Typen Individuelle Erweiterung wird der BEx Web-Laufzeitumgebung ein HTML und/oder JavaScript Codesegment (Snipplte) übergeben. Die BEx Web-Laufzeitumgebung ersetzt den SAP Standard Code durch die übergebenen Codesegmente. Damit die BEx Web-Laufzeitumgebung diesen Ersetzungsprozess durchführt müssen bestimmte Rahmenbedingungen erfüllt sein.

Ich gehe weiter unten noch im Detail auf die Implementierung ein.

2      Kundenindividuelle Formatierung und Positionierung

Die erste Möglichkeit den Variablendialog kundenindividuell anzupassen ist, die einzelnen Elemente des Variablendialoges kundenindividuell zu Positionieren. Zur Bestimmung der Positionen der einzelnen Elemente können beliebige HTML Tags verwendet werden. Für die einzelnen Elemente stehen Muster (Pattern) zur Verfügung die innerhalb eines kundenindividuellen HTML Textes platziert werden können.

Folgende Elemente stehen zur Verfügung:

  • Bereich Varianten
  • Bereich Personalisieren
  • Jede einzelne Variable des Berichtes
  • OK-Button
  • Check-Button

Die Pattern werden als individuelle XML-Tags im kundenindividuelle HTML Coding platziert. Die BEx Web-Laufzeitumgebung erkennt die Pattern und ersetzt sie durch das benötigte Coding.

Abbildung 2.2 zeigt in (1) einen angepassten Variablendialog in dem die Bereiche Varianten und Personalisieren so wie die Button OK und Check analog zum Standard Variablendialog positioniert wurden. Die Variablen wurden unterteilt in zeitbezogene Variablen und nicht zeitbezogene Variablen. Um diese Gliederung besser hervorzuheben wurde für die einzelnen Typen jeweils eine eigene Gruppe erzeugt.

customer_individual_variabledialog
Abbildung 2.1: Kundenindividuelle Formatierung und Positionierung

Die Anpassung in (2) zeigt die Verwendung von komplexeren HTML Komponenten. Hier werden nur die zeitbezogenen Variablen direkt dargestellt und alle weiteren Variablen werden über einen Tray ausgeblendet. Hierdurch kann der Variablendialog für Berichten mit sehr vielen Variablen übersichtlicher gestaltet werden und somit der Bedienungskomfort erhöht werden.

Die Implementierung der hier verwendeten Tray Komponente erfolgt rein über HTML und JavaScript und Bedarf keinen Round-Trip.

Diese Darstellung könnte auch über eine Personalisierung erreicht werden, die könnte aber nicht zentral gesteuert werden.

3      Kundenindividueller Variablendialog

Eine weitere Möglichkeit den Variablendialog anzupassen ist es das Layout und die Verarbeitungslogik für die einzelnen Variablen kundenindividuell zu gestalten.

Bei dieser Variante wird nicht das SAP Standard HTML Coding des gesamten Variablendialoges durch kundenindividuelles HTML Coding ersetzt sondern nur die Bereiche für die Eingabe der Variablenwerte. Im Variablendialog in Abbildung 3.1 wurde das SAP Standard HTML Coding für die beiden Variablen Current Yera Period und Previous Year Period durch kundenindividuelle HMTL Coding ersetzt.

customer_individual_variabledialog_2
Abbildung 3.1: Kundenindividueller Variablendialog

Für die Beispielimplementierung in Abbildung 3.1 wurde neben der sehr individuellen Oberfläche zur Eingabe einer Periode noch zusätzliches JavaScript Coding hinterlegt, über das eine Abhängigkeit der beiden Variablen Current Yera Period und Previous Year Period implementiert wurde.

Validierung und Anpassung von Variablenwerten

Bei der Eingabe eines Periodenwertes für eine der beiden Variablen wird automatisch geprüft ob der Variablenwert der anderen Periode, nach kundenspezifischen Regeln, noch gültig ist. Ist dies nicht der Fall wird der Wert entsprechend der Regeln direkt angepasst.

Eine solche Validierung und Anpassung ist ohne diese Erweiterung nicht möglich, da es im Customer Exit im I_STEP 3 nicht möglich ist die Werte des Anwenders zu überschreiben.

Analog zur Implementierung eines kundenindividuellen Variablendialoges muss auch hier über ein Web Item vom Typen Individuelle Erweiterung der SAP Standard HTML Code ersetzt werden. Bei dieser Variante muss für jede Variable ein Web Item vom Typen Individuelle Erweiterung im WebTemplate hinterlegt werden.

Für die Implementierung des kundenspezifischen HTML Coding werden für einige HTML Elemente auch hier Pattern zur Verfügung gestellt. Für folgende HTML Elemente stehen Pattern zur Verfügung:

  • Input Feld
  • Dropdown-Box
  • Label

Die Pattern dienen der Erleichterung zur Erstellung eines Portal Layout konformen HTML Codes, sie müssen aber nicht zwingend verwendet werden.

Einige Eigenschaften der Erweiterung können über die Parameter des Web Item vom Typen Individuelle Erweiterung im WebTemplate angepasst werden.

Bei jeder Erweiterung wird zusätzlich, durch die BEx Web-Laufzeitumgebung, ein Standard Variablen Eingabefeld in das Layout hineingeneriert. Über die Web Item Parameter können Sie steuern ob das Eingabefeld oberhalb oder unterhalb des kundeneigenen Layouts dargestellt werden soll.

Standard Eingabefeld

Mit Hilfe von JavaScript ist es auch möglich das Standard Eingabefeld auszublenden. Wichtig ist aber das es innerhalb der HTML Seite verfügbar ist. Auch der Button für die F4-Wertehilfe kann mit Hilfe von JavaScript ausgeblendet werden wenn dies nicht benötigt wird.

Ziel der Implementierung ist es dieses Eingabefeld mit dem Variablenwert zu füllen.

Layout

In der aktuellen Version müssen gerade in Bezug auf das Layout noch einige Anpassungen vorgenommen werden. Dies gilt zum Beispiel für die Breite des Variablendialoges, die Höhe der Zeile in der eine kundenindividuelle Anpassung eingebettet wird und die Positionierung des Standard Eingabefeldes für den Variablenwert.

4      Kundenindividuelle F4- und Filterdialoge

Eine weitere Möglichkeit der Variablendarstellung ist die kundenindividuelle Anpassung der F4- und Filterdialoge. Abbildung 4.1 zeigt zwei unterschiedliche Implementierungen zu einem F4 Wertehilfedialog für die Variable ZTK_0I0DAYS. Im oberen Beispiel werden die Werte einer Bezugsperiode mit angezeigt.

Abhängigkeiten zwischen Variablen

Der F4-Wertehilfe-Dialog steht dient explizit für eine Variable. Bei dieser Variante ist es nicht möglich die Werte einer anderen mit zu beeinflussen. Technisch gesehen enthält der Dialog ein zusätzliches Eingabefeld das den Wert der Variablen enthält. Dieses Feld ist genau der Variablen zugeordnet. Der Wert dieses Feldes wird beim Schließen des Dialoges über den OK-Button dem Variablendialog für genau diese Variable übergeben. Die Erweiterung ersetzt lediglich das HTML Coding innerhalb des F4-Wertehilfedialoges.

customer_individual_F4_and_filterdialog
Abbildung 4.1: Kundenindividueller F4- und Filterdialog

Für jeden Dialog muss ein eigenes Web Item vom Typen Individuelle Erweiterung im WebTemplate bereitgestellt werden. Hierbei ist es möglich die Implementierung wiederzuverwenden. Sie wollen einen individuellen F4-Wertehilfedialog für die Variabel 0I_CALMONTH (basiert auf 0CALMONTH) Implementieren. Gleichzeitig möchten Sie aber auch, dass wenn der Anwender im Bericht einen Filter auf das Merkmal 0CALMONTH anwendet der Filterdialog das analoge Verhalten hat wie der F4-Wertehilfedialog. Dies können Sie erreichen in dem Sie für beide Web Item die gleiche Implementierungsklasse verwenden. Genauso gut ist es möglich unterschiedliche Dialoge zu implementieren.

5      Implementierung

Die Implementierung aller beschriebenen Erweiterungen erfolgt immer über das gleiche Prinzip. Abbildung 5.1 zeigt die Architektur der einzelnen Erweiterungen.

Architecture_SAP_Standard
Abbildung 5.1: Architektur – SAP Standard

Die Anzahl der Implementierungen des Web Item vom Typen Individuelle Erweiterung kann auf Grund der vielen Kombinationsmöglichkeiten sehr schnell ansteigen. Zu jeder  Implementierung eines Web Item vom Typen Individuelle Erweiterung gehört immer eine implementierende ABAP-OO Klasse.

Mit Hilfe eines BAdIs können die unterschiedlichen Implementierungen besser organisiert und strukturiert werden. Des Weiteren bietet die erweiterte Architektur durch das BAdI Framework die Möglichkeit Implementierungstemplates zu erstellen die den Aufwand neuer Implementierungen stark vereinfachen und verkürzen. Zusätzlich kann eine Fallback Implementierung hinterlegt werden für den Fall, dass eine Implementierung nicht verfügbar ist.

Architecture_SAP_Standard_with_BAdI
Abbildung 5.2: Architektur – SAP Standard mit BAdI

 

Veröffentlicht unter SAP | Schreib einen Kommentar

Coming soon

Dieser Blog wird aktuell überarbeitet.

Veröffentlicht unter Uncategorized | Schreib einen Kommentar