BAdI Funktion zum Runden für BPC 10.0 NW erstellen

BAdI Funktion zum Runden für BPC 10.0 NW erstellen

In diesem How-To zeige ich wie Sie Business Add-Ins (BAdIs) verwenden können um  fehlende BPC Skriptlogik Funktionalitäten hinzuzufügen. In diesem Beispiel erstelle ich eine Funktion zum Runden von Mengen. Aber Sie können das Prinzip auch auf andere Bereiche anwenden.

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.

Rufen Sie zunächst die Transaktion SE18 (BAdI-Builder – Definitionen) auf. Wählen Sie den Erweiterungssport UJ_CUSTOM_LOGIC aus. Erweiterungsspots dienen als Container für Erweiterungsoptionen.

Erweiterungsspot auswählen

Erweiterungsspot UJ_CUSTOM_LOGIC

Öffnen Sie nun die BAdI-Definition BADI_UJ_CUSTOM_LOGIC und legen Sie eine neue Implementierung an.

Neue BAdI-Implementierung erstellen

Implementierung anlegen

Geben Sie den Namen der Erweiterungs-Implementierung (hier: ZROUND) und einen Kurztext an.

Erweiterungs-Implementierung anlegen

Erweiterungsimplementierung anlegen

Geben Sie den Namen der BAdI-Implementierung (hier: ZROUND), einen Kurztext und die implementierende Klasse (hier: ZCL_BPC_ROUND) ein.

BAdI-Implementierung und Klasse anlegen

BAdI Implementierung anlegen

Wählen Sie zunächst Filterwerte aus und erstellen Sie im Änderungsmodus eine neue Kombination.

Neue Filter-Kombination anlegen

Filter-Kombination erstellen

Vergeben Sie den Filternwert ROUND. Unser BAdi wird immer dann angesprochen, wenn *START_BADI ROUND aufgerufen wird.

Filterwert ändern

Filterwert ROUND

BPC hat die folgende Syntax für Erweiterungen.

*START_BADI <filter_value_of_your_BADI_implementation>
<par1> = <value1>
<par2> = <value2>
*END_BADI

