Ansicht
Dokumentation

ABAPGET_BADI - GET BADI

ABAPGET_BADI - GET BADI

CL_GUI_FRONTEND_SERVICES - Frontend Services   Fill RESBD Structure from EBP Component Structure  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

GET BADI

Kurzreferenz



GET BADI ${ badi $[FILTERS f1 = x1 f2 = x2 ...$] $}
       $| ${ badi TYPE (name)
              $[ ${FILTERS f1 = x1 f2 = x2 ...$}
              $| ${FILTER-TABLE ftab$}$] $}
              $[CONTEXT con$].

Zusätze:

1. ... FILTERS f1 = x1 f2 = x2 ...

2. ... FILTER-TABLE ftab

3. ... CONTEXT con

Wirkung

Diese Anweisung erzeugt ein neues BAdI-Objekt und stellt die BAdI-Referenz auf das Objekt in eine BAdI-Referenzvariable badi. Die Anweisung hat eine statische und eine dynamische Variante:

  • Bei der statischen Variante wird der Zusatz TYPE nicht angegeben. Der statische Typ der Referenzvariable badi muss ein BAdI sein und legt das verwendete BAdI fest.
  • Bei der dynamischen Variante wird mit dem Zusatz TYPE ein eingeklammertes zeichenartiges Datenobjekt name angegeben, das bei Ausführung der Anweisung den Namen eines BAdIs enthalten muss. Der statische Typ der Referenzvariable badi muss die Oberklasse CL_BADI_BASE aller BAdI-Klassen sein.

Um Werte für die Filter des BAdIs anzugeben, können in der statischen und dynamischen Variante der Zusatz FILTERS und in der dynamischen Variante der Zusatz FILTER-TABLE angegeben werden.

Bei einem kontextfreien BAdI darf der Zusatz CONTEXT nicht angegeben werden, bei einem kontextabhängigen BAdI muss er angegeben werden.

Nach der Instanziierung wird wie folgt nach BAdI-Implementierungsklassen für das BAdI gesucht:

  1. Es werden nur BAdI-Implementierungsklassen selektiert, die einer BAdI-Implementierung zugeordnet sind, die im Zustand aktiv ist.
  2. Es werden nur BAdI-Implementierungsklassen selektiert, die einer BAdI-Implementierung, d.h. einer Erweiterung, zugeordnet sind, deren Schalter den Zustand an hat. Falls einer BAdI-Implementierung kein Schalter zugeordnet ist, wird sie wie mit einem Schalter im Zustand an behandelt.
  3. Es werden alle BAdI-Implementierungsklassen selektiert, die vorhergehenden Anforderungen genügen und bei denen die Filterbedingung ihrer BAdI-Implementierung zu den hinter FILTERS oder in ftab angegebenen Werten passt. Wenn mit der Filterangabe keine BAdI-Implementierungen gefunden werden, wird nach BAdI-Implementierungen gesucht, die als Standardimplementierung gekennzeichnet sind. Werden auch keine solchen gefunden, wird - falls vorhanden - die Fallback-BAdI-Implementierungsklasse des BAdIs verwendet.
  4. Wenn bei einem für Einzelverwendung definierten BAdI mehrere BAdI-Implementierungsklassen mit passenden Filterbedingungen gefunden wurden, wird eine Konfliktauflösung durchgeführt. Eine erfolgreiche Konfliktauflösung findet genau eine vorrangige konfliktauflösende Erweiterungsimplementierung und nur deren BAdI-Implementierungsklasse wird selektiert. Wenn mehrere konfliktauflösende Erweiterungsimplementierungen den Vorrang haben oder wenn es keine konfliktauflösende Erweiterungsimplementierung gibt, ist keine korrekte Konfliktauflösung möglich und es bleiben mehrere BAdI-Implementierungsklassen in der Treffermenge bestehen.

Wenn die resultierende Treffermenge zur Definition des BAdIs passt, d.h.:

  • bei einem für Einzelverwendung definierten BAdI muss die Treffermenge genau eine BAdI-Implementierungsklasse enthalten,
  • bei einem für Mehrfachverwendung definierten BAdI darf die Treffermenge mehrere oder keine BAdI-Implementierungsklassen enthalten,

