10 erreurs ABAP Cloud les plus courantes et comment les eviter (2025)

Catégorie
Best Practices
Publié
Auteur
Johannes

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 SAP
SELECT * 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 Released
SELECT * FROM I_Product
INTO TABLE @DATA(lt_products).
" Ou: Utiliser une Released API
DATA(lo_api) = cl_some_released_api=>get_instance( ).
DATA(lt_materials) = lo_api->get_materials( ).

Comment trouver les Released APIs

  1. ABAP Development Tools (ADT) : Utilisez Ctrl+Shift+A → Rechercher des objets → Filtre “API State: Released”
  2. SAP API Business Hub : api.sap.com
  3. 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

" ❌ FAUX
SELECT * 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 explicite
SELECT CustomerID, CustomerName, Country
FROM I_Customer
INTO TABLE @DATA(lt_customers).
" Ou: FIELDS si vous avez besoin de nombreux champs
SELECT 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-routines
FORM 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 methode
CLASS 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.
" Utilisation
DATA(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'exception
DATA(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'exception
TRY.
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 trouve
ENDIF.

Solution 3 : DEFAULT

" ✅ CORRECT: Avec valeur DEFAULT
DATA(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 Mode
managed 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 Mode
managed implementation in class zbp_i_travel unique;
strict ( 2 ); // <- Important!
define behavior for ZI_Travel alias Travel
persistent table ztravel
lock master
authorization 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 Template
DATA(lv_message) = |Client { lv_customer_id } a ete active|.
" Avec formatage
DATA(lv_price) = |Prix: { lv_amount CURRENCY = lv_currency }|.
" Avec formatage de date
DATA(lv_date) = |Date: { lv_timestamp TIMESTAMP = ISO }|.
" Avec padding
DATA(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 TABLE
DATA ls_customer TYPE ty_customer.
READ TABLE lt_customers INTO ls_customer WITH KEY customer_id = lv_id.
IF sy-subrc = 0.
" Traitement
ENDIF.

Solution

Utilisez une Table Expression :

" ✅ MIEUX: Table Expression avec TRY-CATCH
TRY.
DATA(ls_customer) = lt_customers[ customer_id = lv_id ].
" Traitement
CATCH cx_sy_itab_line_not_found.
" Non trouve
ENDTRY.
" Ou avec OPTIONAL
DATA(ls_customer) = VALUE #( lt_customers[ customer_id = lv_id ] OPTIONAL ).
IF ls_customer IS NOT INITIAL.
" Traitement
ENDIF.

Avantages

  • Declaration inline : Pas besoin de DATA separe
  • 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 Dynpro
CALL 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 Definition
projection;
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 COMMIT
MODIFY 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 COMMIT
MODIFY 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 reussie
ENDIF.

Bonne pratique

  • Toujours COMMIT ENTITIES apres MODIFY ENTITIES
  • Verifiez FAILED et REPORTED pour 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 ABAP
SELECT 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 complexe
ENDLOOP.

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 ABAP
SELECT 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

#ErreurSolution
1Utiliser des APIs non-releasedUniquement les CDS Views & APIs Released
2SELECT *Liste de champs explicite
3FORM/PERFORMClasses avec methodes
4Gestion d’exception manquanteTRY-CATCH, OPTIONAL, DEFAULT
5Pas de Strict Modestrict ( 2 ) dans BDEF
6CONCATENATEString Templates |...|
7READ TABLETable Expressions lt_table[ key ]
8DynproRAP + Fiori Elements
9Pas de COMMITCOMMIT ENTITIES apres EML
10Joins dans ABAPAssociations 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 Cockpit

3. Utilisez les modeles de code

Dans ADT : Ctrl+Space pour les modeles de code

  • trycatch → Bloc TRY-CATCH
  • loop → LOOP avec Table Expression
  • method → Definition de methode

4. Apprenez des exemples SAP

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 :

Ressources externes :


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 ENTITIES present ?
  • 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 !