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.
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.
Öffnen Sie nun die BAdI-Definition BADI_UJ_CUSTOM_LOGIC
und legen Sie eine neue Implementierung an.
Geben Sie den Namen der Erweiterungs-Implementierung (hier: ZROUND
) und einen Kurztext an.
Geben Sie den Namen der BAdI-Implementierung (hier: ZROUND
), einen Kurztext und die implementierende Klasse (hier: ZCL_BPC_ROUND
) ein.
Wählen Sie zunächst Filterwerte aus und erstellen Sie im Änderungsmodus eine neue Kombination.
Vergeben Sie den Filternwert ROUND
. Unser BAdi wird immer dann angesprochen, wenn *START_BADI ROUND
aufgerufen wird.
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.
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.
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.
Hinterlasse einen Kommentar
An der Diskussion beteiligen?Hinterlasse uns deinen Kommentar!