Ir al contenido
Programación ABAP

AMDP: procedimientos de base de datos en ABAP

Métodos ABAP cuyo código es SQLScript y se ejecuta directamente en SAP HANA. Se crean, se transportan y se llaman como cualquier método.

Apartados
8
Revisado
Octubre de 2026
Fuentes
2 enlaces

Qué es un AMDP

ABAP Managed Database Procedures (desde 7.40 SP05) permite escribir lógica de base de datos dentro de una clase ABAP. El sistema crea el procedimiento en HANA al activarlo. Solo funciona con SAP HANA.

Usa AMDP solo cuando ABAP SQL y CDS no basten: cálculos procedimentales complejos o funciones propias de HANA. La regla es «primero CDS, luego AMDP».

ABAP clásicoCode pushdown con AMDPServidor de aplicaciones ABAPBase de datos SAP HANALOOP y cálculosen ABAPSELECT detoda la tabla1.000.000 filasLlamada al métodoAMDPSQLScriptagrupa y calcula200 filas
La idea del «code pushdown»: en lugar de traer millones de filas al servidor ABAP para calcular, el cálculo se hace en HANA y solo viaja el resultado.

Un método AMDP paso a paso

  • La clase implementa la interfaz IF_AMDP_MARKER_HDB.
  • Todos los parámetros se pasan por valor (VALUE( )).
  • USING lista las tablas y vistas que lee el procedimiento.
  • Las variables de ABAP se usan con dos puntos delante: :iv_desde.
ABAP + SQLScript
CLASS zcl_amdp_ventas DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    TYPES: BEGIN OF ty_total,
             kunnr TYPE kunnr,
             total TYPE netwr,
           END OF ty_total,
           tt_total TYPE STANDARD TABLE OF ty_total WITH EMPTY KEY.
    METHODS totales_por_cliente
      IMPORTING VALUE(iv_desde) TYPE d
      EXPORTING VALUE(et_total) TYPE tt_total.
ENDCLASS.

CLASS zcl_amdp_ventas IMPLEMENTATION.
  METHOD totales_por_cliente BY DATABASE PROCEDURE FOR HDB
                             LANGUAGE SQLSCRIPT
                             OPTIONS READ-ONLY
                             USING vbak.
    et_total = SELECT kunnr, SUM( netwr ) AS total
                 FROM vbak
                 WHERE mandt = SESSION_CONTEXT( 'CLIENT' )
                   AND erdat >= :iv_desde
                 GROUP BY kunnr;
  ENDMETHOD.
ENDCLASS.
Llamada
NEW zcl_amdp_ventas( )->totales_por_cliente(
  EXPORTING iv_desde = '20260101'
  IMPORTING et_total = DATA(lt_total) ).

AMDP como función de una vista CDS

Una CDS table function define la estructura y un método AMDP la rellena. Después se lee como cualquier vista CDS.

CDS
@EndUserText.label: 'Totales por cliente'
define table function ZTF_TotalCliente
  with parameters p_desde : abap.dats
  returns {
    mandt : abap.clnt;
    kunnr : kunnr;
    total : abap.dec( 15, 2 );
  }
  implemented by method zcl_tf_ventas=>totales;
ABAP + SQLScript
CLASS zcl_tf_ventas DEFINITION PUBLIC FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.
    CLASS-METHODS totales FOR TABLE FUNCTION ztf_totalcliente.
ENDCLASS.

CLASS zcl_tf_ventas IMPLEMENTATION.
  METHOD totales BY DATABASE FUNCTION FOR HDB
                 LANGUAGE SQLSCRIPT
                 OPTIONS READ-ONLY
                 USING vbak.
    RETURN SELECT mandt, kunnr, SUM( netwr ) AS total
             FROM vbak
             WHERE mandt = SESSION_CONTEXT( 'CLIENT' )
               AND erdat >= :p_desde
             GROUP BY mandt, kunnr;
  ENDMETHOD.
ENDCLASS.

ABAP SQL, CDS o AMDP

