ABAP Cloud vs. Classic ABAP - was sind die Unterschiede? Welche Version solltest du lernen? Dieser komplette Vergleich zeigt dir Side-by-Side, was sich geändert hat und warum.
🎯 Überblick: ABAP Cloud vs Classic ABAP
| Aspekt | Classic ABAP | ABAP Cloud |
|---|---|---|
| Seit wann? | 1980er Jahre | 2019 (ABAP Environment) |
| Verfügbar in | SAP ECC, S/4HANA On-Prem | SAP BTP, S/4HANA Cloud |
| Entwicklungsmodus | Alle ABAP-Features | Nur Released APIs |
| UI-Technologie | Dynpro, WebDynpro, Fiori | Nur Fiori |
| Deployment | On-Premise | Cloud & On-Premise |
| Upgrade-Stabilität | Oft manuell anpassen | Automatisch (Clean Core) |
| Lernkurve | Mittel | Steil (viele neue Konzepte) |
Kurz gesagt: ABAP Cloud ist die moderne, cloud-ready Variante von ABAP mit strengeren Regeln aber besserer Wartbarkeit.
1. Syntax-Vergleich: Alt vs. Neu
1.1 Datendeklaration
Classic ABAP:
DATA lv_name TYPE string.DATA lv_count TYPE i.lv_name = 'Max Mustermann'.lv_count = 42.
DATA lt_customers TYPE TABLE OF ty_customer.DATA ls_customer TYPE ty_customer.ABAP Cloud:
" ✅ Inline-Deklaration bevorzugtDATA(lv_name) = 'Max Mustermann'.DATA(lv_count) = 42.
DATA(lt_customers) = VALUE ty_customer_table( ( id = 1 name = 'Max' ) ( id = 2 name = 'Anna' )).Unterschied: ABAP Cloud bevorzugt Inline-Deklarationen für kürzeren Code.
1.2 String-Operationen
Classic ABAP:
DATA lv_full_name TYPE string.CONCATENATE lv_first_name lv_last_name INTO lv_full_name SEPARATED BY space.
" OderCONCATENATE 'Hallo ' lv_name '!' INTO lv_greeting.ABAP Cloud:
" ✅ String TemplatesDATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.DATA(lv_greeting) = |Hallo { lv_name }!|.
" Mit FormatierungDATA(lv_price) = |Preis: { lv_amount CURRENCY = lv_currency }|.Unterschied: CONCATENATE ist obsolete in ABAP Cloud. String Templates sind moderner und mächtiger.
1.3 Interne Tabellen
Classic ABAP:
DATA ls_customer TYPE ty_customer.
READ TABLE lt_customers INTO ls_customer WITH KEY id = lv_id.
IF sy-subrc = 0. " Kunde gefunden WRITE: ls_customer-name.ENDIF.
" Zeile ändernls_customer-name = 'Neuer Name'.MODIFY TABLE lt_customers FROM ls_customer.ABAP Cloud:
" ✅ Table ExpressionTRY. DATA(ls_customer) = lt_customers[ id = lv_id ]. " Kunde gefunden cl_demo_output=>display( ls_customer-name ).
" Zeile direkt ändern lt_customers[ id = lv_id ]-name = 'Neuer Name'.
CATCH cx_sy_itab_line_not_found. " Nicht gefundenENDTRY.
" Oder: Mit OPTIONAL (keine Exception)DATA(ls_customer) = VALUE #( lt_customers[ id = lv_id ] OPTIONAL ).Unterschied: Table Expressions sind kürzer und moderner, benötigen aber Exception Handling.
1.4 Kontrollstrukturen
Classic ABAP:
IF lv_status = 'A'. lv_message = 'Aktiv'.ELSEIF lv_status = 'I'. lv_message = 'Inaktiv'.ELSE. lv_message = 'Unbekannt'.ENDIF.
CASE lv_type. WHEN 'A'. lv_result = 'Typ A'. WHEN 'B'. lv_result = 'Typ B'. WHEN OTHERS. lv_result = 'Anderer Typ'.ENDCASE.ABAP Cloud:
" ✅ COND Expression (Inline IF)DATA(lv_message) = COND string( WHEN lv_status = 'A' THEN 'Aktiv' WHEN lv_status = 'I' THEN 'Inaktiv' ELSE 'Unbekannt').
" ✅ SWITCH Expression (Inline CASE)DATA(lv_result) = SWITCH string( lv_type WHEN 'A' THEN 'Typ A' WHEN 'B' THEN 'Typ B' ELSE 'Anderer Typ').Unterschied: COND/SWITCH sind funktional (geben Wert zurück) statt imperativ.
1.5 Schleifen & Iterationen
Classic ABAP:
DATA lv_total TYPE i VALUE 0.LOOP AT lt_orders INTO DATA(ls_order). lv_total = lv_total + ls_order-amount.ENDLOOP.
" Namen extrahierenDATA lt_names TYPE TABLE OF string.DATA ls_name TYPE string.LOOP AT lt_customers INTO DATA(ls_customer). ls_name = ls_customer-name. APPEND ls_name TO lt_names.ENDLOOP.ABAP Cloud:
" ✅ REDUCE (für Aggregationen)DATA(lv_total) = REDUCE i( INIT sum = 0 FOR ls_order IN lt_orders NEXT sum = sum + ls_order-amount ).
" ✅ FOR Expression (für Transformationen)DATA(lt_names) = VALUE string_table( FOR ls_customer IN lt_customers ( ls_customer-name )).
" Mit FilterDATA(lt_active_names) = VALUE string_table( FOR ls_cust IN lt_customers WHERE ( status = 'ACTIVE' ) ( ls_cust-name )).Unterschied: REDUCE/FOR sind deklarativ und oft performanter.
1.6 Datenbankzugriff
Classic ABAP:
" ❌ SELECT * nicht empfohlen, aber erlaubtSELECT * FROM mara INTO TABLE @DATA(lt_materials) WHERE mtart = 'FERT'.
" Ohne @-Escaping (alte Syntax)SELECT matnr maktx FROM mara INTO TABLE lt_materials WHERE mtart = 'FERT'.ABAP Cloud:
" ❌ SELECT * VERBOTEN in ABAP Cloud" ✅ Nur Released CDS Views + Explizite FelderSELECT Product, ProductDescription FROM I_Product INTO TABLE @DATA(lt_products) WHERE ProductType = 'FERT'.
" @-Escaping ist PFLICHTUnterschied:
SELECT *verboten- Nur Released APIs (CDS Views mit Released-Status)
@-Escaping verpflichtend
1.7 Subroutinen (FORM/PERFORM)
Classic ABAP:
" ✅ In Classic erlaubtFORM calculate_total USING pv_amount TYPE p CHANGING pv_total TYPE p. pv_total = pv_amount * '1.19'.ENDFORM.
PERFORM calculate_total USING lv_amount CHANGING lv_total.ABAP Cloud:
" ❌ FORM/PERFORM VERBOTEN" ✅ Nur Klassen & Methoden
CLASS lcl_calculator DEFINITION. PUBLIC SECTION. CLASS-METHODS calculate_total IMPORTING iv_amount TYPE p RETURNING VALUE(rv_total) TYPE p.ENDCLASS.
CLASS lcl_calculator IMPLEMENTATION. METHOD calculate_total. rv_total = iv_amount * '1.19'. ENDMETHOD.ENDCLASS.
DATA(lv_total) = lcl_calculator=>calculate_total( lv_amount ).Unterschied: ABAP Cloud erzwingt objektorientierte Programmierung.
2. UI-Entwicklung
Classic ABAP
Verfügbare Technologien:
- ✅ Dynpro (klassische SAP GUI)
- ✅ WebDynpro ABAP
- ✅ SAP Fiori (mit SAPUI5)
- ✅ BSP (Business Server Pages)
Beispiel Dynpro:
" Screen 100 mit MODULECALL SCREEN 100.
MODULE status_0100 OUTPUT. SET PF-STATUS 'MAIN'. SET TITLEBAR 'TITLE'.ENDMODULE.
MODULE user_command_0100 INPUT. CASE sy-ucomm. WHEN 'SAVE'. " Speichern WHEN 'BACK'. LEAVE TO SCREEN 0. ENDCASE.ENDMODULE.ABAP Cloud
Verfügbare Technologien:
- ✅ SAP Fiori (mit SAPUI5 oder Fiori Elements)
- ❌ Dynpro VERBOTEN
- ❌ WebDynpro ABAP VERBOTEN
Beispiel Fiori Elements (RAP):
" Kein UI-Code nötig! Automatisch aus Annotations generiert
" Service Binding@EndUserText.label: 'Book Service'define service ZUI_BOOK_O4 { expose ZC_Book as Book;}
" Metadata Extension (UI-Layout)@UI.lineItem: [{ position: 10 }]@UI.identification: [{ position: 10 }]BookId;Unterschied: Dynpro ist Geschichte. Fiori ist die Zukunft (web-basiert, responsive).
3. Datenbankzugriff & APIs
Classic ABAP
Zugriff auf:
- ✅ Alle SAP-Tabellen (MARA, VBAK, KNA1, etc.)
- ✅ Alle Funktionsbausteine
- ✅ Alle BAPIs
- ✅ Alle Klassen (auch interne)
Beispiel:
SELECT matnr maktx FROM mara INTO TABLE @DATA(lt_materials) WHERE mtart = 'FERT'.
CALL FUNCTION 'BAPI_MATERIAL_GET_DETAIL' EXPORTING material = lv_matnr IMPORTING material_general_data = ls_material.ABAP Cloud
Zugriff auf:
- ✅ Nur Released APIs (CDS Views, Klassen mit Released-Status)
- ❌ Keine direkten Tabellenzugriffe auf SAP-Tabellen
- ❌ Viele alte BAPIs nicht verfügbar
Beispiel:
" ✅ Released CDS ViewSELECT Product, ProductDescription FROM I_Product INTO TABLE @DATA(lt_products).
" ✅ RAP/EML statt BAPIREAD ENTITIES OF I_Product ENTITY Product ALL FIELDS WITH VALUE #( ( Product = lv_product_id ) ) RESULT DATA(lt_result).So findest du Released APIs:
- ADT:
Ctrl+Shift+A→ Suche mit Filter “API State: Released” - SAP API Business Hub: api.sap.com
- Released Objects: Grüner Haken in ADT
Unterschied: ABAP Cloud hat Zugriffsbeschränkungen für bessere Upgrade-Stabilität.
4. RAP (RESTful ABAP Programming)
Classic ABAP
RAP verfügbar?
- ⚠️ Ja, aber optional (ab S/4HANA 2020)
- Du kannst weiterhin BAPIs, Dynpro, etc. nutzen
ABAP Cloud
RAP verfügbar?
- ✅ Haupt-Entwicklungsmodell
- Für transaktionale Apps ist RAP der einzige Weg
RAP Komponenten:
| Komponente | Zweck |
|---|---|
| CDS View | Datenmodell |
| Behavior Definition (BDEF) | CRUD-Logik, Actions, Validations |
| Behavior Implementation (BIL) | Business-Logik in ABAP |
| Service Definition | Welche Entities werden exposed? |
| Service Binding | OData Service (V2 oder V4) |
Beispiel - Managed Scenario:
managed implementation in class zbp_i_book unique;strict ( 2 );
define behavior for ZI_BOOK alias Bookpersistent table zbook_tab{ create; update; delete;
field ( readonly ) BookId; field ( numbering : managed ) BookId;
validation validateIsbn on save { field Isbn; } action markAsRead result [1] $self;}Unterschied: RAP ist in ABAP Cloud zentral, in Classic ABAP optional.
5. Performance
Classic ABAP
Mögliche Performance-Probleme:
- SELECT in Loops (häufig)
- Keine Built-In Optimierungen
- Manuelles Tuning erforderlich
Beispiel Problem:
LOOP AT lt_customers INTO DATA(ls_customer). " ❌ SELECT in Loop - sehr langsam! SELECT SINGLE * FROM kna1 WHERE kunnr = ls_customer-id INTO @DATA(ls_detail).ENDLOOP.ABAP Cloud
Performance-Vorteile:
- ✅ CDS Views mit automatischen Optimierungen
- ✅ RAP Framework optimiert DB-Zugriffe
- ✅ Built-in Caching
- ✅ EML batcht Operationen automatisch
Beispiel Lösung:
" ✅ Ein SELECT für alle IDsSELECT FROM I_Customer FIELDS Customer, CustomerName FOR ALL ENTRIES IN @lt_customers WHERE Customer = @lt_customers-id INTO TABLE @DATA(lt_details).Unterschied: ABAP Cloud erzwingt Best Practices, Classic ABAP erlaubt schlechte Patterns.
6. Testing
Classic ABAP
Unit Testing:
- ✅ ABAP Unit vorhanden
- ⚠️ Aber oft nicht genutzt
- Kein Test Seam Framework
CLASS ltc_test DEFINITION FOR TESTING. PRIVATE SECTION. METHODS test_calculation FOR TESTING.ENDCLASS.
CLASS ltc_test IMPLEMENTATION. METHOD test_calculation. DATA(lv_result) = zcl_calculator=>calculate( 10 ). cl_abap_unit_assert=>assert_equals( act = lv_result exp = 12 ). ENDMETHOD.ENDCLASS.ABAP Cloud
Unit Testing:
- ✅ ABAP Unit empfohlen
- ✅ CDS Test Double Framework
- ✅ RAP Test Seams
CLASS ltc_test DEFINITION FOR TESTING. PRIVATE SECTION. CLASS-DATA environment TYPE REF TO if_cds_test_environment.
CLASS-METHODS class_setup. METHODS test_create_book FOR TESTING.ENDCLASS.
CLASS ltc_test IMPLEMENTATION. METHOD class_setup. environment = cl_cds_test_environment=>create_for_multiple_cds( i_for_entities = VALUE #( ( i_for_entity = 'ZI_BOOK' ) ) ). ENDMETHOD.
METHOD test_create_book. MODIFY ENTITIES OF zi_book ENTITY Book CREATE FROM VALUE #( ( %cid = 'B1' Title = 'Test' ) ). " Test-Assertions ENDMETHOD.ENDCLASS.Unterschied: ABAP Cloud hat bessere Test-Tools und Testing ist kulturell wichtiger.
7. Deployment & DevOps
Classic ABAP
Deployment:
- Transports (DEV → QAS → PRD)
- Manuelle Freigaben
- Wenig CI/CD
Versionierung:
- ⚠️ abapGit optional
- Oft kein Git
ABAP Cloud
Deployment:
- ✅ Transports + gapless abapGit
- ✅ CI/CD Pipelines (ABAP Environment Pipelines)
- ✅ Continuous Deployment möglich
Versionierung:
- ✅ abapGit empfohlen
- ✅ Git-Integration in ADT
Beispiel CI/CD Pipeline:
# Azure DevOps / GitHub Actions- name: Run ABAP Unit Tests run: abap test --package ZBOOK
- name: Deploy to QAS run: abap deploy --target QAS
- name: Run Integration Tests run: abap integration-testUnterschied: ABAP Cloud ist DevOps-freundlicher.
8. Wann welche Version nutzen?
Nutze Classic ABAP wenn:
- ✅ Du On-Premise SAP ECC/S/4HANA hast
- ✅ Legacy-Code gepflegt werden muss
- ✅ Migration zu ABAP Cloud (noch) nicht geplant
- ✅ Du mit Dynpro arbeiten musst
- ✅ Kurz- bis mittelfristige Projekte (<5 Jahre)
Beispiel-Szenarien:
- Wartung bestehender Reports
- Schnelle Anpassungen an Standard-Code
- Projekte mit knappem Budget/Zeit
Nutze ABAP Cloud wenn:
- ✅ Neuentwicklung startest
- ✅ Cloud-Deployment geplant (SAP BTP)
- ✅ Langfristige Wartbarkeit wichtig (>5 Jahre)
- ✅ Clean Core Strategie verfolgst
- ✅ Moderne Entwicklung (RAP, Fiori)
Beispiel-Szenarien:
- Neue SAP Fiori Apps
- S/4HANA Cloud Projekte
- Greenfield-Entwicklung
- SaaS-Anwendungen auf SAP BTP
9. Lernkurve
Classic ABAP
Lernaufwand: ⭐⭐⭐ Mittel
Einstieg:
- ABAP Basics (2-4 Wochen)
- Interne Tabellen, Selects (2 Wochen)
- Dynpro/Reports (2-3 Wochen)
- BAPIs, RFCs (1-2 Wochen)
Gesamt: ~3 Monate bis produktiv
ABAP Cloud
Lernaufwand: ⭐⭐⭐⭐ Hoch
Einstieg:
- Modern ABAP Syntax (2 Wochen)
- CDS Views (3-4 Wochen)
- RAP (6-8 Wochen)
- SAP Fiori (4-6 Wochen)
- Testing & DevOps (2 Wochen)
Gesamt: ~5-6 Monate bis produktiv
Aber: Langfristig besser wartbar!
10. Migration: Classic → Cloud
Migrationspfad
Classic ABAP ↓Modernisieren (ABAP Cleaner, neue Syntax) ↓Released APIs identifizieren ↓ABAP Cloud-konforme Neuentwicklung ↓Schritt für Schritt Migration ↓ABAP Cloud ✓Tools:
- Custom Code Migration App (Fiori App)
- ABAP Test Cockpit (ATC Checks)
- ABAP Cleaner (Syntax-Modernisierung)
Siehe: ABAP Cloud Migration Guide
11. Kosten
Classic ABAP
Lizenzkosten:
- On-Premise Lizenz (einmalig + Wartung)
- Keine Cloud-Kosten
Entwicklerkosten:
- Durchschnittlicher ABAP-Entwickler: 60-80k€/Jahr
ABAP Cloud
Lizenzkosten:
- SAP BTP: Pay-per-Use (ab ~200€/Monat)
- Oder: S/4HANA Cloud (höhere Lizenzkosten)
Entwicklerkosten:
- ABAP Cloud-Entwickler: 70-90k€/Jahr (höhere Nachfrage)
Langfristig: ABAP Cloud oft günstiger durch:
- Weniger Wartungsaufwand
- Automatische Upgrades
- Geringere Infrastruktur-Kosten (Cloud)
12. Zusammenfassung: Entscheidungsmatrix
| Kriterium | Classic ABAP | ABAP Cloud | Gewinner |
|---|---|---|---|
| Einstiegshürde | Niedrig | Hoch | Classic |
| Langfristige Wartbarkeit | Mittel | Hoch | Cloud |
| Performance | Gut | Sehr gut | Cloud |
| Upgrade-Stabilität | Gering | Sehr hoch | Cloud |
| Flexibilität | Sehr hoch | Mittel | Classic |
| Cloud-Ready | Nein | Ja | Cloud |
| UI-Moderne | Mittel (Dynpro alt) | Hoch (nur Fiori) | Cloud |
| Developer Experience | Gut | Sehr gut (ADT) | Cloud |
| Community/Ressourcen | Sehr groß | Wachsend | Classic |
| Zukunftssicherheit | Mittel | Sehr hoch | Cloud |
Fazit:
- Kurzfristig: Classic ABAP schneller & flexibler
- Langfristig: ABAP Cloud wartbarer & zukunftssicher
📚 Weiterführende Ressourcen
Auf abapcloud.com:
- ABAP Cloud Migration Guide
- ABAP Cloud Developer Roadmap
- ABAP Cloud Cheat Sheet
- 10 häufigste ABAP Cloud Fehler
- RAP Tutorial Serie
Externe Ressourcen:
💬 Deine Meinung?
- Entwickelst du mit Classic ABAP oder ABAP Cloud?
- Planst du eine Migration?
- Was fehlt dir in ABAP Cloud?
Teile deine Erfahrungen in den Kommentaren!
Viel Erfolg bei der Entscheidung! 🚀