ABAP Cloud Cheat Sheet 2025 : Reference complete

Catégorie
ABAP Cloud
Publié
Auteur
Johannes

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

  1. Declaration de donnees
  2. Structures de controle
  3. Tables internes
  4. Acces a la base de donnees
  5. Expressions modernes
  6. Operations sur les chaines
  7. POO (Programmation Orientee Objet)
  8. Gestion des exceptions
  9. RAP (RESTful ABAP)
  10. 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 inline
DATA(lv_name) = 'Max Mustermann'.
DATA(lv_count) = 42.
" Constantes
CONSTANTS gc_max_entries TYPE i VALUE 100.
" Field Symbols & References de donnees
FIELD-SYMBOLS <fs_data> TYPE any.
DATA(lo_ref) = NEW zcl_my_class( ).

Structures et tables

" Structure
TYPES: BEGIN OF ty_customer,
id TYPE i,
name TYPE string,
email TYPE string,
END OF ty_customer.
" Table interne
DATA lt_customers TYPE TABLE OF ty_customer.
" Moderne : TYPE TABLE OF avec index
DATA 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'.
" Code
ELSEIF lv_status = 'PENDING'.
" Code
ELSE.
" Code
ENDIF.
" Moderne : Inline avec COND
DATA(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 defaut
ENDCASE.
" Moderne : Expression SWITCH
DATA(lv_result) = SWITCH string( lv_type
WHEN 'A' THEN 'Type A"
WHEN 'B' THEN 'Type B"
ELSE 'Inconnu"
).

Boucles

" Boucle DO
DO 10 TIMES.
" Code
ENDDO.
" Boucle WHILE
WHILE lv_count < 100.
lv_count = lv_count + 1.
ENDWHILE.
" LOOP AT (table interne)
LOOP AT lt_customers INTO DATA(ls_customer).
" Traitement
ENDLOOP.
" Moderne : Expression FOR
DATA(lt_names) = VALUE string_table(
FOR ls_cust IN lt_customers
( ls_cust-name )
).

Tables internes

Ajouter des lignes

" APPEND
APPEND VALUE #( id = 1 name = 'Max' ) TO lt_customers.
" INSERT
INSERT VALUE #( id = 2 name = 'Anna' ) INTO TABLE lt_customers.
" Moderne : VALUE avec plusieurs lignes
lt_customers = VALUE #(
( id = 1 name = 'Max' email = '[email protected]' )
( id = 2 name = 'Anna' email = '[email protected]' )
).

Lire des lignes

" READ TABLE classique
READ TABLE lt_customers INTO DATA(ls_customer)
WITH KEY id = 1.
" Moderne : Expression de table
DATA(ls_cust) = lt_customers[ id = 1 ].
" Optionnel : Par defaut si non trouve
DATA(ls_opt) = VALUE #( lt_customers[ id = 999 ] OPTIONAL ).
" Definir une valeur par defaut
DATA(ls_def) = VALUE #( lt_customers[ id = 999 ]
DEFAULT VALUE #( id = 0 name = 'Inconnu' ) ).

Modifier des lignes

" MODIFY classique
MODIFY lt_customers FROM VALUE #( id = 1 name = 'Maximilian' )
TRANSPORTING name WHERE id = 1.
" Moderne : Expression de table
lt_customers[ id = 1 ]-name = 'Maximilian'.

Supprimer des lignes

" DELETE classique
DELETE lt_customers WHERE id = 1.
" DELETE par index
DELETE lt_customers INDEX 1.
" CLEAR & FREE
CLEAR lt_customers. " Vide la table (memoire conservee)
FREE lt_customers. " Libere la memoire

Operations sur les tables

" Nombre de lignes
DATA(lv_lines) = lines( lt_customers ).
" Trier
SORT lt_customers BY name ASCENDING.
" Filtrer
DATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" CORRESPONDING (Mapping)
DATA(lt_target) = CORRESPONDING #( lt_source ).

Acces a la base de donnees

SELECT

" Enregistrement unique
SELECT SINGLE id, name, email
FROM ztab_customers
WHERE id = @lv_id
INTO @DATA(ls_customer).
" Plusieurs lignes
SELECT id, name, email
FROM ztab_customers
WHERE status = 'ACTIVE"
INTO TABLE @lt_customers.
" Moderne : Inline avec Joins
SELECT 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).
" Agregation
SELECT customer_id, COUNT( * ) AS order_count
FROM ztab_orders
GROUP BY customer_id
INTO TABLE @DATA(lt_stats).

INSERT, UPDATE, DELETE

" INSERT
INSERT ztab_customers FROM @ls_customer.
" UPDATE
UPDATE ztab_customers
SET status = 'INACTIVE"
WHERE id = @lv_id.
" DELETE
DELETE FROM ztab_customers WHERE id = @lv_id.
" MODIFY (INSERT ou UPDATE)
MODIFY ztab_customers FROM @ls_customer.

COMMIT & ROLLBACK

" Enregistrer les modifications
COMMIT WORK.
" Annuler les modifications
ROLLBACK WORK.

Expressions modernes

Constructeur VALUE

