Der Change Pointer ist eine komfortable Funktion, um Stammdatenänderungen, etwa Materialstammdaten, an Drittsysteme weiterzugeben. Dabei wird im Falle einer Änderung ein IDOC erstellt, welches die Segmente enthält, deren Daten geändert wurden.
Eine Delta-Versorgung des Drittsystems ist jedoch nicht immer gewünscht oder möglich. Der SAP Standard sieht leider keine Möglichkeit vor, ein vollständiges IDOC im Falle einer Stammdatenänderung zu versenden.
In der SAP Community wird seit Jahren daher vorgeschlagen, mittels Modifikation oder Kopie des Reports
RBDMIDOC begegnen.
Im Wesentlichen werden dabei stets die geschriebenen Daten des Change Pointers (Tabelle BDCP unter ECC, BDCP2 unter S/4) geändert und die Spalte FLDNAME mit dem Wert ALELISTING belegt.
Statt der Kopie oder der Modifikation kann auch das BAdI BDCP_BEFORE_WRITE verwendet werden
Lösung
Das BAdI wird vor dem Schreiben des Änderungszeigers auf die Datenbank aufgerufen. Üblicherweise wird es implementiert, um weitere Filterkriterien für die IDOC Erstellung zu hinterlegen, welche sich nicht über die Ale Verteilmodelle realisieren lassen.
Mit dem BAdI kann aber der Inhalt der Änderungszeiger angepasst werden. Da das BAdI filterabhängig ist, kann komfortabel pro Nachrichtenart eingeschränkt werden, ob die BAdI Implementierung aufgerufen werden soll, oder nicht.
Im Folgenden wird davon ausgegangen, dass ein MATMAS04 IDOC beim Ändern des Materialstamms erstellt werden soll. Dabei soll das IDOC alle Daten des Materialstamms enthalten, nicht nur die geänderten Daten. Da dies nur für ein bestimmtes Drittsystem erforderlich ist, soll das BAdI nicht generell für MATMAS Nachrichten durchlaufen werden.
Customizing
Anlegen einer eigenen Nachrichtentyp
Zunächst wird eine eigene Nachrichtentyp (WE81) definiert, welche für die Filterung des BAdI verwendet wird
Nachrichtentyp einem IDOC Typ zuweisen
Mit der Transaktion WE82 wird anschließend die Nachrichtentyp mit einem Standard IDOC Typ verknüpft
Änderungszeiger aktivieren
In der BD61 muss sichergestellt sein, dass Änderungszeiger grundsätzlich erstellt werden
In der BD50 wird dann der Änderungszeiger für die neue Nachrichtentyp aktiviert
Änderungsrelevante Felder
In der BD52 kann anschließend noch definiert werden, bei welchen Feldänderungen überhaupt ein Änderungszeiger erstellt werden soll. Im Beispiel soll dies bei Änderung der Einkäufergruppe erfolgen. Werden keine Daten angegeben, wird kein Änderungszeiger erstellt. Es ist leider nicht möglich, Felder von bestehenden Nachrichtentypen zu kopieren.
Zusatzdaten für Nachrichtentyp
In der BD60 wird hinterlegt, welcher Funktionsbaustein zum Erstellen des IDOC verwendet werden muss. Hier wird der Baustein des MATMAS04 verwendet
Filteroptionen für ALE Verteilmodell definieren
In der Transaktion BD59 werden die Filteroptionen für die ALE Verteilung definiert. Dies sind die Felder, nach denen in der BD64 das Verteilmodell gefiltert werden kann.
Abschließend muss natürlich das ALE Verteilmodell (BD64) entsprechend gepflegt werden.
BAdI Implementierung
Bis zu diesem Punkt wurden nur Customizing Einstellungen vorgenommen. Die eigentliche Funktion erfolgt durch eine neue Implementierung des BAdI BDCP_BEFORE_WRITE. In den allgemeinen Daten der Implementierung wird der Nachrichtentypen hinterlegt, für den die BAdI Implementierung aufgerufen werden soll
Der Quellcode selbst besteht nur aus wenigen Zeilen Code
METHOD if_ex_bdcp_before_write~filter_bdcpv_before_write.
" Change Pointer senden üblicherweise nur Felder, die geändert wurden (Delta)
" Es soll aber das vollständige MATMAS04 IDOC gesendet werden. Um des zu erreichen, wird
" der Change Pointer geändert und das Feld auf den Wert ALELISTING geändert.
" Dies bewirkt, dass das vollständige Material gesendet wird.
LOOP AT change_pointers ASSIGNING FIELD-SYMBOL(<ls_pointer>).
<ls_pointer>-fldname = 'ALELISTING'.
ENDLOOP.
ENDMETHOD.