Show TOC Anfang des Inhaltsbereichs

Prozessdokumentation Aktionen von Seiten des BAPI-Entwicklers  Dokument im Navigationsbaum lokalisieren

Einsatzmöglichkeiten

Der BAPI-Entwickler hat zunächst einmal, den Anforderungen entsprechend, die an das BAPI gestellt werden, den ExtensionIn- und/oder den ExtensionOut-Parameter an der BAPI-Schnittstelle, sowie maximal zwei BAdIs im BAPI-Funktionsbaustein vorzusehen. Damit ermöglicht er dem Kunden, generell alle drei Arten der Erweiterung an diesem BAPI durchzuführen.

Zusätzlich kann er dem Kunden weitere Unterstützung geben, indem er vordenkt, an welchen SAP-Datenbanktabellen der Kunde sinnvoll eigene Felder anhängen bzw. aus welchen Tabellen er nachträglich bestehende Felder in das BAPI einbeziehen kann.

Ablauf

Im folgenden wird anhand eines Beispiels beschrieben, welche Aktionen maximal von einem BAPI-Entwickler durchzuführen sind. In diesem Beispiel soll das BAPI TravelAgency.CreateFromData erweiterbar gestaltet und speziell Erweiterungen an der Datenbanktabelle STRAVELAG vorgedacht werden.

Es lassen sich folgende 5 Schritte unterscheiden:

Anlegen der Extension-Parameter an der BAPI-Schnittstelle

...

In Abhängigkeit von den Anforderungen, die an das BAPI gestellt werden, legt der BAPI-Entwickler einen Extension-Parameter (ExtensionIn) für den Datenimport und/oder einen Extension-Parameter (ExtensionOut) für den Datenexport an der Schnittstelle des BAPI-Funktionsbausteins an.
Folgende Richtlinien müssen dabei eingehalten werden:

       1.      Die Namenskonvention für die Extension-Parameter ist ExtensionIn für eine Erweiterung von  Import-Parametern und ExtensionOut für eine Erweiterung der Export-Parameter.

       2.      Die Extension-Parameter müssen als Tabellenparameter definiert werden.

       3.      Den Extension-Parametern wird die Bezugsstruktur BAPIPAREX zugrunde gelegt.

       4.      In der Dokumentation zum Extension-Parameter müssen alle im BAPI verwendeten BAPI Table Extensions und ihre Zuordnung zum jeweiligen BAPI-Parameter beschrieben sein.

Hinweis

Unter Anwendung auf die standardisierten BAPIs werden Empfehlungen ausgesprochen, welche Extension-Parameter für die einzelnen standardisierten BAPIs angelegt werden sollten.

 

Definition der BAPI Table Extensions

Dieser Schritt ist nur durchzuführen, wenn für dem BAPI zugrundeliegende SAP-Tabellen vorgedacht werden soll, ob an diese sinnvoll kundeneigene Felder angehängt bzw. bestehende Felder nachträglich in das BAPI einbezogen werden sollen. In diesem Fall ist für jede sinnvoll erweiterbare SAP-Tabelle eine BAPI Table Extension als Datentruktur mit Hilfe der Transaktion SE11 anzulegen. Beim Anlegen der BAPI Table Extensions sind folgende Richtlinien einzuhalten:

       1.      Die Namenskonvention für BAPI Table Extensions lautet BAPI_TE_<Tabellenname>. Kann diese Namenskonvention aufgrund der Längenbeschränkung für Strukturnamen nicht eingehalten werden, ist dies explizit in der Dokumentation der Table Extension und des BAPIs zu kennzeichnen.

       5.      Für jede erweiterungsfähige Tabelle ist eine eigene BAPI Table Extension anzulegen. Allerdings darf jede Tabelle auch nur eine einzige Table Extension besitzen. Benutzen also mehrere BAPIs die gleiche Tabelle, so müssen sie sich eine Table Extension teilen

Ausnahme:

