Das ultimative ABAP Cloud Cheat Sheet mit allen wichtigen Statements, modernen Ausdrücken und Best Practices für 2025. Perfekt als Schnellreferenz für den täglichen Entwickleralltag.
📋 Inhaltsverzeichnis
- Datendeklaration
- Kontrollstrukturen
- Interne Tabellen
- Datenbankzugriff
- Moderne Ausdrücke
- String-Operationen
- OOP (Objektorientierung)
- Exception Handling
- RAP (RESTful ABAP)
- CDS Views
Datendeklaration
Elementare Datentypen
" Klassisch (veraltet in ABAP Cloud)DATA lv_name TYPE string.DATA lv_count TYPE i.
" Modern: Inline-DeklarationDATA(lv_name) = 'Max Mustermann'.DATA(lv_count) = 42.
" KonstantenCONSTANTS gc_max_entries TYPE i VALUE 100.
" Field Symbols & Data ReferencesFIELD-SYMBOLS <fs_data> TYPE any.DATA(lo_ref) = NEW zcl_my_class( ).Strukturen und Tabellen
" StrukturTYPES: BEGIN OF ty_customer, id TYPE i, name TYPE string, email TYPE string, END OF ty_customer.
" Interne TabelleDATA lt_customers TYPE TABLE OF ty_customer.
" Modern: TYPE TABLE OF mit IndexDATA 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.Kontrollstrukturen
IF-Bedingungen
IF lv_status = 'ACTIVE'. " CodeELSEIF lv_status = 'PENDING'. " CodeELSE. " CodeENDIF.
" Modern: Inline mit CONDDATA(lv_message) = COND string( WHEN lv_status = 'ACTIVE' THEN 'Aktiv' WHEN lv_status = 'PENDING' THEN 'Ausstehend' ELSE 'Unbekannt').CASE-Statement
CASE lv_type. WHEN 'A'. " Code WHEN 'B' OR 'C'. " Code WHEN OTHERS. " DefaultENDCASE.
" Modern: SWITCH ExpressionDATA(lv_result) = SWITCH string( lv_type WHEN 'A' THEN 'Typ A' WHEN 'B' THEN 'Typ B' ELSE 'Unbekannt').Schleifen
" DO-SchleifeDO 10 TIMES. " CodeENDDO.
" WHILE-SchleifeWHILE lv_count < 100. lv_count = lv_count + 1.ENDWHILE.
" LOOP AT (interne Tabelle)LOOP AT lt_customers INTO DATA(ls_customer). " VerarbeitungENDLOOP.
" Modern: FOR ExpressionDATA(lt_names) = VALUE string_table( FOR ls_cust IN lt_customers ( ls_cust-name )).Interne Tabellen
Zeilen hinzufügen
" APPENDAPPEND VALUE #( id = 1 name = 'Max' ) TO lt_customers.
" INSERTINSERT VALUE #( id = 2 name = 'Anna' ) INTO TABLE lt_customers.
" Modern: VALUE mit mehreren Zeilenlt_customers = VALUE #( ( id = 1 name = 'Max' email = 'max@example.com' ) ( id = 2 name = 'Anna' email = 'anna@example.com' )).Zeilen lesen
" READ TABLE klassischREAD TABLE lt_customers INTO DATA(ls_customer) WITH KEY id = 1.
" Modern: Table ExpressionDATA(ls_cust) = lt_customers[ id = 1 ].
" Optional: Default bei nicht gefundenDATA(ls_opt) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Default-Wert setzenDATA(ls_def) = VALUE #( lt_customers[ id = 999 ] DEFAULT VALUE #( id = 0 name = 'Unbekannt' ) ).Zeilen ändern
" MODIFY klassischMODIFY lt_customers FROM VALUE #( id = 1 name = 'Maximilian' ) TRANSPORTING name WHERE id = 1.
" Modern: Table Expressionlt_customers[ id = 1 ]-name = 'Maximilian'.Zeilen löschen
" DELETE klassischDELETE lt_customers WHERE id = 1.
" DELETE nach IndexDELETE lt_customers INDEX 1.
" CLEAR & FREECLEAR lt_customers. " Leert Tabelle (Speicher bleibt)FREE lt_customers. " Gibt Speicher freiTabellenoperationen
" Anzahl ZeilenDATA(lv_lines) = lines( lt_customers ).
" SortierenSORT lt_customers BY name ASCENDING.
" FilternDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" CORRESPONDING (Mapping)DATA(lt_target) = CORRESPONDING #( lt_source ).Datenbankzugriff
SELECT
" Single RecordSELECT SINGLE id, name, email FROM ztab_customers WHERE id = @lv_id INTO @DATA(ls_customer).
" Mehrere ZeilenSELECT id, name, email FROM ztab_customers WHERE status = 'ACTIVE' INTO TABLE @lt_customers.
" Modern: Inline mit 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).
" AggregationSELECT 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 oder UPDATE)MODIFY ztab_customers FROM @ls_customer.COMMIT & ROLLBACK
" Änderungen sichernCOMMIT WORK.
" Änderungen zurücknehmenROLLBACK WORK.Moderne Ausdrücke
VALUE Constructor
" StrukturDATA(ls_data) = VALUE ty_customer( id = 1 name = 'Max' email = 'max@example.com').
" TabelleDATA(lt_data) = VALUE ty_customer_table( ( id = 1 name = 'Max' ) ( id = 2 name = 'Anna' )).
" BASE: Vorhandene Daten erweiternlt_data = VALUE #( BASE lt_data ( id = 3 name = 'Peter' )).CORRESPONDING
" Einfaches MappingDATA(ls_target) = CORRESPONDING #( ls_source ).
" Mit MAPPINGDATA(ls_mapped) = CORRESPONDING #( ls_source MAPPING target_field = source_field).
" DEEP: Nested StrukturenDATA(ls_deep) = CORRESPONDING #( DEEP ls_source ).COND & SWITCH
" COND (IF-Alternative)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 (CASE-Alternative)DATA(lv_category) = SWITCH string( lv_age WHEN 0 THEN 'Baby' WHEN 1 TO 12 THEN 'Kind' WHEN 13 TO 17 THEN 'Jugendlicher' ELSE 'Erwachsener').FILTER
" Einfacher FilterDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" Filter mit IN-BedingungDATA(lt_premium) = FILTER #( lt_customers USING KEY id WHERE id IN lt_premium_ids ).REDUCE
" Summe berechnenDATA(lv_total) = REDUCE i( INIT sum = 0 FOR ls_order IN lt_orders NEXT sum = sum + ls_order-amount ).
" String concatenierenDATA(lv_names) = REDUCE string( INIT text = || FOR ls_cust IN lt_customers NEXT text = text && ls_cust-name && ', ' ).FOR Expression
" TransformationDATA(lt_ids) = VALUE int4_table( FOR ls_customer IN lt_customers ( ls_customer-id )).
" Mit BedingungDATA(lt_active_names) = VALUE string_table( FOR ls_cust IN lt_customers WHERE ( status = 'ACTIVE' ) ( ls_cust-name )).
" Nested FORDATA(lt_flat) = VALUE ty_table( FOR ls_group IN lt_groups FOR ls_item IN ls_group-items ( ls_item )).String-Operationen
String Templates
" EinfachDATA(lv_greeting) = |Hallo { lv_name }!|.
" Mit FormatierungDATA(lv_price) = |Preis: { lv_amount CURRENCY = lv_currency }|.DATA(lv_date) = |Datum: { lv_timestamp TIMESTAMP = ISO }|.
" Ausrichtung und PaddingDATA(lv_padded) = |{ lv_text WIDTH = 20 ALIGN = LEFT PAD = '.' }|.String-Methoden
" LängeDATA(lv_len) = strlen( lv_text ).
" SubstringDATA(lv_sub) = substring( val = lv_text off = 0 len = 5 ).
" Suchen & ErsetzenDATA(lv_pos) = find( val = lv_text sub = 'test' ).DATA(lv_replaced) = replace( val = lv_text sub = 'alt' with = 'neu' ).
" Upper/Lower CaseDATA(lv_upper) = to_upper( lv_text ).DATA(lv_lower) = to_lower( lv_text ).
" TrimmenDATA(lv_trimmed) = condense( lv_text ).CONCATENATE & SPLIT
" Modern: String Template statt CONCATENATEDATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.
" SPLITSPLIT lv_text AT ',' INTO TABLE DATA(lt_parts).OOP (Objektorientierung)
Klassendefinition
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.Instanziierung
" NEW OperatorDATA(lo_customer) = NEW zcl_customer( iv_id = 1 ).
" MethodenaufrufDATA(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 = |Verarbeitet: { iv_data }|. ENDMETHOD.ENDCLASS.Exception Handling
TRY-CATCH
TRY. DATA(lv_customer) = lt_customers[ id = lv_id ]. CATCH cx_sy_itab_line_not_found INTO DATA(lx_error). " Fehlerbehandlung DATA(lv_msg) = lx_error->get_text( ).ENDTRY.
" Mehrere ExceptionsTRY. " Code CATCH cx_sy_arithmetic_error. " Division durch 0 CATCH cx_sy_conversion_error. " Konvertierungsfehler CATCH cx_root INTO DATA(lx_any). " Alle anderenENDTRY.CLEANUP
TRY. " Code mit Ressourcen CATCH cx_error. " Error handling CLEANUP. " Ressourcen freigeben (immer ausgeführt) lo_resource->close( ).ENDTRY.Exception Klassen
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.
" VerwendenIF 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
" Action ausführenMODIFY ENTITIES OF zi_travel ENTITY Travel EXECUTE acceptTravel FROM VALUE #( ( TravelId = lv_id ) ) RESULT DATA(lt_result).CDS Views
Basis View
@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 // Expose association}Annotationen
@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}Best Practices
✅ DO
" Inline-DeklarationenDATA(lv_result) = calculate_value( ).
" VALUE ConstructorDATA(lt_data) = VALUE ty_table( ( id = 1 ) ).
" String TemplatesDATA(lv_msg) = |Fehler: { lv_error_code }|.
" Table ExpressionsDATA(ls_customer) = lt_customers[ id = lv_id ].
" Method ChainingDATA(lv_final) = lo_object->method1( )->method2( )->get_result( ).❌ DON’T
" Veraltete DeklarationDATA lv_result TYPE string.lv_result = calculate_value( ).
" CONCATENATE statt String TemplateCONCATENATE 'Fehler:' lv_error_code INTO lv_msg SEPARATED BY space.
" Unnötige HilfsvariablenDATA ls_customer TYPE ty_customer.READ TABLE lt_customers INTO ls_customer WITH KEY id = lv_id.ABAP Cloud Einschränkungen
❌ Nicht erlaubt in ABAP Cloud
FORM/PERFORM(Subroutinen)SELECT *ohne Feldliste- Direkte DB-Zugriffe auf SAP-Tabellen (nur Released APIs)
SUBMITfür Report-Aufrufe- Dynpro-Entwicklung (nur Fiori)
CALL TRANSACTION
✅ Verwende stattdessen
- Methoden statt FORM
- Explizite Feldliste bei SELECT
- CDS Views mit Released Status
- Business Events & RAP
- SAP Fiori Elements
- ABAP EML (Entity Manipulation Language)
Nützliche Klassen & Interfaces
| Klasse/Interface | Verwendung |
|---|---|
cl_abap_context_info | System-Datum, User, Mandant |
cl_abap_random | Zufallszahlen generieren |
cl_abap_structdescr | Runtime Type Info (RTTI) |
cl_http_client | HTTP-Requests |
cl_salv_table | ALV Listen erstellen |
if_abap_behv | RAP Behavior Constants |
cx_root | Basis aller Exceptions |
Zusammenfassung
Dieses Cheat Sheet deckt die wichtigsten ABAP Cloud Konzepte für 2025 ab:
- Moderne Syntax mit Inline-Deklarationen
- Konstruktor-Ausdrücke (VALUE, CORRESPONDING, COND, etc.)
- EML für RAP-Entwicklung
- CDS Views für Datenmodellierung
- Best Practices für sauberen, wartbaren Code
Tipp: Speichere diese Seite als Lesezeichen oder drucke sie aus für schnellen Zugriff während der Entwicklung!
Siehe auch: