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.