Besitzt ein BAPI zwei oder mehr Parameter, denen die gleiche Datenbanktabelle zugrundeliegt, dann wird für jeden BAPI-Parameter eine BAPI Table Extension angelegt. Die Namenskonvention lautet dann BAPI_TE_<Tabellenname><fortlaufende Nummer>. Im Beispiel würden die Table Extensions BAPI_TE_STRAVELAG1 und BAPI_TE_STRAVELAG2, etc. heißen.

       6.      Die Struktur der BAPI Table Extension muss alle identifizierenden Schlüsselfelder der Tabelle enthalten, auf die sich die BAPI Table Extension bezieht. Abgesehen von den Schlüsselfeldern enthält die ausgelieferte Table Extension keine weiteren Felder.

Im obigen Beispiel müsste die BAPI Table Extension BAPI_TE_STRAVELAG heißen und den Schlüssel AGENCYNUM besitzen.

 

Anpassen des BAPI-Funktionsbausteins

Jeder BAPI-Funktionsbaustein kann maximal den folgenden Aufbau besitzen:

 

FUNCTION BAPI_ERWEITERUNG_TEST

<Programmtext>

<BADI_1>

<Programmtext>

<Auslesen von ExtensionIn>

<Programmtext>

<BADI_2>

<Programmtext>

END FUNCTION

 

 

Der BAPI-Entwickler muss also im kompliziertesten Fall die Kundenerweiterung in seinem Funktionsbaustein an drei Stellen berücksichtigen:

       1.      BAdI 1

Dieses BAdI ist nur dann anzulegen, wenn das BAPI einen ExtensionIn-Parameter besitzt. Das BAdI soll dem Kunden ermöglichen, alle an das BAPI übergebenen Daten, einschließlich des ExtensionIn-Parameters, zu prüfen. Das BAdI sollte die folgenden Parameter besitzen:

                                                  i.       Als Import werden alle BAPI-Importparameter und -Tabellen übergeben. Speziell der ExtensionIn-Parameter muss im BAdI zur Verfügung stehen.

                                                ii.       Als Export sollte der Return-Parameter vom BAdI zurückgegeben werden, um dem BAPI im BAdI aufgetretene Fehler zu melden.

                                               iii.       Falls es die Anwendung erfordert, können auch zusätzliche Parameter als Import bzw. Export an das BAdI übergeben werden

 

       7.      Auslesen von ExtensionIn

Dieser Schritt ist nur durchzuführen, wenn der Kunde eigene Felder an eine SAP-Tabelle angehängt bzw. bestehende Felder nachträglich in das BAPI einbezogen hat und der Entwickler dafür sorgen möchte, dass die mittels ExtensionIn mitgegebenen Erweiterungen automatisch in diese zusätzlichen Tabellenfelder geschrieben werden. Somit ist kein kundenseitiger Programmieraufwand mehr nötig, falls die Kundenerweiterungen ohne weitere Verarbeitung direkt in die zugehörigen Datenbanktabellen geschrieben werden sollen.

Speziell bei Create()- , Add<Teilobjekt>()- und SaveReplica()-BAPIs sollte dieses automatische Füllen der erweiterten Felder programmiert werden.

Das Auslesen eines Datensatzes aus dem Container läuft in zwei Schritten ab:

                            a.      Zunächst wird das Container-Format in eine durch die entsprechende BAPI Table Extension vorgegebene temporäre Struktur konvertiert. Da die Werte im Container in der gleichen Reihenfolge wie in der BAPI Table Extension angeordnet sind, kann dies durch einen einzigen MOVE-Befehl realisiert werden.

                            b.      Anschließend werden aus dieser Struktur die zusätzlich an der Datenbanktabelle zu beachtenden Felder mittels MOVE-CORRESPONDING gefüllt. Dazu muss zunächst mit Hilfe des übergebenen Schlüsselwertes die richtige Zeile der Datenbanktabelle ermittelt werden, in welche die Werte eingefügt werden sollen.

Der gesamte Vorgang  lässt sich in Pseudo-Code wie folgt beschreiben:

 

LOOP at ExtensionIn

IF gesuchte Table Extension in ExtensionIn vorhanden

THEN MOVE Werte aus ExtensionIn TO Table Extension END.

Suche richtige Zeile in Datenbanktabelle.
Fülle Datenbanktabelle mit Table Extension
mittels MOVE-CORRESPONDING.

END LOOP

 

Ein automatisches Füllen der Tabellenerweiterungen ist also nur möglich, wenn die vom Kunden an die BAPI Table Extension hinzugefügten Felder genau mit den Feldern der erweiterten Tabelle übereinstimmen, da nur in diesem Fall der MOVE-CORRESPONDING-Befehl funktioniert.