werden Referenzen auf Objekt-Plugins der gefundenen BAdI-Implementierungen im BAdI-Objekt gespeichert. Noch nicht vorhandene Objekt-Plugins werden hierfür erzeugt. Ob ein bereits vorhandenes Objekt-Plugin erzeugt wiederverwendet oder ob ein neues Objekt-Plugin erzeugt wird, richtet sich danach, ob das BAdI kontextfrei oder kontextabhängig ist und nach dem Zusatz CONTEXT. Die genaue Semantik ist dort beschrieben.

Wenn die Treffermenge keine oder mehrere BAdI-Implementierungen enthält, obwohl das BAdI für die Einzelverwendung definiert ist, kommt es zu einer Ausnahme. Falls die BAdI-Referenzvariable badi im Ausnahmefall vor der Anweisung bereits eine gültige BAdI-Referenz enthielt, bleibt diese bestehen, ansonsten wird sie initialisiert.

Hinweise

  • Über BAdI-Referenzen kann nicht direkt auf BAdI-Objekte zugegriffen werden. Sie dienen ausschließlich dem Aufruf der BAdI-Methoden in den referenzierten Objekt-Plugins mit der Anweisung CALL BADI. Ansonsten können BAdI-Referenzvariablen an den gleichen Operandenpositionen wie normale Objektreferenzvariablen verwendet werden. Insbesondere sind also Zuweisungen und Vergleiche möglich.
  • Die Methode NUMBER_OF_IMPLEMENTATIONS der Klasse CL_BADI_QUERY gibt die Anzahl der BAdI-Implementierungen zurück, die in einem BAdI-Objekt gespeichert sind.
  • Um die Ausnahme für BAdIs, für die Einzelverwendung definiert ist, in Systemen zu verhindern, in denen keine entsprechende Erweiterung vorgenommen wird, empfiehlt es sich für solche BAdIs eine Fallback-BAdI-Implementierungsklasse anzugeben. Die Fallback-BAdI-Implementierungsklasse gehört zum BAdI und ist unabhängig von Erweiterungen.
  • Um direkt auf Objekt-Plugins zugreifen zu können benötigt man, entsprechende Referenzen. Diese können beispielsweise von BAdI-Methoden zurückgeliefert werden.
  • Um die eventuellen Instanzereignisse eines BAdIs zu behandeln, kann nicht die BAdI-Referenz verwendet werden. Statt dessen muss bei der Registrierung der Ereignisbehandler mit SET HANDLER entweder der Zusatz FOR ALL INSTANCES oder direkt eine Referenz auf ein Objekt-Plugin angegeben werden

Zusatz 1

... FILTERS f1 = x1 f2 = x2 ...

Wirkung

Hinter dem Zusatz FILTERS müssen elementare Datenobjekte x1, x2, ... für alle Filter f1, f2, ... des BAdIs angegeben werden. Wenn ein Filter im BAdI die Eigenschaft konstanter Filterwert beim Aufruf hat, können nur Literale und Konstanten angegeben werden. Die Datenobjekte müssen kompatibel zum Datentyp der Filter sein. Für ein BAdI ohne Filter darf FILTERS nicht angegeben werden.

Zusatz 2

... FILTER-TABLE ftab

Wirkung

Dieser Zusatz ordnet mit Hilfe der speziellen internen Tabelle ftab den Filtern eines dynamisch angegebenen BAdIs Werte zu. Die interne Tabelle muss den Tabellentyp BADI_FILTER_BINDINGS aus dem ABAP Dictionary haben. Die Tabelle muss bei Ausführung der Anweisung GET BADI für jeden Filter des BAdIs genau eine Zeile enthalten. Die Spalten der Tabelle sind:

  • NAME vom Typ c der Länge 30
für den Namen des Filters in Großbuchstaben. Die Angabe eines nicht vorhandenen Filters führt zu einer behandelbaren Ausnahme.
  • VALUE vom Typ REF TO data
als Zeiger auf ein passendes Datenobjekt. Der Wert des Datenobjekts, auf das die Referenzvariable in VALUE zeigt, wird dem in NAME angegebenen Filter zugeordnet.

Die Spalte NAME ist der eindeutige Schlüssel der sortierten Tabelle ftab.

Zusatz 3

... CONTEXT con

Wirkung

