La expresion FILTER permite filtrar tablas internas de forma declarativa y eficiente. Es una alternativa moderna a LOOP AT ... WHERE con APPEND y utiliza claves de tabla para mejor rendimiento.
Sintaxis
FILTER <tipo_tabla>( <tabla_origen>
[ USING KEY <clave> ]
[ WHERE <condicion> ]
[ EXCEPTWHERE <condicion> ]
).
Requisitos
La tabla de origen debe tener una clave de tabla (sorted o hashed)
Los campos de filtro deben ser parte de una clave
El resultado tiene el mismo tipo de linea
Ejemplos
1. Filtro basico con WHERE
TYPES: BEGIN OF ty_order,
order_id TYPE i,
status TYPE cLENGTH1,
amount TYPE pDECIMALS2,
END OF ty_order,
" Tabla sorted para FILTER
ty_orders TYPE SORTED TABLE OF ty_order
WITH UNIQUE KEY order_id
WITH NON-UNIQUE SORTED KEY by_status COMPONENTS status.
DATA: lt_orders TYPE ty_orders.
lt_orders =VALUE #(
( order_id =1 status ='O' amount ='100.00' )
( order_id =2 status ='C' amount ='200.00' )
( order_id =3 status ='O' amount ='150.00' )
( order_id =4 status ='X' amount ='300.00' )
( order_id =5 status ='O' amount ='250.00' )
).
" Filtrar solo pedidos abiertos (status = 'O')
DATA(lt_open_orders) =FILTER #( lt_orders
USING KEY by_status
WHERE status ='O'
).
" Resultado: ordenes 1, 3, 5
2. EXCEPT WHERE (excluir registros)
" Obtener todos EXCEPTO los cancelados
DATA(lt_active_orders) =FILTER #( lt_orders
USING KEY by_status
EXCEPTWHERE status ='X'
).
" Resultado: ordenes 1, 2, 3, 5 (todas menos status 'X')
3. Filtro con multiples componentes de clave
TYPES: BEGIN OF ty_item,
plant TYPE cLENGTH4,
storage TYPE cLENGTH4,
material TYPE cLENGTH10,
quantity TYPE i,
END OF ty_item,
ty_items TYPE SORTED TABLE OF ty_item
WITH UNIQUE KEY plant storage material
WITH NON-UNIQUE SORTED KEY by_plant_storage
COMPONENTS plant storage.
DATA: lt_items TYPE ty_items.
lt_items =VALUE #(
( plant ='1000' storage ='LG01' material ='MAT001' quantity =10 )
( plant ='1000' storage ='LG01' material ='MAT002' quantity =20 )
( plant ='1000' storage ='LG02' material ='MAT001' quantity =15 )
( plant ='2000' storage ='LG01' material ='MAT001' quantity =25 )
).
" Filtrar por planta y almacen
DATA(lt_filtered) =FILTER #( lt_items
USING KEY by_plant_storage
WHERE plant ='1000'AND storage ='LG01'
).
" Resultado: MAT001 y MAT002 de 1000/LG01
4. Comparacion: FILTER vs LOOP WHERE
" === CLASICO CON LOOP ===
DATA: lt_result_loop TYPE ty_orders.
LOOP AT lt_orders INTODATA(ls_order) WHERE status ='O'.
APPEND ls_order TO lt_result_loop.
ENDLOOP.
" === MODERNO CON FILTER ===
DATA(lt_result_filter) =FILTER #( lt_orders
USING KEY by_status
WHERE status ='O'
).
" FILTER es mas corto y potencialmente mas rapido
" (usa la clave para busqueda optimizada)
5. FILTER con tabla como filtro
TYPES: ty_status_filter TYPE SORTED TABLE OF cLENGTH1
WITH UNIQUE KEYtable_line.
DATA: lt_valid_status TYPE ty_status_filter.
" Estados validos a filtrar
lt_valid_status =VALUE #( ( 'O' ) ( 'P' ) ).
" Filtrar usando otra tabla
DATA(lt_valid_orders) =FILTER #( lt_orders
USING KEY by_status
WHERE status IN lt_valid_status
).
6. FILTER con EXCEPT y tabla
TYPES: ty_exclude_status TYPE SORTED TABLE OF cLENGTH1