PROMO JULIO en CVOSOFT United States Of America: 💎Calidad, 🔥Bonificaciones, 🥶Precios Congelados y MÁS!

 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

Lección 1: Mejoras a partir de ABAP 7.40

1.- Mejoras a ABAP 7.40

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

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

1.1 – Como determinamos la versión de ABAP con la que estamos trabajando?

Para saber si estamos trabajando con ABAP 7.4 o superior, debemos ingresar a un modo SAP e ir a Menú, Sistema / Status y clicar en el botón Componentes / Product Versión.

De la lista de componentes, buscamos la versión de los componentes SAP_BASIS y SAP_ABA.

De dónde venimos, donde estamos y hacia dónde vamos?

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.

En Abap 7,0 seria así:

DATA: ti_carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti_carr.

DATA: wa_scarr LIKE LINE OF ti_carr.

READ TABLE ti_scarr WITH KEY carrid = ‘LH’ INTO wa_scarr.

DATA: v_output TYPE string.

CONCATENATE ‘Carrier:’ wa_scarr-carrname INTO v_output SEPARATED BY space.

Cl_demo_output=>display(v_output).

Con la versión 7.02 ABAP dio un gran paso en la dirección de habilitación de la expresión. 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.

En la version 7.02

DATA: ti_carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti_carr.

DATA: wa_scarr LIKE LINE OF ti_carr.

READ TABLE ti_scarr WITH KEY carrid = ‘LH’ INTO wa_scarr.

Cl_demo_output=>display( |Carrier: { wa_scarr-carrname }| ).

En la version 7.40

DATA: ti_carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti_carr.

READ TABLE ti_scarr WITH KEY carrid = ‘LH’ INTO DATA(wa_scarr).

Cl_demo_output=>display( |Carrier: { wa_scarr-carrname }| ).

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

Hemos efectuado una línea menos. Pero wa_scarr_carrname sigue siendo una variable auxiliar. Si utilizamos una expresión de tabla:

DATA: ti_carr TYPE TABLE OF scarr.

SELECT * FROM scarr INTO TABLE ti_carr.

Cl_demo_output=>display( |Carrier: { ti_scarr[ carrid = ‘LH’ ]-carrname }| ).

Qué es ABAP 7.50 y cuáles son sus fundamentos?

En 2015 SAP lanza el servidor de aplicaciones SAP NetWeaver AS ABAP 7.5 y la nueva versión del lenguaje ABAP 7.5.

· Corre con el Kernel 7.45.

· Soporta la base de datos SAP HANA y otras BD.

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

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

· Ofrece una experiencia de desarrollo de primera clase en Eclipse.

2.- Declaraciones en línea. (Inline Declarations)

Lo primero que solemos hacer al crear un programa ABAP es escribir las declaraciones de datos. Declaramos las variables el inicio de las subrutinas, los métodos y los programas.

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 el código de generamos.

2.1 – Declaraciones con DATA

Antes de ABAP 7.4 declarábamos y asignábamos una variable es dos líneas de la siguiente forma:

DATA: v_texto TYPE string.

V_texto = ‘hola mundo’.

A partir de ABAP 7.4 podemos hacerlo en una sola línea:

DATA(v_texto) = ‘hola mundo’.

2.2 – Loop AT INTO work área.

Antes de ABAP 7.4 declarábamos una estructura o también llamada Work área para recorrer una tabla en un LOOP en dos líneas:

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:

LOOP AT ti_carrier INTO data(wa_carrier).

ENDLOOP.

2.3 – CALL METHOD

Antes de ABAP 7.4 declarábamos los atributos que utilizábamos luego en la llamada a un método en dos líneas:

“Declaración de datos sin declaración en línea.

DATA: lo_alv TYPE REF TO cl_salv_table,

lo_exc TYPE REF TO cx_salv_msg,

lt_data TYPE TABLE OF scarr.


TRY.

“Generamos la tabla del ALV

cl_salv_table=>factory( IMPORTING r_salv_table = lo_alv

CHANGING t_table = lt_data ).

“Mostramos el ALV

lo_alv->display().

CATCH cx_salv_msg INTO lo_exc.

MESSAGE lo_exc TYPE ‘I’ DISPLAY LIKE ‘E’.

ENDTRY.

A partir de ABAP 7.4

TRY.

“Generamos la tabla del ALV

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

CHANGING t_table = lt_data ).

“Mostramos el ALV

lo_alv_inline->display().

CATCH cx_salv_msg INTO data(lo_exc_inline).

MESSAGE lo_exc TYPE ‘I’ DISPLAY LIKE ‘E’.

ENDTRY.

2.4 – LOOP AT ASSIGNING

Antes de ABAP 7,4 declarábamos un 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:

FIELD-SYMBOLS: <wa_bukrs> TYPE bukrs.

LOOP AT ti_bukrs ASSIGNING <wa_bukrs>.

ENDLOOP.

A partir de ABAP 7.4

DATA: ti_bukrs TYPE STANDAR TABLE OF bukrs.

LOOP AT ti_bukrs ASSINING field-symbol(<wa_bukrs>).

ENDLOOP.

