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:
- Convertir el
SELECT-OPTIONSa un filtro SQL (WHERE dinámico) - Pasar ese filtro como string al AMDP
- 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.


