🚀PROMO #PLANCARRERA2024 - 🔥Bonificaciones, Precios Congelados y Cuotas

 X 

✒️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

Mejoras a partir de ABAP 7.40.

1.- Mejoras ABAP.

A partir del lanzamiento del sistema SAP Netweaver 7.4, se han implementado una serie de mejoras en el lenguaje de programación ABAP.

Junto con SAP Netwaeaver 7.40 llegó el servidor de aplicaciones ABAP AS ABAP 7.40.

El AS ABAP 7.40 es el sucesor de AS ABAP 7.31 (también conocido como AS ABAP 7.03) que es el sucesor de AS ABAP 7.02 que se basa en AS ABAP 7.0.

Gracias a una mayor orientación hacia las expresiones estas mejoras nos permiten escribir código ABAP más corto y más legible.

En el contexto de desarrollo de ABAP en SAP HANA, Las opciones asociadas con las expresiones hacen posible reducir el código ABAP a la intención esencial.

El paradigma code pushdown puede utilizarse para realizar cálculos dentro de la base de datos y (al usar los componentes contenidos en el ABAP AS) la aplicación puede orquestarse utilizando considerablemente menos código de aplicación.

1.1 Cómo determinamos con cuál versión de BAP estamos trabajando?

Dentro del modo SAP, en el menú Sistema / Status. Luego click en el botón "componentes" (product Versiòn) que se visualiza en la siguiente pantalla.

De la lista de componentes de software instalados, buscamos la versión o realease de los componentes SAP_BASIS y SAP_HANA Netweaver.

1.2 De donde venimos, donde estamos y hacia donde vamos?

A partir de la versión 7.0 ABAP fue orientado a declaraciones.

Supongamos que tenemos la tarea de generar una cadena de caracteres concatenada a partir de un valor de una columna de una tabla interna con algunos contenidos literales, utilizando un método determinado. En ABAP 7.0 se verìa de la siguiente forma.

DATA: ti:carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti-carr.

DATA: wa_carr LIKE LINE OF ti_scarr.

READ TABLE ti_scarr WHIT KEY carrid = 'LH' INTO wa_scarr.

DATA: v_output TYPE string.

CANCATENATE 'Carrier:' wa_scarr-carrname INTO v_output SEPARED BY space.

cl_demo_output=>display( v_output ).

Con la versiòn 7.02 ABAP dio el primer gran paso en la direcciòn de habilitaciòn de la expresiòn. Muchas nuevas funciones incorporadas, expresiones de cadena con operador de concatenación && combinadas con cadenas y la capacidad de escribir.expresiones en muchas posiciones de operandos, abrieron un nuevo ámbito de programación ABAP.

En la versiòn 7.02, la tarea anterior ya se puede escribir de la siguiente manera:

DATA: ti:carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti-carr.

DATA: wa_carr LIKE LINE OF ti_scarr.

READ TABLE ti_scarr WHIT KEY carrid = 'LH' INTO wa_scarr.

cl_demo_output=>display( |-carrier: { wa-scarrname} | ).

Una variable auxiliar y una declaración menos gracias a las llaves en ABAP.

Gracias a las llamadas declaraciones en línea reescribimos el código anterior en 7.40:

DATA: ti:carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti-carr.

READ TABLE ti_scarr WHIT KEY carrid = 'LH' INTO data(wa_scar)r.

cl_demo_output=>display( |-carrier: { wa-scarrname} | ).

El compilador ABAP conoce el tipo de datos necesario para la escritura wa_scarr, por lo tanto, podemos declarar la estructura de línea en una posición.

De nuevo una línea menos. Pero wa_scarr-carname sigue siendo una variable auxiliar. Vayamos un paso más allá usando una expresión de tabla:

DATA: ti:carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti-carr.

READ TABLE ti_scarr WHIT KEY INTO wa_scarr.

cl_demo_output=>display( |-carrier: { ti_scarr[carrid = 'LH']-carrname } | ).

Gracias a los corchetes dentro de las llaves ya no tenemos ninguna instrución READ TABLE más.

