Anfang des Inhaltsbereichs

Diese Grafik wird im zugehörigen Text erklärt So erstellen Sie Ihr erstes BAdI  Dokument im Navigationsbaum lokalisieren

Anwendungsfall

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

Erweiterungsspot erstellen

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.

...

       1.      Gehen Sie in die ABAP-Workbench (SE80) und öffnen Sie Ihr lokales Objekt.

       2.      Wählen Sie im Kontextmenü der lokalen Objektmappe Anlegen Erweiterung Erweiterungsspot.

Sie gelangen auf ein Dialogfenster.

       3.      Geben Sie einen Namen und einen Kurztext für den Erweiterungsspot ein.

BAdI anlegen

...

       1.      Um innerhalb des neuen Erweiterungsspots ein BAdI anzulegen, wählen Sie wie in der folgenden Abbildung gezeigt auf der linken Seite die Drucktaste BAdI anlegen.

Diese Grafik wird im zugehörigen Text erklärt

       2.      Es wird ein Dialogfenster geöffnet. Geben Sie den Namen z_badi_calc_vat und eine Kurzbeschreibung für das BAdI ein.

Es befindet sich nun ein BAdI in Ihrem Erweiterungsspot.

       3.      Entfernen Sie die Markierung der Option Mehrfach verwendbar. Für die gewünschte Kalkulation benötigen Sie ein BAdI zur Einzelverwendung.

Diese Grafik wird im zugehörigen Text erklärt

Das BAdI-Interface

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.

...

       1.      Klicken Sie auf den Pfeil vor dem Namen des BAdI.

       2.      Doppelklicken Sie auf das Symbol Interface.

Geben Sie einen Namen für das Interface ein. Sie können einen vorhandenen Namen wählen oder einen neuen anlegen.

Diese Grafik wird im zugehörigen Text erklärt

       3.      Wählen Sie die Drucktaste Ändern.

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.

Hinweis

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.

Diese Grafik wird im zugehörigen Text erklärt

       4.      Bestimmen Sie die Methodenparameter.

Diese Grafik wird im zugehörigen Text erklärt

       5.      Sichern und aktivieren Sie das Interface und den Spot.

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.

Hinweis

Eine BAdI-Definition markiert die Stelle, an der ein Objekt-Plugin eingefügt werden kann, das zur Laufzeit etwas ausführt. Sie benötigen noch ein Objekt-Plugin, um Funktionen ausführen zu können.

Quelltext schreiben

Sie müssen nun etwas 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.

Fallback-Klasse

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 Single-Use-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:

      Das Programm läuft mit einem Single-Use-BadI, ohne eine Ausnahme auszulösen.

      Die Fallback-Klasse wird automatisch nicht mehr verwendet, sobald eine BAdI-Implementierung vorhanden ist. Die Fallback-Klasse wird bedingt selektiert. Dies ist wichtig, da der BAdI-Provider meistens nicht die Details der Prozesse kennt. Darum wird ein BAdI verwendet.

Um eine Fallback-Klasse hinzuzufügen, gehen Sie folgendermaßen vor:

...

       1.      Wählen Sie die Option Rufe Fallback, falls keine Implementierung ausgeführt wird und geben Sie einen Namen für die Fallback-Klasse ein

Diese Grafik wird im zugehörigen Text erklärt

       2.      Wählen Sie Ändern. Sie gelangen wieder in den Class Builder.

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.

       3.      Sichern und aktivieren Sie die Klasse.

       4.      Gehen Sie zurück zum Enhancementspot und aktivieren Sie diesen.

       5.      Führen Sie das Programm aus.

Das Ergebnis sollte folgendermaßen aussehen:

Prozentsatz: 20 VAT: 10.

Nächster Schritt: BAdIs implementieren und Filter benutzen

 

 

 

Ende des Inhaltsbereichs