Für das konkrete Beispiel ergibt sich folgendes Coding:

 

loop at extensionin.

case extensionin-structure.

when 'BAPI_TE_STRAVELAG.

move extensionin+c_lenstruc to wa_bapi_te_stravelag.
* Die Konstante c_lenstruct besitzt die Länge des Feldes
* STRUCTURE der BAPIPAREX-Struktur. Durch diese Konstante
* wird sichergestellt, dass nur die Werte aus VALUEPART1
* bis VALUEPART4 der Table Extension zugewiesen werden.
read table t_stravelag with key agencynum = agencynumber.

catch system-exceptions conversion_errors  = 1.

   move-corresponding wa_bapi_te_stravelag to t_stravelag.

endcatch.

Ausnahme:

Bei Create-BAPIs mit interner Nummervergabe steht der Wert des Schlüssel beim Aufruf des BAPIs noch nicht fest und kann somit dem Container nicht mitgegeben werden. Das hat zur Folge, dass im Anschluss an das Auslesen des Containers, der im BAPI erzeugte Schlüsselwert explizit der Table Extension zugewiesen werden muss. Das obige Beispiel ist dann wie folgt zu modifizieren:

 

loop at extensionin.

case extensionin-structure.

when 'BAPI_TE_SRAVELAG.

move extensionin+c_lenstruc to wa_bapi_te_stravelag.
* Jetzt wird nachträglich der erzeugte Schlüssel an die
* Table Extension übergeben:

move agencynumber to wa_bapi_te_stravelag-agencynum.

read table t_stravelag with key agencynum = agencynumber.

catch system-exceptions conversion_errors  = 1.

move-corresponding wa_bapi_te_stravelag to t_stravelag.

endcatch.

 

       8.      BAdI 2

Dieses BAdI ist dann notwendig, wenn es dem Kunden ermöglicht werden soll, die durch ExtensionIn übergebenen Daten weiterzuverarbeiten oder sonstige Datenbankmanipulationen durchzuführen. Hat der Kunden die Export-Parameter des BAPIs erweitert, sollte das zweite BAdI zusätzlich dazu verwendet werden, den ExtensionOut-Parameter zu füllen. Das BAdI sollte die folgenden Parameter besitzen:

                                                  i.       Als Import werden dem BAdI alle BAPI-Parameter, einschließlich ExtenionIn, übergeben. Tabellenparameter am BAPI-Funktionsbaustein bleiben auch am BAdI Tabellen.

                                                ii.       Als Export sollten ExtensionOut und der Return-Parameter vom BAdI zurückgegeben werden.

                                               iii.       Falls es die Anwendung erfordert, können auch zusätzliche Parameter als Import bzw. Export an das BAdI übergeben werden..

 

Hinweis

Unter Anwendung auf die standardisierten BAPIs werden für die einzelnen standardisierten BAPIs Empfehlungen ausgesprochen, welche Vorkehrungen jeweils an den zugrundeliegenden Funktionsbausteinen getroffen werden sollten.

Ein ausführliches Programmierbeispiel für die Implementierung eines BAPI-Funktionsbausteins finden Sie unter Beispiele

 

Füllen von ExtensionIn vor einem BAPI-Aufruf

Wird im von SAP ausgelieferten Coding ein BAPI aufgerufen, so muss der Entwickler entscheiden, ob vor diesem Aufruf automatisch dafür gesorgt werden soll, dass der ExtensionIn-Parameter mit den Erweiterungen gefüllt wird. In diesem Fall ist das Füllen von ExtensionIn explizit auszuprogrammieren. Der konkrete Ablauf beim Füllen von ExtensionIn wird unter Aktionen von Seiten des Kundenbeschrieben.

 

Auswerten von ExtensionOut nach einem BAPI-Aufruf

Wird im von SAP ausgelieferten Coding ein BAPI aufgerufen, so kann der Entwickler dafür sorgen, dass der ExtensionOut-Parameter automatisch ausgewertet wird. Allerdings lässt sich solch eine Auswertung nur in den seltensten Fällen vordenken.

Ende des Inhaltsbereichs