ABAP Cloud vs. ABAP Clásico: Diferencias y guía de migración

Kategorie
ABAP-Statements
Veröffentlicht
Autor
Johannes

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

AspectoABAP ClásicoABAP Cloud
Modelo de desarrolloDesarrollo clásicoRESTful (RAP)
APIsTodas disponiblesSolo APIs liberadas
UIDynpro, ALV, WebDynproFiori Elements, UI5
Base de datosOpen SQLABAP SQL (optimizado)
SintaxisTodas las sentenciasSubconjunto moderno
AmpliacionesModificaciones, BAdIsSolo 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 - permitido
DATA: lv_text TYPE string,
lt_data TYPE TABLE OF sflight.
" ABAP Cloud - Inline declaraciones preferidas
DATA(lv_text) = `Hola`.
SELECT * FROM sflight INTO TABLE @DATA(lt_data).

2. Operaciones de cadenas

" Clásico
CONCATENATE lv_first lv_second INTO lv_result SEPARATED BY ' '.
" ABAP Cloud - String Templates preferidos
DATA(lv_result) = |{ lv_first } { lv_second }|.

3. READ TABLE

" Clásico
READ TABLE lt_data INTO ls_data WITH KEY id = 1.
IF sy-subrc = 0.
" ...
ENDIF.
" ABAP Cloud - Table Expression preferida
TRY.
DATA(ls_data) = lt_data[ id = 1 ].
CATCH cx_sy_itab_line_not_found.
" No encontrado
ENDTRY.
" O con valor por defecto
DATA(ls_data) = VALUE #( lt_data[ id = 1 ] OPTIONAL ).

4. LOOP con índice

" Clásico
LOOP AT lt_data INTO ls_data.
lv_index = sy-tabix.
ENDLOOP.
" ABAP Cloud - con INDEX INTO
LOOP AT lt_data INTO DATA(ls_data) INDEX INTO DATA(lv_index).
" lv_index contiene el índice
ENDLOOP.

5. MOVE-CORRESPONDING

" Clásico
MOVE-CORRESPONDING ls_source TO ls_target.
" ABAP Cloud - CORRESPONDING preferido
ls_target = CORRESPONDING #( ls_source ).
" Con mapeo
ls_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 disponible
CALL FUNCTION 'BAPI_SALESORDER_GETLIST'.
SELECT SINGLE * FROM vbak. " Tablas no liberadas
" ABAP Cloud - usar CDS Views liberadas
SELECT * FROM I_SalesOrder INTO TABLE @DATA(lt_orders).

Campos del sistema

" NO disponible
DATA(lv_uname) = sy-uname.
DATA(lv_datum) = sy-datum.
" ABAP Cloud - CL_ABAP_CONTEXT_INFO
DATA(lv_user) = cl_abap_context_info=>get_user_technical_name( ).
DATA(lv_date) = cl_abap_context_info=>get_system_date( ).

Output

" NO disponible
WRITE: / 'Hola'.
MESSAGE 'Hola' TYPE 'I'.
" ABAP Cloud - Output clásico no tiene sentido
" En su lugar: Logging, RAP Messages

Alternativas a funciones clásicas

1. Funciones de fecha

" Clásico
CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'.
" ABAP Cloud
DATA(lv_year) = EXTRACT( YEAR FROM lv_date ).
DATA(lv_month) = EXTRACT( MONTH FROM lv_date ).

2. UUIDs

" Clásico
CALL FUNCTION 'GUID_CREATE'.
" ABAP Cloud
DATA(lv_uuid) = cl_system_uuid=>create_uuid_x16_static( ).

3. Números

" Clásico
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
nr_range_nr = '01'
object = 'Z_NROBJ'
IMPORTING
number = lv_number.
" ABAP Cloud
DATA(lo_nr) = cl_numberrange_runtime=>number_get(
nr_range_nr = '01'
object = 'Z_NROBJ'
).
DATA(lv_number) = lo_nr-number.

4. ALV

" Clásico
CALL 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 Elements

Comprobació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: abaplint

API 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

  1. Ejecutar comprobación ATC con perfil Cloud
  2. Identificar APIs no liberadas
  3. Documentar dependencias

Paso 2: Reemplazar APIs

" Antes
CALL FUNCTION 'POPUP_TO_CONFIRM'.
" Después - no hay reemplazo directo
" Concepto de UI a través de Fiori/UI5
" O: Diseñar mensajes RAP apropiadamente

Paso 3: Adaptar el modelo de datos

" Antes - acceso directo a tablas
SELECT * FROM mara INTO TABLE @DATA(lt_mara).
" Después - usar CDS Views liberadas
SELECT * FROM I_Product INTO TABLE @DATA(lt_products).

Paso 4: Arquitectura RAP

" Antes - Reports con ALV
REPORT 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 + Binding

Herramientas de comparación

Verificación de la liberación de la API

-- Buscar clases liberadas
SELECT * 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.