" Structure
DATA(ls_data) = VALUE ty_customer(
id = 1
name = 'Max"
).
" Table
DATA(lt_data) = VALUE ty_customer_table(
( id = 1 name = 'Max' )
( id = 2 name = 'Anna' )
).
" BASE : Etendre les donnees existantes
lt_data = VALUE #( BASE lt_data
( id = 3 name = 'Peter' )
).

CORRESPONDING

" Mapping simple
DATA(ls_target) = CORRESPONDING #( ls_source ).
" Avec MAPPING
DATA(ls_mapped) = CORRESPONDING #( ls_source MAPPING
target_field = source_field
).
" DEEP : Structures imbriquees
DATA(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 simple
DATA(lt_active) = FILTER #( lt_customers WHERE status = 'ACTIVE' ).
" Filtre avec condition IN
DATA(lt_premium) = FILTER #( lt_customers USING KEY id
WHERE id IN lt_premium_ids ).

REDUCE

" Calculer la somme
DATA(lv_total) = REDUCE i( INIT sum = 0
FOR ls_order IN lt_orders
NEXT sum = sum + ls_order-amount ).
" Concatener des chaines
DATA(lv_names) = REDUCE string( INIT text = ||
FOR ls_cust IN lt_customers
NEXT text = text && ls_cust-name && ', ' ).

Expression FOR

" Transformation
DATA(lt_ids) = VALUE int4_table(
FOR ls_customer IN lt_customers
( ls_customer-id )
).
" Avec condition
DATA(lt_active_names) = VALUE string_table(
FOR ls_cust IN lt_customers
WHERE ( status = 'ACTIVE' )
( ls_cust-name )
).
" FOR imbrique
DATA(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

" Simple
DATA(lv_greeting) = |Bonjour { lv_name } !|.
" Avec formatage
DATA(lv_price) = |Prix : { lv_amount CURRENCY = lv_currency }|.
DATA(lv_date) = |Date : { lv_timestamp TIMESTAMP = ISO }|.
" Alignement et padding
DATA(lv_padded) = |{ lv_text WIDTH = 20 ALIGN = LEFT PAD = '.' }|.

Methodes de chaines

" Longueur
DATA(lv_len) = strlen( lv_text ).
" Sous-chaine
DATA(lv_sub) = substring( val = lv_text off = 0 len = 5 ).
" Rechercher & Remplacer
DATA(lv_pos) = find( val = lv_text sub = 'test' ).
DATA(lv_replaced) = replace( val = lv_text sub = 'ancien' with = 'nouveau' ).
" Majuscules/Minuscules
DATA(lv_upper) = to_upper( lv_text ).
DATA(lv_lower) = to_lower( lv_text ).
" Supprimer les espaces
DATA(lv_trimmed) = condense( lv_text ).

CONCATENATE & SPLIT

" Moderne : Template de chaine au lieu de CONCATENATE
DATA(lv_full_name) = |{ lv_first_name } { lv_last_name }|.
" SPLIT
SPLIT 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 NEW
DATA(lo_customer) = NEW zcl_customer( iv_id = 1 ).
" Appel de methode
DATA(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 exceptions
TRY.
" 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 autres
ENDTRY.

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.
" Utilisation
IF lv_invalid.
RAISE EXCEPTION TYPE zcx_my_exception.
ENDIF.

RAP (RESTful ABAP)

EML (Entity Manipulation Language)

" READ
READ ENTITIES OF zi_travel
ENTITY Travel
FIELDS ( TravelId AgencyId Status )
WITH VALUE #( ( TravelId = lv_id ) )
RESULT DATA(lt_travel).
" CREATE
MODIFY 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( )
) ).
" UPDATE
MODIFY ENTITIES OF zi_travel
ENTITY Travel
UPDATE FIELDS ( Status )
WITH VALUE #( ( TravelId = lv_id Status = 'A' ) ).
" DELETE
MODIFY ENTITIES OF zi_travel
ENTITY Travel
DELETE FROM VALUE #( ( TravelId = lv_id ) ).
" COMMIT
COMMIT ENTITIES.

Actions

" Executer une action
MODIFY 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 inline
DATA(lv_result) = calculate_value( ).
" Constructeur VALUE
DATA(lt_data) = VALUE ty_table( ( id = 1 ) ).
" Templates de chaines
DATA(lv_msg) = |Erreur : { lv_error_code }|.
" Expressions de table
DATA(ls_customer) = lt_customers[ id = lv_id ].
" Chainage de methodes
DATA(lv_final) = lo_object->method1( )->method2( )->get_result( ).

A NE PAS FAIRE

" Declaration obsolete
DATA lv_result TYPE string.
lv_result = calculate_value( ).
" CONCATENATE au lieu de template de chaine
CONCATENATE 'Erreur:' lv_error_code INTO lv_msg SEPARATED BY space.
" Variables auxiliaires inutiles
DATA 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)
  • SUBMIT pour 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/InterfaceUtilisation
cl_abap_context_infoDate systeme, User, Mandant
cl_abap_randomGenerer des nombres aleatoires
cl_abap_structdescrRuntime Type Info (RTTI)
cl_http_clientRequetes HTTP
cl_salv_tableCreer des listes ALV
if_abap_behvConstantes RAP Behavior
cx_rootBase 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 :