1.3 Qué es ABAP 7.5 y cuales son sus fundamentos ?

ABAP continuo evolucionando hasta que en Octubre del año 2015, SAP lanza el servidor de aplicaciones SAP Netweaver AS ABAP 7.5 y con él la nueva versión del lenguaje ABAP 7.5.

Generalidades de ABAP 7.5:

- Es compatible con el servidor de aplicaciones ABAP 7.4.

- Corre con el kernel 7.45

- Solo funciona con sistemas Unicode, es decir al momento de comprobar la sintaxis se verificará que el atributo Unicode este tildado.

- Facilita la explotaciòn de HANA con nuevas optimizaciones sofisticadas centradas en la base de datos.

- Ofrece un modelo de programación ABAP común para aplicaciones transaccionales y analíticas.

- Establece a SAP Fiori como experiencia de usuario de aplicaciones cruzadas.

- Es compatible con la industria 4.0 y los escenarios de big data.

- Moderniza y simplifica aún más el lenguaje ABAP.

- Ofrece una experiencia de desarrollo de primera clase Eclipse.

- Proporciona herramientas de administración de código personalizadas para una actualización y migración simples a SAP S/4 HANA.

2.- Declaraciones en línea (In line Declarations)

Lo primero que hacemos cuando creamos un programa ABAP es escribir las declaraciones de datos. Declaramos las variables al inicio de las subrutinas, los métodos y los programas.

La gran mayoría de las líneas de código que escribimos son solo para estas declaraciones de tipos de datos-

A partir de la versión ABAP 7.4 estas declaraciones de datos pueden evitarse por completo.

El objetivo de las declaraciones en línea es ayudarnos a reducir y optimizar e código que generamos.

"Si bien en algunos casos son realmente muy prácticas y recomendables de utilizar, en otros casos traen como consecuencia que el código ABAP se vuelve muy complejo de seguir, por lo que no se recomienda su uso".

2. Declaraciones con DATA.

antes de ABAP 7.4:

DATA: v_texto TYPE string.

v_texto = 'Hola mundo'.

A partir de ABAP 7.4 se puede hacer en una sola línea:

DATA(v_texto) = 'Hola mundo'.

2.2 Loop AT INTO work area.

Antes de ABAP 7.4.

DATA: ti:carrid 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 7.4 podemos hacer ambos casis en una solo línea.

LOOP AT ti_carrier INTO data(wa_carrier).

ENDLOOP.

2.3 CALL METHOD.

Antes de ABAP 7.4, primero declaramos los atributos que utilizamos luego en la llamada de un método, en dos líneas:

DATA: lo_alv TYPE REF TO cl_salv_table,

lo_exc TYPE REF TO cx_salv_msg,

lt_data TYPE TABLE OF scarr.

TRY.

cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv

CHANGING t_table = lt_data ).

lo_alv->display().

CATCH cx_salv_msg INTO lo_exc.

MESSAGE lo_exc TYPE 'I' DSIPLAY LIKE 'E'.

ENDTRY.

A partir de ABAP podemos hacer ambos pasos en una sola linea.

TRY.

cl_salv_table=>factory( IMPORTING r_salv_table = DATA(lo_alv_inline)

CHANGING t_table = lt_data ).

lo_alv_inline->display().

CATCH cx_salv_msg INTO DATA(lo_exc_inline).

MESSAGE lo_exc_inline TYPE 'I' DSIPLAY LIKE 'E'.

ENDTRY.

2.4 LOOP AT ASSIGNING.

Antes de ABAP 7.4 primero declaramos FIELD_SYMBOL que luego asignamos al momento de realizar un LOOP a una tabla interna, de modo de almacenar cada registro de la tabla, en dos líneas de la siguiente forma:

FIELD-SYMBOLS: <wa_burks> TYPE burks.

LOOP AT ti_burks ASSIGNING <wa_burks>.

ENDLOOP.

A partir de 7.4 podemos hacer ambos pasos en una sola linea:

