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?
| Componente | Función |
|---|---|
tipo | Tipo de datos del resultado (p.ej., i, string, p). También se puede usar # para que el sistema infiera el tipo. |
INIT | Declara e inicializa el acumulador. Es la variable que irá guardando el resultado parcial y será la que finalmente se devuelva. |
FOR | Define cómo se itera. Puede ser sobre una tabla (IN), un rango numérico (= hasta UNTIL o WHILE), o grupos (GROUPS). |
NEXT | En cada iteración, actualiza el acumulador usando el valor del elemento actual. |
REDUCE es realmente un bucle funcional:
INITes el punto de partida,FORcontrola las iteraciones, yNEXTes 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.




