Visual Studio Code für ABAP Cloud: Der komplette Guide 2025

kategorie
Tools
Veröffentlicht
autor
Johannes

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

Terminal window
# 1. VS Code öffnen
# 2. Extensions-View öffnen (Strg+Shift+X / Cmd+Shift+X)
# 3. Suchen nach "ABAP Cloud"
# 4. Auf "Install" klicken

Oder ü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:

  1. Command Palette öffnen (F1 oder Strg+Shift+P)
  2. ABAP Cloud: Connect to System auswählen
  3. Credentials eingeben oder SSO verwenden
  4. 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.abap

Arbeiten mit ABAP-Objekten

CDS View erstellen

Terminal window
# Command Palette (F1)
ABAP Cloud: Create CDS View
src/data-definitions/zi_booking.ddls
@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

src/behaviors/zi_travel.bdef
managed implementation in class zbp_i_travel unique;
strict ( 2 );
with draft;
define behavior for ZI_Travel alias Travel
persistent table ztravel
draft table zd_travel
lock master
total etag LastChangedAt
authorization 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 Booking
persistent table zbooking
draft table zd_booking
lock dependent by _Travel
authorization dependent by _Travel
{
update;
delete;
field ( readonly ) TravelId, BookingId;
association _Travel { with draft; }
}

ABAP-Klasse erstellen

Terminal window
# Command Palette
ABAP Cloud: Create Class
src/classes/zcl_travel_handler.clas.abap
CLASS 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

Terminal window
# 1. GitHub Copilot Extension installieren
# 2. In VS Code anmelden
# 3. Copilot wird automatisch für .abap, .ddls, .bdef erkannt

Beispiel: 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

src/behaviors/zi_travel.abap
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:

  1. F5 oder Run → Start Debugging
  2. Debug-Konfiguration auswählen (automatisch erstellt)
  3. System führt Code aus, stoppt bei Breakpoint
  4. 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

zcl_travel_handler.clas.testclasses.abap
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:

  • F5 für einzelnen Test
  • Test Explorer (Sidebar) für alle Tests
  • Coverage-Report wird automatisch generiert

Git-Integration

VS Code bietet erstklassige Git-Unterstützung out-of-the-box:

Terminal window
# 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 reviewen

VS Code vs. Eclipse ADT

FeatureVS Code (2025)Eclipse ADT
PerformanceSehr schnellLangsamer Start
KI-IntegrationNative (Copilot, etc.)Plugins benötigt
Development ModelFile-basedRepository-based
Git-IntegrationExzellentBasic
UI/UXModern, intuitivKomplexer
ErweiterungenRiesiges ÖkosystemLimitiert
ABAP CoverageNur ABAP CloudClassic + Cloud
DebuggingJaJa
Transport-VerwaltungLimitiert (gCTS)Vollständig (CTS+)
ReleaseAb Q4 2025Seit 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 Save für nahtloses Arbeiten
  • Nutzen Sie Shortcuts:
    • F12: Go to Definition
    • Shift+F12: Find All References
    • Ctrl+.: Quick Fix
    • Ctrl+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