✒️ABAP HANA Las mejoras a partir de ABAP 7.40
ABAP HANA Las mejoras a partir de ABAP 7.40
Se implementó una serie de mejoras en el lenguaje ABAP
AS ABAP 7.40 es sucesor de AS ABAP 7.31
Mayor orientación hacia las expresiones, haciendo poder reducir el código y el paradigma code pushdown
1.1 ¿Cómo determinamos con cual versión de ABAP estamos trabajando?
Ingresamos a un modo SAP > Menú Sistema > Status
Clic en "Componentes" (Product version
Buscamos SA_BASIS y SAP_ABA
1.2 ¿De donde venimos, donde estamos y hacia donde vamos?
Versiones:
7.0 : Fue orientado a declaraciones.
7.02: Se habilitpo la expresión. Expresiones de cadena con operador de concatenación && combinadas con cadenas. Podemos mandar el valor directo de la tabla concatenando con expresiones.
7.40: Orientado a la expresión real:
Al momento de buscar en tabla podemos genrar al vuelo una variable auxiliar DATA(wa_tabla).
En la misma expresión podemos hacer la busqueda del registro y ahí enviar el valor que buscamos.
1.3 ¿Qué es ABAP 7.50 y cuales son sus fundamentos?
Especificaciones:
Lanza servidor SAP de aplicaciones SAP NetWeaver AS ABAP 7.5 y con él ABAP 7.5
Es compatible con el servidor ode aplicaciones aBAP 7.4
Corre con el kernel 7.45
Solo funciona con sistemas Unicode
Soporta la base de datos SAP HANA y otras
Facilita la explotacion de HANA
Ofrece un modelo de programación ABAP común
SAP Fiori como UX
Compatible con industria 4.0 y escenarios de big data
Moderniza y simplifica el lenguaje ABAP
Experiencia de desarrolllo de primera clase en Eclipse
Herramientas de administración de código personalizada para una actualización y migración simples a SAP S/4 HANA
2 Declaraciones en línea (Inline Declarations)
Deberan ser usadas para reducir y optimizar el código, pero no abusar de ellas ya que podrían ser muy complejo seguir el código a un futuro
2.1 Declaraciones con DATA
Antes declarabamos y luego asignabamos
Ahora se pude ser en un paso: DATA(v_texto) = 'Hola Mundo'.
2.2 Loop AT INTO work area
Antes se declaraban tanto tabla como work area
Ahora se puede declarar el work area al momento del loop: LOOP AT ti_carrier INTO data(wa_carrier). ENDLOOP.
2.3 CALL METHOD
Antes declarabamos atributos para utilizarlso en la llamada, en dos lineas
Ahora podemos declarar en una sola linea:
TRY
cl_salv_table=>factory( IMPORTING r_salv_table = data(lo_alv_inline)
ChANGING t_table = lt_data ).
lo_alv->display().
CATCH cx_salv_msg INTO data(lo_exc_inline).
MESSAGE lo_exc_inline TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
2.4 LOOP AT ASSINGNING
Ahora podemos hacerlo en una linea: LOOP AT ti_burks ASSIGNING field-symbol(<wa_bukrs>). ENDLOOP.
2.5 READ TABLE ASSIGNING
Ahora podemos hacerlo en una linea: READ TABLE ti_matnr ASSIGNING field-symbol(<wa_matnr>) INDEX 3.
2.6 SELECT INTO TABLE
Ahora podemos hacerlo en una linea: SELECT * FROM scarr INTO TABLE @data(ti_scarr).
2.7 SELECT SINGLE INTO
Ahora podemos declar la variable dentro del select:
SELECT SINGLE carrname
FROM scarr
WHERE carrid EQ 'AA'
INTO @data(v_carrname).
Las declaraciones no cambian el alcance de las variables ABAP, por lo tanto no se puede usar el mismo nombre de variable varias veces en un metodo. Son utiles para variables con un contexto de uso limitado y local.
No se pueden utilizar para definir el resultado de un SELECT INTO o INTO TABLE
3 Expresiones con Tablas
3.1 READ TABLE INDEX
Ahora podemos leer un registro puntual de una tabla interna así: data(wa_carrier) = ti_carrier[ 1 ].
3.2 READ TABLE WITH KEY
Ahora podemos leer un registro de una tabla interna utilizando campos clave así: DATA wa_carrier = ti_carrier[ carrid = 'LH' ]. **
3.3 ¿Existe el registro?
Ahora podemos determinar si existe el registro en una ti_ así: IF line_exists( ti_carrier[ carrid ='AA'] ).
3.4 Obtenemos el índice de una tabla
Ahora podemos determinar el indice de una ti_ así: DATA(v_index) = line_index( ti_scarr[ carrid = 'AA'] ).
Si no encuentra nada se producirá un dump por ello SAP recomienda hacer un field-symbol y checar el SY-SUBRC de la siguiente manera
ASSIGN lt_tab to FIELD-SYMBOL().
IF sy-subrc EQ 0. ENDIF.
4 Expresiones de constructor
Nos permiten crear e inicializar objetos ABAP, estructuras y referencias por medio de expresión.
Antes para declarar objetos era:
DATA: lo_reporte TYPE REF TO lcl_reporte.
CREATE OBJECT lo_reporte EXPORTING iv_rec = 5.
Ahora podemos hacerlo en una linea:
data(o_reporte) = NEW lcl_reporte( 1 ).
NEW será el operador que nos permitirá declararlo en linea.
Antes para inicializar los campos de una estructura o work area era:
DATA: ls_carr TYPE scarr.
ls_carr-carrid = 'LH'.
ls_carr-carrname = 'Lufthansa'.
Ahora podemos hacerlo en una linea:
ls_carr = VALUE #( carrid= 'LH' carrname = 'Lufthansa' ).
VALUE será el operador que utilizaremos.
También podemos combinar la expresión VALUE con una declaración en linea:
DATA(ls_car) = VALUE scarr( carrid = 'LH' carrname = 'Lufthansa' ).
Tenemos que declaran el tipo de dato exacto.
También podemos utilizar el operador VALUE para inicializar tablas:
DATA: lt_carrier TYPE TABLE OF scarr.
lt_carrier = VALUE #( ( carrid = 'AA' carrname = 'American Airlines' )
( carrid = 'LH' carrname = 'Lufthansa' ) ).
Otro operador muy utilizado es REF junto con GET REFERENCE, se utiliza de la siguiente manera:
TRY
"Preparamos la conexión SQL.
data(lo_result_set) = cl_sql_connection=>get_connection()->create_statement()->execute_query( iv_statement ).
lo_result_set->set_parama-table( ref #(lt_result ) ).
"Obtenemos el resultado.
lo_result_set->next_package( ).
lo_result_set->close( ).
CATCH cx_sql_exception INTO data(lo_exc).
"Manejo de los errores.
ENDTRY-
5 El operador CORRESPONDING
Pasar el contenido inicializando previamente el contenido, antes lo usabamos así:
CLEAR wa_line2.
MOVE-CORRESPONDING wa_line1 TO wa_line2.
Ahora podemos hacerlo así:
wa_line2 = CORRESPONDIGN #( wa_line1 ).
Los campos que no sean iguales o no coincidan entre ambas estructuras serán inicializados.
Para asignar el contenido sin previamente inicializar el contenido, podemos hacerlo así:
wa_line2 = CORRESPONDING #( BASE ( wa_line2 ) wa_line1 ).
Para asignar contenido teniendo 3 tablas sin previamente inicializar el contenido, podemos hacerlo así:
DATA(wa_line3) = CORRESPONDING line2( BASE ( wa_line2 ) wa_line1 ).
6 Operaciones con caracteres
Ahora podemos indentificar las cadenas rodeandolas por dos |(pipes), así:
DATA: v_string TYPE string.
v_string = |Esto es un texto literal.|.
WRITE: / (30) v_string.
Podrán no ser considerados caracteres, si encerramos dentro de llaves {} los siguientes objetos:
Objetos de datos
Expresiones de cálculo
Expresiones de constructores
Expresiones de tablas
Funciones predefinidas
Métodos funcionales y encadenamiento de métodos
Esto último se hacía así antes:
DATA: v_string TYPE string,
v_syssubrc_c(4) TYPE c.
CLEAR v_syssubrc_c.
v_syssubrc_c = sy-subrc.
CONCATENATE 'El código de retorno es:' v_syssubrc_c INTO v_string SEPARATED BY space.
WRITE: /(30) v_strign.
Ahora lo podremos hacer así:
DATA: v_string TYPE string.
v_string |El código de retorno es: { sy-subrc }|.
WRITE: /(30) v_string.
Para concatenar caracteres, lo hacíamos así:
DATA:v vl_output TYPE string.
CONCATENATE 'Hola' 'Mundo' INTO vl_outputy SEPARATED BY space.
Ahora lo podemos hacer así:
DATA(vl_output) = |Hola| & | | & |Mundo|.
 
 
 
Agradecimiento:
Ha agradecido este aporte: Jesús Quiñonez López
Sobre el autor
Publicación académica de Martín Ramssés Gómez Rodríguez, en su ámbito de estudios para el Máster ABAP for HANA.
Martín Ramssés Gómez Rodríguez
Profesión: Desarrollador Software - Mexico - Legajo: QS57M
✒️Autor de: 10 Publicaciones Académicas
🎓Egresado del módulo:
Disponibilidad Laboral: FullTime
Presentación:
Desarollarme profesionalmente para seguir apoyando a la sociedad, de manera ética y con valores
Certificación Académica de Martín Gómez