Add BO-enhancements (Functions) using RAP Cloud Environment
Desarrollo de ampliaciones con código de cliente en una aplicación en ABAP RAP en Ambiente Cloud (Functions).
Objetivo
Adecuar una aplicación CRUD para añadir ampliaciones a lógica de negocio o código de cliente, con el modelo RestFul Application programming model en Eclipse utilizando ABAP Development Tools.
Prerequisitos
- Desarrollo de un servicio OData para una aplicación FIORI (Managed).
- Añadir lógica de negocio a una aplicación ABAP RAP ambiente Cloud.
- Añadir una entidad al modelo de datos de una aplicación ABAP RAP ambiente Cloud.
- Añadir virtual elements a una aplicación RAP Ambiente Cloud.
- Añadir internal actions a una aplicación RAP Ambiente Cloud.
Cuando desarrollamos una aplicación por lo regular tenemos algunos datos que se calculan en tiempo de ejecución, es decir, no se graban en tablas pero es necesario mostrarlos en pantalla.
En este caso creamos nuevos campos virtual elements para el child entity Booking y usando una función para llamar la implementación de la clase donde se realiza el cálculo de los nuevos datos.
Pasos
- Crear el abstract entity para los nuevos virtual elements.
- Definir la function en el behavior de Booking.
- Crear la clase para el calculo de los virtual elements.
- Ajustar el projection view de Booking.
- Ajustar el metadata view de Booking.
- Visualizar la Aplicación (Preview).
1.- Crear el abstract entity para los nuevos virtual elements.
Seleccionar Data Definitions y con el menú contextual la opción: New Data Definition.
Capturar nombre y descripción de data definition para el abstact.
Presionar Next.
Seleccionar un paquete y presionar Finish.
Implementar el siguiente código.
@EndUserText.label: 'Abstract entity for Days To Flight'
define abstract entity ZA_RAP100_DaysToFlight_M
{
initial_days_to_flight : abap.int4;
remaining_days_to_flight : abap.int4;
booking_status_indicator : abap.int4;
days_to_flight_indicator : abap.int4;
}
Grabar (Ctrl+S) y Activar (CTRL+F3).
2.- Definir la function en el behavior de Booking.
Incluír las siguientes líneas en el Behavior Definition de Booking.
function getDaysToFlight result [1] ZA_RAP100_DaysToFlight_M;
En la línea añadida dar clic en icono para implementar el código.
Implementar el siguiente código.
**************************************************************************
* Instance-bound function for calculating virtual elements via EML calls
**************************************************************************
METHOD getDaysToFlight.
DATA:
c_booking_entity TYPE ZC_RAP100_BOOK_M,
bookings_result TYPE TABLE FOR FUNCTION RESULT ZR_RAP100_TRAVEL_Mbooking~getdaystoflight,
booking_result LIKE LINE OF bookings_result.
"read relevant data
READ ENTITIES OF ZR_RAP100_TRAVEL_M IN LOCAL MODE
ENTITY booking
FIELDS ( TravelID BookingStatus BookingID FlightDate BookingDate )
* ALL FIELDS
WITH CORRESPONDING #( keys )
RESULT DATA(bookings).
LOOP AT bookings ASSIGNING FIELD-SYMBOL(<booking>).
c_booking_entity = CORRESPONDING #( <booking> ).
"set relevant transfered data
booking_result = CORRESPONDING #( <booking> ).
"calculate virtual elements
booking_result-%param
= CORRESPONDING #( zrapdev_calc_book_elem_100=>calculate_days_to_flight( c_booking_entity )
MAPPING booking_status_indicator = BookingStatusIndicator
days_to_flight_indicator = DaysToFlightIndicator
initial_days_to_flight = InitialDaysToFlight
remaining_days_to_flight = RemainingDaysToFlight ).
"append
APPEND booking_result TO bookings_result.
ENDLOOP.
result = bookings_result.
ENDMETHOD.
Grabar (Ctrl+S) y Activar (CTRL+F3).
3.- Crear la clase para el calculo de los virtual elements.
En la siguiente línea dar clic en icono para implementar el código.
Si no existe se creará la clase para el cálculo de los virtual elements.
Seleccionar un paquete y presionar Finish.
Implementar el siguiente código en la clase del Booking element.
CLASS zrapdev_calc_book_elem_100 DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
* interfaces IF_SADL_EXIT .
INTERFACES if_sadl_exit_calc_element_read .
CLASS-METHODS:
calculate_days_to_flight
IMPORTING is_original_data TYPE zc_rap100_book_m
RETURNING VALUE(result) TYPE zc_rap100_book_m.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zrapdev_calc_book_elem_100 IMPLEMENTATION.
METHOD if_sadl_exit_calc_element_read~calculate.
IF it_requested_calc_elements IS INITIAL.
EXIT.
ENDIF.
LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_req_calc_elements>).
CASE <fs_req_calc_elements>.
"virtual elements from BOOKING entity
WHEN 'INITIALDAYSTOFLIGHT' OR 'REMAININGDAYSTOFLIGHT'
OR 'DAYSTOFLIGHTINDICATOR' OR 'BOOKINGSTATUSINDICATOR'.
DATA lt_book_original_data TYPE STANDARD TABLE OF zc_rap100_book_m WITH DEFAULT KEY.
lt_book_original_data = CORRESPONDING #( it_original_data ).
LOOP AT lt_book_original_data ASSIGNING FIELD-SYMBOL(<fs_book_original_data>).
<fs_book_original_data> = zrapdev_calc_book_elem_100=>calculate_days_to_flight( <fs_book_original_data> ).
ENDLOOP.
ct_calculated_data = CORRESPONDING #( lt_book_original_data ).
ENDCASE.
ENDLOOP.
ENDMETHOD.
METHOD if_sadl_exit_calc_element_read~get_calculation_info.
IF iv_entity EQ 'ZC_RAP100_BOOK_M'. "Booking BO node
LOOP AT it_requested_calc_elements ASSIGNING FIELD-SYMBOL(<fs_booking_calc_element>).
CASE <fs_booking_calc_element>.
WHEN 'INITIALDAYSTOFLIGHT'.
COLLECT `BOOKINGDATE` INTO et_requested_orig_elements.
COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.
WHEN 'REMAININGDAYSTOFLIGHT'.
COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.
WHEN 'DAYSTOFLIGHTINDICATOR'.
COLLECT `FLIGHTDATE` INTO et_requested_orig_elements.
WHEN 'BOOKINGSTATUSINDICATOR'.
COLLECT `BOOKINGSTATUS` INTO et_requested_orig_elements.
ENDCASE.
ENDLOOP.
ENDIF.
ENDMETHOD.
METHOD calculate_days_to_flight.
DATA(today) = cl_abap_context_info=>get_system_date( ).
result = CORRESPONDING #( is_original_data ).
"VE InitialDaysToFlight: initial days to flight
DATA(initial_days) = result-FlightDate - result-BookingDate.
IF initial_days > 0 AND initial_days < 999.
* IF initial_days > 0 .
result-InitialDaysToFlight = initial_days.
ELSE.
result-InitialDaysToFlight = 0.
ENDIF.
"VE RemainingDaysToFlight: remaining days to flight
DATA(remaining_days) = result-FlightDate - today.
IF remaining_days < 0 OR remaining_days > 999.
result-RemainingDaysToFlight = 0.
ELSE.
result-RemainingDaysToFlight = result-FlightDate - today.
ENDIF.
"VE DaysToFlightIndicator: remaining days to flight *indicator*
"(dataPoint: 1 = red | 2 = orange | 3 = green | 4 = grey | 5 = bleu)
IF remaining_days >= 6.
result-DaysToFlightIndicator = 3. "green
ELSEIF remaining_days <= 5 AND remaining_days >= 3.
result-DaysToFlightIndicator = 2. "orange
ELSEIF remaining_days <= 2 AND remaining_days >= 0.
result-DaysToFlightIndicator = 1. "red
ELSE.
result-DaysToFlightIndicator = 4. "grey
ENDIF.
"VE BookingStatusIndicator: booking status indicator
"(criticality: 1 = red | 2 = orange | 3 = green)
CASE result-BookingStatus.
WHEN 'X'.
result-BookingStatusIndicator = 1.
WHEN 'N'.
result-BookingStatusIndicator = 2.
WHEN 'B'.
result-BookingStatusIndicator = 3.
WHEN OTHERS.
ENDCASE.
ENDMETHOD.
ENDCLASS.
Grabar (Ctrl+S) y Activar (CTRL+F3).
3.- Ajustar el projection view de Booking.
Implementar el siguiente código en el projection view del Booking.
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZRAPDEV_CALC_BOOK_ELEM_100'
@EndUserText.label: 'Booking Status Indicator'
virtual BookingStatusIndicator : abap.int1,
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZRAPDEV_CALC_BOOK_ELEM_100'
@EndUserText.label: 'Initial Days to Flight'
virtual InitialDaysToFlight : abap.int1,
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZRAPDEV_CALC_BOOK_ELEM_100'
@EndUserText.label: 'Remaining Days to Flight'
virtual RemainingDaysToFlight : abap.int1,
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZRAPDEV_CALC_BOOK_ELEM_100'
@EndUserText.label: 'Days to Flight Indicator'
virtual DaysToFlightIndicator : abap.int1,
Quedando de la siguiente manera.
Grabar (Ctrl+S) y Activar (CTRL+F3).
3.- Ajustar el projection view de Booking.
Implementar el siguiente código en el metadata extension del Booking.
@UI: {
dataPoint: { title: 'Days to Flight Indicator',
criticality: 'DaysToFlightIndicator',
targetValue: #(InitialDaysToFlight),
visualization: #PROGRESS },
lineItem: [{ type: #AS_DATAPOINT, position: 100, importance: #HIGH}],
identification: [{ type: #AS_DATAPOINT, position: 100 }] }
RemainingDaysToFlight;
Quedando de la siguiente manera.
Grabar (Ctrl+S) y Activar (CTRL+F3).
5.- Visualizar la aplicación.
Seleccionar el Service Binding de la aplicación.
Presionar el botón Preview.
Presionar el botón Go.
Y seleccionar un Travel para ver su detalle.
Presionar el botón Edit.
Aparecen los campos que se agregaron con el cálculo de días para el vuelo.
Continua…
Agregar Features a la aplicación creada.
Add BO-enhancements (Features) using RAP Cloud Environment