Wenn also eine Script Logic mit *START_BADI ROUND ausgeführt wird, startet unser BAdI.
Folgende Parameter werden standardmäßig (auch wenn Sie diese nicht explizit definieren) in einer *START_BADI/*END_BADI-Anweisung verwendet:
QUERY – führt die Standardabfrage durch und füllt die CT_DATA-Tabelle. Standardwert ist ON. Falls Sie eine eigene Abfrage durchführen möchten, setzen Sie diesen Parameter auf OFF.
WRITE – speichert die Daten. Standardwert ist ON. Wenn Sie eine eigene Methode zum Zurückschreiben der Daten verwenden wollen, setzen Sie diesen Parameter auf OFF.
Neben den Standardparametern können Sie auch benutzerdefinierte Parameter übergeben. Diese werden in der internen Tabelle IT_PARAM der Methode EXECUTE abgelegt und können im Coding verwendet werden.
Beispiel Skriptlogik:

*XDIM_MEMBERSET ACCOUNT = SAQTY
*XDIM_MEMBERSET CATEGORY = O01
*XDIM_MEMBERSET COMPCODE = 1000
*XDIM_MEMBERSET SAORG = 1000
*XDIM_MEMBERSET SAOFF = 
*XDIM_MEMBERSET DICHA = 
*XDIM_MEMBERSET PRODUCT = 
*XDIM_MEMBERSET INPUTCURRENCY = EUR
*XDIM_MEMBERSET TIME = BAS(2014.TOTAL)

*START_BADI ROUND
QUERY = ON //Optional, weil Standardeinstellung
WRITE = ON //Optional, weil Standardeinstellung
//Eigene Parameter
DECIMALS = 0
MODE = 2
*END_BADI

Die Tabelle CT_DATA wird unter Berücksichtigung von *XDIM_MEMBERSET gefüllt. Dabei soll die Menge (Account SAQTY) auf Null Dezimalstellen kaufmännisch gerundet werden. Einen Exkurs zu der ABAP-Anweisung ROUND finden Sie weiter unten.

Als nächstes bearbeiten wir unsere Klasse ZCL_BPC_ROUND. Die Methode EXECUTE enthält die benutzerdefinierte Logik, um eingehende Bewegungsdaten von CT_DATA zu ändern.
In meinem Code lese ich die Parameter und verwende diese um die Menge zu runden.

METHOD if_uj_custom_logic~execute.
  DATA: ls_param TYPE ujk_s_script_logic_hashentry,
        l_ref    TYPE REF TO data,
        lv_dec TYPE i,
        lv_mode TYPE i.

  FIELD-SYMBOLS: <ls_line>     TYPE any,
                 <l_keyfigure> TYPE any.

  " Read parameters
  READ TABLE it_param WITH KEY hashkey = 'DECIMALS' INTO ls_param.
  lv_dec = ls_param-hashvalue.
  READ TABLE it_param WITH KEY hashkey = 'MODE' INTO ls_param.
  lv_mode = ls_param-hashvalue.

  " Preparation: create data structure and assign fields
  CREATE DATA l_ref LIKE LINE OF ct_data.
  ASSIGN l_ref->* TO <ls_line>.

  ASSIGN COMPONENT ujr0_c_keyfigure OF STRUCTURE <ls_line> TO <l_keyfigure>.

  "Round
  LOOP AT ct_data INTO <ls_line>.
    <l_keyfigure> = ROUND( val = <l_keyfigure> dec = lv_dec mode = lv_mode ).
    MODIFY ct_data FROM <ls_line>.
  ENDLOOP.

ENDMETHOD.

Fügen Sie den Code in die Methode EXECUTE ein und aktivieren Sie Ihre Klasse sowie die Erweiterungsimplementierung.
Ihr BAdI kann nun verwendet werden.

Runden BAdI Davor und Danach

Vor und nach dem Runden


Exkurs: ABAP Anweisung ROUND
Die Anweisung ABAP hat die folgende Syntax:

round( val = arg {dec = n}|{prec = n} [mode = m] )

Der Parameter dec beschreibt auf wieviele Nachkommastellen gerundet werden soll. Wenn der Parameter prec mit einem Wert versorgt wird, wird der Eingabewert auf angegebene Präzision gerundet und zurück gegeben. Die Rundungsart wird über den Parameter mode bestimmt. Dabei können nur Werte vergeben werden, die als ROUND_ Konstante in der Klasse CL_ABAP_MATH existieren. Wenn mode nicht angegeben wird, wird automatisch kaufmännisch gerundet.
Eine Übersicht über Rundungsarten erhalten Sie wenn Sie die Transaktion SE80 aufrufen. Gehen Sie anschließen auf Repository Infosystem -> Klassenbibliothek -> Klassen/Interfaces. Wählen Sie die Klasse CL_ABAP_MATH aus und drücken Sie Ausführen (F8). Wählen Sie nun den Reiter Attribute aus.

Konstante Rundungsart Wert
ROUND_HALF_UP Es wird zum nächstliegenden gerundeten Wert gerundet. Falls der Wert genau in der Mitte zwischen zwei gerundeten Werten liegt, wird von der Null weg gerundet (kaufmännisches Runden). 2
ROUND_HALF_DOWN Es wird zum nächstliegenden gerundeten Wert gerundet. Falls der Wert genau in der Mitte zwischen zwei gerundeten Werten liegt, wird zur Null hin gerundet. 4
ROUND_HALF_EVEN Es wird zum nächstliegenden gerundeten Wert gerundet. Falls der Wert genau in der Mitte zwischen zwei gerundeten Werten liegt, wird zu dem Wert gerundet, dessen hinterste Dezimalstelle eine gerade Zahl ist. 3
ROUND_UP Es wird immer von der Null weg bzw. zum größeren Absolutwert hin gerundet. 1
ROUND_DOWN Es wird immer zur Null bzw. zum kleineren Absolutwert hin gerundet. 5
ROUND_CEILING Es wird immer in positive Richtung bzw. zum größeren Wert hin gerundet. 0
ROUND_FLOOR Es wird immer in negative Richtung bzw. zum kleineren Wert hin gerundet. 6

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:
Benutzerdefinierte Logik und BAdI
Rundungsfunktionen
Präzision
Karl-Heinz Kühnhauser, Thorsten Franz (2011): Discover ABAP, 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.

0 Kommentare

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.