
Die Entwickler müssen die Umsatzsteuer für verschiedene Ledger-Einträge berechnen. Die Einträge müssen an eine Methode übergeben werden, welche die Umsatzsteuer berechnet und zurückgibt. Da die Entwickler die Höhe der Umsatzsteuer für ein bestimmtes Land nicht kennen, definieren sie ein BAdI mit der Methode get_vat. Diese Methode muss die Umsatzsteuer für einen bestimmten Wert, der an die Methode get_vat übergeben wurde, zurückgeben.
Wenn Sie ein BAdI anlegen möchten, benötigen Sie zunächst einen Container für das BAdI. Dazu müssen Sie einen (einfachen) Erweiterungsspot anlegen. Dieser ist der Container, in dem Sie Ihr BAdI entwickeln.
Sie gelangen auf das folgende Dialogfenster:
Es befindet sich nun ein BAdI in Ihrem Erweiterungsspot.
Bisher haben Sie noch kein BAdI. Sie benötigen noch ein Interface, in dem Sie die Methoden definieren können, welche die Verwendung des BAdI festlegen.
Geben Sie einen Namen für das Interface ein. Sie können einen vorhandenen Namen wählen oder einen neuen anlegen.
Der Class Builder wird geöffnet. Hier können Sie die gewünschten Methoden für Ihr BAdI anlegen. Sie müssen nur den Methodennamen get_vat und die gewünschten Parameter eintragen.
Ein BAdI-Interface muss das Interface if_badi_interface implementieren. Wenn Sie das BAdI-Interface wie oben beschrieben anlegen, ist dieses Marker-Interface bereits in das BAdI-Interface integriert.
Sie haben nun einen Erweiterungsspot und ein BAdI mit einem Interface angelegt. Bisher hat Ihr Interface eine Methode.
Sie haben nun zwar ein BAdI angelegt, dieses arbeitet jedoch noch nicht. Sie benötigen eine BAdI-Instanz, die Sie im Code aufrufen müssen. Da das BAdI nur ein Interface definiert, benötigen Sie eine Klasse, die dieses Interface implementiert.
Eine BAdI-Definition markiert die Stelle, an der ein Objekt-Plug-In eingefügt werden kann, das zur Laufzeit etwas ausführt. Sie benötigen noch ein Objekt-Plug-In, um Funktionen ausführen zu können.
Sie müssen nun ABAP-Code schreiben, um das BAdI zu verwenden. Sie benötigen eine Variable, die sich auf das BAdI beziehen kann sowie weitere Variablen, welche die eigentlichen Parameter der BadI-Methode sind.
Danach müssen Sie ein Handle für das BAdI anlegen und die BAdI-Methode get_vat aufrufen. Die entsprechenden Befehle sind GET BADI und CALL BADI.
DATA: handle TYPE REF TO z_badi_calc_vat,
sum TYPE p,
vat TYPE p,
percent TYPE p.
sum = 50.
GET BADI handle.
CALL BADI handle->get_vat
EXPORTING im_amount = sum
IMPORTING ex_amount_vat = vat
ex_percent_vat = percent.
WRITE: 'percentage:', percent, 'VAT:', vat.
Wenn Sie das Programm an dieser Stelle ausführen, erzeugt es einen Dump. Der Grund dafür ist, dass exakt eine aktive Implementation für ein einfach verwendbares BAdI vorhanden sein muss. Durch Abfangen der Ausnahme cx_badi_not_implemented können Sie den Fehler behandeln.
Der bessere Weg ist jedoch, eine Fallback-Klasse zu benutzen. Eine solche Klasse wird benutzt, wenn keine aktive BAdI-Implementierung vorhanden ist.
Der Befehl GET BADI liefert ein Handle auf eine Instanz der Fallback-Klasse, und der Befehl CALL BADI ruft die Methoden der Fallback-Klassen-Instanz auf. Sobald eine aktive BAdI-Implementierung vorhanden ist, wird die Fallback-Klasse nicht mehr zur Laufzeit verwendet.
Eine Fallback-Klasse hat gleichzeitig zwei Funktionen:
Um eine Fallback-Klasse hinzuzufügen, gehen Sie folgendermaßen vor:
Die entsprechende Methode des BAdI-Interface wird automatisch definiert. Sie müssen sie nur implementieren:
DATA: percent TYPE p VALUE 20.
ex_amount_vat = im_amount * percent / 100 .
ex_percent_vat = percent.
Das Ergebnis sollte folgendermaßen aussehen:
percentage: 20 VAT: 10.
Nächster Schritt: BAdIs implementieren und Filter benutzen