DATA: ti_burks TYPE STANDARD OF burks.

LOOP AT ti_burks ASSIGNING FIELD-SYMBOL(<wa_burks>).

ENDLOOP.

2.5 READ TABLE ASSIGNING.

Antes de ABAP 7.4 declaramos un FIELD SYMBOL que luego asignamos a l momento de leer un registro de una tabla interna, de modo de almacenar el registro de la tabla en dos líneas:

DATA: ti_matnr TYPE STANDARD TABLE OF matnr,

wa_matnr LIKE LINE OF ti_matnr.

READ TABLE ti_matnr ASSIGNING <wa-matnr> INDEX 3.

A partir de ABAP 7.4.

DATA: ti_matnr TYPE STANDARD TABLE OF matnr.

READ TABLE ti_matnr ASSIGNING field-symbol(<wa-matnr>= INDEX 3.

2.6 SELECT INTO TABLE.

Antes de ABAP 7.4, primero declaramos la tabla interna y luego utilizabamos dicha tabla para almacenar el resultado de un SELECT, en dos líneas de la siguiente forma.

DATA: ti:scarr TYPE TABLE OF scarr.

SELECT * FROM INTO TABLE ti_scarr.

A partir de 7.4 se lo puede hacer en una sola línea.

SELECT * FROM scarr INTO TABLE @data(ti_scarr).

2.7 SELECT SINGLE INTO.

Antes de ABAP 7.4 primero declaramos la variable en donde se va a almacenar el resultado.

DATA: v_carrname LIKE scarr-carrname.

SELECT SINGLE carrname

FROM scarr

INTO v_carrname

WHERE carrid EQ 'AA'.

A parrtir de 7.4 se puede hacer:

SELECT SINGLE carrname

FROM scarr

INTO @DATA(v_carrname)

WHERE carrid EQ 'AA'.

Las declaraciones in line no cambian el alcance de las variables ABAP, por lo tanto no es posible usar el mimo nombre de la variable varias veces en el mismo método. Es recomendable continuar escribiendo las declaraciones al comienzo.

La declaraciones in line es útil para un contexto uso limitado local, aún no se puede usar las declaraciones in line para un resultado INTO o INTO TABLE.

3.- Expresiones con tablas.

- Cuando una línea de la tabla no es encontrada al momento de realizar por ejemplo un READ, entonces se dispara la excepción CX_SY_ITAB_LINE_NOT_FOUND en lugar de cambiar de valor la variable del sistema SY-SUBRC tal como se venía trabajando.

3.1 READ TABLE INDEX.

Antes de ABAP 7.4 para leer un registro puntual de una tabla interna escribíamos el siguiente código:

DATA: ti_carrier TYPE TABLE OF scarr,

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 ABAP7.4 para leer un registro de una tabla interna utilizando campos claves se escribía el siguiente código:

DATA: ti_carrier TYPE TABLE OF scarr WITH KEY carrid,

wa_carrier LIKE LINE OF ti_carrier.

READ TABLE ti_carrier WITH KEY carrid = 'LH' into wa_carrier.

A parir de ABAP 7.4 se puede hacer:

DATA(vl:nombre) = ti_carrier[ carrid = 'LH' ]-carrname.

3.3 Existe el registro ?

Antes de ABAP 7.4 para determinar si existe el registro de una tabla interna podíamos ejecutar el siguiente código.

SELECT *

FROM scarr

INTO TABLE ti_carrier WITH KEY carrid = 'AA' TRASNPORTING NO FIELDS.

IF sy-subrc = 0.

ENDIF.

A partir de ABAP 7.4 podemos ejecutar la siguiente línea de código para realizar exactamente lo mismo.

IF line_exists( ti_carrier [ carrid = 'AA']).

ENDIF.

3.4 Obtenemos el índice de una tabla.

Antes de ABAP 7.4 para determinar el índice de una tabla podíamos ejecutar:

DATA: ti_carr TYPE TABLE OF scarr WITH UNIQUE KEY carrid,

v_index TYPE I.

SELECT *

FROM scarr

INTO TABLE ti_scarr.

READ TABLE ti_scarr WITH TABLE KEY carrid = 'AA'

TRANSPORTING NO FIELDS.

IF sy-subrc = 0.

v_index = sy-tabidx.

ENDIF.

A partir de ABAP 7.4 podemos ejecutar la siguiente línea de código para realizar exactamente lo mismo.

DATA(v_index) = line_index( ti_carrid[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 ellos que SAP recomienda asignar un field symbol y chequear el sy-subrc de la siguiente forma.

ASSIGN ti_tab[ 1 ] to FIELD-SYMBOL().

IF sy-subrc EQ 0.

...

ENDIF.

4.- Expresiones de constructor.

Las expresiones de constructor nos permiten crear e inicializar objetos ABAP, estructuras de datos y referencias de datos por medio de una expresión.

El beneficio de estas expresiones radica en la reducción de las declaraciones necesarias, así como en la compatibilidad con las declaraciones en línea (in line declarations).

Tradicionalmente, los objetos ABAP se pueden crear utilizando la siguiente declaración:

CLASS lcl_reporte DEFINITION.

PUBLIC SECTION.

METHODS:

constructor IMPORTING iv_rec TYPE I,

seleccionar_datos,

imprimir datos.

PRIVATE SECTION.

DATA:v_rec TYPE i.

ENDCLASS.

CLASS lcl_reporte IMPLEMENTATION.

METHOD constructor.

WRITE: / '----------'.

WRITE: / 'Nuevo Objeto', iv_rec.

ENDMETHOD.

METHOD seleccionar_datos.

WRITE : / ' Seleccionando datos: ', v_rec.

ENDMETHOD.

METHOD imprimir_datos.

WRITE : / ' Imprimiendo datos: ', v_rec.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA: lo_reporte TYPE REF TO lcl_reporte.

CREATE OBJECT lo_reporte EXPORTING iv_rec = 5.

A partir de la versión 7.4 se puede crear un objeto con NEW, el cual 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. Por ejemplo podemos realizar la siguiente asignación:

data(o_reporte) = NEW lcl_reporte( 1 ).

Antes de ABAP 7.4 para inicializar los campos de una estuctura o workarea, ejecutábamos el siguiente código:

DATA: ls_carr TYPE scarr.

ls_carr-carrid = 'LH'.

ls_carr-carrname = 'Luftansa'.

A partir de ABAP 7.4, mediante el operador VALUE, utilizamos la expresión de constructor ejecutando la siguiente línea de código para realizar exactamente lo mismo:

ls_carr = VALUE # ( carrid = 'LH' carrname = 'lufthansa').

Uno de los beneficios de 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_carr) = VALUE scarr( carrid = 'LH' carrname = 'lufthansa' ).

También podemos utilizar el operador VALUE para inicializar tablas internas tal como vemos en la siguiente imagen.

DATA: lt_carrier TYPE TABLE OF scarr.

lt_carrier = VALUE # ( ( carrid = 'AA' carrname = 'American Airines' )

( carrid = 'LH' carrname = 'Lufthansa' ) ).

Otro operador muy utilizado es el operador REF, que es una alternativa orientada a la expresión, el cualutilizamos para generar una referencia de datos junto con la sentencia GET REFERENCE. Veamos como utilizar el operador REF junto con las declaraciones en línea:

TRY.

data(lo_result_set) = cl_sql_connection=>get_connection()->execute_query( lv_staement ).

lo_result_set->set_param_table( ref #( lt_result ) ).

lo_resul_set->next_package( ).

lo_result_set->close( ).

CATCH cx_sql_exception INTO data(lo_exc).

ENDTRY.

Además de l os operadores NEW, VALUE, REF, existen muchos más operadores tales como conversiones C0NV o conversiones tipo CAST.

Si necesitamos que un objeto este presente en varios lugares, por ejemplo, no debemos inicializarlo dos veces.

El operador COORRESPONDING.

Muy utilizado cuando trabajamos con estructuras y tablas internas, ha sido optimizado de modo de poder utilizarse en una sola línea tal como veremos a continuación.

Antes de ABAP 7.4, para asignar a una estructura el conenido de otra estructura o workarea, previamente inicializando el contenido de la estructura destino, ejecutábamos el siguiente código:

TYPES: BEGIN OF line1,

col1 TYPE I,

col2 TYPE I,

END OF line1.

TYPES: BEGIN OF line2,

col1 TYPE I,

col2 TYPE I,

col3 TYPE i,

END OF line1.

DATA: wa_linea1 TYPE linea1,

wa_liena2 TYPE linea2.

CLEAR wa:linea2.

MOVE-CORRESPONDING wa_linea1 TO wa_linea2.

A partir de ABAP7.4 podemos ejecutar la siguiente línea de código para realizar exactamente lo mismo.

wa_linea2 = CORRESPONDING # ( wa_linea1 ).

El contenido de wa_linea1 se moverá a wa_linea2 si hay un campo que lleve el mismo nombre y el mismo tipoo de datos. Los campos que no sean iguales o no coincidan entre ambas estructuras serán inicializados.

Antes de ABAP 7.4 para asignar a una estructura el contenido de otra estructura o workarea , sin previamente inicializar el contenido de la estructura destino, ejecutábamos el siguiente código:

MOVE-CORRESPONDING wa_linea1 TO wa_linea2.

A partir de ABAP 7.4 podemos ejecutar la siguiente línea de código para realizar exactamente lo mismo.

wa_linea2 = CORRESPONDING # ( BASE ( wa_linea2 ) wa_linea1).

Esta sentencia utiliza el contenido existente en wa_linea2 como base y sobreescribe las columnas coincidentes de wa_linea1.

funciona exactamente igual a la sentencia MOVE-CORRESPONDING.

DATA(wa_linea3) = CORRESPONDING wa_linea2( BASE( wa_linea2 ) wa_linea1).

Esta sentencia crea una tercera y nueva estructura wa_linea3 que se basa en wa_linea2 pero se sobreescribe con las columnas coincidentes de wa_linea1.

6.- OPERACIONES CON CARACTERES.

Antes de ABAP .7.4, identificábamos las cadenas de caracteres encerrándolas entre comillas simples ''.

DATA_ v_string TYPE string.

v_string = 'Esto es un texto literal'.

WRITE: /(30) v_string.

A paritr de ABAP 7.4 una cadena de caracteres está rodeada por dos "|"

DATA_ v_string TYPE string.

v_string = |Esto es un texto literal|.

WRITE: /(30) v_string.

Dentro de una cadena de caracteres podemos encerrar entre llaves los siguientes objetos y expresiones, de modo que no sean considerados como caracteres.

- Objeto de datos

- Expresiones de Cálculo

- Expresiones de constructores

- Expresiones de tablas.

- Funciones predefinidas-

- Métodos funcionales y encadenamiento de métodos.

Ejemplo:

DATA: v_string TYPE string.

v_stringn = |El código de retorno es: |.

WRITE: /(30) v_string.


La sentencia ABAP CONCATENATE ha sido optimizada:

Antes de ABAPA 7.4:

DATA: vl_output TYPE string.

CONCATENATE 'Hola mundo' INTO vl_output SEPARTED BY space.

Se lo puede hacer todo con una sola línea,

DATA(vl_output) = |Hola| & | | & |Mundo|.


 

 

 


Sobre el autor

Publicación académica de Miguel Angel Acosta Acosta, en su ámbito de estudios para el Máster ABAP for HANA.

SAP Expert


Miguel Angel Acosta Acosta

Profesión: Ingeniero de Sistemas - Ecuador - Legajo: TF64C

✒️Autor de: 238 Publicaciones Académicas

🎓Egresado de los módulos:

Disponibilidad Laboral: FullTime

Presentación:

Profesional de ingeniería de sistemas en computación e informática, con experiencia en la implantación y soporte de proyectos informáticos para empresas del sector industrial y financiero.

Certificación Académica de Miguel Acosta