Mit dem Zusatz CONTEXT muss bei kontextabhängigen BAdIs eine Objektreferenzvariable con angegeben werden, deren statischer Typ das Tag-Interface IF_BADI_CONTEXT einbindet bzw. ist und die eine Referenz auf ein BAdI-Kontextobjekt enthält. Falls con initial ist, kommt es zu einer Ausnahme. Bei kontextfreien BAdIs darf der Zusatz CONTEXT nicht angegeben werden.

Der Zusatz CONTEXT steuert wie folgt die Erzeugung der Objekt-Plugins:

  • Ohne den Zusatz CONTEXT, d.h., für kontextfreie BAdIs richtet sich die Erzeugung der Objekt-Plugins nach der Einstellung des BAdIs. Entweder werden bei jeder Ausführung der Anweisung GET BADI neue Objekt-Plugins erzeugt oder ein einmal in der aktuellen internen Sitzung erzeugtes Objekt-Plugin wird wiederverwendet, falls es wiederholt benötigt wird. Ein solches Objekt-Plugin ist ein Singleton bezüglich seiner BAdI-Implementierungsklasse.
  • Mit dem Zusatz CONTEXT, d.h., für kontextabhängige BAdIs, werden innerhalb einer internen Sitzung für den gleichen Inhalt von con immer die gleichen Objekt-Plugins verwendet. Solche Objekt-Plugins sind Singletons bezüglich ihrer BAdI-Implementierungsklasse und eines BAdI-Kontextobjekts.

Falls eine BAdI-Implementierungsklasse mehrere BAdI-Interfaces implementiert und GET BADI innerhalb einer internen Sitzung für mehrere dieser BAdIs ausgeführt wird, können mehrere BAdI-Objekte auf die gleichen Objekt-Plugins zeigen, was es ermöglicht Daten zwischen verschiedenen BAdIs zu teilen. Bei kontextfreien BAdIs ist dies nur bei der Wiederverwendung der Fall. Bei kontextabhängigen BAdIs können mehrere BAdI-Objekte des gleichen Kontexts auf die gleichen Objekt-Plugins zeigen.

Hinweise

  • Die Tatsache, dass Objekt-Plugins entweder neu erzeugt oder wiederverwendet werden, kann auch so ausgedrückt werden, dass ein Objekt-Plugin bezüglich eines BAdIs oder eines Kontexts zustandsbehaftet oder zustandsfrei ist.
  • Das Tag-Interface IF_BADI_CONTEXT kann von beliebigen Klassen implementiert werden. Das Anwendungsgebiet reicht von der Implementierung in einer lokalen Klasse ohne sonstige Komponenten, deren einziger Zweck es ist, eine programminterne Kontextverwaltung für BAdIs zu ermöglichen, bis zur Implementierung in einer globalen Anwendungsklasse, deren Objekte gezielt erweitert werden sollen.

Ausnahmen

Behandelbare Ausnahmen

CX_BADI_CONTEXT_ERROR

  • Ursache: Bei der dynamischen Variante der Anweisung trat ein Fehler bezüglich des Kontexts auf.

CX_BADI_FILTER_ERROR

  • Ursache: Bei der dynamischen Variante der Anweisung wurden fehlerhafte Angaben für die Filter des BAdIs gemacht.

CX_BADI_INITIAL_CONTEXT

  • Ursache: Die hinter CONTEXT angegebene Referenzvariable ist initial.

CX_BADI_MULTIPLY_IMPLEMENTED

  • Ursache: Es wurden mehrere BAdI-Implementierungsklassen gefunden, obwohl das BAdI für Einzelverwendung definiert ist. Unterklasse von CX_BADI_NOT_SINGLE_USE.

CX_BADI_NOT_IMPLEMENTED

  • Ursache: Es wurde keine BAdI-Implementierungsklasse gefunden, obwohl das BAdI für Einzelverwendung definiert ist. Unterklasse von CX_BADI_NOT_SINGLE_USE.

CX_BADI_UNKNOWN_ERROR

  • Ursache: Das bei der dynamischen Variante der Anweisung angegebene BAdI existiert nicht.





BAL_S_LOG - Application Log: Log header data   Addresses (Business Address Services)  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 16762 Date: 20240425 Time: 021625     sap01-206 ( 200 ms )