Doce cambios de sintaxis ABAP que ahorran líneas (y errores)

Desde ABAP 7.40 el lenguaje ha cambiado más que en los quince años anteriores. Todo lo de este artículo funciona en cualquier ECC con 7.40 SP08 o superior y en S/4HANA, así que no hace falta esperar a una migración para usarlo.

1. Declaración en línea

" Antes
DATA lv_count TYPE i.
lv_count = lines( lt_items ).
" Ahora
DATA(lv_count) = lines( lt_items ).

2. Field-symbols en línea

LOOP AT lt_items ASSIGNING FIELD-SYMBOL(<ls_item>).
  <ls_item>-status = 'X'.
ENDLOOP.

3. NEW en lugar de CREATE OBJECT

DATA(lo_app) = NEW lcl_app( iv_bukrs = p_bukrs ).

4. Llenar tablas con VALUE

DATA(lt_range) = VALUE tt_matnr_range( sign = 'I' option = 'EQ'
                                       ( low = 'MAT-001' )
                                       ( low = 'MAT-002' ) ).

5. Leer una línea con expresión de tabla

" Lanza CX_SY_ITAB_LINE_NOT_FOUND si no existe
DATA(ls_mat) = lt_materials[ matnr = lv_matnr ].
" Sin excepción: valor inicial si no existe
DATA(lv_text) = VALUE #( lt_materials[ matnr = lv_matnr ]-maktx OPTIONAL ).

6. Comprobar si existe

IF line_exists( lt_materials[ matnr = lv_matnr ] ).

7. Transformar una tabla con FOR

DATA(lt_matnr) = VALUE string_table( FOR ls_m IN lt_materials WHERE ( mtart = 'FERT' )
                                     ( CONV #( ls_m-matnr ) ) ).

8. Acumular con REDUCE

DATA(lv_total) = REDUCE netwr( INIT s = CONV netwr( 0 )
                               FOR ls_pos IN lt_positions
                               NEXT s = s + ls_pos-netwr ).

9. COND y SWITCH en lugar de IF para asignar

DATA(lv_icon) = COND icon_d( WHEN lv_stock > 100 THEN icon_green_light
                             WHEN lv_stock > 0   THEN icon_yellow_light
                             ELSE icon_red_light ).

10. CORRESPONDING con mapeo

ls_out = CORRESPONDING #( ls_vbak MAPPING customer = kunnr
                                          order    = vbeln
                                  EXCEPT  ernam ).

11. String templates

lv_msg = |Pedido { lv_ebeln ALPHA = OUT } de { lv_date DATE = USER }: { lv_amount NUMBER = USER } €|.

Las opciones de formato (ALPHA, DATE, NUMBER, WIDTH, ALIGN) sustituyen a varias llamadas a módulos de conversión.

12. SQL estricto

SELECT FROM vbak
  FIELDS vbeln, kunnr, netwr,
         CASE WHEN netwr > 10000 THEN 'A' ELSE 'B' END AS class
  WHERE erdat >= @lv_from
  ORDER BY netwr DESCENDING
  INTO TABLE @DATA(lt_orders)
  UP TO 100 ROWS.

Las comas entre campos y la @ delante de las variables ABAP activan la sintaxis estricta, que es la que permite expresiones (CASE, CAST, funciones de cadena y fecha), declaración en línea del destino y FIELDS después de FROM, que hace que el autocompletado de ADT funcione.

Lo que no conviene hacer

La sintaxis nueva permite escribir un programa entero en una sola expresión de veinte líneas. No es buena idea. Un VALUE con un FOR anidado dentro de un REDUCE es difícil de depurar porque el depurador lo trata como una sola sentencia. Si una expresión no se entiende de un vistazo, un LOOP clásico con un par de variables auxiliares es mejor código.

Todas estas equivalencias, y las de RAP y ABAP Cloud, están en la chuleta de ABAP moderno en PDF. Y si quieres modernizar un programa entero, CleanCore Check aplica automáticamente los cambios seguros.