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».
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( )). USINGlista las tablas y vistas que lee el procedimiento.- Las variables de ABAP se usan con dos puntos delante:
:iv_desde.
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.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.
@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;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 programa | ABAP SQL |
| Un modelo de datos reutilizable, con permisos y para Fiori | Vista CDS |
| Lógica que no cabe en una sola consulta o funciones propias de HANA | AMDP o CDS table function |
| Que funcione en bases de datos que no son HANA | ABAP 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.
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:
| Forma | Cómo |
|---|---|
| Filtrar a mano | WHERE mandt = SESSION_CONTEXT( 'CLIENT' ), como en los ejemplos |
| Dejar que lo haga el sistema | Añadir AMDP OPTIONS CDS SESSION CLIENT current y leer vistas CDS en lugar de tablas |
| En una table function | Anotar @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:
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-ONLYsiempre 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.