ABAP 7.40以降の新構文:REDUCEとMAPPINGの活用

REDUCE構文の概要

REDUCEは、ABAP 7.40から導入された構文で、ループ処理や集計処理を簡潔に記述できる機能です。主に文字列結合や数値の合計など、単一の結果値を生成するために使用されます。

result = REDUCE type(
    INIT { var1 = initial_value }
    FOR loop_expression
    NEXT { var1 = expression }
).

この構文では、INIT句で初期値を設定し、FOR句でイテレーション対象を指定します。NEXT句では各ステップでの計算ロジックを定義します。

文字列結合の例

DATA(result_str) = REDUCE string(
    INIT text = ||
    FOR line IN itab WHERE ( key_field = 'VALUE' )
    NEXT text = |{ text }{ line-field }, |
).

" 数値カウンタによる繰り返し
DATA(counter_str) = REDUCE string(
    INIT buffer = ``
    FOR i = 1 THEN i + 1 UNTIL i > 5
    NEXT buffer = |{ buffer }{ i } |
)

数値集計処理

DATA(total_amount) = REDUCE #( 
    INIT sum TYPE p LENGTH 16 DECIMALS 2 VALUE 0
    FOR item IN order_items
    WHERE ( order_id = current_order_id )
    NEXT sum = sum + item-net_value
)

オブジェクト参照の逐次処理

TYPES: ty_output_ref TYPE REF TO if_demo_output.

DATA(output_ref) = REDUCE ty_output_ref(
    INIT ref = cl_demo_output=>new( )
          msg = ||
    FOR prefix = 'X' THEN |{ prefix }Y|
    UNTIL strlen( prefix ) > 6
    NEXT ref = ref->write( msg )
         msg = |{ msg } { prefix }|
)
output_ref->display( ).

MAPPINGによるデータ変換

MAPPING構文は、異なる構造体または内部テーブル間でフィールド名が一致しない場合でも、明示的に対応関係を指定して代入を行うための機能です。

TYPES: BEGIN OF ty_source_structure,
         id     TYPE i,
         name   TYPE string,
         amount TYPE p LENGTH 10 DECIMALS 2,
       END OF ty_source_structure.

TYPES: BEGIN OF ty_target_structure,
         identifier TYPE i,
         title      TYPE string,
         value      TYPE p LENGTH 10 DECIMALS 2,
       END OF ty_target_structure.

MOVE-CORRESPONDING source TO target
    MAPPING identifier = id
            title      = name
    EXCEPT  value.

上記のように、source構造体とtarget構造体でフィールド名が異なる場合でも、MAPPINGを使用することで適切な割当が可能です。EXCEPTキーワードにより特定のフィールドを除外することもできます。

タグ: ABAP REDUCE Mapping SAP InternalTable

5月18日 18:42 投稿