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キーワードにより特定のフィールドを除外することもできます。