REDUCE Operador: Simplifica la agregación de datos sin usar LOOP

Si alguna vez has tenido que sumar los valores de una tabla interna, concatenar una lista de textos o calcular un total complejo, seguro que has escrito un bucle LOOP con varias líneas de código. Con REDUCE todo eso cambia.

REDUCE es uno de los operadores de construcción (constructor operators) introducidos en ABAP 7.40 que te permite iterar sobre un conjunto de datos y reducirlos a un único resultado en una sola expresión, sin necesidad de usar LOOP ni declarar variables auxiliares adicionales.

¿Qué es REDUCE?

El operador REDUCE pertenece a la familia de operadores de reducción y su propósito es sencillo: toma un conjunto de valores (por ejemplo, las líneas de una tabla interna) y los va combinando progresivamente hasta obtener un único valor final, que puede ser un número, un texto, una estructura o incluso una tabla interna reducida.

Técnicamente, REDUCE es una expresión constructora que especifica un tipo de datos para el resultado, itera sobre una o más expresiones y, en cada paso, actualiza el acumulador hasta devolver el resultado final.

La sintaxis básica es la siguiente:

DATA(resultado) = REDUCE tipo(
    INIT acumulador = valor_inicial
    FOR elemento IN tabla_interna
    NEXT acumulador = expresion_con_elemento
).

¿Qué significa cada parte?

ComponenteFunción
tipoTipo de datos del resultado (p.ej., i, string, p). También se puede usar # para que el sistema infiera el tipo.
INITDeclara e inicializa el acumulador. Es la variable que irá guardando el resultado parcial y será la que finalmente se devuelva.
FORDefine cómo se itera. Puede ser sobre una tabla (IN), un rango numérico (= hasta UNTIL o WHILE), o grupos (GROUPS).
NEXTEn cada iteración, actualiza el acumulador usando el valor del elemento actual.

REDUCE es realmente un bucle funcional: INIT es el punto de partida, FOR controla las iteraciones, y NEXT es el cuerpo del bucle.

Para qué sirve y cuándo usarlo

REDUCE es ideal para cualquier situación en la que necesites:

  • Acumular valores: sumar importes, contar elementos, calcular máximos/mínimos.
  • Concatenar cadenas: construir un texto a partir de varias líneas, gestionando limpia y eficientemente los separadores.
  • Transformar datos: crear una nueva tabla a partir de otra, filtrando y aplicando reglas.
  • Agrupar datos: sumar o agregar valores por grupos (categorías, clientes, fechas).
  • Validar conjuntos: comprobar si todos los elementos de una tabla cumplen una condición.

En general, REDUCE es una alternativa compacta y expresiva a los bucles LOOP tradicionales, y suele resultar en un código más declarativo y fácil de mantener.

Ejemplos prácticos

Suma de elementos

Sintaxis vieja:

DATA: lt_numbers TYPE TABLE OF i,
      lv_sum     TYPE i.
lt_numbers = VALUE #( ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ).
LOOP AT lt_numbers INTO DATA(lv_num).
  lv_sum = lv_sum + lv_num.
ENDLOOP.
* lv_sum ahora vale 15

Sintaxis nueva:

DATA(lt_numbers) = VALUE i_table( ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ).
DATA(lv_sum) = REDUCE i(
    INIT s = 0
    FOR x IN lt_numbers
    NEXT s = s + x
).
* lv_sum ahora vale 15

Contar elementos que cumplen una condición

DATA(lt_numbers) = VALUE i_table( ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ( 6 ) ).

DATA(lv_count) = REDUCE i(
    INIT c = 0
    FOR x IN lt_numbers
    NEXT c = COND #( WHEN x MOD 2 = 0 THEN c + 1 ELSE c )
).
* lv_count = 3

Suma sobre una tabla

DATA(lt_items) = VALUE #(
( matnr = 'A' netwr = 100 )
( matnr = 'B' netwr = 200 )
( matnr = 'C' netwr = 150 )
).

DATA(lv_total) = REDUCE netwr(
INIT t = 0
FOR item IN lt_items
NEXT t = t + item-netwr
).
* lv_total = 450

Combinación con COND

" Cálculo de saldo con movimientos de débito (S) y crédito (H)
DATA(lv_balance) = REDUCE dmbtr(
    INIT bal = 0
    FOR mov IN lt_movements
    NEXT bal = COND #( WHEN mov-shkzg = 'S' THEN bal - mov-dmbtr
                       WHEN mov-shkzg = 'H' THEN bal + mov-dmbtr
                       ELSE bal )
).

El operador REDUCE es una herramienta esencial del ABAP moderno que, bien utilizada, permite escribir código más expresivo, eliminar bucles manuales y concentrarse en la lógica de negocio. Especialmente útil en cálculos de totales, concatenaciones y transformaciones ligeras.