![](/cvo_files/imgs_sap_abap/logos/logo_cvo_academy_it.png)
✒️ABAP HANA Las mejoras a partir de ABAP 7.40
ABAP HANA Las mejoras a partir de ABAP 7.40
![ABAP HANA Las mejoras a partir de ABAP 7.40 ABAP HANA Las mejoras a partir de ABAP 7.40](https://www.cvosoft.com/cvo_files/imgs_sap_abap/og-images/251.jpg)
Mejoras a partir de ABAP 7.40
Para saber con qué versión estamos trabajando, verificamos los componentes SAP_BASIS Y SAP_ABA.
A partir de la versión 7.0, ABAP fue orientado a declaraciones.
Con la versión 7.02, ABAP dio el primer gran paso en la dirección de habilitación de la expresión.
ABAP 7.4 está más orientado hacia las expresiones.
ABAP 7.5 es compatible con el servidor de aplicaciones ABAP 7.4 y corre con el kernel 7.45. Sólo funciona con sistemas Unicode. Soporta la base de datos HANA y otras bases de datos. Establece a SAP Fiori como experiencia de usuario.
Declaraciones en línea (inline declarations)
El objetivo es reducir y optimizar el código.
Antes de ABAP 7.4 declarábamos y asignábamos una variable en dos líneas. Ahora lo podemos hacer en una sola:
DATA(v_texto) = 'Hola Mundo'.
LOOP AT ti_carrier INTO data(wa_carrier).
LOOP AT ti_bukrs ASSIGNING field-symbol(<wa_bukrs>).
READ TABLE ti_matnr ASSIGNING field-symbol(<wa_matnr>) INDEX 3.
SELECT * FROM scarr INTO TABLE @data(ti_scarr).
SELECT SINGLE carrname FROM scarr WHERE carrid EQ 'AA' INTO @data(v_carrname).
cl_salv_table=>factory( IMPORTING r_salv_table = data(lo_alv_inline)
CHANGING t_table = lt_data ).
No es posible usar el mismo nombre de variable dentro de un mismo scope (sobre todo en métodos).
Las declaraciones inline son sumamente útiles para un contexto limitado y local.
Expresiones con tablas
Cuando una línea de la tabla no es encontrada al momento de realizar por ejemplo un READ, se dispara la excepción
CX_SY_ITAB_LINE_NOT_FOUND en lugar de cambiar el valor del sy-subrc.
- Podemos reemplazar:
READ TABLE ti_carrier INTO wa_carrier INDEX 1.
por:
DATA(wa_carrier) = ti_carrier[ 1 ].
- Podemos reemplazar:
READ TABLE ti_carrier INTO wa_carrier WITH KEY carrid = 'LH'.
por:
DATA(vl_nombre) = ti_carrier[ carrid = 'LH' ]-carrname.
- Para saber si existe un registro, podemos reemplazar:
READ TABLE ti_carrier WITH KEY carrid = 'AA' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
ENDIF.
por:
IF line_exists( ti_carrier[ carrid = 'AA'] ).
ENDIF.
- Para obtener el índice de una tabla, podemos reemplazar:
READ TABLE ti_carrier WITH KEY carrid = 'AA' TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
v_index = sy-tabix.
ENDIF.
por:
DATA(v_index) = line_index( ti_scarr[ carrid = 'AA' ] ).
Se producirá un dump si utilizamos una expresión en línea que haga referencia a un registro que no existe en una tabla
interna. Es por ello que SAP recomienda asignar un field symbol y chequear el SY-SUBRC:
ASSIGN ti_tab[ 1 ] TO field-symbol().
IF sy-subrc = 0.
ENDIF.
Expresiones de constructor
Nos permiten crear e inicializar objetos ABAP, estructuras de datos y referencias de datos por medio de una expresión.
El operador NEW nos permite declarar una instancia de un objeto directamente en línea. Los parámetros para el constructor
son transferidos cuando el método es llamado.
DATA(o_reporte) = NEW lcl_reporte ( 1 ).
El operador VALUE se utiliza para inicializar estructuras o tablas internas.
Podemos reemplazar:
DATA: ls_scarr TYPE scarr.
ls_scarr-carrid = 'LH'.
ls_scarr-carrname = 'Lufthansa'.
por:
ls_scarr = VALUE #( carrid = 'LH' carrname = 'Lufthansa' ).
Uno de los beneficios de la expresión VALUE es que puede combinarse con una declaración en línea. Sin embargo, en este caso deberemos especificar el tipo de dato exacto tal como vemos a continuación:
DATA(ls_scarr) = VALUE scarr( carrid = 'LH' carrname = 'Lufthansa' ).
Para inicializar una tabla interna:
DATA: lt_carrier TYPE TABLE OF scarr.
lt_carrier = VALUE #( ( carrid = 'AA' carrname = 'American Airlines' ) ( carrid = 'LH' carrname = 'Lufthansa' ) ).
El operador REF, que es una alternativa orientada a la expresión, se usa para generar una referencia de datos junto con la sentencia GET REFERENCE. Veamos cómo usar el operador REF junto con las declaraciones en línea:
TRY.
DATA(lo_result_set) = cl_sql_connection=>get_connection()->create_statement()->execute_query( lv_statement ).
lo_result_set->set_param_table( ref #( lt_result ) ).
lo_result_set->next_package().
lo_result_set->close().
CATCH cx_sql_exception INTO data(lo_exc).
ENDTRY.
El operador CORRESPONDING, muy utilizado cuando trabajamos con estructuras y tablas internas, ha sido optimizado. Podemos reemplazar un MOVE-CORRESPONDING por:
wa_line2 = CORRESPONDING #( wa_line1 ).
Operaciones con caracteres
Antes identificábamos a las cadenas de caracteres encerrándolas entre comillas simples. Ahora, va entre pipes. Dentro de una cadena, podemos encerrar entre llaves los siguientes objetos y expresiones: Objetos de datos, expresiones de cálculo, expresiones de constructores, expresiones de tablas, funciones predefinidas, y métodos funcionales y encadenamiento de métodos.
DATA v_string TYPE string.
v_string = |El código de retorno es: { sy-subrc }|.
La sentencia CONCATENATE ha sido optimizada:
DATA(vl_output) = |Hola| & | | & |mundo|.
 
 
 
Sobre el autor
Publicación académica de Sergio Ariel Del Sordo, en su ámbito de estudios para el Máster ABAP for HANA.
Sergio Ariel Del Sordo
Profesión: Analista Programador Abap - Argentina - Legajo: LE26W
✒️Autor de: 13 Publicaciones Académicas
🎓Egresado del módulo:
Presentación:
Soy analista programador universitario y la mayor parte de mi actividad laboral la desarrollé como programador abap. me interesa aprender sobre hana, ya que es lo que se está usando en las empresas.
Certificación Académica de Sergio Del