ABAP Cloud Cheat Sheet 2025: Referencia Completa

Kategorie
ABAP Cloud
Veröffentlicht
Autor
Johannes

El Cheat Sheet ABAP Cloud definitivo con todos los Statements importantes, expresiones modernas y mejores prácticas para 2025. Perfecto como referencia rápida para el día a día del desarrollador.

Índice de contenidos

  1. Declaración de datos
  2. Estructuras de control
  3. Tablas internas
  4. Acceso a base de datos
  5. Expresiones modernas
  6. Operaciones con strings
  7. OOP (Orientación a objetos)
  8. Manejo de excepciones
  9. RAP (RESTful ABAP)
  10. CDS Views

Declaración de datos

Tipos de datos elementales

" Clásico (obsoleto en ABAP Cloud)
DATA lv_name TYPE string.
DATA lv_count TYPE i.
" Moderno: Declaración inline
DATA(lv_name) = 'Max Mustermann'.
DATA(lv_count) = 42.
" Constantes
CONSTANTS gc_max_entries TYPE i VALUE 100.
" Field Symbols & Referencias de datos
FIELD-SYMBOLS <fs_data> TYPE any.
DATA(lo_ref) = NEW zcl_my_class( ).

Estructuras y tablas

" Estructura
TYPES: BEGIN OF ty_customer,
id TYPE i,
name TYPE string,
email TYPE string,
END OF ty_customer.
" Tabla interna
DATA lt_customers TYPE TABLE OF ty_customer.
" Moderno: TYPE TABLE OF con índice
DATA lt_indexed TYPE STANDARD TABLE OF ty_customer WITH DEFAULT KEY.
DATA lt_sorted TYPE SORTED TABLE OF ty_customer WITH UNIQUE KEY id.
DATA lt_hashed TYPE HASHED TABLE OF ty_customer WITH UNIQUE KEY id.

Estructuras de control

Condiciones IF

IF lv_status = 'ACTIVE'.
" Código
ELSEIF lv_status = 'PENDING'.
" Código
ELSE.
" Código
ENDIF.
" Moderno: Inline con COND
DATA(lv_message) = COND string(
WHEN lv_status = 'ACTIVE' THEN 'Activo'
WHEN lv_status = 'PENDING' THEN 'Pendiente'
ELSE 'Desconocido'
).

Statement CASE

CASE lv_type.
WHEN 'A'.
" Código
WHEN 'B' OR 'C'.
" Código
WHEN OTHERS.
" Default
ENDCASE.
" Moderno: Expresión SWITCH
DATA(lv_result) = SWITCH string( lv_type
WHEN 'A' THEN 'Tipo A'
WHEN 'B' THEN 'Tipo B'
ELSE 'Desconocido'
).

Bucles

" Bucle DO
DO 10 TIMES.
" Código
ENDDO.
" Bucle WHILE
WHILE lv_count < 100.
lv_count = lv_count + 1.
ENDWHILE.
" LOOP AT (tabla interna)
LOOP AT lt_customers INTO DATA(ls_customer).
" Procesamiento
ENDLOOP.
" Moderno: Expresión FOR
DATA(lt_names) = VALUE string_table(
FOR ls_cust IN lt_customers
( ls_cust-name )
).

Tablas internas

Agregar filas

" APPEND
APPEND VALUE #( id = 1 name = 'Max' ) TO lt_customers.
" INSERT
INSERT VALUE #( id = 2 name = 'Anna' ) INTO TABLE lt_customers.
" Moderno: VALUE con múltiples filas
lt_customers = VALUE #(
( id = 1 name = 'Max' email = '[email protected]' )
( id = 2 name = 'Anna' email = '[email protected]' )
).

Leer filas

" READ TABLE clásico
READ TABLE lt_customers INTO DATA(ls_customer)
WITH KEY id = 1.
" Moderno: Table Expression
DATA(ls_cust) = lt_customers[ id = 1 ].
" Opcional: Default cuando no se encuentra
DATA(ls_opt) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Establecer valor por defecto
DATA(ls_def) = VALUE #( lt_customers[ id = 999 ]
DEFAULT VALUE #( id = 0 name = 'Desconocido' ) ).

Modificar filas

" MODIFY clásico
MODIFY lt_customers FROM VALUE #( id = 1 name = 'Maximilian' )
TRANSPORTING name WHERE id = 1.
" Moderno: Table Expression
lt_customers[ id = 1 ]-name = 'Maximilian'.

