Visual Studio Code wird ab Q4 2025 offiziell für ABAP Cloud-Entwicklung unterstützt. Mit der neuen ABAP Cloud Extension bringt SAP die ABAP-Entwicklung in den beliebtesten Code-Editor der Welt – inklusive integrierter KI-Assistenz und modernem, dateibasiertem Workflow.
Warum VS Code für ABAP Cloud?
SAP vollzieht einen strategischen Wandel: Neben Eclipse ADT wird VS Code zur vollwertigen ABAP-Entwicklungsumgebung. Die Vorteile:
- KI-Integration: Native Unterstützung für GitHub Copilot und andere AI-Assistenten
- File-based Development: Arbeiten Sie mit Dateien statt Repository-Objekten
- Moderne UX: Schnellere, intuitivere Benutzeroberfläche als Eclipse
- Große Community: Profitieren Sie vom riesigen VS Code-Ökosystem
- Cross-Platform: Native Performance auf Windows, macOS und Linux
- Git-Integration: Erstklassige Versionskontrolle out-of-the-box
Installation und Setup
Voraussetzungen
- Visual Studio Code 1.85 oder neuer
- SAP BTP ABAP Environment oder S/4HANA Cloud (ABAP Cloud-fähig)
- SAP-Benutzerkonto mit Entwicklerberechtigung
ABAP Cloud Extension installieren
# 1. VS Code öffnen# 2. Extensions-View öffnen (Strg+Shift+X / Cmd+Shift+X)# 3. Suchen nach "ABAP Cloud"# 4. Auf "Install" klickenOder über Marketplace: marketplace.visualstudio.com/items?itemName=SAP.abap-cloud
System-Verbindung einrichten
// .abapcloud.json im Projektverzeichnis{ "systemId": "TRL", "systemUrl": "https://your-system.abap.eu10.hana.ondemand.com", "client": "100", "language": "DE", "auth": { "type": "sso" }}Verbindung herstellen:
- Command Palette öffnen (F1 oder Strg+Shift+P)
ABAP Cloud: Connect to Systemauswählen- Credentials eingeben oder SSO verwenden
- System erscheint in der Sidebar
Projekt-Struktur: File-Based Development
Anders als Eclipse ADT arbeitet VS Code mit Dateien statt Repository-Objekten:
my-abap-cloud-project/├── .abapcloud.json # System-Konfiguration├── src/│ ├── data-definitions/│ │ ├── zi_travel.ddls # CDS Interface View│ │ ├── zc_travel.ddls # CDS Projection View│ │ └── zi_travel.asddls # Metadata Extension│ ├── behaviors/│ │ ├── zi_travel.bdef # Behavior Definition│ │ └── zi_travel.abap # Behavior Implementation│ ├── classes/│ │ ├── zcl_travel_handler.clas.abap│ │ └── zcl_travel_handler.clas.testclasses.abap│ ├── services/│ │ ├── zui_travel_o4.srvd # Service Definition│ │ └── zui_travel_o4.srvb # Service Binding│ └── tables/│ └── ztravel.tabl└── test/ └── zcl_travel_handler.test.abapArbeiten mit ABAP-Objekten
CDS View erstellen
# Command Palette (F1)ABAP Cloud: Create CDS View@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'Booking - Interface View'
define view entity ZI_Booking as select from zbooking association to parent ZI_Travel as _Travel on $projection.TravelId = _Travel.TravelId{ key travel_id as TravelId, key booking_id as BookingId, booking_date as BookingDate, customer_id as CustomerId, carrier_id as CarrierId, connection_id as ConnectionId, flight_date as FlightDate,
@Semantics.amount.currencyCode: 'CurrencyCode' flight_price as FlightPrice,
@Semantics.currencyCode: true currency_code as CurrencyCode,
// Associations _Travel}Sofortiges Feedback:
- Syntax-Highlighting
- Inline-Fehler
- Auto-Completion für Tabellen, Felder, Annotationen
- Hover-Informationen
Behavior Definition erstellen
managed implementation in class zbp_i_travel unique;strict ( 2 );with draft;
define behavior for ZI_Travel alias Travelpersistent table ztraveldraft table zd_travellock mastertotal etag LastChangedAtauthorization master ( instance ){ // CRUD Operations create; update; delete;
// Field Properties field ( readonly ) TravelId; field ( readonly ) CreatedBy, CreatedAt; field ( mandatory ) AgencyId, CustomerId;
// Actions action acceptTravel result [1] $self; action rejectTravel result [1] $self;
// Validations validation validateDates on save { field BeginDate, EndDate; } validation validateCustomer on save { field CustomerId; }
// Determinations determination setStatusNew on modify { create; } determination calculateTotal on modify { field FlightPrice; }
// Draft draft action Edit; draft action Activate; draft action Discard; draft action Resume; draft determine action Prepare;
// Associations association _Bookings { create; with draft; }}
define behavior for ZI_Booking alias Bookingpersistent table zbookingdraft table zd_bookinglock dependent by _Travelauthorization dependent by _Travel{ update; delete;
field ( readonly ) TravelId, BookingId;
association _Travel { with draft; }}ABAP-Klasse erstellen
# Command PaletteABAP Cloud: Create ClassCLASS zcl_travel_handler DEFINITION PUBLIC FINAL CREATE PUBLIC.
PUBLIC SECTION. INTERFACES if_oo_adt_classrun.
CLASS-METHODS: accept_travel IMPORTING iv_travel_id TYPE /dmo/travel_id EXPORTING es_travel TYPE zi_travel et_messages TYPE bapiret2_t RAISING cx_static_check,
get_open_travels RETURNING VALUE(rt_travels) TYPE STANDARD TABLE OF zi_travel.
PROTECTED SECTION. PRIVATE SECTION.ENDCLASS.
CLASS zcl_travel_handler IMPLEMENTATION.
METHOD if_oo_adt_classrun~main. " Schneller Test direkt aus VS Code DATA(lt_travels) = get_open_travels( ). out->write( |{ lines( lt_travels ) } offene Reisen gefunden| ).
LOOP AT lt_travels INTO DATA(ls_travel). out->write( |{ ls_travel-TravelId }: { ls_travel-Description }| ). ENDLOOP. ENDMETHOD.
METHOD accept_travel. " EML: Daten lesen und Action ausführen MODIFY ENTITIES OF zi_travel ENTITY Travel EXECUTE acceptTravel FROM VALUE #( ( TravelId = iv_travel_id ) ) FAILED DATA(ls_failed) REPORTED DATA(ls_reported) MAPPED DATA(ls_mapped).
IF ls_failed IS INITIAL. COMMIT ENTITIES RESPONSE OF zi_travel FAILED DATA(commit_failed) REPORTED DATA(commit_reported).
" Aktualisierte Daten lesen READ ENTITIES OF zi_travel ENTITY Travel ALL FIELDS WITH VALUE #( ( TravelId = iv_travel_id ) ) RESULT DATA(lt_travel).
es_travel = lt_travel[ 1 ]. ELSE. " Fehler konvertieren et_messages = VALUE #( FOR msg IN ls_reported-travel ( type = 'E' id = 'Z_TRAVEL' number = '001' message_v1 = CONV #( msg-%msg->if_message~get_text( ) ) ) ). ENDIF. ENDMETHOD.
METHOD get_open_travels. " RAP-konformer Zugriff via EML READ ENTITIES OF zi_travel ENTITY Travel ALL FIELDS WITH VALUE #( FOR i = 1 WHILE i <= 100 ( TravelId = |{ i WIDTH = 8 ALIGN = RIGHT PAD = '0' }| ) ) RESULT DATA(lt_all_travels).
" Filtern in ABAP (oder besser: in CDS View mit WHERE-Bedingung) rt_travels = VALUE #( FOR travel IN lt_all_travels WHERE ( Status = 'O' ) ( travel ) ). ENDMETHOD.
ENDCLASS.KI-Unterstützung: ABAP mit AI entwickeln
GitHub Copilot aktivieren
# 1. GitHub Copilot Extension installieren# 2. In VS Code anmelden# 3. Copilot wird automatisch für .abap, .ddls, .bdef erkanntBeispiel: Copilot schreibt Behavior Implementation
" Ihr Prompt als Kommentar:" Implement validation to check if begin date is before end date and not in past
METHOD validateDates. " Copilot generiert automatisch: READ ENTITIES OF zi_travel IN LOCAL MODE ENTITY Travel FIELDS ( BeginDate EndDate ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_travel).
LOOP AT lt_travel INTO DATA(ls_travel). " Check end date after begin date IF ls_travel-EndDate < ls_travel-BeginDate. APPEND VALUE #( %tky = ls_travel-%tky %element-EndDate = if_abap_behv=>mk-on ) TO failed-travel.
APPEND VALUE #( %tky = ls_travel-%tky %element-EndDate = if_abap_behv=>mk-on %msg = new_message_with_text( severity = if_abap_behv_message=>severity-error text = 'End date must be after begin date' ) ) TO reported-travel. ENDIF.
" Check begin date not in past IF ls_travel-BeginDate < cl_abap_context_info=>get_system_date( ). " ... weitere Validierung ENDIF. ENDLOOP.ENDMETHOD.Inline Chat für Code-Erklärungen
" Markieren Sie Code → Rechtsklick → "Copilot: Explain This"" Oder: Strg+I für Inline-Chat
" Chat-Beispiel:User: "Refactor this to use a FILTER expression"
" Copilot wandelt um:" Alt:LOOP AT lt_travels INTO DATA(ls_travel) WHERE status = 'O'. APPEND ls_travel TO lt_open_travels.ENDLOOP.
" Neu:DATA(lt_open_travels) = FILTER #( lt_travels WHERE status = 'O' ).Debugging in VS Code
Breakpoint setzen
METHOD validateCustomer. READ ENTITIES OF zi_travel IN LOCAL MODE ENTITY Travel FIELDS ( CustomerId ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_travel).
LOOP AT lt_travel INTO DATA(ls_travel). " Breakpoint hier setzen (F9) IF ls_travel-CustomerId IS INITIAL. " Debugger stoppt hier APPEND VALUE #( ... ) TO failed-travel. ENDIF. ENDLOOP.ENDMETHOD.Debugging starten:
- F5 oder
Run → Start Debugging - Debug-Konfiguration auswählen (automatisch erstellt)
- System führt Code aus, stoppt bei Breakpoint
- Variables-Panel zeigt alle Variablen (
lt_travel,ls_travel, etc.)
Debug Console
" Im Debug-Modus können Sie direkt ABAP ausführen:> ls_travel-CustomerId = '000042'> lines( lt_travel )→ 5> lt_travel[ 1 ]-CustomerName→ 'Max Mustermann'Testing: ABAP Unit in VS Code
CLASS ltc_travel_handler DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
PRIVATE SECTION. DATA mo_cut TYPE REF TO zcl_travel_handler. DATA mo_env TYPE REF TO if_cds_test_environment.
METHODS: setup, teardown, accept_travel_success FOR TESTING RAISING cx_static_check, accept_travel_not_found FOR TESTING RAISING cx_static_check.ENDCLASS.
CLASS ltc_travel_handler IMPLEMENTATION.
METHOD setup. " Test Double für RAP BO mo_env = cl_cds_test_environment=>create_for_multiple_cds( i_for_entities = VALUE #( ( i_for_entity = 'ZI_Travel' ) ( i_for_entity = 'ZI_Booking' ) ) ).
" Testdaten einfügen mo_env->insert_test_data( i_data = VALUE zi_travel( ( TravelId = '00000001' Status = 'O' CustomerId = '000042' ) ( TravelId = '00000002' Status = 'A' CustomerId = '000043' ) ) ).
CREATE OBJECT mo_cut. ENDMETHOD.
METHOD teardown. mo_env->destroy( ). ENDMETHOD.
METHOD accept_travel_success. " Arrange DATA(lv_travel_id) = '00000001'.
" Act zcl_travel_handler=>accept_travel( EXPORTING iv_travel_id = lv_travel_id IMPORTING es_travel = DATA(ls_travel) et_messages = DATA(lt_messages) ).
" Assert cl_abap_unit_assert=>assert_initial( act = lt_messages msg = 'Es sollten keine Fehler auftreten' ).
cl_abap_unit_assert=>assert_equals( exp = 'A' act = ls_travel-Status msg = 'Status sollte auf Accepted (A) gesetzt sein' ). ENDMETHOD.
METHOD accept_travel_not_found. " Arrange DATA(lv_invalid_id) = '99999999'.
" Act zcl_travel_handler=>accept_travel( EXPORTING iv_travel_id = lv_invalid_id IMPORTING et_messages = DATA(lt_messages) ).
" Assert cl_abap_unit_assert=>assert_not_initial( act = lt_messages msg = 'Fehler sollte gemeldet werden' ). ENDMETHOD.
ENDCLASS.Tests ausführen:
F5für einzelnen TestTest Explorer(Sidebar) für alle Tests- Coverage-Report wird automatisch generiert
Git-Integration
VS Code bietet erstklassige Git-Unterstützung out-of-the-box:
# Initialisierung (automatisch)git init
# Staging & Commit direkt in VS Code# Source Control View (Strg+Shift+G):# 1. Geänderte Dateien sehen# 2. "+ Stage Changes" klicken# 3. Commit-Message eingeben# 4. Commit (✓) klicken
# Branch-Management# Status Bar unten links: Branch wechseln/erstellen
# Pull Requests# GitHub Pull Requests Extension installieren# → PR direkt aus VS Code erstellen und reviewenVS Code vs. Eclipse ADT
| Feature | VS Code (2025) | Eclipse ADT |
|---|---|---|
| Performance | Sehr schnell | Langsamer Start |
| KI-Integration | Native (Copilot, etc.) | Plugins benötigt |
| Development Model | File-based | Repository-based |
| Git-Integration | Exzellent | Basic |
| UI/UX | Modern, intuitiv | Komplexer |
| Erweiterungen | Riesiges Ökosystem | Limitiert |
| ABAP Coverage | Nur ABAP Cloud | Classic + Cloud |
| Debugging | Ja | Ja |
| Transport-Verwaltung | Limitiert (gCTS) | Vollständig (CTS+) |
| Release | Ab Q4 2025 | Seit Jahren etabliert |
Wichtige Hinweise / Best Practice
- VS Code ist NUR für ABAP Cloud: Classic ABAP wird nicht unterstützt
- File-based = Git-freundlich: Nutzen Sie Branches und PRs für kollaborative Entwicklung
- Copilot trainiert auf SAP: GitHub Copilot kennt RAP-Patterns und Best Practices
- Aktivieren Sie Auto-Save:
File → Auto Savefür nahtloses Arbeiten - Nutzen Sie Shortcuts:
F12: Go to DefinitionShift+F12: Find All ReferencesCtrl+.: Quick FixCtrl+Space: Auto-Completion
- Extensions installieren:
- GitHub Copilot (KI-Unterstützung)
- GitLens (erweiterte Git-Features)
- Error Lens (Inline-Fehler)
- TODO Highlight (TODO-Kommentare hervorheben)
- Settings Sync: Synchronisieren Sie VS Code-Einstellungen über GitHub
- Backup-Plan: Behalten Sie Eclipse ADT als Fallback, bis VS Code Extension mature ist
- Feedback geben: SAP Community nutzen für Feature Requests (extension ist neu!)
Weitere Ressourcen
- SAP Community: community.sap.com
- VS Code Docs: code.visualstudio.com/docs
- ABAP Cloud: /abap-cloud-definition/
- RAP Basics: /rap-basics/