2.5 – READ TABLE ASSINING

Antes de ABAP 7.4 primero declarábamos un FIELD SYMBOL que luego asignábamos al momento de leer un registro de una tabla interna.

DATA: ti_matnr TYPE STANDARD TABLE OF matnr.

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 declarábamos una tabla interna y luego utilizábamos dicha tabla para almacenar el resultado de un SELECT:

DATA: ti_carr 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 al momento de realizar un SELECT SINGLE INTO, primero declarábamos las variables en donde se van a almacenar los resultados obtenidos en la selección y luego realizamos la selección:

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

WHERE carrid EQ ‘AA’

INTO @data(v_carrname)

NOTA: Las declaraciones en línea no cambian el alcance de las variables ABAP. Por lo cual no es posible usar el mismo nombre de variable varias veces dentro de un método.

Es recomendable continuar definiendo al comienzo de una implementación de un método las variables que deseamos utilizar en varios lugares dentro de un método extenso.

Las declaraciones en línea son sumamente útiles para las variables con un contexto de uso limitado y local.

Las declaraciones no pueden utilizarse en todas las situaciones. En particular no es posible todavía utilizar una declaración en línea para definir el resultado de un SELECT INTO o INTO TABLE.

3.- Expresiones con Tablas

En lo que se refiere al manejo de tablas, los cambios a partir de ABAP 7.4 son muchos.

Uno de los más significativos hace referencia a que 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 el valor de la variable del sistema SY-SUBRC tal como se hacía hasta ahora.

3.1 – READ TABLE INDEX

Antes de ABAP 7.4 para leer un registro puntual de una tabla interna:

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 ABAP 7.4 para leer un registro de una tabla interna utilizando campos claves escribíamos:

DATA: ti_carrier TYPE TABLE OF scarr WITH KEY carrid,

wa_carrier LIKE LINE OF lt_carrier.

READ TABLE ti_carrier WITH KEY carrid = ‘LH’ INTO wa_carrier.

A partir de ABAP 7.4

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.

READ TABLE ti_carrier WITH KEY carrid = ‘AA’ TRANSPORTING NO FIELDS.

IF sy-subrc = 0.

ENDDIF.

A partir de ABAP 7.4

IF line_exist( 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 interna:

DATA: ti_scarr TYPE SORTED TABLE OF scarr WITH UNIQUE KEY carrid,

v_idex TYPE i.

SELECT *

FROM scarr

INTO TABLE ti_scarr.

READ TABLE ti_scarr WITH TABLE KEY carrid = ‘AA

TRANSPORTING NO FIELDS.

IF sy-subrx = 0.

v_idex = sy-tabix.

ENDIF.

A partir de ABAP 7.4

DATA(v_index) = line_index( ti_scarr[ carrid = ‘AA’ ] ) .

NOTA: Se producirá un DUMP (error en tiempo de ejecución) su utilizamos una expresión en línea que haga referencia a un registro que no existe en una tabla interna.

Se recomienda asignar un field symbol y chequear el SY-SUBRC de la siguiente manera:

ASSING it_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 las expresiones radica en la reducción de las declaraciones necesarias, así como en la compatibilidad con las declaraciones en línea. (Inline Declarations).

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

*-----------------------------

* Class lcl_report DEFINITION

*-----------------------------

CLASS lcl_reporte DEFINITION.

PUBLIC SECTION.

METHODS:

constructor IMPORTING iv_rec TYPE i,

seleccionar_datos,

imprimir_dados.

PRIVATE SECTION.

DATA: v_rec TYPE i.

ENDCLASS.

*--------------------------------

* Class lcl_report IMPLEMENTATION

*--------------------------------

CLASS lcl_reporte IMPLEMENTATION.

METHOD constructor.

WRITE: / ‘-------‘.

WRITE: / ‘Nuevo objeto’, iv_rec.

v_rec = iv_rec.

ENDMETHOD. “Constructor

METHOD seleccionar_datos.

WRITE: / ‘ Seleccionando datos’, v_rec.

ENDMETHOD. “ Seleccionar datos

METHOD imprimir datos.

WRITE: / ‘ Imprimiendo datos’, v_rec.

ENDMETHOD. “ imprimir datos

ENDCLASS.

START-OF-SELECION.

DATA: lo_reporte TYPE REF TO lcl_reporte.

CREATE OBJECT lo_reporte EXPORTING iv_rec = 5.

constructor IMPORTING iv_rec TYPE i,

seleccionar_datos,

imprimir_dados.

PRIVATE SECTION.

DATA: v_rec TYPE i.

ENDCLASS.

Para crear la instancia de un objeto, podemos utilizar el operador 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.

Data(o_reporte) = NEW lcl_reporte (1).

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

DATA: ls_carr TYPE scarr.


 

 

 


Sobre el autor

Publicación académica de Juan Hernández, en su ámbito de estudios para el Máster ABAP for HANA.

SAP Master


Juan Hernández

Profesión: Programador Informático - España - Legajo: XQ15K

✒️Autor de: 125 Publicaciones Académicas

🎓Egresado de los módulos:

Disponibilidad Laboral: PartTime

Certificación Académica de Juan Hernández