Eliminar filas

" DELETE clásico
DELETE lt_customers WHERE id = 1.
" DELETE por índice
DELETE lt_customers INDEX 1.
" CLEAR & FREE
CLEAR lt_customers. " Vacía tabla (memoria permanece)
FREE lt_customers. " Libera memoria

Operaciones con tablas

" Número de filas
DATA(lv_lines) = lines( lt_customers ).
" Ordenar
SORT lt_customers BY name ASCENDING.
" Filtrar
DATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" CORRESPONDING (Mapeo)
DATA(lt_target) = CORRESPONDING #( lt_source ).

Acceso a base de datos

SELECT

" Registro individual
SELECT SINGLE id, name, email
FROM ztab_customers
WHERE id = @lv_id
INTO @DATA(ls_customer).
" Múltiples filas
SELECT id, name, email
FROM ztab_customers
WHERE status = 'ACTIVE'
INTO TABLE @lt_customers.
" Moderno: Inline con Joins
SELECT c~id, c~name, o~order_date
FROM ztab_customers AS c
INNER JOIN ztab_orders AS o
ON c~id = o~customer_id
WHERE c~status = 'ACTIVE'
INTO TABLE @DATA(lt_result).
" Agregación
SELECT customer_id, COUNT( * ) AS order_count
FROM ztab_orders
GROUP BY customer_id
INTO TABLE @DATA(lt_stats).

INSERT, UPDATE, DELETE

" INSERT
INSERT ztab_customers FROM @ls_customer.
" UPDATE
UPDATE ztab_customers
SET status = 'INACTIVE'
WHERE id = @lv_id.
" DELETE
DELETE FROM ztab_customers WHERE id = @lv_id.
" MODIFY (INSERT o UPDATE)
MODIFY ztab_customers FROM @ls_customer.

COMMIT & ROLLBACK

" Guardar cambios
COMMIT WORK.
" Revertir cambios
ROLLBACK WORK.

Expresiones modernas

Constructor VALUE

" Estructura
DATA(ls_data) = VALUE ty_customer(
id = 1
name = 'Max'
).
" Tabla
DATA(lt_data) = VALUE ty_customer_table(
( id = 1 name = 'Max' )
( id = 2 name = 'Anna' )
).
" BASE: Extender datos existentes
lt_data = VALUE #( BASE lt_data
( id = 3 name = 'Peter' )
).

CORRESPONDING

" Mapeo simple
DATA(ls_target) = CORRESPONDING #( ls_source ).
" Con MAPPING
DATA(ls_mapped) = CORRESPONDING #( ls_source MAPPING
target_field = source_field
).
" DEEP: Estructuras anidadas
DATA(ls_deep) = CORRESPONDING #( DEEP ls_source ).

COND & SWITCH

" COND (Alternativa a IF)
DATA(lv_discount) = COND decfloat16(
WHEN lv_amount > 1000 THEN lv_amount * '0.1'
WHEN lv_amount > 500 THEN lv_amount * '0.05'
ELSE 0
).
" SWITCH (Alternativa a CASE)
DATA(lv_category) = SWITCH string( lv_age
WHEN 0 THEN 'Bebé'
WHEN 1 TO 12 THEN 'Niño'
WHEN 13 TO 17 THEN 'Adolescente'
ELSE 'Adulto'
).

FILTER

" Filtro simple
DATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" Filtro con condición IN
DATA(lt_premium) = FILTER #( lt_customers USING KEY id
WHERE id IN lt_premium_ids ).

REDUCE

" Calcular suma
DATA(lv_total) = REDUCE i( INIT sum = 0
FOR ls_order IN lt_orders
NEXT sum = sum + ls_order-amount ).
" Concatenar strings
DATA(lv_names) = REDUCE string( INIT text = ||
FOR ls_cust IN lt_customers
NEXT text = text && ls_cust-name && ', ' ).

Expresión FOR

" Transformación
DATA(lt_ids) = VALUE int4_table(
FOR ls_customer IN lt_customers
( ls_customer-id )
).
" Con condición
DATA(lt_active_names) = VALUE string_table(
FOR ls_cust IN lt_customers
WHERE ( status = 'ACTIVE' )
( ls_cust-name )
).
" FOR anidado
DATA(lt_flat) = VALUE ty_table(
FOR ls_group IN lt_groups
FOR ls_item IN ls_group-items
( ls_item )
).

