{"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-para-el-mundo-de-sap","status":"publish","type":"post","link":"https:\/\/e3mag.com\/es\/green-abap-fuer-die-sap-welt\/","title":{"rendered":"Green Abap para el mundo SAP"},"content":{"rendered":"<p class=\"wp-block-paragraph\">Todo sistema digital necesita energ\u00eda para funcionar. Aunque el hardware es cada vez m\u00e1s eficiente, el software ineficiente sigue obligando a los servidores a alcanzar niveles de rendimiento m\u00e1ximos innecesarios. Las grandes empresas suelen gestionar sus procesos de negocio con complejos sistemas SAP. El lenguaje de programaci\u00f3n ABAP constituye el n\u00facleo de estas aplicaciones. Antes, los desarrolladores sol\u00edan escribir c\u00f3digo ABAP centr\u00e1ndose \u00fanicamente en la funcionalidad. Hoy en d\u00eda, merece la pena prestar atenci\u00f3n tambi\u00e9n al consumo energ\u00e9tico. Y es que un c\u00f3digo deficiente aumenta artificialmente el consumo de electricidad.<\/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 y Clean Code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aqu\u00ed es donde entra en juego el enfoque \u201eGreen ABAP\u201c. Este m\u00e9todo vincula directamente los objetivos de sostenibilidad con el desarrollo de software. El \u201ec\u00f3digo limpio\u201c desempe\u00f1a un papel fundamental en este sentido. Este t\u00e9rmino se refiere a un c\u00f3digo f\u00e1cil de leer y de mantener. El c\u00f3digo limpio reduce los errores y simplifica las optimizaciones posteriores en la programaci\u00f3n. Un c\u00f3digo f\u00e1cil de leer evita la deuda t\u00e9cnica, ahorra recursos de hardware a largo plazo y contribuye a alcanzar los objetivos clim\u00e1ticos.<\/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\">As\u00ed se realiz\u00f3 la prueba: la metodolog\u00eda<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Hemos analizado el consumo energ\u00e9tico del c\u00f3digo ABAP mediante un an\u00e1lisis emp\u00edrico. Las pruebas se llevaron a cabo en un entorno SAP S\/4 HANA estandarizado, dentro de un sistema de formaci\u00f3n. El SAP Workload Monitor (ST03N) registr\u00f3 con precisi\u00f3n los valores de rendimiento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para ello, comparamos siempre los programas antiguos e ineficientes con versiones optimizadas. La comparaci\u00f3n se basa en cuatro par\u00e1metros importantes: el tiempo de CPU, el tiempo de respuesta de la base de datos, el tiempo de respuesta total y el volumen de datos solicitado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cada prueba se realiz\u00f3 exactamente diez veces para evitar fluctuaciones aleatorias en los valores medidos. En un sistema SAP no es f\u00e1cil medir el consumo el\u00e9ctrico directo en julios. Sin embargo, los tiempos de CPU y de base de datos obtenidos se consideran, en general, indicadores fiables del consumo energ\u00e9tico. Cuanto menos tiempo de c\u00e1lculo necesite un programa, menos electricidad consumir\u00e1 el servidor. Se analizaron nueve casos t\u00edpicos de programaci\u00f3n, cuyos resultados y ejemplos de c\u00f3digo correspondientes se presentan a continuaci\u00f3n.<\/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\">Caso 1: Evitar consultas a la base de datos en bucles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Identificamos que las consultas repetidas a la base de datos supon\u00edan un grave problema de rendimiento. La versi\u00f3n ineficiente lee los registros de la base de datos l\u00ednea por l\u00ednea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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\" Cargar todos los registros de vuelos\nSELECT * FROM sflight INTO TABLE lt_flights.\n\n\" Ineficiente: SELECT dentro del bucle\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\">Para optimizar el proceso, todos los datos se cargan previamente en la memoria RAM. A continuaci\u00f3n, el programa utiliza tablas internas de acceso r\u00e1pido para la comparaci\u00f3n de datos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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\" Cargar ambas tablas una vez\nSELECT * FROM sflight INTO TABLE lt_flights.\nSELECT * FROM scarr INTO TABLE lt_scarr.\n\n\" Eficiente: b\u00fasqueda en memoria\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\">Gracias a esta optimizaci\u00f3n, el tiempo de la base de datos se redujo en casi un 99 por ciento.<\/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\">Caso 2: Eliminaci\u00f3n ineficaz de duplicados<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Probamos el comando ABAP para eliminar duplicados. Si no se ordenan previamente los datos, el sistema solo elimina los duplicados que est\u00e1n uno al lado del otro.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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\"No se ordena antes de eliminar los duplicados\u00bb\nELIMINA LOS DUPLICADOS ADYACENTES DE lt_data\n  COMPARANDO carrid y 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\">En la versi\u00f3n optimizada, hemos a\u00f1adido una sencilla instrucci\u00f3n de ordenaci\u00f3n antes de la eliminaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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\"Eficiente: ordenar antes de eliminar duplicados\u00bb\nSORT lt_data BY carrid connid.\n\nELIMINAR DUPLICADOS ADYACENTES DE lt_data\n  COMPARANDO carrid y connid.\n\nBUCLE POR lt_data EN ls_data.\n  ESCRIBIR: \/ ls_data-carrid, ls_data-connid.\nFIN DEL BUCLE.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Este peque\u00f1o ajuste mejor\u00f3 el tiempo de respuesta del sistema en casi un 47 %. De este modo, el sistema compara las entradas de forma mucho m\u00e1s eficiente.<\/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\">Caso 3: Reducir dr\u00e1sticamente el volumen de datos en el origen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Analizamos el comportamiento de las consultas a bases de datos sin filtrar. La versi\u00f3n ineficiente carga sin m\u00e1s toda la tabla de datos en la memoria.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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  \" procesar todos los vuelos, incluso cuando no sea necesario\n  WRITE: \/ ls_flight-carrid, ls_flight-connid.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para optimizar el proceso, trasladamos directamente el filtrado al nivel de la base de datos mediante el uso de una condici\u00f3n \u201cWHERE\u201d espec\u00edfica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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  \" procesar solo los vuelos relevantes\n  WRITE: \/ ls_flight-carrid, ls_flight-connid.\nENDLOOP.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">De este modo, el volumen de datos consultados se redujo inmediatamente en m\u00e1s del 73 por ciento.<\/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\">Caso 4: Comparar tablas de forma inteligente<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los bucles anidados suelen provocar tiempos de c\u00e1lculo exponenciales cuando se trabaja con grandes vol\u00famenes de datos. Hemos comparado este enfoque con el uso de tablas de claves eficientes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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\">Convertimos la segunda tabla en una \u201ctabla hash\u201d para optimizarla, de modo que el programa encuentre las entradas correspondientes sin necesidad de realizar b\u00fasquedas extensas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_opt_hashed_lookup.\n\nTIPOS: COMIENZO DE ty_flight_map,\n carrid TIPO sflight-carrid,\n connid TIPO sflight-connid,\n fldate TIPO sflight-fldate,\n FIN DE ty_flight_map.\n\nDATOS: lt_conn TIPO TABLA DE spfli,\n lt_flight_map TIPO TABLA HASH DE ty_flight_map\n CON CLAVE \u00daNICA carrid connid.\n\nSELECT * FROM spfli INTO TABLA 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\">De este modo, se logr\u00f3 reducir el tiempo de CPU en m\u00e1s del 71 por ciento.<\/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\">Caso 5: Modularizaci\u00f3n de la l\u00f3gica<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Analizamos en detalle los efectos de un c\u00f3digo bien estructurado. Una l\u00f3gica que se ejecuta directamente en el programa se desarrolla de forma lineal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente (en l\u00ednea):<\/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\" Calcular la suma de los primeros 10.000 n\u00fameros\nDO 10000 TIMES.\n  lv_sum = lv_sum + sy-index.\nENDDO.\n\nWRITE: \/ 'Suma de los primeros 10 000 n\u00fameros:', lv_sum.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, externalizamos esta l\u00f3gica de c\u00e1lculo a un m\u00f3dulo de funciones independiente. Esto genera unos costes de estructura m\u00ednimos en el sistema.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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  EXPORTANDO\n    p_limit = 10000\n  IMPORTANDO\n    p_sum   = lv_result.\n\nESCRIBE: \/ 'Suma de los primeros 10 000 n\u00fameros (m\u00f3dulo de funci\u00f3n):', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>El m\u00f3dulo de funciones correspondiente:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FUNCI\u00d3N 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 versi\u00f3n modular ofreci\u00f3 unos valores de rendimiento pr\u00e1cticamente id\u00e9nticos. La gran ventaja en este caso radica en la mayor facilidad de mantenimiento de cara a futuras adaptaciones.<\/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\">Caso 6: Programaci\u00f3n procedimental frente a programaci\u00f3n orientada a objetos<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Comparamos un bucle de recuento sencillo con un enfoque recursivo orientado a objetos para medir el consumo de recursos que supone la programaci\u00f3n orientada a objetos.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo iterativo:<\/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: \/ 'Factorial iterativo (bucle) de', lv_number, ':', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo orientado a objetos:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zthesis_factorial_oop.\n\nCLASS lcl_factorial DEFINITION.\n\n  SECCI\u00d3N P\u00daBLICA.\n\n M\u00c9TODOS: calculate\n IMPORTANDO iv_number TIPO i\n DEVOLVIENDO VALOR(rv_result) TIPO i.\n\nFIN DE CLASE.\n\nCLASE lcl_factorial IMPLEMENTACI\u00d3N.\n\n  M\u00c9TODO calculate.\n\n    IF iv_number calculate( 10 ).\n\nWRITE: \/ 'Factorial recursivo (OOP) de 10:', lv_result.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La variante orientada a objetos consumi\u00f3 aproximadamente un 22 % m\u00e1s de tiempo de CPU y, en operaciones tan sencillas, no resulta rentable desde el punto de vista energ\u00e9tico. Sin embargo, en arquitecturas de gran tama\u00f1o, a largo plazo prevalece la ventaja de la escalabilidad.<\/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\">Caso 7: C\u00f3mo evitar el uso de \u201cSELECT \u201c<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Muchos desarrolladores y desarrolladoras utilizan, por comodidad, el comando de base de datos \u201cSELECT *\u201d. Al hacerlo, el sistema carga sin distinci\u00f3n todas las columnas de una tabla.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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\">Adaptamos el c\u00f3digo y pasamos a consultar expl\u00edcitamente solo las tres columnas necesarias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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\">Esta reducci\u00f3n m\u00ednima permiti\u00f3 ahorrar m\u00e1s del 73 % del volumen de datos consultado.<\/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\">Caso 8: Flujo de control claro<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Un c\u00f3digo limpio requiere un flujo claro y predecible. Analizamos un bucle con muchas condiciones de salida repartidas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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: \/ 'Se ha encontrado una conexi\u00f3n especial.'.\nENDIF.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Para optimizar el c\u00f3digo, agrupamos los numerosos saltos en una \u00fanica consulta de control clara.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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     O 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: \/ 'Se ha encontrado una conexi\u00f3n especial.'.\nENDIF.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">El tiempo de ejecuci\u00f3n apenas se vio afectado por esta medida. Sin embargo, ahora el c\u00f3digo es mucho m\u00e1s legible y f\u00e1cil de entender.<\/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\">Caso 9: Reducir el uso innecesario de memoria<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Algunos programas copian varias veces tablas de datos de gran tama\u00f1o en la memoria RAM. Adem\u00e1s, crean enormes b\u00faferes de texto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo ineficiente:<\/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\">Procesamos los datos originales directamente en la versi\u00f3n optimizada y prescindimos de copias intermedias innecesarias.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>C\u00f3digo optimizado:<\/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\">Gracias a este acceso directo, el tiempo de CPU se redujo en m\u00e1s del 33 por ciento.<\/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\">Resumen de los ahorros<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Los resultados de los experimentos de optimizaci\u00f3n son, en algunos casos, evidentes. Al evitar las consultas a la base de datos en los bucles, el tiempo de consulta a la base de datos se redujo en casi un 99 por ciento. En esta prueba concreta, el tiempo de CPU se redujo en casi un 94 por ciento.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">El filtrado mediante la condici\u00f3n \u201eWHERE\u201c redujo el volumen de datos recuperados del servidor en m\u00e1s del 73 por ciento. Adem\u00e1s, prescindir del c\u00f3modo \u201eSELECT *\u201c supuso un ahorro de m\u00e1s del 73 % de los datos solicitados. Unas ingeniosas tablas hash redujeron la carga de la CPU al comparar tablas en un notable 71 %.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En los nueve casos analizados, el tiempo de CPU se redujo en la mayor\u00eda de los casos en un notable porcentaje, que oscil\u00f3 entre el 20 % y el 90 %. Los tiempos de la base de datos tambi\u00e9n se redujeron de forma considerable, entre un 30 % y casi un 99 %. En la tabla 1 se muestra un resumen completo.<\/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\">Conclusi\u00f3n:\u2009<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Green ABAP a\u00fan no ha recibido mucha atenci\u00f3n, pero es una estrategia s\u00f3lida para lograr una arquitectura de software mucho mejor. Un c\u00f3digo optimizado reduce dr\u00e1sticamente el consumo el\u00e9ctrico de un sistema. Alivia la carga del hardware, reduce los costes energ\u00e9ticos de la empresa y es beneficioso para el medio ambiente. Los equipos de desarrollo deben abandonar algunos viejos h\u00e1bitos. Las consultas a bases de datos deben agruparse de forma estricta y el volumen de datos transmitidos debe reducirse de forma espec\u00edfica. Herramientas como SAP Code Inspector ayudan a llevar a cabo esta implementaci\u00f3n de forma sistem\u00e1tica.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Desde la introducci\u00f3n de la tecnolog\u00eda de bases de datos HANA, SAP ya viene promoviendo el \u00abcode pushdown\u00bb, es decir, la externalizaci\u00f3n sistem\u00e1tica de tareas de c\u00e1lculo al nivel de la base de datos. La programaci\u00f3n sostenible combina la excelencia t\u00e9cnica con una importante contribuci\u00f3n a la protecci\u00f3n del clima. Cada bloque de c\u00f3digo optimizado contribuye as\u00ed de forma notable a una tecnolog\u00eda de la informaci\u00f3n m\u00e1s ecol\u00f3gica.<\/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>Tabla 1: Resumen de los ahorros seg\u00fan los distintos indicadores<\/em><\/figcaption><\/figure>","protected":false},"excerpt":{"rendered":"<p>El software consume electricidad. Especialmente en los grandes sistemas SAP, las l\u00edneas de c\u00f3digo ineficientes se acumulan y se convierten en enormes fuentes de desperdicio energ\u00e9tico. El concepto \u201eGreen ABAP\u201c ofrece soluciones concretas para lograr un entorno de sistemas sostenible y, al mismo tiempo, de alto rendimiento.<\/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\/es\/category\/it-management\/\" rel=\"category tag\">IT-Management<\/a>, <a href=\"https:\/\/e3mag.com\/es\/category\/mag-26-10\/\" rel=\"category tag\">MAG 26-10<\/a>","author_info_v2":{"name":"Sven Treutler, RKU","url":"https:\/\/e3mag.com\/es\/author\/sven-treutler\/"},"comments_num_v2":"0 comentarios","_links":{"self":[{"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/posts\/166898","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/users\/5881"}],"replies":[{"embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/comments?post=166898"}],"version-history":[{"count":2,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/posts\/166898\/revisions"}],"predecessor-version":[{"id":166925,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/posts\/166898\/revisions\/166925"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/media\/166899"}],"wp:attachment":[{"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/media?parent=166898"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/categories?post=166898"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/tags?post=166898"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/e3mag.com\/es\/wp-json\/wp\/v2\/coauthors?post=166898"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}