Visual Studio Code pour ABAP Cloud : Le guide complet 2025

Catégorie
Tools
Publié
Auteur
Johannes

Visual Studio Code est officiellement supporté pour le développement ABAP Cloud à partir du 4ème trimestre 2025. Avec la nouvelle extension ABAP Cloud, SAP apporte le développement ABAP dans l’éditeur de code le plus populaire au monde - y compris l’assistance IA intégrée et un workflow moderne basé sur les fichiers.

Pourquoi VS Code pour ABAP Cloud ?

SAP opère un changement stratégique : outre Eclipse ADT, VS Code devient un environnement de développement ABAP à part entière. Les avantages :

  • Intégration IA : Support natif pour GitHub Copilot et autres assistants IA
  • Développement basé fichiers : Travaillez avec des fichiers au lieu d’objets de dépôt
  • UX moderne : Interface plus rapide et plus intuitive qu’Eclipse
  • Grande communauté : Profitez du vaste écosystème VS Code
  • Multiplateforme : Performance native sur Windows, macOS et Linux
  • Intégration Git : Contrôle de version de premier ordre prêt à l’emploi

Installation et configuration

Prérequis

  • Visual Studio Code 1.85 ou plus récent
  • SAP BTP ABAP Environment ou S/4HANA Cloud (compatible ABAP Cloud)
  • Compte utilisateur SAP avec autorisation de développement

Installer l’extension ABAP Cloud

Terminal window
# 1. Ouvrir VS Code
# 2. Ouvrir la vue Extensions (Ctrl+Shift+X / Cmd+Shift+X)
# 3. Rechercher "ABAP Cloud"
# 4. Cliquer sur "Install"

Ou via le Marketplace : marketplace.visualstudio.com/items?itemName=SAP.abap-cloud

Configurer la connexion système

// .abapcloud.json dans le répertoire du projet
{
"systemId": "TRL",
"systemUrl": "https://your-system.abap.eu10.hana.ondemand.com",
"client": "100",
"language": "FR",
"auth": {
"type": "sso"
}
}

Établir la connexion :

  1. Ouvrir la palette de commandes (F1 ou Ctrl+Shift+P)
  2. Sélectionner ABAP Cloud: Connect to System
  3. Entrer les identifiants ou utiliser SSO
  4. Le système apparaît dans la barre latérale

Structure de projet : Développement basé fichiers

Contrairement à Eclipse ADT, VS Code travaille avec des fichiers au lieu d’objets de dépôt :

my-abap-cloud-project/
├── .abapcloud.json # Configuration système
├── src/
│ ├── data-definitions/
│ │ ├── zi_travel.ddls # Vue CDS Interface
│ │ ├── zc_travel.ddls # Vue CDS Projection
│ │ └── zi_travel.asddls # Extension de métadonnées
│ ├── behaviors/
│ │ ├── zi_travel.bdef # Définition de comportement
│ │ └── zi_travel.abap # Implémentation de comportement
│ ├── classes/
│ │ ├── zcl_travel_handler.clas.abap
│ │ └── zcl_travel_handler.clas.testclasses.abap
│ ├── services/
│ │ ├── zui_travel_o4.srvd # Définition de service
│ │ └── zui_travel_o4.srvb # Liaison de service
│ └── tables/
│ └── ztravel.tabl
└── test/
└── zcl_travel_handler.test.abap

Travailler avec des objets ABAP

Créer une vue CDS

Terminal window
# Palette de commandes (F1)
ABAP Cloud: Create CDS View
src/data-definitions/zi_booking.ddls
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Réservation - Vue Interface"
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
}

Retour immédiat :

  • Coloration syntaxique
  • Erreurs en ligne
  • Auto-complétion pour tables, champs, annotations
  • Informations au survol

Créer une définition de comportement

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 )
{
// Opérations CRUD
create;
update;
delete;
// Propriétés de champs
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; }
// Déterminations
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; }
}

Créer une classe ABAP

Terminal window
# Palette de commandes
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.
" Test rapide directement depuis VS Code
DATA(lt_travels) = get_open_travels( ).
out->write( |{ lines( lt_travels ) } voyages ouverts trouvés| ).
LOOP AT lt_travels INTO DATA(ls_travel).
out->write( |{ ls_travel-TravelId }: { ls_travel-Description }| ).
ENDLOOP.
ENDMETHOD.
METHOD accept_travel.
" EML : lire les données et exécuter l'action
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).
" Lire les données mises à jour
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.
" Convertir les erreurs
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.
" Accès conforme RAP 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).
" Filtrer en ABAP (ou mieux : dans la vue CDS avec clause WHERE)
rt_travels = VALUE #( FOR travel IN lt_all_travels
WHERE ( Status = 'O' )
( travel ) ).
ENDMETHOD.
ENDCLASS.

Support IA : Développer ABAP avec l’IA

Activer GitHub Copilot

Terminal window
# 1. Installer l'extension GitHub Copilot
# 2. Se connecter dans VS Code
# 3. Copilot est automatiquement reconnu pour .abap, .ddls, .bdef

