Kundenfelder in BAPI-Struktur füllen

Das Befüllen von Kundeneigenen Feldern in einem BAPI stellt einen häufig vor Probleme. Ich stelle dir hier eine kurze Doku mit Beispielcoding vor, um Kundenfelder korrekt und beschwerdefrei übergeben zu können.
Als Beispiel verwenden ich den BAPI_SALESORDER_CREATEFROMDAT2 zum Anlegen von Kundenaufträgen.

Vorbedingung BAPE_VBAK

Alle kundeneigenen Felder, die mittels APPEND an die Kopfstruktur VBAK angehängt wurden, müssen ebenfalls in einem APPEND an die Struktur BAPE_VBAK appendiert werden. Hierbei ist es wichtig, dass die Felder zeichenartig sein müssen! Es dürfen also keine Felder vom Typ FLOAT, DEC oder INT verwendet werden! Entweder müssen diese Felder außen vor gelassen werden (sie können dann nicht mittels BAPI geändert werden), oder es muss ein eigenes zeichenartiges Datenelement spezielle für den BAPI angelegt werden.

Beispiel

Die Umwandlung einer Struktur in einen „Container“ braucht man immer, wenn man Kundenfelder in BAPIs verwenden möchte. In vielen BAPIs gibt es einen EXTENSION-Parameter, dem alle Kundenfelder übergeben werden. In diesem speziellen Fall ist es die Übergabetabelle EXTENSIONIN.

Die Anweisung zum Füllen der EXTENSIONIN sieht klassischerweise in etwa so aus:

DATA ls_bape_vbak  TYPE bape_vbak.
DATA ls_extension  TYPE bapiparex.
DATA lt_extensions TYPE STANDARD TABLE OF bapiparex.

ls_bape_vbak-zzfeld1    = '1'.
ls_bape_vbak-zzfeld2    = 'ABCD'.

ls_extension-structure  = 'BAPE_VBAK'.
ls_extension+30(960)    = ls_bape_vbak. "(bapiparex-valuepart1 - 4)
APPEND ls_extension TO lt_extensions.

Abgesehen davon, dass die Unterteilung der Kundenfelder in VALUEPART1 bis VALUEPART4 absoluter Schwachsinn ist, ist es unter Unicode nicht mehr einfach möglich, die Strukturen zuzuweisen. Im ABAP-Editor erhälst du dann die Meldung:

„LS_EXTENSION+30(960)“ und „LS_BAPE_VBAK“ sind in einem
Unicode-Programm nicht ineinander konvertierbar.

Casting notwendig

Entweder bedient man sich des Tricks mit dem X-Casting oder man verwendet die entsprechende Klasse von SAP: CL_ABAP_CONTAINER_UTILITIES.
Mit dieser Klasse – und speziell der Methode FILL_CONTAINER_C – ist es möglich, die typgerechte Umwandlung vorzunehmen.
CALL METHOD cl_abap_container_utilities=>fill_container_c
  EXPORTING
    im_value     = ls_bape_vbak
  IMPORTING
    ex_container = ls_extension+30(960)
  EXCEPTIONS
    illegal_parameter_type = 1
    OTHERS = 2.

image_pdfimage_print