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
- Declaración de datos
- Estructuras de control
- Tablas internas
- Acceso a base de datos
- Expresiones modernas
- Operaciones con strings
- OOP (Orientación a objetos)
- Manejo de excepciones
- RAP (RESTful ABAP)
- 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 inlineDATA(lv_name) = 'Max Mustermann'.DATA(lv_count) = 42.
" ConstantesCONSTANTS gc_max_entries TYPE i VALUE 100.
" Field Symbols & Referencias de datosFIELD-SYMBOLS <fs_data> TYPE any.DATA(lo_ref) = NEW zcl_my_class( ).Estructuras y tablas
" EstructuraTYPES: BEGIN OF ty_customer, id TYPE i, name TYPE string, email TYPE string, END OF ty_customer.
" Tabla internaDATA lt_customers TYPE TABLE OF ty_customer.
" Moderno: TYPE TABLE OF con índiceDATA 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ódigoELSEIF lv_status = 'PENDING'. " CódigoELSE. " CódigoENDIF.
" Moderno: Inline con CONDDATA(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. " DefaultENDCASE.
" Moderno: Expresión SWITCHDATA(lv_result) = SWITCH string( lv_type WHEN 'A' THEN 'Tipo A' WHEN 'B' THEN 'Tipo B' ELSE 'Desconocido').Bucles
" Bucle DODO 10 TIMES. " CódigoENDDO.
" Bucle WHILEWHILE lv_count < 100. lv_count = lv_count + 1.ENDWHILE.
" LOOP AT (tabla interna)LOOP AT lt_customers INTO DATA(ls_customer). " ProcesamientoENDLOOP.
" Moderno: Expresión FORDATA(lt_names) = VALUE string_table( FOR ls_cust IN lt_customers ( ls_cust-name )).Tablas internas
Agregar filas
" APPENDAPPEND VALUE #( id = 1 name = 'Max' ) TO lt_customers.
" INSERTINSERT VALUE #( id = 2 name = 'Anna' ) INTO TABLE lt_customers.
" Moderno: VALUE con múltiples filaslt_customers = VALUE #().Leer filas
" READ TABLE clásicoREAD TABLE lt_customers INTO DATA(ls_customer) WITH KEY id = 1.
" Moderno: Table ExpressionDATA(ls_cust) = lt_customers[ id = 1 ].
" Opcional: Default cuando no se encuentraDATA(ls_opt) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Establecer valor por defectoDATA(ls_def) = VALUE #( lt_customers[ id = 999 ] DEFAULT VALUE #( id = 0 name = 'Desconocido' ) ).Modificar filas
" MODIFY clásicoMODIFY lt_customers FROM VALUE #( id = 1 name = 'Maximilian' ) TRANSPORTING name WHERE id = 1.
" Moderno: Table Expressionlt_customers[ id = 1 ]-name = 'Maximilian'.Eliminar filas
" DELETE clásicoDELETE lt_customers WHERE id = 1.
" DELETE por índiceDELETE lt_customers INDEX 1.
" CLEAR & FREECLEAR lt_customers. " Vacía tabla (memoria permanece)FREE lt_customers. " Libera memoriaOperaciones con tablas
" Número de filasDATA(lv_lines) = lines( lt_customers ).
" OrdenarSORT lt_customers BY name ASCENDING.
" FiltrarDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" CORRESPONDING (Mapeo)DATA(lt_target) = CORRESPONDING #( lt_source ).Acceso a base de datos
SELECT
" Registro individualSELECT SINGLE id, name, email FROM ztab_customers WHERE id = @lv_id INTO @DATA(ls_customer).
" Múltiples filasSELECT id, name, email FROM ztab_customers WHERE status = 'ACTIVE' INTO TABLE @lt_customers.
" Moderno: Inline con JoinsSELECT 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ónSELECT customer_id, COUNT( * ) AS order_count FROM ztab_orders GROUP BY customer_id INTO TABLE @DATA(lt_stats).INSERT, UPDATE, DELETE
" INSERTINSERT ztab_customers FROM @ls_customer.
" UPDATEUPDATE ztab_customers SET status = 'INACTIVE' WHERE id = @lv_id.
" DELETEDELETE FROM ztab_customers WHERE id = @lv_id.
" MODIFY (INSERT o UPDATE)MODIFY ztab_customers FROM @ls_customer.COMMIT & ROLLBACK
" Guardar cambiosCOMMIT WORK.
" Revertir cambiosROLLBACK WORK.Expresiones modernas
Constructor VALUE
" EstructuraDATA(ls_data) = VALUE ty_customer( id = 1 name = 'Max').
" TablaDATA(lt_data) = VALUE ty_customer_table( ( id = 1 name = 'Max' ) ( id = 2 name = 'Anna' )).
" BASE: Extender datos existenteslt_data = VALUE #( BASE lt_data ( id = 3 name = 'Peter' )).CORRESPONDING
" Mapeo simpleDATA(ls_target) = CORRESPONDING #( ls_source ).
" Con MAPPINGDATA(ls_mapped) = CORRESPONDING #( ls_source MAPPING target_field = source_field).
" DEEP: Estructuras anidadasDATA(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 simpleDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" Filtro con condición INDATA(lt_premium) = FILTER #( lt_customers USING KEY id WHERE id IN lt_premium_ids ).REDUCE
" Calcular sumaDATA(lv_total) = REDUCE i( INIT sum = 0 FOR ls_order IN lt_orders NEXT sum = sum + ls_order-amount ).
" Concatenar stringsDATA(lv_names) = REDUCE string( INIT text = || FOR ls_cust IN lt_customers NEXT text = text && ls_cust-name && ', ' ).Expresión FOR
" TransformaciónDATA(lt_ids) = VALUE int4_table( FOR ls_customer IN lt_customers ( ls_customer-id )).
" Con condiciónDATA(lt_active_names) = VALUE string_table( FOR ls_cust IN lt_customers WHERE ( status = 'ACTIVE' ) ( ls_cust-name )).
" FOR anidadoDATA(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
" SimpleDATA(lv_greeting) = |Hola { lv_name }!|.
" Con formatoDATA(lv_price) = |Precio: { lv_amount CURRENCY = lv_currency }|.DATA(lv_date) = |Fecha: { lv_timestamp TIMESTAMP = ISO }|.
" Alineación y paddingDATA(lv_padded) = |{ lv_text WIDTH = 20 ALIGN = LEFT PAD = '.' }|.Métodos de strings
" LongitudDATA(lv_len) = strlen( lv_text ).
" SubstringDATA(lv_sub) = substring( val = lv_text off = 0 len = 5 ).
" Buscar & ReemplazarDATA(lv_pos) = find( val = lv_text sub = 'test' ).DATA(lv_replaced) = replace( val = lv_text sub = 'old' with = 'new' ).
" Upper/Lower CaseDATA(lv_upper) = to_upper( lv_text ).DATA(lv_lower) = to_lower( lv_text ).
" TrimDATA(lv_trimmed) = condense( lv_text ).CONCATENATE & SPLIT
" Moderno: String Template en lugar de CONCATENATEDATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.
" SPLITSPLIT 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 NEWDATA(lo_customer) = NEW zcl_customer( iv_id = 1 ).
" Llamada de métodoDATA(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 excepcionesTRY. " 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ásENDTRY.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.
" UsoIF lv_invalid. RAISE EXCEPTION TYPE zcx_my_exception.ENDIF.RAP (RESTful ABAP)
EML (Entity Manipulation Language)
" READREAD ENTITIES OF zi_travel ENTITY Travel FIELDS ( TravelId AgencyId Status ) WITH VALUE #( ( TravelId = lv_id ) ) RESULT DATA(lt_travel).
" CREATEMODIFY 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( ) ) ).
" UPDATEMODIFY ENTITIES OF zi_travel ENTITY Travel UPDATE FIELDS ( Status ) WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ).
" DELETEMODIFY ENTITIES OF zi_travel ENTITY Travel DELETE FROM VALUE #( ( TravelId = lv_id ) ).
" COMMITCOMMIT ENTITIES.Actions
" Ejecutar ActionMODIFY 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 inlineDATA(lv_result) = calculate_value( ).
" Constructor VALUEDATA(lt_data) = VALUE ty_table( ( id = 1 ) ).
" String TemplatesDATA(lv_msg) = |Error: { lv_error_code }|.
" Table ExpressionsDATA(ls_customer) = lt_customers[ id = lv_id ].
" Method ChainingDATA(lv_final) = lo_object->method1( )->method2( )->get_result( ).❌ NO HACER
" Declaración obsoletaDATA lv_result TYPE string.lv_result = calculate_value( ).
" CONCATENATE en lugar de String TemplateCONCATENATE 'Error:' lv_error_code INTO lv_msg SEPARATED BY space.
" Variables auxiliares innecesariasDATA 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)
SUBMITpara 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/Interface | Uso |
|---|---|
cl_abap_context_info | Fecha del sistema, Usuario, Mandante |
cl_abap_random | Generar números aleatorios |
cl_abap_structdescr | Runtime Type Info (RTTI) |
cl_http_client | Peticiones HTTP |
cl_salv_table | Crear listas ALV |
if_abap_behv | Constantes de comportamiento RAP |
cx_root | Base 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: