✒️ABAP HANA Las mejoras a partir de ABAP 7.40
ABAP HANA Las mejoras a partir de ABAP 7.40
1 Mejoras a ABAP
Junto con SAP NetWeaver llegó el ABAP AS 7.40, sucesor de la versión 7.31 (conocida también como 7.03) que a su vez es sucesor de la versión 7.0.
Gracias a una mayor orientación a expresiones se nos permite escribir un código mas corte y legible. Además, el paradigma code-pushdown puede utilizarse para realizar cálculos dentro de la base de datos y la aplicación puede orquestarse utilizando menos código de aplicación.
1.1 ¿Cómo determinamos con cuál versión de ABAP estamos trabajando?
Ingresamos a SAPGUI y nos dirigimos al menú Sistema->Status y después click en el botón Componentes que es el ícono en forma de lupa que se encuentra a la derecha de Produc Version en la sección de SAP System Data. De la lista de componentes instalados, se debe revisar SAP_BASIS y SAP_ABA para conocer la versión de SAP NetWeaver.
1.2 ¿De donde venimos, donde estamos y hacia donde vamos?
Hasta la versión 7.0 ABAP fue orientado a declaraciones. Con la versión 7.02, ABAP dio el primer gran paso en habilitar expresiones. Esto permitió hacer uso de muchas nuevas funciones incorporados, concatenar cadenas con // y poder escribir expresiones en muchas posiciones de operandos lo cual abrió un nuevo ámbito de programación ABAP.
Con la versión 7.4 vamos en la dirección de orientación de la expresión real: mas expresiones y mas posiciones de expresión. Gracias a las llamadas declaraciones en línea es posible escribir el código de nuestros desarrollo dejando que el compilador deduzca el tipo de dato necesario para una estructura por ejemplo de work area en lugar de declararla nosotros. Si deseamos ir mas lejos, es posible eliminar la variable auxiliar y utilizar algo llamado "expresión de tabla" para acceder a los datos que se encuentran dentro de la tabla.
1.3 ¿Qupe es ABAP 7.5 y cuáles son sus fundamentos?
ABAP continuó evolucionando hasta llegar a la versión 7.5 disponible en el ABAP AS 7.5
Generalidades:
- Compatible con el ABAP AS 7.5
- Corre con el kernel 7.45
- Solo funciona con sistemas Unicode. Al comprobarse la sintaxis se verifica que el atributo Unicode este seleccionado.
- Soporta SAP HANA y otras bases de datos.
- Facilita la explotación de HANA con optimizaciones centradas en la base de datos.
- Ofrece un modelo de programación común para aplicaciones transaccionales y analíticas.
- Establece a Fiori como experiencia de usuario de aplicaciones cruzadas.
- Es compatible con la industria 4.0 y los escenarios de BigData.
- Moderniza y simplifica aun mas el lenguaje ABAP.
- Ofrece una experiencia de desarrollo de primera clase en Eclipse.
- Proporciona herramientas de administración de código personalizadas para una actualización y migración simples a SAP S/4hana.
2 Declaraciones en línea (Inline Declarations)
La gran mayoría de líneas de código que escribimos son solo para declaraciones de tipos de daatos. A partir de ABAP 7.4 estas declaraciones pueden evitarse por completo. Las declaraciones en línea implica que el compilador deduce el tipo necesario y el lo asigna.
¿Lo anterior significa que no habrá declaraciones de tipos de datos en ABAP? NO. El objetivo de las declaraciones en línea es ayudarnos a reducir y optimizar el código que generamos.
IMPORTANTE: Hay que ser muy cuidadosos al utilizar estas declaraciones. En ocasiones pueden ser muy prácticas y recomendables pero en otros casos pueden causar que el código se vuelva muy complejo de seguir, CVOSOFT no recomienda su uso.
2.1 Declaraciones con Data
Antes de ABAP 7.4 declarabamos y asignabamos una variable en dos líneas de la siguiente forma:
DATA: v_texto TYPE string.
c_texto = 'Hola mundo'.
A partir de ABAP 7.4 podemos hacer ambos pasos en una sola:
DATA(v_texto) = 'Hola mundo'.
2.2 Loop AT INTO work area
Antes de ABAP 7.4 declarabamos una estructura o work area para recorrer una tabla en un LOOP:
DATA: ti_carrier TYPE TABLE OF scarr WITH KEY carrid,
wa_carrier LIKE LINE OF ti_carrier.
LOOP AT ti_carrier INTO wa_carrier.
ENDLOOP.
A partir de ABAP 7.4 podemos hacerlo así:
LOOP AT ti_carrier INTO data(wa_carrier).
ENDLOOP.
2.3 CALL METHOD
Antes de ABAP 7.4 primero declarabamos los atributos que utilizamos luego en la llamada de un método:
"Declaración de datos
DATA: lo_alv TYPE REF TO cl_salv_table,
lo_exc TYPE REF TO cx_salv_msg,
lo_data TYPE TABLE OF scarr.
TRY
cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv
CHANGING t_table = lt_data ).
"Mostramos ALV
lo_alv->display( ).
CATCH cx_salv_msg INTO lo_exc.
"Mostramos mensaje
ENDTRY.
A partir de ABAP 7.4 podemos hacerlo así:
DATA: lo_data TYPE TABLE OF scarr.
TRY
cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv_inline)
CHANGING t_table = lt_data ).
"Mostramos ALV
lo_alv->display( ).
CATCH cx_salv_msg INTO DATA(lo_exc_inline).
"Mostramos mensaje
ENDTRY.
2.4 LOOP AT ASSIGNING
Antes de ABAP 7.4 primero declarabamos un FielSymbol que luego asignabamos al momento de realizar un LOOP a una tabla interna:
FIELD-SYMBOLS> <wa_bukrs> TYPE bukrs.
LOOP AT t_bukrs ASSIGNING <wa_bukrs>.
ENDLOOP.
A partir de ABAP 7.4:
LOOP AT t_bukrs ASSIGNING FIELD-SYMBOL(<wa_bukrs>).
ENDLOOP.
2.5 READ TABLE ASSIGNING
Antes de ABAP 7.4 primero declarabamos un FielSymbol que luego asignabamos al momento de leer un registro de una tabla interna:
FIELD-SYMBOLS> <wa_matnr> TYPE bukrs.
READ TABLE ti_matnr ASSIGNING <wa_matnr> INDEX 3.
A partir de ABAP 7.4:
READ TABLE ti_matnr ASSIGNING FIELD-SYMBOL(<wa_matnr>) INDEX 3.
2.6 SELECT INTO TABLE
Antes de ABAP 7.4 primero declarabamos una tabla interna y luego utilizabamos dicha tabla para almacenar el resultado de un SELECT:
DATA: ti_scarr TYPE TABLE OF scarr.
SELECT * FROM scarr INTO TABLE ti_scarr.
A partir de ABAP 7.4:
SELECT * FROM scarr INTO TABLE @DATA(ti_scarr).
2.7 SELECT SINGLE INTO
Antes de ABAP 7.4 primer declarabamos las variables donde se van a almacenar los resultados y despues se realizaba la seleccion:
DATA v_carrname LIKE scarr-carrname.
SELECT SINGLE carrname
FROM scarr
INTO v_carrname
WHERE carrid EQ 'AA'.
A partir de ABAP 7.4:
SELECT SINGLE carrname
FROM scarr
INTO @DATA(v_carrname)
WHERE carrid EQ 'AA'.
3 Expresiones con tablas
Hay muchos cambios en este tema. Uno de los mas significativos es que al no encontrase un registro al realizar una búsqueda en una tabla, en un READ por ejemplo, se disparará la excepción CX_SY_ITAB_LINE_NOT_FOUND en lugar de solo cambiar el valor de la variable SY-SUBRC.
3.1 READ TABLE INDEX
Antes de ABAP 7.4 para leer un registro puntual de una tabla interna:
DATA: wa_carrier LIKE LINE OF ti_carrier.
READ TABLE ti_carrier INTO wa_carrier INDEX 1.
A partir de ABAP 7.4:
DATA(wa_carrier) = ti_carrier[ 1 ].
3.2 READ TABLE WITH KEY
Antes de ABAP 7.4 para leer un registro en base a campos clave de una tabla interna:
DATA: wa_carrier LIKE LINE OF ti_carrier.
READ TABLE ti_carrier WITH KEY carrid= 'LH' INTO wa_carrier.
A partir de ABAP 7.4:
DATA(wa_carrier) = ti_carrier[ carrid = 'LH' ].
3.3 ¿Existe el registro?
Antes de ABAP 7.4 para determinar si existe el registro en una tabla hacíamos lo siguiente:
SELECT *
FROM scarrINTO TABLE ti_carrier.
READ TABLE ti_carrier WITH KEY carrid= 'AA' TRANSPORTING NO FIELDS.
IF SY-SUBRC = 0.
ENDIF.
A partir de ABAP 7.4:
IF LINE_EXISTS( ti_carrier[ carrid = 'AA' ] ).
ENDIF.
3.4 Obtenemos el índice de una tabla
Antes de ABAP para determinar el índice de una tabla:
DATA v_idex TYPE I.
READ TABLE ti_scarr WITH TABLE KEY carrid = 'AA' TRANSPORTING NO FIELDS.
IF SY-SUBRC = 0.
v_idex = SY-TABIX.
ENDIF.
A partir de ABAP 7.4:
DATA(v_idex) = LINE_INDEX( ti_scarr[ carrid = 'AA' ] ).
4 Expresiones de constructor
Estas expresiones nos permiten crear e inicializar objetos ABAP, estructuras de datos y referencias de datos por medio de una expresión. El beneficio radica en la reducción de las declaraciones necesarias y su compatibilidad con las declaraciones en línea. Para utilizar expresiones al crear instancias de objetos, hacemos uso del operador NEW y se pasan los paraámetros cuando el método es llamado:
DATA(o_reporte) = NEW lcl_reporte( 1 ).
Además de los objetos, podemos utilizar este tipo de expresiones para inicializar estructuras o tablas internas. En este caso utilizamos el operador VALUE.
Antes de ABAP 7.4:
DATA: ls_carr TYPE scarr.
"Inicializamos campos
ls-carr-carrid = 'LH'.
A partir de ABAP 7.4:
DATA: ls_carr TYPE scarr.
"Inicializamos campos
ls_carr = VALUE #( carrid = 'LH' carrname = 'Lufthansa' ). "El # es como un comodin
La expresión VALUE puede combinarse con declaraciones en línea pero si hacemos eso debemos especificar el tipo de dato exacto, ABAP no lo deducirá por si solo. Veamos un ejemplo:
DATA(ls_carr) = VALUE scarr( carrid = 'LH' carrname = 'Lufthansa' ). "Aqui indicamos el tipo de dato en lugar de #
Tambien podemos utilizar el operador VALUE para inicializar tablas internas:
DATA: ls_carr TYPE TABLE OF scarr.
lt_carrier = VALUE #( ( carrid = 'AA' carrname= 'American Airlines' )
( carrid = 'LH' carrname= 'Lufthansa' ) ).
Otros operadores que se tienen:
- REF para generar una referencia de datos junto con la sentencia GET REFERENCE.
- CONV para conversiones
- CAST para conversiones forzadas
5 El operador CORRESPONDING
Muy utilizado cuando trabajamos con estructuras y tablas internas, ha sido optimizado para poder utilizarse en una sola línea. Antes de ABAP 7.4 para asignar el contenido de una estructura o work area a otra PREVIAMENTE inicializando el contenido de la estructura destirno era necesario:
DATA: wa_line1 TYPE line1,
wa_line2 TYPE line2.
CLEAR wa_line2.
MOVE-CORRESPONDING wa_line1 TO wa_line2.
A partir de ABAP 7.4 podemos hacer lo siguiente y se moveran los campos con el mismo nombre y los campos que no coincidan seran inicializados:
wa_line2 = CORRESPONDING #( wa_line1 ).
Antes de ABAP 7.4 para asignar contenido de una estructura a otra sin inicializar su contenido realizabamos:
MOVE-CORRESPONDING wa_line1 TO wa_line2.
A partir de ABAP 7.4 podemos hacer lo siguiente (es el equivalente a lo que antes hacia el MOVE-CORRESPONDING):
wa_line2 = CORRESPONDING #( BASE ( wa_line2 ) wa_line1 ).
Antes de ABAP 7.4, si teniamos tres estructuras para asignar a una estructura el contenido de otra sin inicializar el contenido de la estructura destino:
DATA: wa_line3 LIKE wa_line2.
MOVE-CORRESPONDING wa_line1 TO wa_line2.
A partir de ABAP 7.4:
DATA(wa_line3) = CORRESPONDING line2( BASE (wa_line2 ) wa_line1 ).
6 Operaciones con caracteres
Antes de ABAP 7.4 se utilizaban comillas simples para cadenas:
v_string = 'Esto es un string.'.
A partir de ABAP 7.4 se utilizan PIPES:
v_string = |Esto es un string|.
Dentro de una cadena de caracteres podemos encerrar entre llaves {} los siguientes objetos y expresiones y que no se consideren caracteres:
- Objetos de datos
- Expresiones de cálculo
- Expresiones de constructores
- Expresiones de tablas
- Funciones predefinidas
- Métodos funcionales y encadenamiento de métodos
Veamos un ejemplo de lo anterior (se observa que no utilizamos CONCATENATE):
v_string = |El codigo de retorno es { SY-SUBRC }.
Por otra parte, la sentencia CONCATENATE también fue optimizada y ahora se puede concatenar directamente con &. Lo que antes era:
DATA: vl_out TYPE string.
CONCATENATE 'Hola' 'Mundo' INTO vl_out SEPARATED BY SPACE.
En ABAP 7.4 es:
DATA(cl_out) = |Hola| & | | & |Mundo|.
TIPS:
- Las declaraciones en línea no cambian el alcance de las variables por lo que no es posible utilizar el mismo nombre de variable varias veces dentro de un metodo. Es recomendable declarar al inicio de un método las variables que vayamos a utilizar en varios lugares. Las declaracione en línea son muy útiles en contextos de uso limitado y local. Cabe señalar que no pueden utilizarse en cualquier situación.
- Se producirá un DUMP (Error en tiempo de ejecución) si utilizamos una expresión en línea que haga referencia a un registro que no existe en una tabla interna. Por ello SAP recomienda asignar un FIELD SYMBOL y revisar el SY-SUBRC.
- Al utilizar expresiones de constructor no debemos pasar por alto consideraciones tales como que si ocupamos que un objeto este presente en varios lugares no lo estemos inicializando varias veces.
 
 
 
Agradecimiento:
Ha agradecido este aporte: Jesús Quiñonez López
Sobre el autor
Publicación académica de Abraham Humberto Noriega Cabrera, en su ámbito de estudios para el Máster ABAP for HANA.
Abraham Humberto Noriega Cabrera
Profesión: Ingeniero Sistemas Computacionales - Mexico - Legajo: WO62V
✒️Autor de: 14 Publicaciones Académicas
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime
Presentación:
Ingeniero en sistemas computacionales con experiencia en análisis, desarrollo e implementación de sistemas. he tenido el gusto de participar en implementaciones tanto locales como a nivel estatal.
Certificación Académica de Abraham Noriega