Konstruktorausdruck VALUE: Interne Tabellen und Strukturen füllen im neuen ABAP
Siehe Kategorie: Konstruktorausdruck.
Siehe Kategorie: Neues ABAP.
Siehe Neues ABAP (ab Release 7.40).
Ab ABAP-Release 7.40 gibt es auch viele neue Möglichkeiten zum Füllen von internen Tabellen und lokalen Strukturen.
Der Konstruktorausdruck VALUE ist sehr mächtig und wichtig sich mit diesen Befehl zu verstehen. Er bietet das Potential das eigene Coding deutlich kompakter zu schreiben, mit höherer Performance und oftmals auch übersichtlicher, wenn man die Syntax verstanden hat.
Füllen lokale Struktur mit Inline-Deklaration mit "VALUE <DATENTYP>"
Die Interne Tabelle LS_ITEM wird inline deklariert und gefüllt hinter dem Befehl VALUE mit Daten vom Dictionary-Typ BAPI2017_GM_ITEM_CREATE. Hinter einer öffnenden Klammer werden die zu füllenden Felder aufgeführt. Es müssen nicht alle Felder der Struktur gefüllt werden. Nicht gefüllte Felder behalten ihren Initialwert.
DATA(ls_item) = VALUE bapi2017_gm_item_create(
material = <record>-matnr
plant = <record>-werks
stge_loc = <record>-lgort
batch = <record>-charg
stk_segment = <record>-sgt_sca
base_uom = <record>-meins
entry_uom = <record>-meins
).
Füllen lokale Struktur in bekannte Struktur mit "VALUE #"
Die Interne Tabelle LS_ITEM ist bereits deklariert und gefüllt hinter dem Befehl VALUE. Das "#" ist das Stellvertreterzeichen für die bereits deklarierte Struktur.
Hier muss man sich bewußt sein, dass alle Felder von LS_ITEM, die nicht angesprochen werden, mit ihrem initialen Wert überschrieben werden.
Data: ls_item type bapi2017_gm_item_create.
...
ls_item = VALUE #(
material = <record>-matnr
plant = <record>-werks
stge_loc = <record>-lgort
batch = <record>-charg
stk_segment = <record>-sgt_sca
base_uom = <record>-meins
entry_uom = <record>-meins
).
Wenn man z. B. alle Felder belassen will mit ihrem bereits gefüllten Wert, dann kommt der Zusatz "BASE" zum Einsatz, wo die Struktur LS_ITEM initial mit den eigenen Werten aus LS_ITEM gefüllt wird.
ls_item = VALUE #( BASE ls_item
material = <record>-matnr
plant = <record>-werks
stge_loc = <record>-lgort
batch = <record>-charg
stk_segment = <record>-sgt_sca
base_uom = <record>-meins
entry_uom = <record>-meins
).
Fülle N Zeilen in interne Tabelle
Die interne LT_PARTN wird hier gefüllt mit 3 Zeilen. man spart sich so die Definition einer Struktur, die Zuweisungen zur Struktur und die Appends der Struktur zur internen Tabelle.
Man sollte darauf achten die Klammern und Gleichzeichen bündig zu setzen, um das Coding maximal lesbar und verständlich zu halten.
lt_partn = value #( ( partn_role = 'AG'
partn_numb = lv_kunnr_ag )
( partn_role = 'WE'
partn_numb = lv_kunnr_we )
( partn_role = 'MF'
partn_numb = lv_kunnr_mf )
).
Wenn in der internen Tabelle LT_PARTNR bereits Datensätze gefüllt sind, die man nicht überschreiben will, kommt wieder der Zusatz BASE zum Einsatz.
lt_partn = value #( base lt_partn
( partn_role = 'SP'
partn_numb = lv_kunnr_ag )
).
Siehe SAP-Hilfe: Füllen interne Tabelle mit VALUE.
Füllen interne Tabelle mit Iterationsausdruck FOR .. IN über andere interne Tabelle1
Ein relativ komplexes Projektbeispiel wird hier dargestellt. Hier werden verschiedene neue Technologien eingesetzt.
In klassischer Programmierung würde man bei diesem Beispiel deutlich mehr Codingzeilen benötigen und die Ausführungsgeschwindigkeit wäre bei klassischer Programmierung langsamer.
Das Verständnis solch komplexer Ausdrücke kann jedoch eine Herausforderung darstellen. Hier wird versucht mit Farbformatierungen das Verständnis zu erleichtern.
- Es wird eine interne Tabelle gefüllt mit dem Namen "zif_sd_direct_shippng_strategy~t_output_messages"
- Es wird als Datengrundlage eine interne Tabelle "it_result_message101" verarbeitet mit dem Befehl "FOR res101 IN it_result_message101"
- In den Zuweisungen werden über den Ausdruck "COND #( WHEN .. THEN .. ELSE ..)" unterschiedliche Werte gefüllt.
APPEND LINES OF VALUE zif_sd_direct_shippng_strategy~tt_msg_output( FOR res101 IN it_result_message101 "Iterationsausdruck ( receipt_type = v_receipt_type receipt_number = iv_customer_ord_id bapi_result = COND #( WHEN res101-bapi_result IS INITIAL THEN v_success_result_buf ELSE res101-bapi_result ) psting_status = COND #( WHEN res101-psting_status IS INITIAL THEN co_success_flag ELSE res101-psting_status ) psting_attempt = res101-psting_attempt ) ) TO zif_sd_direct_shippng_strategy~t_output_message.
- Es empfiehlt sich bei solch komplexen Ausdrücken auch Wert auf die Bündigkeit zu legen, um die Coding möglichst einfach erfassen.
- Man sollte die Komplexität solcher Ausdrücke nicht übertreiben, da das Verständnis für einen selbst und/oder für Entwickler-/Beraterkollegen sonst extrem schwierig wird. Da ist abzuwägen zwischen kompakter Schreibweise und Komplexität, sowie mehr Zeilen, aber einfacherem Verständnis.
Füllen interne Tabelle mit FOR .. IN über andere interne Tabelle
Dies ist ein Test für Vorlagentext im Fließtext für Formatierung.
Ein anderes einfacheres Beispiel, um eine Tabelle zu füllen, wo eine andere Tabelle abgeloopt wird in der neuen Syntax.
ltr_lgort = value #( for wa_lips in lt_lips ( sign = 'I'
option = 'EQ'
low = wa_lips-lgort ) ).
Die Workarea WA_LIPS muss nicht extrem deklariert werden. Es kann genauso als Field-Symbol verwendet werden.
ltr_lgort = value #( for <fs_lips> in lt_lips ( sign = 'I'
option = 'EQ'
low = <fs_lips>-lgort ) ).
Füllen interne Tabelle mit FOR .. IN mit WHERE-Bedingung
Die Iteration kann auch um eine Where-Bedingung ergänzt werden. Die Where-Bedingung wird auch mit einer Klammer umschlossen.
Hier hat die interne Tabelle IT_ITAB ein Feld SELKZ, wo nur Datensätze mit einem 'X' relevant sind.
ltr_vbeln = VALUE #( FOR <fs_itab> IN it_itab WHERE ( selkz = 'X' ) ( sign = 'I' option = 'EQ' low = <fs_itab>-vbeln ) ).
Füllen interne Tabelle mit FOR .. WHILE
- Eine andere Möglichkeit eine interne Tabelle zu füllen ist mit einer Iteration "FOR .. WHILE .."
- Hier wird iteriert über einen Counter von 1 bis 5 und jeder dieser Werte wird in eine Zeile der internen Tabelle LT_ITAB geschrieben.
lt_itab = VALUE #( FOR lv_count = 1 WHILE lv_count <= 5 ( lv_count ) ).