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
# 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 :
- Ouvrir la palette de commandes (F1 ou Ctrl+Shift+P)
- Sélectionner
ABAP Cloud: Connect to System - Entrer les identifiants ou utiliser SSO
- 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.abapTravailler avec des objets ABAP
Créer une vue CDS
# Palette de commandes (F1)ABAP Cloud: Create CDS View@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
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 ){ // 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 Bookingpersistent table zbookingdraft table zd_bookinglock dependent by _Travelauthorization dependent by _Travel{ update; delete;
field ( readonly ) TravelId, BookingId;
association _Travel { with draft; }}Créer une classe ABAP
# Palette de commandesABAP 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. " 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
# 1. Installer l'extension GitHub Copilot# 2. Se connecter dans VS Code# 3. Copilot est automatiquement reconnu pour .abap, .ddls, .bdefExemple : 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
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 :
- F5 ou
Run → Start Debugging - Sélectionner la configuration de débogage (créée automatiquement)
- Le système exécute le code, s’arrête au point d’arrêt
- 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
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 :
F5pour un test individuelTest 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 :
# 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 CodeVS Code vs. Eclipse ADT
| Fonctionnalité | VS Code (2025) | Eclipse ADT |
|---|---|---|
| Performance | Très rapide | Démarrage lent |
| Intégration IA | Native (Copilot, etc.) | Plugins requis |
| Modèle de développement | Basé fichiers | Basé dépôt |
| Intégration Git | Excellente | Basique |
| UI/UX | Moderne, intuitive | Plus complexe |
| Extensions | Écosystème énorme | Limité |
| Couverture ABAP | ABAP Cloud uniquement | Classic + Cloud |
| Débogage | Oui | Oui |
| Gestion des transports | Limité (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 Savepour un travail fluide - Utilisez les raccourcis :
F12: Go to DefinitionShift+F12: Find All ReferencesCtrl+.: Quick FixCtrl+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
- Communauté SAP : community.sap.com
- Docs VS Code : code.visualstudio.com/docs
- ABAP Cloud : /abap-cloud-definition/
- Bases RAP : /rap-basics/