Operaciones con strings

String Templates

" Simple
DATA(lv_greeting) = |Hola { lv_name }!|.
" Con formato
DATA(lv_price) = |Precio: { lv_amount CURRENCY = lv_currency }|.
DATA(lv_date) = |Fecha: { lv_timestamp TIMESTAMP = ISO }|.
" Alineación y padding
DATA(lv_padded) = |{ lv_text WIDTH = 20 ALIGN = LEFT PAD = '.' }|.

Métodos de strings

" Longitud
DATA(lv_len) = strlen( lv_text ).
" Substring
DATA(lv_sub) = substring( val = lv_text off = 0 len = 5 ).
" Buscar & Reemplazar
DATA(lv_pos) = find( val = lv_text sub = 'test' ).
DATA(lv_replaced) = replace( val = lv_text sub = 'old' with = 'new' ).
" Upper/Lower Case
DATA(lv_upper) = to_upper( lv_text ).
DATA(lv_lower) = to_lower( lv_text ).
" Trim
DATA(lv_trimmed) = condense( lv_text ).

CONCATENATE & SPLIT

" Moderno: String Template en lugar de CONCATENATE
DATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.
" SPLIT
SPLIT lv_text AT ',' INTO TABLE DATA(lt_parts).

OOP (Orientación a objetos)

Definición de clase

CLASS zcl_customer DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING iv_id TYPE i,
get_name
RETURNING VALUE(rv_name) TYPE string,
set_status
IMPORTING iv_status TYPE string.
PRIVATE SECTION.
DATA:
mv_id TYPE i,
mv_name TYPE string,
mv_status TYPE string.
ENDCLASS.
CLASS zcl_customer IMPLEMENTATION.
METHOD constructor.
mv_id = iv_id.
ENDMETHOD.
METHOD get_name.
rv_name = mv_name.
ENDMETHOD.
METHOD set_status.
mv_status = iv_status.
ENDMETHOD.
ENDCLASS.

Instanciación

" Operador NEW
DATA(lo_customer) = NEW zcl_customer( iv_id = 1 ).
" Llamada de método
DATA(lv_name) = lo_customer->get_name( ).
lo_customer->set_status( 'ACTIVE' ).

Interfaces

INTERFACE zif_processor.
METHODS process
IMPORTING iv_data TYPE string
RETURNING VALUE(rv_result) TYPE string.
ENDINTERFACE.
CLASS zcl_impl DEFINITION.
PUBLIC SECTION.
INTERFACES zif_processor.
ENDCLASS.
CLASS zcl_impl IMPLEMENTATION.
METHOD zif_processor~process.
rv_result = |Procesado: { iv_data }|.
ENDMETHOD.
ENDCLASS.

Manejo de excepciones

TRY-CATCH

TRY.
DATA(lv_customer) = lt_customers[ id = lv_id ].
CATCH cx_sy_itab_line_not_found INTO DATA(lx_error).
" Manejo de error
DATA(lv_msg) = lx_error->get_text( ).
ENDTRY.
" Múltiples excepciones
TRY.
" Código
CATCH cx_sy_arithmetic_error.
" División por 0
CATCH cx_sy_conversion_error.
" Error de conversión
CATCH cx_root INTO DATA(lx_any).
" Todas las demás
ENDTRY.

CLEANUP

TRY.
" Código con recursos
CATCH cx_error.
" Manejo de error
CLEANUP.
" Liberar recursos (siempre se ejecuta)
lo_resource->close( ).
ENDTRY.

Clases de excepción

CLASS zcx_my_exception DEFINITION
PUBLIC
INHERITING FROM cx_static_check
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
METHODS constructor
IMPORTING textid TYPE sotr_conc OPTIONAL.
ENDCLASS.
" Uso
IF lv_invalid.
RAISE EXCEPTION TYPE zcx_my_exception.
ENDIF.

RAP (RESTful ABAP)

EML (Entity Manipulation Language)

