
Im vorherigen Beispiel ( So erstellen Sie Ihr erstes BAdI ) haben Sie ein BAdI definiert, eine Fallback-Klasse bereitgestellt, das BAdI instanziiert und eine BAdI-Methode aufgerufen. Außerdem haben Sie einen Erweiterungsspot bereitgestellt, der als Containier für das BadI dient.
Wie Sie bereits wissen, wird die Fallback-Klasse gewählt, wenn keine BAdI-Implementierung verfügbar ist. Da Sie bisher noch keine BAdI-Implementierung angelegt haben, wird in Ihrem Quelltextbeispiel die Methodenimplementierung der Fallback-Klasse benutzt.
In diesem Abschnitt lernen Sie, wie man eine BAdI-Implementierung anlegt. Sobald eine passende BAdI-Implementierung vorhanden ist, wird die Methode der Fallback-Klasse nicht mehr benutzt.
Bisher haben Sie die folgenden Einträge:
Das BAdI-Interface definiert einen wichtigen Teil der BAdI-Identität: Es definiert die BAdI-Methoden, die verwendet werden können.
BAdI-Definitionen und BAdI-Implementierungen haben eine Gemeinsamkeit: So wie Sie einen Erweiterungsspot als Container für Ihr BAdI benötigen, können Sie eine BAdI-Implementierung nicht bauen, ohne vorher einen entsprechenden Container angelegt zu haben.
Die Containerart für BAdI-Implementierungen heißt (einfache) Erweiterungsimplementierung. Eine einfache Erweiterungsimplementierung kann mit einer Einschränkung viele verschiedene BAdI-Implementierungen enthalten: Sie muss eindeutig einem Erweiterungsspot zugeordnet sein. Eine (einfache) Erweiterungsimplementierung kann demnach nur BAdI-Implementierungen von BAdIs enthalten, die zu dem Spot gehören, dem die einfache Erweiterungsimplementierung zugeordnet ist. Eine (einfache) Erweiterungsimplementierung kann also keine BAdI-Implementierungen enthalten, die zu einem anderen Spot gehörende BAdIs implementieren.
Aus diesem Grund müssen Sie einen Container anlegen, der eindeutig dem Erweiterungsspot zugeordnet ist, zu dem Ihre BAdIs gehören. Das entsprechende Werkzeug in SE80 bietet Ihnen dazu einen einfachen Weg:
Das folgende Fenster wird geöffnet:
Was müssen Sie hier eingeben?
Sie haben einen Container für BAdI-Implementierungen - eine Erweiterungsimplementierung - angelegt. Dieser Container ist Ihrem Erweiterungsspot eindeutig zugeordnet. Sobald die Verbindung hergestellt ist, können Sie innerhalb des Erweiterungsspots eine BAdI-Implementierung für das BAdI anlegen. Da Sie nur ein BAdI angelegt haben, müssen Sie dieses auswählen. Wenn mehrere BAdIs in Ihrem Erweiterungsspot vorhanden wären, müssten Sie nun das BAdI auswählen, das Sie implementieren möchten.
Eine (einfache) Erweiterungsimplementierung sieht in dem Werkzeug fast genau so aus wie ein Erweiterungsspot. Unter dem Register Erw.implementierungs-Elemente sehen Sie einen Baum mit den auf der rechten Seite enthaltenen BAdI-Implementierungen. Links sehen Sie die Eigenschaften der ausgewählten BAdI-Implementierungen.
Markieren Sie unter Laufzeitverhalten die Option Implementierung ist aktiv wie im oben stehenden Bild gezeigt. Im darunter liegenden Textfeld erscheint der Text Implementierung wird aufgerufen. Dies verdeutlicht Ihnen die Bedeutung der soeben von Ihnen vorgenommenen Auswahl. Weiter unten finden Sie eine Liste mit den Eigenschaften der BAdI-Definition, der Ihre BAdI-Implementierung zugeordnet ist.
Sie benötigen nun eine implementierende Klasse.
Der Class Builder wird geöffnet. Die entsprechenden Interface-Methoden sind dort bereits definiert. In Ihrem Fall benötigen Sie nur die Methode get_vat().
DATA: percent type p value 4 .
ex_amount_vat = im_amount * percent / 100 .
ex_percent_vat = percent.
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.
Das Ergebnis sind vier Prozent. Dieses Ergebnis kommt zustande, da die Fallback-Klasse nicht ausgewählt ist, wenn eine aktive BAdI-Implementierung vorhanden ist.
Um Ihr Beispiel praxisnaher zu gestalten, legen Sie noch eine Erweiterungsimplementierung an, d. h. noch einen Container. Das Implementieren von Steuern für verschiedene Länder wird sehr wahrscheinlich in verschiedenen Projekten ausgeführt, daher muss die Struktur einer (einfachen) Erweiterungsimplementierung die Projektstruktur widerspiegeln.
Sie erhalten einen Kurzdump mit der Ausnahme cx_badi_multiply_implemented.
Sie haben ein einfach verwendbares BAdI definiert, indem Sie die Markierung der Option mehrfach verwendbar aufgehoben haben. Bei der Instanziierung eines einfach verwendbaren BAdIs müssen Sie sich vergewissern, dass nur eine aktive Implementierung vorhanden ist, die nicht der Standard ist. Andernfalls treten zur Laufzeit verschiedene Ausnahmen auf.
Der nächste Schritt ist, einen Weg zu finden, wie Sie zwischen verschiedenen BAdI-Implementierungen wählen können. Dazu gibt es Filter. Weitere Informationen finden Sie unter Filter verwenden .