Add BO-enhancements (Internal Actions) using RAP Cloud Environment
Desarrollo de ampliaciones con código de cliente en una aplicación en ABAP RAP en Ambiente Cloud (Internal Actions).
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.
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.
Ya se había visto el Action en forma de calculo desde un botón (Descuento al Fee) ahora esta acción interna deberá calcular el TotalPrice automáticamente sumando el FlightPrice de cada uno de los Bookings más el BookingFee del Travel.
Pasos
- Ajustar el Behavior Definition de Travel.
- Implementar código en la clase BP de Travel.
- Ajustar el Behavior Definition de Booking.
- Implementar código en la clase BP de Booking.
- Visualizar la Aplicación (Preview).
1.- Ajustar el Behavior Definition de Travel.
Incluír la siguiente línea en el Behavior Definition de Travel.
field ( readonly ) TotalPrice;
Incluír las siguientes líneas en el Behavior Definition de Travel debajo de los actions que ya tenemos.
internal action recalcTotalPrice;
determination calculateTotalPrice on modify { create; field BookingFee, CurrencyCode; }
2.- Implementar el código en la clase BP de Travel.
En la línea del determination dar clic en icono para implementar el código.
Implementar el siguiente código en la definición handler de la clase de Travel.
METHODS recalcTotalPrice FOR MODIFY
IMPORTING keys FOR ACTION Travel~recalcTotalPrice.
METHODS calculateTotalPrice FOR DETERMINE ON MODIFY
IMPORTING keys FOR Travel~calculateTotalPrice.
Implementar el siguiente código en la implementación handler de la clase de Travel.
**************************************************************************
* Internal instance-bound action calculateTotalPrice
**************************************************************************
METHOD reCalctotalprice.
TYPES: BEGIN OF ty_amount_per_currencycode,
amount TYPE /dmo/total_price,
currency_code TYPE /dmo/currency_code,
END OF ty_amount_per_currencycode.
DATA: amounts_per_currencycode TYPE STANDARD TABLE OF ty_amount_per_currencycode.
" Read all relevant travel instances.
READ ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY Travel
FIELDS ( BookingFee CurrencyCode )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
DELETE travels WHERE CurrencyCode IS INITIAL.
" Read all associated bookings and add them to the total price.
READ ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY Travel BY \_Booking
FIELDS ( FlightPrice CurrencyCode )
WITH CORRESPONDING #( travels )
LINK DATA(booking_links)
RESULT DATA(bookings).
LOOP AT travels ASSIGNING FIELD-SYMBOL(<travel>).
" Set the start for the calculation by adding the booking fee.
amounts_per_currencycode = VALUE #( ( amount = <travel>-bookingfee
currency_code = <travel>-currencycode ) ).
LOOP AT booking_links INTO DATA(booking_link) USING KEY id WHERE source-%tky = <travel>-%tky.
" Short dump occurs if link table does not match read table, which must never happen
DATA(booking) = bookings[ KEY id %tky = booking_link-target-%tky ].
COLLECT VALUE ty_amount_per_currencycode( amount = booking-flightprice
currency_code = booking-currencycode ) INTO amounts_per_currencycode.
ENDLOOP.
DELETE amounts_per_currencycode WHERE currency_code IS INITIAL.
CLEAR <travel>-TotalPrice.
LOOP AT amounts_per_currencycode INTO DATA(amount_per_currencycode).
" If needed do a Currency Conversion
IF amount_per_currencycode-currency_code = <travel>-CurrencyCode.
<travel>-TotalPrice += amount_per_currencycode-amount.
ELSE.
/dmo/cl_flight_amdp=>convert_currency(
EXPORTING
iv_amount = amount_per_currencycode-amount
iv_currency_code_source = amount_per_currencycode-currency_code
iv_currency_code_target = <travel>-CurrencyCode
iv_exchange_rate_date = cl_abap_context_info=>get_system_date( )
IMPORTING
ev_amount = DATA(total_booking_price_per_curr)
).
<travel>-TotalPrice += total_booking_price_per_curr.
ENDIF.
ENDLOOP.
ENDLOOP.
" write back the modified total_price of travels
MODIFY ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY travel
UPDATE FIELDS ( TotalPrice )
WITH CORRESPONDING #( travels ).
ENDMETHOD.
**************************************************************************
* determination calculateTotalPrice
**************************************************************************
METHOD calculateTotalPrice.
MODIFY ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY Travel
EXECUTE reCalcTotalPrice
FROM CORRESPONDING #( keys ).
ENDMETHOD.
Grabar (Ctrl+S) y Activar (CTRL+F3).
3.- Ajustar el Behavior Definition de Booking.
Incluír las siguientes líneas en el Behavior Definition de Booking.
implementation in class ZBP_R_RAP100_BOOK_M unique
Más abajo antes del mapping incluír la siguiente línea.
determination calculateTotalPrice on modify { create; field FlightPrice, CurrencyCode; }
4.- Implementar el código en la clase BP de Booking.
En la línea del determination dar clic en icono para implementar el código.
En este caso la clase aún no existía, se crea.
Presionar Next.
Seleccionar un paquete y presionar Finish.
Implementar el siguiente código en la clase del Booking.
CLASS lhc_booking DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS calculateTotalPrice FOR DETERMINE ON MODIFY
IMPORTING keys FOR Booking~calculateTotalPrice.
ENDCLASS.
CLASS lhc_booking IMPLEMENTATION.
**************************************************************************
* Determination calculateTotalPrice
**************************************************************************
METHOD calculateTotalPrice.
" Read all parent IDs
READ ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY Booking BY \_Travel
FIELDS ( TravelID )
WITH CORRESPONDING #( keys )
RESULT DATA(travels).
" Trigger Re-Calculation on Root Node
MODIFY ENTITIES OF zr_rap100_travel_m IN LOCAL MODE
ENTITY Travel
EXECUTE reCalcTotalPrice
FROM CORRESPONDING #( travels ).
ENDMETHOD.
ENDCLASS.
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.
Aparece el campo TotalPrice en solo lectura calculando la suma de los FlightPrice más el BookingFee.
Continua...
Agregar Functions a la aplicación creada.
Add BO-enhancements (Functions) using RAP Cloud Environment