ABAP Cloud representa la evolución de la programación ABAP hacia un modelo de desarrollo moderno, preparado para el futuro y cloud-ready. Este artículo muestra las diferencias con el ABAP clásico.
Resumen
| Aspecto | ABAP Clásico | ABAP Cloud |
|---|---|---|
| Modelo de desarrollo | Desarrollo clásico | RESTful (RAP) |
| APIs | Todas disponibles | Solo APIs liberadas |
| UI | Dynpro, ALV, WebDynpro | Fiori Elements, UI5 |
| Base de datos | Open SQL | ABAP SQL (optimizado) |
| Sintaxis | Todas las sentencias | Subconjunto moderno |
| Ampliaciones | Modificaciones, BAdIs | Solo BAdIs liberados |
Diferencias arquitectónicas
ABAP Clásico
┌─────────────────────────────────┐│ Lógica de negocio ││ (Reports, BAPIs, Dynpro) │├─────────────────────────────────┤│ Acceso a base de datos ││ (Open SQL, Native SQL) │├─────────────────────────────────┤│ Base de datos │└─────────────────────────────────┘ABAP Cloud
┌─────────────────────────────────┐│ Fiori Elements │├─────────────────────────────────┤│ Objetos de negocio (RAP) ││ (Behavior Definition) │├─────────────────────────────────┤│ CDS Views │├─────────────────────────────────┤│ Base de datos │└─────────────────────────────────┘Diferencias en la sintaxis
1. Sentencia DATA
" Clásico - permitidoDATA: lv_text TYPE string, lt_data TYPE TABLE OF sflight.
" ABAP Cloud - Inline declaraciones preferidasDATA(lv_text) = `Hola`.SELECT * FROM sflight INTO TABLE @DATA(lt_data).2. Operaciones de cadenas
" ClásicoCONCATENATE lv_first lv_second INTO lv_result SEPARATED BY ' '.
" ABAP Cloud - String Templates preferidosDATA(lv_result) = |{ lv_first } { lv_second }|.3. READ TABLE
" ClásicoREAD TABLE lt_data INTO ls_data WITH KEY id = 1.IF sy-subrc = 0. " ...ENDIF.
" ABAP Cloud - Table Expression preferidaTRY. DATA(ls_data) = lt_data[ id = 1 ]. CATCH cx_sy_itab_line_not_found. " No encontradoENDTRY.
" O con valor por defectoDATA(ls_data) = VALUE #( lt_data[ id = 1 ] OPTIONAL ).4. LOOP con índice
" ClásicoLOOP AT lt_data INTO ls_data. lv_index = sy-tabix.ENDLOOP.
" ABAP Cloud - con INDEX INTOLOOP AT lt_data INTO DATA(ls_data) INDEX INTO DATA(lv_index). " lv_index contiene el índiceENDLOOP.5. MOVE-CORRESPONDING
" ClásicoMOVE-CORRESPONDING ls_source TO ls_target.
" ABAP Cloud - CORRESPONDING preferidols_target = CORRESPONDING #( ls_source ).
" Con mapeols_target = CORRESPONDING #( ls_source MAPPING target_field = source_field ).APIs no disponibles
En ABAP Cloud, muchos módulos de función y clases clásicas no están disponibles:
Acceso a datos
" NO disponibleCALL FUNCTION 'BAPI_SALESORDER_GETLIST'.SELECT SINGLE * FROM vbak. " Tablas no liberadas
" ABAP Cloud - usar CDS Views liberadasSELECT * FROM I_SalesOrder INTO TABLE @DATA(lt_orders).Campos del sistema
" NO disponibleDATA(lv_uname) = sy-uname.DATA(lv_datum) = sy-datum.
" ABAP Cloud - CL_ABAP_CONTEXT_INFODATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).DATA(lv_date) = cl_abap_context_info=>get_system_date( ).Output
" NO disponibleWRITE: / 'Hola'.MESSAGE 'Hola' TYPE 'I'.
" ABAP Cloud - Output clásico no tiene sentido" En su lugar: Logging, RAP MessagesAlternativas a funciones clásicas
1. Funciones de fecha
" ClásicoCALL FUNCTION 'DATE_TO_PERIOD_CONVERT'.
" ABAP CloudDATA(lv_year) = EXTRACT( YEAR FROM lv_date ).DATA(lv_month) = EXTRACT( MONTH FROM lv_date ).2. UUIDs
" ClásicoCALL FUNCTION 'GUID_CREATE'.
" ABAP CloudDATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).3. Números
" ClásicoCALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' object = 'Z_NROBJ' IMPORTING number = lv_number.
" ABAP CloudDATA(lo_nr) = cl_numberrange_runtime=>number_get( nr_range_nr = '01' object = 'Z_NROBJ').DATA(lv_number) = lo_nr-number.4. ALV
" ClásicoCALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'.cl_salv_table=>factory( ).
" ABAP Cloud - solo Fiori Elements" No hay output ABAP clásico" En su lugar: OData Service + Fiori ElementsComprobación de compatibilidad
ABAP Test Cockpit (ATC)
" Comprobación ATC para ABAP Cloud" Perfil: ABAP_CLOUD_DEVELOPMENT
" En ADT: Run As -> ABAP Test Cockpit" O en CLI: abaplintAPI liberadas
" Comprobar si una clase está liberada" En ADT: Ctrl+Shift+A -> Buscar clase" La anotación @API:... muestra el estado de liberación
" O vía: Finder del modelo ABAP Cloud Release" https://api.sap.com/Guía de migración
Paso 1: Análisis
- Ejecutar comprobación ATC con perfil Cloud
- Identificar APIs no liberadas
- Documentar dependencias
Paso 2: Reemplazar APIs
" AntesCALL FUNCTION 'POPUP_TO_CONFIRM'.
" Después - no hay reemplazo directo" Concepto de UI a través de Fiori/UI5" O: Diseñar mensajes RAP apropiadamentePaso 3: Adaptar el modelo de datos
" Antes - acceso directo a tablasSELECT * FROM mara INTO TABLE @DATA(lt_mara).
" Después - usar CDS Views liberadasSELECT * FROM I_Product INTO TABLE @DATA(lt_products).Paso 4: Arquitectura RAP
" Antes - Reports con ALVREPORT z_material_report.SELECT * FROM mara ...CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'.
" Después - Objeto de negocio RAP" 1. Crear CDS Views" 2. Behavior Definition" 3. Behavior Implementation" 4. Service Definition + BindingHerramientas de comparación
Verificación de la liberación de la API
-- Buscar clases liberadasSELECT * FROM i_apireleasedsoftwarecmpfcd WHERE softwarecomponentname = '/BOBF/CL_LIB'.ADT Views
En ADT puedes comprobar:
- Properties View: Estado de liberación
- ABAP Repository Trees: Filtrar por liberado
- Quick Fix: Sugerencias para alternativas
Notas importantes / Mejores prácticas
- Clean Core es el objetivo - evitar modificaciones.
- Usar únicamente APIs liberadas - ver la documentación SAP.
- CDS Views como capa de abstracción de datos.
- RAP como modelo de programación para objetos de negocio.
- Fiori Elements como UI estándar.
- Ejecutar comprobación ATC regularmente.
- Consultar la documentación SAP ABAP Cloud API.