Programmieren von Change()-BAPIs 

Verwendung

Mit dem BAPI Change() wird eine bestehende Instanz eines SAP-Business-Objekttyps geändert, zum Beispiel eine Bestellung.

Das BAPI Change() ist eine Instanzmethode, das BAPI ChangeMultiple() dagegen eine Klassenmethode (instanzunabhängig).

Funktionsumfang

BAPI-Schnittstelle

Import-Parameter

Bei der Festlegung der Import-Parameter sind folgende Aspekte zu beachten:

Bei der entsprechenden Methodendefinition im BOR dürfen die Schlüsselfelder jedoch nicht zusätzlich als Parameter aufgeführt werden. Aus diesem Grund nimmt der BOR/BAPI-Wizard beim Anlegen eines BAPIs die Funktionsbaustein-Parameter für die Schlüsselfelder nicht in die Methodendefinition auf.

Wird dagegen das Konzept Änderung durch Vergleich implementiert, ist für jeden Parameter mit änderungsrelevanten Felder zusätzlich ein äquivalenter Parameter anzulegen. Informationen finden Sie unter Änderungsparameter.

Export-Parameter

Bei der Festlegung der Export-Parameter sind folgende Aspekte zu beachten:

Dabei sind folgende Aspekte von Bedeutung:

Ist der Gesamtschlüssel länger als die maximale Kapazität von MESSAGE_V2 (also 50 Zeichen), so wird er auf die beiden Felder MESSAGE_V2 und MESSAGE_V3 aufgeteilt. Dabei werden die ersten 50 Zeichen in MESSAGE_V2 gespeichert und der Rest MESSAGE_V3 zugewiesen.

Die Bedeutung der einzelnen Felder ist äquivalent zum Erfolgsfall.

BAPI-Coding

Mögliche Strategien für die Implementierung eines Change()-BAPIs

In BAPIs, die Änderungen auf der Datenbank hervorrufen, z.B. Change()- und Create()-BAPIs, muß man zwischen den Parameterfeldern unterscheiden können, die geändert werden sollen (den "änderungsrelevanten Feldern"), und denen, die unverändert bleiben sollen.

Zu diesem Zweck genügt die Verwendung eines Initialwerts nicht, da es sich bei dem Initialwert auch um einen gültigen, neuen Wert handeln kann. Ebensowenig kann in der ABAP-Programmiersprache und auch auf anderen Entwicklungsplattformen einem Datentyp der Wert "NULL" zugewiesen werden, um ein Feld als nicht belegt zu markieren.

Aus diesem Grund müssen die änderungsrelevanten Felder über ein Hilfskonstrukt identifiziert werden. Dabei gibt es zwei Möglichkeiten:

  1. Identifizieren der änderungsrelevanten Felder durch Markierung

In diesem Ansatz werden änderungsrelevante Felder in einem Parameter durch eine entsprechende Markierung in einem zusätzlichen Änderungs-Parameter identifiziert:

Auf diese Weise kann das BAPI genau identifizieren, welche Felder des Parameters modifizierte Daten enthalten, und in welchen Feldern keine Änderungen vorgenommen wurden.

Beachten Sie folgende Konventionen, wenn Sie Änderungs-Parameter anlegen:

   

'X':
Dieser Wert bedeutet, daß das zugehörige Feld im Parameter einen änderungsrelevanten Wert enthält.

   

' ' (kein Wert):
Kein Wert bedeutet, daß das entsprechende Feld des Parameters nicht aktualisiert werden muß.

Weitere Informationen zu diesem Konzept finden Sie unter Änderungsparameter.

  1. Identifizieren der änderungsrelevanten Felder durch Vergleich

In diesem Ansatz werden änderungsrelevante Felder durch den Vergleich zweier Parameter identifiziert, von denen der eine die aktuell gültigen Daten und der andere die neuen, geänderten Daten enthält.

Beim Aufruf des Change()-BAPIs müssen die aktuellen Daten aus der Datenbank, sowie die neuen, geänderten Daten in die entsprechenden Parameter eingetragen werden. Der aktuelle Datenbestand kann dabei beispielsweise aus dem vorausgegangenen Aufruf eines GetDetail()-BAPIs übernommen werden.

Folgende Vergleiche sind nun möglich:

Beachten Sie folgendes, wenn Sie änderungsrelevante Felder durch Vergleich identifizieren:

Heißt der Parameter mit den aktuell gültigen Daten beispielsweise EquiSales, ist der Name des Parameters mit den geänderten Daten EquiSalesNew.

Vermeidung von Konflikten mit Customizing-Einstellungen

Es ist möglich, daß bestimmte Werte durch das Customizing festgelegt werden, jedoch an der BAPI-Schnittstelle weiterhin als variabel erscheinen. Diese Werte dürfen von einem Change()-BAPI nicht überschrieben werden.

Um Konflikte mit Customizing-Einstellungen zu vermeiden, sollten Sie ein Change()-BAPI folgendermaßen implementieren:

Siehe auch:

Beispiel für ein Change()-BAPI