Necesitas…Usa
Leer datos en un programaABAP SQL
Un modelo de datos reutilizable, con permisos y para FioriVista CDS
Lógica que no cabe en una sola consulta o funciones propias de HANAAMDP o CDS table function
Que funcione en bases de datos que no son HANAABAP SQL o CDS (AMDP no sirve)

Para depurar, ADT tiene un depurador de AMDP: pon un punto de parada en el SQLScript y ejecuta la llamada.

SQLScript paso a paso: los 3 mejores pedidos de cada cliente

En SQLScript cada consulta puede guardar su resultado en una variable de tabla, que se usa después con dos puntos delante (:lt_ventas). HANA optimiza el conjunto, así que no hay que preocuparse por las tablas intermedias.

ABAP + SQLScript
METHOD top3_por_cliente BY DATABASE PROCEDURE FOR HDB
                        LANGUAGE SQLSCRIPT
                        OPTIONS READ-ONLY
                        USING vbak.
  -- 1. Numerar los pedidos de cada cliente de mayor a menor importe
  lt_ventas = SELECT kunnr, vbeln, netwr,
                     ROW_NUMBER() OVER ( PARTITION BY kunnr
                                         ORDER BY netwr DESC ) AS posicion
                FROM vbak
                WHERE mandt = SESSION_CONTEXT( 'CLIENT' )
                  AND erdat >= :iv_desde;

  -- 2. Quedarse con los tres primeros
  et_top = SELECT kunnr, vbeln, netwr, posicion
             FROM :lt_ventas
             WHERE posicion <= 3
             ORDER BY kunnr, posicion;
ENDMETHOD.
  • Los comentarios en SQLScript empiezan por --, no por comillas.
  • ROW_NUMBER() OVER ( PARTITION BY … ) es una función de ventana: numera las filas dentro de cada grupo sin agruparlas.
  • En CDS también hay funciones de ventana en versiones recientes, así que comprueba primero si te basta una vista.

El mandante en AMDP

En ABAP SQL el mandante se filtra solo. En SQLScript no: si lo olvidas, leerás datos de todos los mandantes. Hay dos formas de hacerlo bien:

FormaCómo
Filtrar a manoWHERE mandt = SESSION_CONTEXT( 'CLIENT' ), como en los ejemplos
Dejar que lo haga el sistemaAñadir AMDP OPTIONS CDS SESSION CLIENT current y leer vistas CDS en lugar de tablas
En una table functionAnotar @ClientHandling.type: #CLIENT_DEPENDENT y devolver el campo mandt

Capturar errores

Si el procedimiento falla en HANA (por ejemplo, una división por cero), ABAP recibe una excepción de la familia CX_AMDP_ERROR. Decláralas en el método y captúralas al llamar:

ABAP
METHODS totales_por_cliente
  IMPORTING VALUE(iv_desde) TYPE d
  EXPORTING VALUE(et_total) TYPE tt_total
  RAISING   cx_amdp_error.

" Al llamar
TRY.
    NEW zcl_amdp_ventas( )->totales_por_cliente(
      EXPORTING iv_desde = '20260101'
      IMPORTING et_total = DATA(lt_total) ).
  CATCH cx_amdp_error INTO DATA(lx_error).
    MESSAGE lx_error->get_text( ) TYPE 'I'.
ENDTRY.

Buenas prácticas

  • Usa OPTIONS READ-ONLY siempre que el procedimiento solo lea: es más seguro y HANA lo optimiza mejor.
  • Filtra cuanto antes y selecciona solo las columnas que necesitas, nunca SELECT *.
  • No uses las funciones CE (CE_PROJECTION, CE_JOIN…): están obsoletas. Usa SQL normal.
  • Prueba los AMDP con ABAP Unit como cualquier otro método.
  • En ABAP Cloud los AMDP están permitidos, pero solo pueden leer tablas y vistas propias o liberadas para ello.
  • Si el resultado se va a consultar como una vista, mejor una CDS table function que un procedimiento.

Fuentes