ABAP moderno: Filtrado y ordenación más potente con FILTER

La evolución de ABAP en versiones como 7.4 y 7.5 ha traído consigo un abanico de mejoras sintácticas que permiten escribir código más legible, compacto y eficiente. Si has trabajado durante años en ABAP clásico, seguro te habrás acostumbrado a patrones repetitivos como los bucles para filtrar datos. Sin embargo, con la introducción de expresiones como FILTER, ahora es posible hacer lo mismo en una sola línea, con una mejora significativa en claridad y rendimiento.

En este artículo te explico cómo usar FILTER para lograr un filtrado potente y elegante de tablas internas, sin necesidad de loops manuales. Si todavía no estás usando estas expresiones, este artículo te va a cambiar la manera de escribir ABAP.


El enfoque tradicional: LOOP + WHERE + APPEND

Durante mucho tiempo, la única forma de filtrar una tabla interna era usando un LOOP AT ... WHERE junto con APPEND, lo cual era funcional, pero generaba mucho código repetitivo:

abapCopiarDATA: lt_filtered TYPE TABLE OF ty_table.

LOOP AT lt_table INTO DATA(ls_wa) WHERE field1 = 'X'.
APPEND ls_wa TO lt_filtered.
ENDLOOP.

Este enfoque, aunque ampliamente adoptado, tiene algunas desventajas claras:

  • Mayor número de líneas de código.
  • Complejidad innecesaria cuando el objetivo es solo obtener una tabla filtrada.
  • Uso menos eficiente de memoria, ya que estamos creando una tabla adicional y recorriendo toda la tabla fuente manualmente.

Por suerte, ABAP moderno tiene una solución mucho más elegante.


La solución moderna: FILTER

A partir de ABAP 7.4, se introdujo la poderosa expresión FILTER, que permite construir una tabla filtrada directamente desde otra, de forma declarativa y muy concisa:

abapCopiarDATA(lt_filtered) = FILTER #( lt_table WHERE field1 = 'X' ).

Sí, eso es todo. En una sola línea estás logrando exactamente el mismo resultado que antes requería 5 o más. Esta expresión crea una nueva tabla (lt_filtered) que contiene únicamente los registros de lt_table donde field1 = 'X'.


¿Por qué usar FILTER? Ventajas clave

1. Código más limpio y expresivo

El uso de FILTER elimina la necesidad de escribir loops verbosos y auxiliares. Esto mejora considerablemente la legibilidad, especialmente cuando se trata de bloques de código más grandes.

El desarrollador puede entender de inmediato qué se está haciendo sin tener que leer varias líneas.

2. Mayor rendimiento

Aunque puede parecer un simple cambio estético, también hay una mejora de eficiencia. Al usar FILTER, el sistema ABAP puede optimizar internamente la operación, evitando el sobrecoste de estructuras temporales y bucles manuales.

Esto es especialmente útil cuando se trabaja con tablas internas grandes, donde cada microoptimización cuenta.

3. Menos errores

Con menos líneas y sin necesidad de estructuras intermedias, también se reduce la posibilidad de errores humanos, como olvidar limpiar la tabla destino (CLEAR lt_filtered) o cometer errores al usar APPEND o COLLECT.


Ejemplos prácticos del uso de FILTER

➤ Filtrar por múltiples condiciones

abapCopiarDATA(lt_result) = FILTER #( lt_orders WHERE status = 'O' AND country = 'ES' ).

Esto reemplaza a un loop clásico donde se verificarían ambas condiciones con IF.

➤ Filtrar por rango con BETWEEN

abapCopiarDATA(lt_in_range) = FILTER #( lt_items WHERE amount BETWEEN 100 AND 500 ).

Ideal cuando estás procesando transacciones financieras u operaciones logísticas con valores que deben estar dentro de ciertos márgenes.


Tips avanzados: FILTER con GROUP o SORT

Aunque FILTER se suele utilizar principalmente para seleccionar subconjuntos de datos, su verdadero poder se nota cuando se combina con otras expresiones modernas como SORT, REDUCE o GROUP BY. Por ejemplo, puedes:

  • Filtrar datos y luego ordenarlos:
abapCopiarDATA(lt_top) = FILTER #( lt_scores WHERE score >= 80 ).
SORT lt_top BY score DESCENDING.

  • Usarlo en combinación con LOOP AT ... INTO DATA() para trabajar directamente sobre resultados filtrados sin necesidad de declarar variables adicionales.

Consideraciones y buenas prácticas

Aunque FILTER es potente, no reemplaza todos los casos de uso de LOOP. Algunas recomendaciones prácticas:

  • Úsalo cuando tu intención sea obtener una tabla filtrada completa.
  • Evítalo si necesitas hacer transformaciones complejas dentro del loop. En ese caso, el LOOP AT tradicional te da más flexibilidad.
  • Recuerda que FILTER es compatible solo con versiones ABAP 7.4+, por lo que si trabajas en entornos antiguos, verifica la compatibilidad primero.

Conclusión: FILTER como parte esencial del ABAP moderno

El uso de FILTER # es una de las joyas del ABAP moderno. No solo reduce líneas de código, sino que también eleva la calidad de tu programación a un nuevo nivel. Permite escribir de forma declarativa, limpia y eficiente, alineada con los principios de desarrollo contemporáneo.

Si estás trabajando en proyectos con SAP S/4HANA o cualquier sistema que soporte ABAP 7.4 o superior, adoptar FILTER no es opcional: es esencial.

Haz la prueba en tu próximo desarrollo y notarás de inmediato el cambio en legibilidad, tiempo de desarrollo y facilidad para mantener tu código.