Le passage de Classic ABAP a ABAP Cloud apporte de nombreux defis. Nouvelles regles, APIs restreintes et syntaxe moderne peuvent faire trebucher meme les developpeurs ABAP experimentes.
Dans cet article, nous montrons les 10 erreurs les plus courantes que font les developpeurs ABAP Cloud - avec des solutions pratiques et des exemples de code, pour que vous evitiez ces pieges des le depart.
1. Utilisation d’APIs et d’objets non-released
Le probleme
En ABAP Cloud, vous ne pouvez utiliser que des Released APIs. L’acces aux tables SAP internes, modules de fonction ou classes sans statut Released provoque des erreurs de syntaxe.
Erreur typique
" ❌ FAUX: Acces direct a une table SAPSELECT * FROM mara INTO TABLE @DATA(lt_materials).Erreur : MARA is not released for ABAP Cloud
Solution
Utilisez des CDS Views avec statut Released ou des Released APIs :
" ✅ CORRECT: Utiliser une CDS View ReleasedSELECT * FROM I_Product INTO TABLE @DATA(lt_products).
" Ou: Utiliser une Released APIDATA(lo_api) = cl_some_released_api=>get_instance( ).DATA(lt_materials) = lo_api->get_materials( ).Comment trouver les Released APIs
- ABAP Development Tools (ADT) : Utilisez
Ctrl+Shift+A→ Rechercher des objets → Filtre “API State: Released” - SAP API Business Hub : api.sap.com
- Released Objects Browser : Transaction
SOTS_REGISTRY(dans les systemes compatibles)
Astuce : Dans ADT, les objets Released affichent une coche verte dans la liste des objets.
2. SELECT * au lieu d’une liste de champs explicite
Le probleme
SELECT * n’est pas autorise en ABAP Cloud. Vous devez toujours specifier explicitement quels champs vous voulez lire.
Erreur typique
" ❌ FAUXSELECT * FROM I_Customer INTO TABLE @DATA(lt_customers).Erreur : SELECT * is not allowed in ABAP Cloud
Solution
Specifiez tous les champs explicitement :
" ✅ CORRECT: Liste de champs expliciteSELECT CustomerID, CustomerName, Country FROM I_Customer INTO TABLE @DATA(lt_customers).
" Ou: FIELDS si vous avez besoin de nombreux champsSELECT CustomerID, CustomerName, Country, City, PostalCode FROM I_Customer INTO TABLE @DATA(lt_customers).Pourquoi ?
- Performance : Seules les donnees necessaires sont transferees
- Maintenabilite : Les listes de champs explicites sont plus lisibles
- Stabilite : Les modifications de la table ne cassent pas votre code
3. Utiliser FORM/PERFORM au lieu de methodes
Le probleme
Les sous-routines avec FORM et PERFORM sont interdites en ABAP Cloud. Vous devez travailler en oriente objet avec des classes et methodes.
Erreur typique
" ❌ FAUX: Sous-routinesFORM 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.Erreur : FORM/PERFORM is not allowed in ABAP Cloud
Solution
Utilisez des classes avec methodes :
" ✅ CORRECT: Classe avec methodeCLASS 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.
" UtilisationDATA(lv_total) = lcl_calculator=>calculate_total( lv_amount ).Bonne pratique
- Utilisez des classes locales (
lcl_) pour la logique interne - Utilisez des classes globales (
zcl_,ycl_) pour les composants reutilisables - Utilisez des methodes statiques pour les fonctions utilitaires
4. Gestion d’exception manquante pour les Table Expressions
Le probleme
Les Table Expressions comme lt_table[ key = value ] declenchent une exception si l’entree n’est pas trouvee. Sans TRY-CATCH, cela conduit a un Shortdump.
Erreur typique
" ❌ FAUX: Pas de gestion d'exceptionDATA(ls_customer) = lt_customers[ customer_id = lv_id ]." Si non trouve: CX_SY_ITAB_LINE_NOT_FOUND → Shortdump!Solution 1 : TRY-CATCH
" ✅ CORRECT: Avec gestion d'exceptionTRY. DATA(ls_customer) = lt_customers[ customer_id = lv_id ]. " Traitement CATCH cx_sy_itab_line_not_found. " Gestion d'erreur ls_customer = VALUE #( customer_id = 0 name = 'Inconnu' ).ENDTRY.Solution 2 : OPTIONAL
" ✅ CORRECT: Avec OPTIONAL (pas d'exception)DATA(ls_customer) = VALUE #( lt_customers[ customer_id = lv_id ] OPTIONAL ).
IF ls_customer IS INITIAL. " Non trouveENDIF.Solution 3 : DEFAULT
" ✅ CORRECT: Avec valeur DEFAULTDATA(ls_customer) = VALUE #( lt_customers[ customer_id = lv_id ] DEFAULT VALUE #( customer_id = 0 name = 'Non trouve' ) ).Quand utiliser quoi ?
- TRY-CATCH : Quand ne pas trouver est un cas d’erreur
- OPTIONAL : Quand ne pas trouver est normal (puis verifier avec
IS INITIAL) - DEFAULT : Quand vous avez besoin d’une valeur par defaut
5. Strict Mode manquant dans les Behavior Definitions RAP
Le probleme
Le Strict Mode (strict ( 2 )) dans RAP assure la validation des bonnes pratiques. Sans lui, les erreurs ne sont detectees qu’a l’execution.
Erreur typique
" ❌ FAUX: Pas de Strict Modemanaged implementation in class zbp_i_travel unique;
define behavior for ZI_Travel alias Travel{ create; update; delete;}Solution
Ajoutez le Strict Mode :
" ✅ CORRECT: Avec Strict Modemanaged implementation in class zbp_i_travel unique;strict ( 2 ); // <- Important!
define behavior for ZI_Travel alias Travelpersistent table ztravellock masterauthorization master ( instance ){ create; update; delete;}Que fait le Strict Mode ?
- Verifications de syntaxe : Impose les bonnes pratiques
- Champs obligatoires : ex.
persistent table,lock master - Perennite : Prepare aux nouvelles versions ABAP
- Niveau 2 : Validation la plus stricte (recommandee pour les nouveaux developpements)
Toujours l’utiliser ! Il n’y a aucune raison d’omettre le Strict Mode.
6. CONCATENATE au lieu des String Templates
Le probleme
CONCATENATE est obsolete. Les String Templates sont plus modernes, lisibles et puissants.
Erreur typique
" ❌ FAUX: CONCATENATE (obsolete)DATA lv_message TYPE string.CONCATENATE 'Client' lv_customer_id 'a ete active" INTO lv_message SEPARATED BY space.Solution
Utilisez les String Templates :
" ✅ CORRECT: String TemplateDATA(lv_message) = |Client { lv_customer_id } a ete active|.
" Avec formatageDATA(lv_price) = |Prix: { lv_amount CURRENCY = lv_currency }|.
" Avec formatage de dateDATA(lv_date) = |Date: { lv_timestamp TIMESTAMP = ISO }|.
" Avec paddingDATA(lv_padded) = |{ lv_id WIDTH = 10 ALIGN = RIGHT PAD = '0' }|." Resultat: "0000000042"Avantages des String Templates
- Lisible : Clairement structure
- Puissant : Formatage integre
- Moderne : Bonne pratique en ABAP Cloud
- Plus court : Moins de code
7. READ TABLE au lieu des Table Expressions
Le probleme
READ TABLE n’est pas interdit, mais obsolete. Les Table Expressions sont plus courtes et modernes.
Erreur typique
" ❌ PAS IDEAL: READ TABLEDATA ls_customer TYPE ty_customer.READ TABLE lt_customers INTO ls_customer WITH KEY customer_id = lv_id.IF sy-subrc = 0. " TraitementENDIF.Solution
Utilisez une Table Expression :
" ✅ MIEUX: Table Expression avec TRY-CATCHTRY. DATA(ls_customer) = lt_customers[ customer_id = lv_id ]. " Traitement CATCH cx_sy_itab_line_not_found. " Non trouveENDTRY.
" Ou avec OPTIONALDATA(ls_customer) = VALUE #( lt_customers[ customer_id = lv_id ] OPTIONAL ).IF ls_customer IS NOT INITIAL. " TraitementENDIF.Avantages
- Declaration inline : Pas besoin de
DATAsepare - Plus court : Une ligne au lieu de trois
- Moderne : Bonne pratique en ABAP Cloud
Note : READ TABLE fonctionne encore, mais les Table Expressions sont l’avenir.
8. Developpement Dynpro au lieu de SAP Fiori
Le probleme
Dynpro (SAP GUI classique) n’est plus possible en ABAP Cloud. L’interface utilisateur doit etre construite avec SAP Fiori.
Erreur typique
" ❌ FAUX: Utiliser DynproCALL SCREEN 100.
MODULE status_0100 OUTPUT. SET PF-STATUS 'MAIN'. SET TITLEBAR 'TITLE'.ENDMODULE.Erreur : Dynpro n’est pas disponible en ABAP Cloud
Solution
Utilisez RAP + SAP Fiori Elements :
" ✅ CORRECT: RAP Business Object avec Service Binding
" 1. CDS View (Modele de donnees)@EndUserText.label: 'Customer View"define root view entity ZC_Customer as projection on ZI_Customer{ key CustomerId, CustomerName, Email, Status}
" 2. Behavior Definitionprojection;strict ( 2 );
define behavior for ZC_Customer{ use create; use update; use delete;}
" 3. Service Definition@EndUserText.label: 'Customer Service"define service ZUI_CUSTOMER_O4 { expose ZC_Customer as Customer;}
" 4. Service Binding (OData V4 - UI)" Type: OData V4 - UI" → App Fiori Elements automatique!Avantages de Fiori
- Moderne : Responsive, optimise pour le tactile
- Cloud-ready : Fonctionne partout (navigateur, tablette, mobile)
- Peu de maintenance : Fiori Elements genere l’UI automatiquement
- Coherent : Experience SAP unifiee
Astuce : Utilisez SAP Fiori Elements - l’UI est generee automatiquement a partir de votre modele RAP !
9. COMMIT ENTITIES manquant pour les operations EML
Le probleme
Les operations EML (Entity Manipulation Language) comme MODIFY ENTITIES necessitent un COMMIT explicite, sinon les modifications ne sont pas sauvegardees.
Erreur typique
" ❌ FAUX: Pas de COMMITMODIFY ENTITIES OF zi_travel ENTITY Travel UPDATE FIELDS ( Status ) WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ).
" Les modifications sont perdues! ❌Solution
Utilisez COMMIT ENTITIES :
" ✅ CORRECT: Avec COMMITMODIFY ENTITIES OF zi_travel ENTITY Travel UPDATE FIELDS ( Status ) WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ) FAILED DATA(failed) REPORTED DATA(reported).
" IMPORTANT: Ne pas oublier le COMMIT!COMMIT ENTITIES RESPONSE OF zi_travel FAILED DATA(commit_failed) REPORTED DATA(commit_reported).
IF commit_failed IS INITIAL. " Sauvegarde reussieENDIF.Bonne pratique
- Toujours COMMIT ENTITIES apres
MODIFY ENTITIES - Verifiez
FAILEDetREPORTEDpour les erreurs - Dans les Behavior Implementations, pas de COMMIT (le framework le fait)
- Utilisez COMMIT uniquement dans le code externe (ex. reports, classes)
10. Problemes de performance dus aux associations CDS manquantes
Le probleme
Faire des joins dans le code ABAP au lieu d’utiliser des associations CDS conduit a une mauvaise performance et un code illisible.
Erreur typique
" ❌ FAUX: Joins dans ABAPSELECT c~customer_id, c~name, o~order_id, o~order_date FROM ztab_customers AS c INNER JOIN ztab_orders AS o ON c~customer_id = o~customer_id WHERE c~status = 'ACTIVE" INTO TABLE @DATA(lt_result).
" Puis agregation manuelle, filtrage, etc.LOOP AT lt_result INTO DATA(ls_result). " Logique complexeENDLOOP.Solution
Utilisez des CDS Views avec Associations :
/* ✅ CORRECT: CDS View avec Association */@AbapCatalog.sqlViewName: 'ZVCUSTOMER"@EndUserText.label: 'Customer with Orders"
define view Z_Customer as select from ztab_customers as c association [0..*] to ztab_orders as _Orders on c.customer_id = _Orders.customer_id{ key c.customer_id as CustomerId, c.name as CustomerName, c.status as Status,
/* Exposer l'association */ _Orders}" Utilisation en ABAPSELECT FROM Z_Customer FIELDS CustomerId, CustomerName WHERE Status = 'ACTIVE" INTO TABLE @DATA(lt_customers).
" Charger les commandes si necessaire (Lazy Loading)SELECT FROM Z_Customer FIELDS CustomerId, \_Orders-OrderId, \_Orders-OrderDate WHERE Status = 'ACTIVE" INTO TABLE @DATA(lt_customer_orders).Avantages
- Performance : La DB fait les joins (pas ABAP)
- Reutilisable : L’association peut etre utilisee dans toutes les vues
- Lazy Loading : Charger les commandes seulement si necessaire
- Lisible : Modelisation de donnees claire
Regle d’or : Les joins appartiennent aux CDS Views, pas au code ABAP !
Resume : Les 10 erreurs ABAP Cloud les plus courantes
| # | Erreur | Solution |
|---|---|---|
| 1 | Utiliser des APIs non-released | Uniquement les CDS Views & APIs Released |
| 2 | SELECT * | Liste de champs explicite |
| 3 | FORM/PERFORM | Classes avec methodes |
| 4 | Gestion d’exception manquante | TRY-CATCH, OPTIONAL, DEFAULT |
| 5 | Pas de Strict Mode | strict ( 2 ) dans BDEF |
| 6 | CONCATENATE | String Templates |...| |
| 7 | READ TABLE | Table Expressions lt_table[ key ] |
| 8 | Dynpro | RAP + Fiori Elements |
| 9 | Pas de COMMIT | COMMIT ENTITIES apres EML |
| 10 | Joins dans ABAP | Associations CDS |
Conseils pratiques pour eviter les erreurs
1. Utilisez ABAP Development Tools (ADT)
- Eclipse avec ADT detecte les erreurs ABAP Cloud immediatement
- Coloration syntaxique pour les objets Released/Non-Released
- Quick Fixes pour de nombreuses erreurs
2. Activez les verifications ATC
ABAP Test Cockpit verifie la conformite ABAP Cloud du code :
" Dans ADT: Clic droit sur l'objet → Run As → ABAP Test Cockpit3. Utilisez les modeles de code
Dans ADT : Ctrl+Space pour les modeles de code
trycatch→ Bloc TRY-CATCHloop→ LOOP avec Table Expressionmethod→ Definition de methode
4. Apprenez des exemples SAP
- SAP Developers Tutorials : developers.sap.com
- GitHub SAP-Samples : github.com/SAP-samples
- SAP Community : community.sap.com
5. Utilisez les outils de migration
Pour les migrations depuis Classic ABAP :
- Custom Code Migration App (App Fiori dans le systeme)
- ABAP Test Cockpit avec les verifications Cloud
- SAP BTP ABAP Environment Migration Tool
Ressources supplementaires
Sur abapcloud.com :
- Definition ABAP Cloud
- Aide-memoire ABAP Cloud 2025
- Bases RAP
- CDS Views
- Statement TRY-CATCH
- Classes d’exception
Ressources externes :
- ABAP Cloud FAQ - SAP Community
- Clean Core & ABAP Cloud - Doktor ERP
- Exemples de migration ABAP Cloud
Checklist : Revue de code ABAP Cloud
Avant de commiter votre code, verifiez :
- Uniquement des APIs Released utilisees ?
- Pas d’instructions
SELECT *? - Pas de
FORM/PERFORM? - Table Expressions avec gestion d’exception ?
- Strict Mode active dans les BDEFs ?
- String Templates au lieu de
CONCATENATE? - Syntaxe moderne (VALUE, CORRESPONDING, etc.) ?
- Avec EML :
COMMIT ENTITIESpresent ? - Fiori au lieu de Dynpro ?
- Associations CDS au lieu de joins dans ABAP ?
Si tous les points sont coches : Votre code est pret pour ABAP Cloud !
Votre erreur ABAP Cloud la plus frequente ?
Quelle erreur faites-vous le plus souvent ? Manque-t-il une erreur importante dans cette liste ? Partagez vos experiences dans les commentaires !
Bonne chance pour votre developpement ABAP Cloud !