{"id":166898,"date":"2026-09-29T16:00:00","date_gmt":"2026-09-29T14:00:00","guid":{"rendered":"https:\/\/e3mag.com\/?p=166898"},"modified":"2026-09-29T15:01:52","modified_gmt":"2026-09-29T13:01:52","slug":"green-abap-pour-lunivers-sap","status":"publish","type":"post","link":"https:\/\/e3mag.com\/fr\/green-abap-fuer-die-sap-welt\/","title":{"rendered":"Green Abap pour l'univers SAP"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Tout syst\u00e8me num\u00e9rique consomme de l'\u00e9nergie lorsqu'il fonctionne. Si le mat\u00e9riel gagne sans cesse en efficacit\u00e9, des logiciels inefficaces obligent n\u00e9anmoins les serveurs \u00e0 fournir des performances maximales inutiles. Les grandes entreprises g\u00e8rent g\u00e9n\u00e9ralement leurs processus m\u00e9tier \u00e0 l'aide de syst\u00e8mes SAP complexes. Le langage de programmation ABAP est au c\u0153ur de ces applications. Autrefois, les d\u00e9veloppeurs \u00e9crivaient souvent du code ABAP en ne se souciant que de sa fonctionnalit\u00e9. Aujourd\u2019hui, il vaut la peine de pr\u00eater \u00e9galement attention \u00e0 la consommation d\u2019\u00e9nergie. En effet, un code de mauvaise qualit\u00e9 fait artificiellement grimper la consommation d\u2019\u00e9lectricit\u00e9.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Green ABAP et Clean Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">C'est l\u00e0 qu'intervient l'approche \u201e Green ABAP \u201c. Cette m\u00e9thode relie directement les objectifs de d\u00e9veloppement durable au d\u00e9veloppement logiciel. Le \u201e Clean Code \u201c joue ici un r\u00f4le essentiel. Ce terme d\u00e9signe un code facile \u00e0 lire et \u00e0 maintenir. Un code propre r\u00e9duit les erreurs et facilite les optimisations ult\u00e9rieures dans la programmation. Un code facile \u00e0 lire permet d\u2019\u00e9viter la dette technique, d\u2019\u00e9conomiser des ressources mat\u00e9rielles \u00e0 long terme et contribue \u00e0 la r\u00e9alisation des objectifs climatiques.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Comment le test a \u00e9t\u00e9 r\u00e9alis\u00e9 : la m\u00e9thodologie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons \u00e9tudi\u00e9 la consommation d'\u00e9nergie du code ABAP dans le cadre d'une analyse empirique. Nous avons r\u00e9alis\u00e9 les tests dans un environnement SAP S\/4 HANA standardis\u00e9, au sein d'un syst\u00e8me de formation. Le SAP Workload Monitor (ST03N) a enregistr\u00e9 les valeurs de performance avec pr\u00e9cision.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons toujours compar\u00e9 d'anciens programmes inefficaces \u00e0 des versions optimis\u00e9es. La comparaison s'appuie sur quatre indicateurs cl\u00e9s : le temps CPU, le temps de r\u00e9ponse de la base de donn\u00e9es, le temps de r\u00e9ponse total et le volume de donn\u00e9es demand\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque test a \u00e9t\u00e9 effectu\u00e9 exactement dix fois afin d'\u00e9viter toute fluctuation al\u00e9atoire des valeurs mesur\u00e9es. Dans un syst\u00e8me SAP, la consommation \u00e9lectrique directe ne peut pas \u00eatre mesur\u00e9e simplement en joules. Les temps de traitement du processeur et de la base de donn\u00e9es d\u00e9termin\u00e9s sont toutefois g\u00e9n\u00e9ralement consid\u00e9r\u00e9s comme des indicateurs fiables de la consommation d'\u00e9nergie. Moins un programme n\u00e9cessite de temps de calcul, moins le serveur consomme d'\u00e9lectricit\u00e9. Neuf cas de programmation typiques ont \u00e9t\u00e9 \u00e9tudi\u00e9s ; nous pr\u00e9sentons ci-apr\u00e8s les conclusions tir\u00e9es ainsi que les exemples de code correspondants.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 1 : \u00e9viter les requ\u00eates de base de donn\u00e9es dans les boucles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons identifi\u00e9 les requ\u00eates r\u00e9p\u00e9t\u00e9es sur la base de donn\u00e9es comme un probl\u00e8me majeur de performances. La version inefficace lit les enregistrements ligne par ligne \u00e0 partir de la base de donn\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_select_loop.\n\nDATA : lt_flights TYPE TABLE OF sflight,\n ls_flight  TYPE sflight,\n lv_carrname TYPE scarr-carrname.\n\n\" Chargement de tous les enregistrements de vol\nSELECT * FROM sflight INTO TABLE lt_flights.\n\n\" Inefficace : instruction SELECT \u00e0 l'int\u00e9rieur de la boucle\nLOOP AT lt_flights INTO ls_flight.\n\n  SELECT SINGLE carrname INTO lv_carrname\n    FROM scarr\n    WHERE carrid = ls_flight-carrid.\n\n  WRITE : \/ ls_flight-carrid, ls_flight-connid, lv_carrname.\n\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c0 des fins d'optimisation, toutes les donn\u00e9es sont charg\u00e9es au pr\u00e9alable dans la m\u00e9moire vive. Le programme utilise ensuite des tables internes rapides pour la comparaison des donn\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_eff_select_loop.\n\nDATA : lt_flights TYPE TABLE OF sflight,\n lt_scarr   TYPE TABLE OF scarr,\n ls_flight  TYPE sflight,\n ls_scarr   TYPE scarr.\n\n\" Charger les deux tables une fois\nSELECT * FROM sflight INTO TABLE lt_flights.\nSELECT * FROM scarr INTO TABLE lt_scarr.\n\n\" Efficace : recherche en m\u00e9moire\nLOOP AT lt_flights INTO ls_flight.\n\n  READ TABLE lt_scarr INTO ls_scarr WITH KEY carrid = ls_flight-carrid.\n\n  IF sy-subrc = 0.\n    WRITE : \/ ls_flight-carrid, ls_flight-connid, ls_scarr-carrname.\n  ENDIF.\n\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gr\u00e2ce \u00e0 cette optimisation, le temps d'acc\u00e8s \u00e0 la base de donn\u00e9es a diminu\u00e9 de pr\u00e8s de 99 %.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 2 : suppression inefficace des doublons<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons test\u00e9 la commande ABAP permettant de supprimer les doublons. Sans tri pr\u00e9alable des donn\u00e9es, le syst\u00e8me ne supprime que les doublons directement adjacents.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_delete_dupl.\n\nDATA : lt_data TYPE TABLE OF sbook,\n ls_data TYPE sbook.\n\nSELECT * FROM sbook INTO TABLE lt_data\n  WHERE customid = '00001234'.\n\n\" Pas de tri avant la suppression des doublons \u00bb\nSUPPRIMER LES DOUBLONS ADJACENTS DE lt_data\n  EN COMPARANT carrid et connid.\n\nLOOP AT lt_data INTO ls_data.\n  WRITE : \/ ls_data-carrid, ls_data-connid.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans la version optimis\u00e9e, nous avons ajout\u00e9 une simple instruction de tri avant la suppression.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_delete_dupl.\n\nDATA : lt_data TYPE TABLE OF sbook,\n ls_data TYPE sbook.\n\nSELECT * FROM sbook INTO TABLE lt_data\n  WHERE customid = '00001234'.\n\n\" Efficacit\u00e9 : tri avant suppression des doublons\nSORT lt_data BY carrid connid.\n\nSUPPRIMER LES DOUBLONS ADJACENTS DE lt_data\n  EN COMPARANT carrid et connid.\n\nBOUCLE SUR lt_data DANS ls_data.\n  \u00c9CRIRE : \/ ls_data-carrid, ls_data-connid.\nFIN DE LA BOUCLE.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette petite modification a permis d'am\u00e9liorer le temps de r\u00e9ponse du syst\u00e8me de pr\u00e8s de 47 %. Le syst\u00e8me compare ainsi les entr\u00e9es de mani\u00e8re bien plus efficace.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 3 : r\u00e9duire radicalement le volume des donn\u00e9es \u00e0 la source<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons \u00e9tudi\u00e9 le comportement des requ\u00eates de base de donn\u00e9es non filtr\u00e9es. La version inefficace charge sans discernement l'int\u00e9gralit\u00e9 de la table de donn\u00e9es en m\u00e9moire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_select_where.\n\nSELECT * FROM sflight INTO TABLE @DATA(lt_flights).\n\nLOOP AT lt_flights INTO DATA(ls_flight).\n  \" Traiter tous les vols, m\u00eame si cela n'est pas n\u00e9cessaire\n  WRITE : \/ ls_flight-carrid, ls_flight-connid.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le cadre de l'optimisation, nous avons d\u00e9plac\u00e9 le processus de filtrage directement au niveau de la base de donn\u00e9es en utilisant une condition \u201c WHERE \u201d cibl\u00e9e.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_select_where.\n\nSELECT * FROM sflight\n  WHERE carrid = 'LH'\n  INTO TABLE @DATA(lt_flights_filtered).\n\nLOOP AT lt_flights_filtered INTO DATA(ls_flight).\n  \" traiter uniquement les vols pertinents \u00bb\n  WRITE: \/ ls_flight-carrid, ls_flight-connid.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le volume de donn\u00e9es consult\u00e9es a ainsi imm\u00e9diatement diminu\u00e9 de plus de 73 %.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 4 : comparer des tableaux de mani\u00e8re astucieuse<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les boucles imbriqu\u00e9es entra\u00eenent souvent des temps de calcul exponentiels lorsque les volumes de donn\u00e9es sont importants. Nous avons compar\u00e9 cette approche \u00e0 celle utilisant des tables de cl\u00e9s efficaces.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_nested_loop.\n\nDATA : lt_conn    TYPE TABLE OF spfli,\n lt_flights TYPE TABLE OF sflight.\n\nSELECT * FROM spfli INTO TABLE lt_conn.\nSELECT * FROM sflight INTO TABLE lt_flights.\n\nLOOP AT lt_conn INTO DATA(ls_conn).\n\n  LOOP AT lt_flights INTO DATA(ls_flight).\n\n    IF ls_conn-carrid = ls_flight-carrid AND\n ls_conn-connid = ls_flight-connid.\n\n WRITE : \/ ls_conn-carrid, ls_conn-connid, ls_flight-fldate.\n\n    ENDIF.\n\n  ENDLOOP.\n\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons converti le deuxi\u00e8me tableau en \u201c table de hachage \u201d \u00e0 des fins d'optimisation, afin que le programme puisse trouver les entr\u00e9es correspondantes sans avoir \u00e0 effectuer de longues recherches.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_hashed_lookup.\n\nTYPES : BEGIN OF ty_flight_map,\n carrid TYPE sflight-carrid,\n connid TYPE sflight-connid,\n fldate TYPE sflight-fldate,\n END OF ty_flight_map.\n\nDATA : lt_conn TYPE TABLE OF spfli,\n lt_flight_map TYPE HASHED TABLE OF ty_flight_map\n WITH UNIQUE KEY carrid connid.\n\nSELECT * FROM spfli INTO TABLE lt_conn.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights_small).\n\nLOOP AT lt_flights_small INTO DATA(ls_flight).\n  INSERT ls_flight INTO TABLE lt_flight_map.\nENDLOOP.\n\nLOOP AT lt_conn INTO DATA(ls_conn).\n\n  READ TABLE lt_flight_map INTO DATA(ls_match)\n    WITH KEY carrid = ls_conn-carrid\n             connid = ls_conn-connid.\n\n  IF sy-subrc = 0.\n    WRITE : \/ ls_conn-carrid, ls_conn-connid, ls_match-fldate.\n  ENDIF.\n\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Le temps CPU a ainsi pu \u00eatre r\u00e9duit de plus de 71 %.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 5 : modularisation de la logique<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons examin\u00e9 en d\u00e9tail les effets d'un code bien structur\u00e9. Une logique ex\u00e9cut\u00e9e directement dans le programme se d\u00e9roule de mani\u00e8re lin\u00e9aire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace (inline) :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_no_function.\n\nDATA : lv_sum TYPE i VALUE 0,\n lv_i   TYPE i.\n\n\" Calculer la somme des 10 000 premiers nombres\nDO 10000 TIMES.\n  lv_sum = lv_sum + sy-index.\nENDDO.\n\nWRITE : \/ 'Somme des 10 000 premiers nombres :', lv_sum.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons ensuite externalis\u00e9 cette logique de calcul dans un module fonction d\u00e9di\u00e9. Cela permet de r\u00e9duire au minimum les co\u00fbts li\u00e9s \u00e0 la structure du syst\u00e8me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_with_function.\n\nDATA : lv_result TYPE i.\n\nCALL FUNCTION 'ZTHESIS_CALC_SUM'\n  EXPORTING\n    p_limit = 10000\n  IMPORTING\n    p_sum   = lv_result.\n\nWRITE : \/ 'Somme des 10 000 premiers nombres (module de fonction) :', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Le module fonction correspondant :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FONCTION zthesis_calc_sum.\n\n  DATA lv_index TYPE i.\n\n  p_sum = 0.\n\n  DO p_limit TIMES.\n    lv_index = sy-index.\n    p_sum = p_sum + lv_index.\n  ENDDO.\n\nENDFUNCTION.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La version modulaire offrait des performances pratiquement identiques. Son principal avantage r\u00e9side dans une plus grande facilit\u00e9 d'entretien en vue d'adaptations futures.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 6 : Approche proc\u00e9durale vs approche orient\u00e9e objet<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons compar\u00e9 une simple boucle de comptage \u00e0 une approche r\u00e9cursive orient\u00e9e objet afin de mesurer la consommation de ressources li\u00e9e \u00e0 la programmation orient\u00e9e objet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code it\u00e9ratif :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_factorial_iterative.\n\nSTART-OF-SELECTION.\n\nDATA : lv_number TYPE i VALUE 10,\n lv_result TYPE i VALUE 1.\n\nDO lv_number TIMES.\n  lv_result = lv_result * sy-index.\nENDDO.\n\nWRITE: \/ 'Facteur it\u00e9ratif (boucle) de', lv_number, ':', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code orient\u00e9 objet :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_factorial_oop.\n\nCLASS lcl_factorial DEFINITION.\n\n  SECTION PUBLIQUE.\n\n M\u00c9THODES : calculate\n IMPORTANT iv_number TYPE i\n RETOURNANT VALUE(rv_result) TYPE i.\n\nFIN DE CLASSE.\n\nCLASSE lcl_factorial IMPL\u00c9MENTATION.\n\n  M\u00c9THODE calculate.\n\n    IF iv_number calculate( 10 ).\n\nWRITE: \/ 'Facteuriel r\u00e9cursif (POO) de 10 :', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La variante orient\u00e9e objet a consomm\u00e9 environ 22 % de temps CPU en plus et n'est pas rentable sur le plan \u00e9nerg\u00e9tique pour des op\u00e9rations aussi simples. Dans le cas d'architectures de grande envergure, l'avantage de l'\u00e9volutivit\u00e9 l'emporte toutefois \u00e0 long terme.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 7 : \u00c9viter l'utilisation de \u201c SELECT \u201c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Par souci de commodit\u00e9, de nombreux d\u00e9veloppeurs utilisent la commande de base de donn\u00e9es \u201c SELECT * \u201d. Le syst\u00e8me charge alors aveugl\u00e9ment toutes les colonnes d'une table.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_select_star.\n\nSELECT * FROM sflight\n  INTO TABLE @DATA(lt_flights).\n\nLOOP AT lt_flights INTO DATA(ls_flight).\n  WRITE : \/ ls_flight-carrid, ls_flight-connid, ls_flight-fldate.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons adapt\u00e9 le code et n'avons plus interrog\u00e9 explicitement que les trois colonnes n\u00e9cessaires.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_select_fields.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights_reduced).\n\nLOOP AT lt_flights_reduced INTO DATA(ls_flight).\n  WRITE: \/ ls_flight-carrid, ls_flight-connid, ls_flight-fldate.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette r\u00e9duction minime a permis d'\u00e9conomiser plus de 73 % du volume de donn\u00e9es consult\u00e9es.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 8 : Flux de contr\u00f4le clair<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un code propre n\u00e9cessite un d\u00e9roulement clair et pr\u00e9visible. Nous avons analys\u00e9 une boucle comportant de nombreuses conditions d'arr\u00eat dispers\u00e9es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_control_flow.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights).\n\nDATA(lv_found) = abap_false.\n\nLOOP AT lt_flights INTO DATA(ls_flight).\n\n  IF ls_flight-carrid IS INITIAL.\n    CONTINUE.\n  ENDIF.\n\n  IF ls_flight-connid IS INITIAL.\n    CONTINUE.\n  ENDIF.\n\n  IF ls_flight-fldate IS INITIAL.\n    CONTINUE.\n  ENDIF.\n\n  IF ls_flight-carrid = 'XX'.\n    CONTINUE.\n  ELSEIF ls_flight-carrid = 'YY'.\n    CONTINUE.\n  ENDIF.\n\n  IF ls_flight-connid = '9999'.\n    lv_found = abap_true.\n    EXIT.\n  ENDIF.\n\n  WRITE : \/ ls_flight-carrid, ls_flight-connid, ls_flight-fldate.\n\nENDLOOP.\n\nIF lv_found = abap_true.\n  WRITE : \/ 'Connexion sp\u00e9ciale trouv\u00e9e.'.\nENDIF.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans un souci d'optimisation, nous avons regroup\u00e9 les nombreux sauts en une seule instruction de contr\u00f4le claire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_control_flow.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights).\n\nDATA(lv_found) = abap_false.\n\nLOOP AT lt_flights INTO DATA(ls_flight).\n\n  IF ls_flight-carrid IS INITIAL\n OR ls_flight-connid IS INITIAL\n OR ls_flight-fldate IS INITIAL\n OR ls_flight-carrid = 'XX'\n     OU ls_flight-carrid = 'YY'.\n\n CONTINUE.\n\n  ENDIF.\n\n  IF ls_flight-connid = '9999'.\n    lv_found = abap_true.\n    EXIT.\n  ENDIF.\n\n  WRITE : \/ ls_flight-carrid, ls_flight-connid, ls_flight-fldate.\n\nENDLOOP.\n\nIF lv_found = abap_true.\n  WRITE : \/ 'Connexion sp\u00e9ciale trouv\u00e9e.'.\nENDIF.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette modification n'a pratiquement pas eu d'incidence sur la dur\u00e9e d'ex\u00e9cution. En revanche, le code est d\u00e9sormais nettement plus lisible et plus facile \u00e0 comprendre.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Cas n\u00b0 9 : R\u00e9duire l'occupation inutile de la m\u00e9moire<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Certains programmes copient plusieurs fois de grands tableaux de donn\u00e9es dans la m\u00e9moire vive. Ils cr\u00e9ent \u00e9galement d'\u00e9normes tampons de texte.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code inefficace :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_ineff_memory.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights).\n\nDATA(lt_copy1) = lt_flights.\nDATA(lt_copy2) = lt_copy1.\n\nDATA lv_buffer TYPE string.\n\nLOOP AT lt_copy2 INTO DATA(ls_flight).\n\n  CONCATENATE lv_buffer\n ls_flight-carrid\n ls_flight-connid\n ls_flight-fldate\n    INTO lv_buffer\n    SEPARATED BY space.\n\nENDLOOP.\n\nWRITE : \/ lines( lt_copy2 ).<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons trait\u00e9 directement les donn\u00e9es d'origine dans leur version optimis\u00e9e, en \u00e9vitant toute copie interm\u00e9diaire inutile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Code optimis\u00e9 :<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_memory.\n\nSELECT carrid, connid, fldate\n  FROM sflight\n  INTO TABLE @DATA(lt_flights).\n\nDATA lv_count TYPE i.\n\nlv_count = 0.\n\nLOOP AT lt_flights INTO DATA(ls_flight).\n  lv_count = lv_count + 1.\nENDLOOP.\n\nWRITE: \/ lv_count.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Gr\u00e2ce \u00e0 cet acc\u00e8s direct, le temps CPU a diminu\u00e9 de plus de 33 %.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Aper\u00e7u des \u00e9conomies r\u00e9alis\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les r\u00e9sultats des exp\u00e9riences d'optimisation sont parfois tr\u00e8s nets. Le fait de ne plus effectuer de requ\u00eates de base de donn\u00e9es dans les boucles a permis de r\u00e9duire le temps pass\u00e9 sur la base de donn\u00e9es de pr\u00e8s de 99 %. Le temps CPU a quant \u00e0 lui diminu\u00e9 de pr\u00e8s de 94 % lors de ce test sp\u00e9cifique.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le filtrage via une condition \u201e WHERE \u201c a permis de r\u00e9duire de plus de 73 % le volume de donn\u00e9es r\u00e9cup\u00e9r\u00e9es sur le serveur. De m\u00eame, le fait de renoncer \u00e0 la commande pratique \u201e SELECT * \u201c a permis d'\u00e9conomiser plus de 73 % des donn\u00e9es demand\u00e9es. Des tables hach\u00e9es intelligentes ont r\u00e9duit la charge du processeur lors de la comparaison des tables de 71 %, ce qui est consid\u00e9rable.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sur l'ensemble des neuf cas \u00e9tudi\u00e9s, le temps CPU a g\u00e9n\u00e9ralement \u00e9t\u00e9 r\u00e9duit de 20 \u00e0 90 %, ce qui est consid\u00e9rable. Les temps d'acc\u00e8s \u00e0 la base de donn\u00e9es ont \u00e9galement diminu\u00e9 de mani\u00e8re significative, de 30 \u00e0 pr\u00e8s de 99 %. Le tableau 1 pr\u00e9sente un aper\u00e7u complet.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Green ABAP est encore peu connu, mais il s'agit d'une strat\u00e9gie concr\u00e8te visant \u00e0 am\u00e9liorer consid\u00e9rablement l'architecture logicielle. Un code optimis\u00e9 r\u00e9duit consid\u00e9rablement la consommation \u00e9lectrique d'un syst\u00e8me. Il soulage le mat\u00e9riel, diminue les co\u00fbts \u00e9nerg\u00e9tiques de l'entreprise et est b\u00e9n\u00e9fique pour l'environnement. Les \u00e9quipes de d\u00e9veloppeurs doivent se d\u00e9faire de certaines vieilles habitudes. Les requ\u00eates de base de donn\u00e9es doivent \u00eatre strictement regroup\u00e9es et les volumes de donn\u00e9es transf\u00e9r\u00e9s doivent \u00eatre maintenus \u00e0 un niveau aussi bas que possible. Des outils tels que SAP Code Inspector facilitent la mise en \u0153uvre syst\u00e9matique de ces mesures.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Depuis l'introduction de la technologie de base de donn\u00e9es HANA, SAP pr\u00f4ne d'ailleurs le \u00ab code pushdown \u00bb, c'est-\u00e0-dire le transfert syst\u00e9matique des t\u00e2ches de calcul vers le niveau de la base de donn\u00e9es. La programmation durable allie l'excellence technique \u00e0 une contribution importante \u00e0 la protection du climat. Chaque bloc de code optimis\u00e9 apporte ainsi une contribution tangible \u00e0 une technologie de l'information plus verte.<\/p>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"608\" src=\"https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-1200x608.png\" alt=\"\" class=\"wp-image-166920\" srcset=\"https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-1200x608-1.png 1200w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-400x203.png 400w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-766x388.png 766w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-100x51.png 100w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-480x243.png 480w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-640x324.png 640w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-960x486.png 960w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-720x365.png 720w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-1168x592.png 1168w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-18x9.png 18w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1-600x304.png 600w, https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/tabelle1.png 1317w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-element-caption\"><em>Tableau 1 : Aper\u00e7u des \u00e9conomies r\u00e9alis\u00e9es selon les diff\u00e9rents indicateurs<\/em><\/figcaption><\/figure>","protected":false},"excerpt":{"rendered":"<p>Les logiciels consomment de l'\u00e9lectricit\u00e9. Dans les syst\u00e8mes SAP de grande envergure notamment, les lignes de code inefficaces finissent par repr\u00e9senter un gaspillage d'\u00e9nergie colossal. Le concept \u201e Green ABAP \u201c propose des pistes concr\u00e8tes pour mettre en place un environnement syst\u00e8me \u00e0 la fois durable et performant.<\/p>","protected":false},"author":5881,"featured_media":166899,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","footnotes":""},"categories":[5,45071],"tags":[453,45244,45240,45246,45237,45249,45238,45245,45241,45239,65,38402,45248,45242,45250,236,45247,5959,45243,953],"coauthors":[45234,45236,45235],"class_list":["post-166898","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-it-management","category-mag-26-10","tag-abap","tag-clean-code","tag-code-pushdown","tag-code-optimierung","tag-cpu-zeit","tag-datenbankoptimierung","tag-datenbankperformance","tag-energieeffizienz","tag-green-abap","tag-green-it","tag-hana","tag-nachhaltigkeit","tag-performance-optimierung","tag-programmierung","tag-ressourceneffizienz","tag-sap","tag-sap-code-inspector","tag-sap-s4-hana","tag-softwarearchitektur","tag-softwareentwicklung","pmpro-has-access"],"acf":[],"featured_image_urls_v2":{"full":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"thumbnail":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-150x150.jpg",150,150,true],"medium":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-400x180.jpg",400,180,true],"medium_large":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-768x346.jpg",768,346,true],"large":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"image-100":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-100x45.jpg",100,45,true],"image-480":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-480x216.jpg",480,216,true],"image-640":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-640x288.jpg",640,288,true],"image-720":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-720x324.jpg",720,324,true],"image-960":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-960x432.jpg",960,432,true],"image-1168":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"image-1440":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"image-1920":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"1536x1536":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"2048x2048":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"trp-custom-language-flag":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-18x8.jpg",18,8,true],"bricks_large_16x9":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"bricks_large":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"bricks_large_square":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku.jpg",1000,450,false],"bricks_medium":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-600x270.jpg",600,270,true],"bricks_medium_square":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-600x450.jpg",600,450,true],"profile_24":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-24x24.jpg",24,24,true],"profile_48":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-48x48.jpg",48,48,true],"profile_96":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-96x96.jpg",96,96,true],"profile_150":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-150x150.jpg",150,150,true],"profile_300":["https:\/\/e3mag.com\/wp-content\/uploads\/2026\/09\/2610_it_rku-300x300.jpg",300,300,true]},"post_excerpt_stackable_v2":"<p>Software verbraucht Strom. Besonders in riesigen SAP-Systemen summieren sich ineffiziente Codezeilen zu gigantischen Energieverschwendern. Das Konzept \u201eGreen Abap\u201c zeigt konkrete Wege zu einer nachhaltigen und gleichzeitig performanten Systemlandschaft auf.<\/p>\n","category_list_v2":"<a href=\"https:\/\/e3mag.com\/fr\/category\/it-management\/\" rel=\"category tag\">IT-Management<\/a>, <a href=\"https:\/\/e3mag.com\/fr\/category\/mag-26-10\/\" rel=\"category tag\">MAG 26-10<\/a>","author_info_v2":{"name":"Sven Treutler, RKU","url":"https:\/\/e3mag.com\/fr\/author\/sven-treutler\/"},"comments_num_v2":"0 commentaire","_links":{"self":[{"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/posts\/166898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/users\/5881"}],"replies":[{"embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/comments?post=166898"}],"version-history":[{"count":2,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/posts\/166898\/revisions"}],"predecessor-version":[{"id":166925,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/posts\/166898\/revisions\/166925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/media\/166899"}],"wp:attachment":[{"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/media?parent=166898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/categories?post=166898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/tags?post=166898"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/e3mag.com\/fr\/wp-json\/wp\/v2\/coauthors?post=166898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}