" READ
READ ENTITIES OF zi_travel
ENTITY Travel
FIELDS ( TravelId AgencyId Status )
WITH VALUE #( ( TravelId = lv_id ) )
RESULT DATA(lt_travel).
" CREATE
MODIFY ENTITIES OF zi_travel
ENTITY Travel
CREATE FIELDS ( AgencyId CustomerId BeginDate )
WITH VALUE #( (
%cid = 'CID_1'
AgencyId = '000001'
CustomerId = '000010'
BeginDate = cl_abap_context_info=>get_system_date( )
) ).
" UPDATE
MODIFY ENTITIES OF zi_travel
ENTITY Travel
UPDATE FIELDS ( Status )
WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ).
" DELETE
MODIFY ENTITIES OF zi_travel
ENTITY Travel
DELETE FROM VALUE #( ( TravelId = lv_id ) ).
" COMMIT
COMMIT ENTITIES.

Actions

" Ejecutar Action
MODIFY ENTITIES OF zi_travel
ENTITY Travel
EXECUTE acceptTravel FROM VALUE #( ( TravelId = lv_id ) )
RESULT DATA(lt_result).

CDS Views

View básico

@AbapCatalog.sqlViewName: 'ZVCUSTOMER'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Customer View'
define view Z_Customer
as select from ztab_customers
{
key id as CustomerId,
name as CustomerName,
email as Email,
@Semantics.amount.currencyCode: 'Currency'
credit_limit as CreditLimit,
currency as Currency
}

Associations & Joins

define view Z_CustomerOrders
as select from ztab_customers as c
association [0..*] to ztab_orders as _Orders
on c.id = _Orders.customer_id
{
key c.id,
c.name,
c.email,
_Orders // Exponer asociación
}

Anotaciones

@Analytics.dataCategory: #CUBE
@Analytics.query: true
@VDM.viewType: #CONSUMPTION
define view Z_SalesAnalytics
as select from ztab_sales
{
@Analytics.dimension: true
product_id,
@Aggregation.default: #SUM
@Semantics.amount.currencyCode: 'Currency'
revenue,
currency
}

Mejores prácticas

✅ HACER

" Declaraciones inline
DATA(lv_result) = calculate_value( ).
" Constructor VALUE
DATA(lt_data) = VALUE ty_table( ( id = 1 ) ).
" String Templates
DATA(lv_msg) = |Error: { lv_error_code }|.
" Table Expressions
DATA(ls_customer) = lt_customers[ id = lv_id ].
" Method Chaining
DATA(lv_final) = lo_object->method1( )->method2( )->get_result( ).

❌ NO HACER

" Declaración obsoleta
DATA lv_result TYPE string.
lv_result = calculate_value( ).
" CONCATENATE en lugar de String Template
CONCATENATE 'Error:' lv_error_code INTO lv_msg SEPARATED BY space.
" Variables auxiliares innecesarias
DATA ls_customer TYPE ty_customer.
READ TABLE lt_customers INTO ls_customer WITH KEY id = lv_id.

Restricciones de ABAP Cloud

❌ No permitido en ABAP Cloud

  • FORM/PERFORM (Subrutinas)
  • SELECT * sin lista de campos
  • Accesos directos a BD en tablas SAP (solo Released APIs)
  • SUBMIT para llamadas de report
  • Desarrollo Dynpro (solo Fiori)
  • CALL TRANSACTION

✅ Usar en su lugar

  • Métodos en lugar de FORM
  • Lista de campos explícita en SELECT
  • CDS Views con estado Released
  • Business Events & RAP
  • SAP Fiori Elements
  • ABAP EML (Entity Manipulation Language)

Clases e interfaces útiles

Clase/InterfaceUso
cl_abap_context_infoFecha del sistema, Usuario, Mandante
cl_abap_randomGenerar números aleatorios
cl_abap_structdescrRuntime Type Info (RTTI)
cl_http_clientPeticiones HTTP
cl_salv_tableCrear listas ALV
if_abap_behvConstantes de comportamiento RAP
cx_rootBase de todas las excepciones

Resumen

Este Cheat Sheet cubre los conceptos más importantes de ABAP Cloud para 2025:

  • Sintaxis moderna con declaraciones inline
  • Expresiones constructoras (VALUE, CORRESPONDING, COND, etc.)
  • EML para desarrollo RAP
  • CDS Views para modelado de datos
  • Mejores prácticas para código limpio y mantenible

Consejo: ¡Guarda esta página como marcador o imprímela para acceso rápido durante el desarrollo!


Ver también: