Cómo filtrar en AMDP usando SELECT-OPTIONS

Uno de los problemas más comunes cuando empiezas con AMDP es intentar usar un SELECT-OPTIONS directamente en la consulta a base de datos, y no funciona.

La razón es que SELECT-OPTIONS es una característica de ABAP, no de SQLScript. Por tanto, AMDP no entiende tablas tipo rango ni select-options.

Este código funciona en Open SQL, pero no en AMDP:

SELECT *
FROM mara
INTO TABLE @DATA(lt_mara)
WHERE matnr IN @s_matnr.

La solución consiste en:

  1. Convertir el SELECT-OPTIONS a un filtro SQL (WHERE dinámico)
  2. Pasar ese filtro como string al AMDP
  3. Aplicar el filtro usando APPLY_FILTER

Ejemplo práctico paso a paso

Paso 1: Definir el SELECT-OPTIONS

SELECT-OPTIONS: s_matnr FOR mara-matnr.

Paso 2: Convertirle el SELECT-OPTIONS a una cadena WHERE dinámica

SAP proporciona una clase estándar para esto: cl_shdb_seltab=>combine_seltabs( ).

DATA(lv_where) = cl_shdb_seltab=>combine_seltabs(
it_named_seltabs = VALUE #(( name = 'MATNR' dref = REF #( s_matnr[] )))
iv_client_field = 'MANDT').

Paso 3: Pasar el filtro al método AMDP

CLASS-METHODS get_data
IMPORTING VALUE(iv_where) TYPE string
EXPORTING VALUE(et_data) TYPE tt_data.

Paso 4: Aplicar el filtro dentro del AMDP con APPLY_FILTER

APPLY_FILTER permite aplicar dinámicamente el WHERE generado desde ABAP.

METHOD get_data BY DATABASE PROCEDURE FOR HDB
LANGUAGE SQLSCRIPT OPTIONS READ-ONLY
USING mara.

et_data = APPLY_FILTER(mara, :iv_where);

ENDMETHOD.

Y con esto ya puedes aplicar select-options en tu AMDP.

📌 Nota sobre CDS views: Si necesitas usar SELECT-OPTIONS en una CDS view table funciton, el proceso es similar: conviertes el rango a cadena WHERE con CL_SHDB_SELTAB=>COMBINE_SELTABS y luego usas :iv_where en la definición de la vista, y luego APPLY_FILTER en la función AMDP.