Exemple : Copilot écrit l’implémentation de comportement

" Votre prompt comme commentaire :
" Implement validation to check if begin date is before end date and not in past
METHOD validateDates.
" Copilot génère automatiquement :
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).
" Vérifier date de fin après date de début
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 = 'La date de fin doit être après la date de début"
)
) TO reported-travel.
ENDIF.
" Vérifier que la date de début n'est pas dans le passé
IF ls_travel-BeginDate < cl_abap_context_info=>get_system_date( ).
" ... validation supplémentaire
ENDIF.
ENDLOOP.
ENDMETHOD.

Chat en ligne pour explications de code

" Sélectionner le code → Clic droit → "Copilot: Explain This"
" Ou : Ctrl+I pour le chat en ligne
" Exemple de chat :
User: "Refactor this to use a FILTER expression"
" Copilot convertit :
" Ancien :
LOOP AT lt_travels INTO DATA(ls_travel) WHERE status = 'O'.
APPEND ls_travel TO lt_open_travels.
ENDLOOP.
" Nouveau :
DATA(lt_open_travels) = FILTER #( lt_travels WHERE status = 'O' ).

Débogage dans VS Code

Définir un point d’arrêt

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).
" Définir un point d'arrêt ici (F9)
IF ls_travel-CustomerId IS INITIAL.
" Le débogueur s'arrête ici
APPEND VALUE #( ... ) TO failed-travel.
ENDIF.
ENDLOOP.
ENDMETHOD.

Démarrer le débogage :

  1. F5 ou Run → Start Debugging
  2. Sélectionner la configuration de débogage (créée automatiquement)
  3. Le système exécute le code, s’arrête au point d’arrêt
  4. Le panneau Variables affiche toutes les variables (lt_travel, ls_travel, etc.)

Console de débogage

" En mode débogage, vous pouvez exécuter directement de l'ABAP :
> ls_travel-CustomerId = '000042"
> lines( lt_travel )
→ 5
> lt_travel[ 1 ]-CustomerName
→ 'Max Mustermann"

Tests : ABAP Unit dans 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 pour 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' )
)
).
" Insérer des données de test
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 = 'Aucune erreur ne devrait se produire"
).
cl_abap_unit_assert=>assert_equals(
exp = 'A"
act = ls_travel-Status
msg = 'Le statut devrait être défini sur Accepté (A)"
).
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 = 'Une erreur devrait être signalée"
).
ENDMETHOD.
ENDCLASS.

Exécuter les tests :

  • F5 pour un test individuel
  • Test Explorer (barre latérale) pour tous les tests
  • Le rapport de couverture est généré automatiquement

Intégration Git

VS Code offre un excellent support Git prêt à l’emploi :

Terminal window
# Initialisation (automatique)
git init
# Staging & Commit directement dans VS Code
# Vue Source Control (Ctrl+Shift+G) :
# 1. Voir les fichiers modifiés
# 2. Cliquer sur "+ Stage Changes"
# 3. Entrer le message de commit
# 4. Commit (✓) cliquer
# Gestion de branches
# Barre d'état en bas à gauche : changer/créer une branche
# Pull Requests
# Installer l'extension GitHub Pull Requests
# → Créer et examiner les PR directement depuis VS Code

VS Code vs. Eclipse ADT

FonctionnalitéVS Code (2025)Eclipse ADT
PerformanceTrès rapideDémarrage lent
Intégration IANative (Copilot, etc.)Plugins requis
Modèle de développementBasé fichiersBasé dépôt
Intégration GitExcellenteBasique
UI/UXModerne, intuitivePlus complexe
ExtensionsÉcosystème énormeLimité
Couverture ABAPABAP Cloud uniquementClassic + Cloud
DébogageOuiOui
Gestion des transportsLimité (gCTS)Complet (CTS+)
ReleaseÀ partir du 4ème trim. 2025Établi depuis des années

Remarques importantes / Bonnes pratiques

  • VS Code est UNIQUEMENT pour ABAP Cloud : ABAP Classic n’est pas supporté
  • Basé fichiers = Git-friendly : Utilisez les branches et PR pour le développement collaboratif
  • Copilot formé sur SAP : GitHub Copilot connaît les patterns RAP et bonnes pratiques
  • Activez Auto-Save : File → Auto Save pour un travail fluide
  • Utilisez les raccourcis :
    • F12 : Go to Definition
    • Shift+F12 : Find All References
    • Ctrl+. : Quick Fix
    • Ctrl+Space : Auto-Completion
  • Installez les extensions :
    • GitHub Copilot (support IA)
    • GitLens (fonctionnalités Git avancées)
    • Error Lens (erreurs en ligne)
    • TODO Highlight (mettre en évidence les commentaires TODO)
  • Settings Sync : Synchronisez les paramètres VS Code via GitHub
  • Plan de secours : Gardez Eclipse ADT comme solution de repli jusqu’à maturité de l’extension VS Code
  • Donnez votre avis : Utilisez la communauté SAP pour les demandes de fonctionnalités (l’extension est nouvelle !)

Ressources supplémentaires