RAP - Virtual Elements
There are virtual elements around the projections, we show you how to use and implement them to extend your RAP object.
Table of contents
We already discussed virtual elements in CDS views in an older article. Today we present another variant, which is mainly used in projections of RAP objects.
Definition
The elements receive their own keyword in the CDS view and again receive the annotation to indicate the implementing class. These virtual elements can only be used in the projection layer and will result in an error for a view or standard entity.
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BS_DEMO_CRAP_VE_EXIT'
virtual NumberOfPositions : abap.int4,
Class
The class is implemented again accordingly with the interface IF_SADL_EXIT_CALC_ELEMENT_READ. It is sufficient to fill the CALCULATE method with content. The example implementation of the method could look like this:
LOOP AT it_requested_calc_elements INTO DATA(ld_virtual_field).
LOOP AT ct_calculated_data ASSIGNING FIELD-SYMBOL(<ls_calculated_data>).
DATA(ld_tabix) = sy-tabix.
ASSIGN COMPONENT ld_virtual_field OF STRUCTURE <ls_calculated_data> TO FIELD-SYMBOL(<ld_field>).
DATA(ls_original) = CORRESPONDING ZBS_C_RAPCInvoice( it_original_data[ ld_tabix ] ).
IF ls_original-Partner = '1000000002'.
<ld_field> = 999.
ELSE.
SELECT FROM zbs_dmo_position
FIELDS COUNT( * )
WHERE document = @ls_original-Document
INTO @<ld_field>.
ENDIF.
ENDLOOP.
ENDLOOP.
The method loops over the requested items and then adds the content that was requested. To derive our information from the data, we assign it to an internal variable. Since the data types were defined as ANY, we have to go this route to address the elements by their names. In the end, for a specific partner we set the number to 999 and for all other partners we determine the number of positions. The overall implementation would then look like this:
CLASS zcl_bs_demo_crap_ve_exit DEFINITION
PUBLIC
FINAL
CREATE PUBLIC.
PUBLIC SECTION.
INTERFACES if_sadl_exit_calc_element_read.
ENDCLASS.
CLASS zcl_bs_demo_crap_ve_exit IMPLEMENTATION.
METHOD if_sadl_exit_calc_element_read~calculate.
LOOP AT it_requested_calc_elements INTO DATA(ld_virtual_field).
LOOP AT ct_calculated_data ASSIGNING FIELD-SYMBOL(<ls_calculated_data>).
DATA(ld_tabix) = sy-tabix.
ASSIGN COMPONENT ld_virtual_field OF STRUCTURE <ls_calculated_data> TO FIELD-SYMBOL(<ld_field>).
DATA(ls_original) = CORRESPONDING ZBS_C_RAPCInvoice( it_original_data[ ld_tabix ] ).
IF ls_original-Partner = '1000000002'.
<ld_field> = 999.
ELSE.
SELECT FROM zbs_dmo_position
FIELDS COUNT( * )
WHERE document = @ls_original-Document
INTO @<ld_field>.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDMETHOD.
METHOD if_sadl_exit_calc_element_read~get_calculation_info.
ENDMETHOD.
ENDCLASS.
Usage
Within RAP, additional information can be given to the frontend that is not available in the data model. For technical fixed values, readable content could be transferred in this way. The result of the example shown above looks like this:
Conclusion
As always, we have committed the current variant to GitHub so that you can understand the changes and examples. Virtual elements are implemented quite simply, but information from JOIN and association should be used preferably.