Le Cheat Sheet ABAP Cloud ultime avec toutes les instructions importantes, les expressions modernes et les bonnes pratiques pour 2025. Parfait comme reference rapide pour le quotidien du developpeur.
Table des matieres
- Declaration de donnees
- Structures de controle
- Tables internes
- Acces a la base de donnees
- Expressions modernes
- Operations sur les chaines
- POO (Programmation Orientee Objet)
- Gestion des exceptions
- RAP (RESTful ABAP)
- Vues CDS
Declaration de donnees
Types de donnees elementaires
" Classique (obsolete dans ABAP Cloud)DATA lv_name TYPE string.DATA lv_count TYPE i.
" Moderne : Declaration inlineDATA(lv_name) = 'Max Mustermann'.DATA(lv_count) = 42.
" ConstantesCONSTANTS gc_max_entries TYPE i VALUE 100.
" Field Symbols & References de donneesFIELD-SYMBOLS <fs_data> TYPE any.DATA(lo_ref) = NEW zcl_my_class( ).Structures et tables
" StructureTYPES: BEGIN OF ty_customer, id TYPE i, name TYPE string, email TYPE string, END OF ty_customer.
" Table interneDATA lt_customers TYPE TABLE OF ty_customer.
" Moderne : TYPE TABLE OF avec indexDATA lt_indexed TYPE STANDARD TABLE OF ty_customer WITH DEFAULT KEY.DATA lt_sorted TYPE SORTED TABLE OF ty_customer WITH UNIQUE KEY id.DATA lt_hashed TYPE HASHED TABLE OF ty_customer WITH UNIQUE KEY id.Structures de controle
Conditions IF
IF lv_status = 'ACTIVE'. " CodeELSEIF lv_status = 'PENDING'. " CodeELSE. " CodeENDIF.
" Moderne : Inline avec CONDDATA(lv_message) = COND string( WHEN lv_status = 'ACTIVE' THEN 'Actif" WHEN lv_status = 'PENDING' THEN 'En attente" ELSE 'Inconnu").Instruction CASE
CASE lv_type. WHEN 'A'. " Code WHEN 'B' OR 'C'. " Code WHEN OTHERS. " Par defautENDCASE.
" Moderne : Expression SWITCHDATA(lv_result) = SWITCH string( lv_type WHEN 'A' THEN 'Type A" WHEN 'B' THEN 'Type B" ELSE 'Inconnu").Boucles
" Boucle DODO 10 TIMES. " CodeENDDO.
" Boucle WHILEWHILE lv_count < 100. lv_count = lv_count + 1.ENDWHILE.
" LOOP AT (table interne)LOOP AT lt_customers INTO DATA(ls_customer). " TraitementENDLOOP.
" Moderne : Expression FORDATA(lt_names) = VALUE string_table( FOR ls_cust IN lt_customers ( ls_cust-name )).Tables internes
Ajouter des lignes
" APPENDAPPEND VALUE #( id = 1 name = 'Max' ) TO lt_customers.
" INSERTINSERT VALUE #( id = 2 name = 'Anna' ) INTO TABLE lt_customers.
" Moderne : VALUE avec plusieurs ligneslt_customers = VALUE #().Lire des lignes
" READ TABLE classiqueREAD TABLE lt_customers INTO DATA(ls_customer) WITH KEY id = 1.
" Moderne : Expression de tableDATA(ls_cust) = lt_customers[ id = 1 ].
" Optionnel : Par defaut si non trouveDATA(ls_opt) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Definir une valeur par defautDATA(ls_def) = VALUE #( lt_customers[ id = 999 ] DEFAULT VALUE #( id = 0 name = 'Inconnu' ) ).Modifier des lignes
" MODIFY classiqueMODIFY lt_customers FROM VALUE #( id = 1 name = 'Maximilian' ) TRANSPORTING name WHERE id = 1.
" Moderne : Expression de tablelt_customers[ id = 1 ]-name = 'Maximilian'.Supprimer des lignes
" DELETE classiqueDELETE lt_customers WHERE id = 1.
" DELETE par indexDELETE lt_customers INDEX 1.
" CLEAR & FREECLEAR lt_customers. " Vide la table (memoire conservee)FREE lt_customers. " Libere la memoireOperations sur les tables
" Nombre de lignesDATA(lv_lines) = lines( lt_customers ).
" TrierSORT lt_customers BY name ASCENDING.
" FiltrerDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" CORRESPONDING (Mapping)DATA(lt_target) = CORRESPONDING #( lt_source ).Acces a la base de donnees
SELECT
" Enregistrement uniqueSELECT SINGLE id, name, email FROM ztab_customers WHERE id = @lv_id INTO @DATA(ls_customer).
" Plusieurs lignesSELECT id, name, email FROM ztab_customers WHERE status = 'ACTIVE" INTO TABLE @lt_customers.
" Moderne : Inline avec JoinsSELECT c~id, c~name, o~order_date FROM ztab_customers AS c INNER JOIN ztab_orders AS o ON c~id = o~customer_id WHERE c~status = 'ACTIVE" INTO TABLE @DATA(lt_result).
" AgregationSELECT customer_id, COUNT( * ) AS order_count FROM ztab_orders GROUP BY customer_id INTO TABLE @DATA(lt_stats).INSERT, UPDATE, DELETE
" INSERTINSERT ztab_customers FROM @ls_customer.
" UPDATEUPDATE ztab_customers SET status = 'INACTIVE" WHERE id = @lv_id.
" DELETEDELETE FROM ztab_customers WHERE id = @lv_id.
" MODIFY (INSERT ou UPDATE)MODIFY ztab_customers FROM @ls_customer.COMMIT & ROLLBACK
" Enregistrer les modificationsCOMMIT WORK.
" Annuler les modificationsROLLBACK WORK.Expressions modernes
Constructeur VALUE
" StructureDATA(ls_data) = VALUE ty_customer( id = 1 name = 'Max").
" TableDATA(lt_data) = VALUE ty_customer_table( ( id = 1 name = 'Max' ) ( id = 2 name = 'Anna' )).
" BASE : Etendre les donnees existanteslt_data = VALUE #( BASE lt_data ( id = 3 name = 'Peter' )).CORRESPONDING
" Mapping simpleDATA(ls_target) = CORRESPONDING #( ls_source ).
" Avec MAPPINGDATA(ls_mapped) = CORRESPONDING #( ls_source MAPPING target_field = source_field).
" DEEP : Structures imbriqueesDATA(ls_deep) = CORRESPONDING #( DEEP ls_source ).COND & SWITCH
" COND (Alternative a IF)DATA(lv_discount) = COND decfloat16( WHEN lv_amount > 1000 THEN lv_amount * '0.1" WHEN lv_amount > 500 THEN lv_amount * '0.05" ELSE 0).
" SWITCH (Alternative a CASE)DATA(lv_category) = SWITCH string( lv_age WHEN 0 THEN 'Bebe" WHEN 1 TO 12 THEN 'Enfant" WHEN 13 TO 17 THEN 'Adolescent" ELSE 'Adulte").FILTER
" Filtre simpleDATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" Filtre avec condition INDATA(lt_premium) = FILTER #( lt_customers USING KEY id WHERE id IN lt_premium_ids ).REDUCE
" Calculer la sommeDATA(lv_total) = REDUCE i( INIT sum = 0 FOR ls_order IN lt_orders NEXT sum = sum + ls_order-amount ).
" Concatener des chainesDATA(lv_names) = REDUCE string( INIT text = || FOR ls_cust IN lt_customers NEXT text = text && ls_cust-name && ', ' ).Expression FOR
" TransformationDATA(lt_ids) = VALUE int4_table( FOR ls_customer IN lt_customers ( ls_customer-id )).
" Avec conditionDATA(lt_active_names) = VALUE string_table( FOR ls_cust IN lt_customers WHERE ( status = 'ACTIVE' ) ( ls_cust-name )).
" FOR imbriqueDATA(lt_flat) = VALUE ty_table( FOR ls_group IN lt_groups FOR ls_item IN ls_group-items ( ls_item )).Operations sur les chaines
Templates de chaines
" SimpleDATA(lv_greeting) = |Bonjour { lv_name } !|.
" Avec formatageDATA(lv_price) = |Prix : { lv_amount CURRENCY = lv_currency }|.DATA(lv_date) = |Date : { lv_timestamp TIMESTAMP = ISO }|.
" Alignement et paddingDATA(lv_padded) = |{ lv_text WIDTH = 20 ALIGN = LEFT PAD = '.' }|.Methodes de chaines
" LongueurDATA(lv_len) = strlen( lv_text ).
" Sous-chaineDATA(lv_sub) = substring( val = lv_text off = 0 len = 5 ).
" Rechercher & RemplacerDATA(lv_pos) = find( val = lv_text sub = 'test' ).DATA(lv_replaced) = replace( val = lv_text sub = 'ancien' with = 'nouveau' ).
" Majuscules/MinusculesDATA(lv_upper) = to_upper( lv_text ).DATA(lv_lower) = to_lower( lv_text ).
" Supprimer les espacesDATA(lv_trimmed) = condense( lv_text ).CONCATENATE & SPLIT
" Moderne : Template de chaine au lieu de CONCATENATEDATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.
" SPLITSPLIT lv_text AT ',' INTO TABLE DATA(lt_parts).POO (Programmation Orientee Objet)
Definition de classe
CLASS zcl_customer DEFINITION PUBLIC FINAL CREATE PUBLIC. PUBLIC SECTION. METHODS: constructor IMPORTING iv_id TYPE i, get_name RETURNING VALUE(rv_name) TYPE string, set_status IMPORTING iv_status TYPE string.
PRIVATE SECTION. DATA: mv_id TYPE i, mv_name TYPE string, mv_status TYPE string.ENDCLASS.
CLASS zcl_customer IMPLEMENTATION. METHOD constructor. mv_id = iv_id. ENDMETHOD.
METHOD get_name. rv_name = mv_name. ENDMETHOD.
METHOD set_status. mv_status = iv_status. ENDMETHOD.ENDCLASS.Instanciation
" Operateur NEWDATA(lo_customer) = NEW zcl_customer( iv_id = 1 ).
" Appel de methodeDATA(lv_name) = lo_customer->get_name( ).lo_customer->set_status( 'ACTIVE' ).Interfaces
INTERFACE zif_processor. METHODS process IMPORTING iv_data TYPE string RETURNING VALUE(rv_result) TYPE string.ENDINTERFACE.
CLASS zcl_impl DEFINITION. PUBLIC SECTION. INTERFACES zif_processor.ENDCLASS.
CLASS zcl_impl IMPLEMENTATION. METHOD zif_processor~process. rv_result = |Traite : { iv_data }|. ENDMETHOD.ENDCLASS.Gestion des exceptions
TRY-CATCH
TRY. DATA(lv_customer) = lt_customers[ id = lv_id ]. CATCH cx_sy_itab_line_not_found INTO DATA(lx_error). " Gestion de l'erreur DATA(lv_msg) = lx_error->get_text( ).ENDTRY.
" Plusieurs exceptionsTRY. " Code CATCH cx_sy_arithmetic_error. " Division par 0 CATCH cx_sy_conversion_error. " Erreur de conversion CATCH cx_root INTO DATA(lx_any). " Toutes les autresENDTRY.CLEANUP
TRY. " Code avec ressources CATCH cx_error. " Gestion de l'erreur CLEANUP. " Liberer les ressources (toujours execute) lo_resource->close( ).ENDTRY.Classes d’exception
CLASS zcx_my_exception DEFINITION PUBLIC INHERITING FROM cx_static_check FINAL CREATE PUBLIC.
PUBLIC SECTION. METHODS constructor IMPORTING textid TYPE sotr_conc OPTIONAL.ENDCLASS.
" UtilisationIF lv_invalid. RAISE EXCEPTION TYPE zcx_my_exception.ENDIF.RAP (RESTful ABAP)
EML (Entity Manipulation Language)
" READREAD ENTITIES OF zi_travel ENTITY Travel FIELDS ( TravelId AgencyId Status ) WITH VALUE #( ( TravelId = lv_id ) ) RESULT DATA(lt_travel).
" CREATEMODIFY ENTITIES OF zi_travel ENTITY Travel CREATE FIELDS ( AgencyId CustomerId BeginDate ) WITH VALUE #( ( %cid = 'CID_1" AgencyId = '000001" CustomerId = '000010" BeginDate = cl_abap_context_info=>get_system_date( ) ) ).
" UPDATEMODIFY ENTITIES OF zi_travel ENTITY Travel UPDATE FIELDS ( Status ) WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ).
" DELETEMODIFY ENTITIES OF zi_travel ENTITY Travel DELETE FROM VALUE #( ( TravelId = lv_id ) ).
" COMMITCOMMIT ENTITIES.Actions
" Executer une actionMODIFY ENTITIES OF zi_travel ENTITY Travel EXECUTE acceptTravel FROM VALUE #( ( TravelId = lv_id ) ) RESULT DATA(lt_result).Vues CDS
Vue de base
@AbapCatalog.sqlViewName: 'ZVCUSTOMER"@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'Customer View"
define view Z_Customer as select from ztab_customers{ key id as CustomerId, name as CustomerName, email as Email, @Semantics.amount.currencyCode: 'Currency" credit_limit as CreditLimit, currency as Currency}Associations & Joins
define view Z_CustomerOrders as select from ztab_customers as c association [0..*] to ztab_orders as _Orders on c.id = _Orders.customer_id{ key c.id, c.name, c.email,
_Orders // Exposer l'association}Annotations
@Analytics.dataCategory: #CUBE@Analytics.query: true@VDM.viewType: #CONSUMPTION
define view Z_SalesAnalytics as select from ztab_sales{ @Analytics.dimension: true product_id,
@Aggregation.default: #SUM @Semantics.amount.currencyCode: 'Currency" revenue,
currency}Bonnes pratiques
A FAIRE
" Declarations inlineDATA(lv_result) = calculate_value( ).
" Constructeur VALUEDATA(lt_data) = VALUE ty_table( ( id = 1 ) ).
" Templates de chainesDATA(lv_msg) = |Erreur : { lv_error_code }|.
" Expressions de tableDATA(ls_customer) = lt_customers[ id = lv_id ].
" Chainage de methodesDATA(lv_final) = lo_object->method1( )->method2( )->get_result( ).A NE PAS FAIRE
" Declaration obsoleteDATA lv_result TYPE string.lv_result = calculate_value( ).
" CONCATENATE au lieu de template de chaineCONCATENATE 'Erreur:' lv_error_code INTO lv_msg SEPARATED BY space.
" Variables auxiliaires inutilesDATA ls_customer TYPE ty_customer.READ TABLE lt_customers INTO ls_customer WITH KEY id = lv_id.Restrictions ABAP Cloud
NON autorise dans ABAP Cloud
FORM/PERFORM(Sous-routines)SELECT *sans liste de champs- Acces directs a la BD sur les tables SAP (uniquement APIs Released)
SUBMITpour les appels de Report- Developpement Dynpro (uniquement Fiori)
CALL TRANSACTION
Utilisez plutot
- Methodes au lieu de FORM
- Liste de champs explicite pour SELECT
- Vues CDS avec statut Released
- Business Events & RAP
- SAP Fiori Elements
- ABAP EML (Entity Manipulation Language)
Classes & Interfaces utiles
| Classe/Interface | Utilisation |
|---|---|
cl_abap_context_info | Date systeme, User, Mandant |
cl_abap_random | Generer des nombres aleatoires |
cl_abap_structdescr | Runtime Type Info (RTTI) |
cl_http_client | Requetes HTTP |
cl_salv_table | Creer des listes ALV |
if_abap_behv | Constantes RAP Behavior |
cx_root | Base de toutes les exceptions |
Resume
Ce Cheat Sheet couvre les concepts ABAP Cloud les plus importants pour 2025 :
- Syntaxe moderne avec declarations inline
- Expressions de constructeur (VALUE, CORRESPONDING, COND, etc.)
- EML pour le developpement RAP
- Vues CDS pour la modelisation des donnees
- Bonnes pratiques pour un code propre et maintenable
Conseil : Enregistrez cette page en favori ou imprimez-la pour un acces rapide pendant le developpement !
Voir aussi :