Technology Blogs by SAP
Learn how to extend and personalize SAP applications. Follow the SAP technology blog for insights into SAP BTP, ABAP, SAP Analytics Cloud, SAP HANA, and more.
Showing results for 
Search instead for 
Did you mean: 

In the blog Step by Step to create CDS view through SmartTemplate + WebIDE and Create a CRM Service Order Fiori application within a couple of minutes we get an Fiori application generated which needs several fine-tuning on appearance. For example, the status field is by default rendered as a pure input field with technical status code like "OPEN", "PROC" displayed. It is better to render it as a drop down list with human readable text like "Open", "In process" displayed as drop down list item.

I searched in SCN and could not find a working solution for it, so I spent some time for research and would like to share with you here.

Step1 Create a simple CDS view to hold status code and status description

@AbapCatalog.sqlViewName: 'zstatusfixed'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'fixed value'
define view Z_C_Status_Fixedvalue as select from zstatus_fixedval {
@EndUserText.label: 'status key for fixed value'
key zstatus_fixedval.status_code,
@EndUserText.label: 'status description for fixed value'

Previewed as below:

Here below is the table definition on top of which the CDS view above is created.

For demonstration purpose I create a Z table and only inserted three status items:

Step2 link the status field to the CDS view created in previous step

I have defined the consumption view Z_C_Service_Order_View with below source code:

define view Z_C_Service_Order_View as select from Z_i_Order_View
@UI.identification: [ { position: 50 } ]
@Consumption.valueHelp: '_statusfixedvalue'
@ObjectModel: { foreignKey.association: '_statusfixedvalue', mandatory: true }

Where does the definition of "_statusfixedvalue" come from?

It is defined in view Z_i_Over_View:

define view Z_i_Over_View as select from XXXX
association [0..1] to Z_C_Status_Fixedvalue as _statusfixedvalue
on $projection.txt04 = _statusfixedvalue.status_code
@ObjectModel.association.type: #TO_COMPOSITION_CHILD

So far the work on CDS side is done.

Step3 create necessary annotation in ABAP code

Prerequisite: you should first create a project using tcode SEGW and then include your CDS consumption view via the context menu as below:

Redefine method DEFINE of your MPC_EXT class with following source code:

    super->define( ).
DATA lo_annotation TYPE REF TO /iwbep/if_mgw_odata_annotation.
DATA lo_property TYPE REF TO /iwbep/if_mgw_odata_property.
DATA lo_entity_set TYPE REF TO /iwbep/if_mgw_odata_entity_set.
lo_entity_set = model->get_entity_set( 'Z_C_Service_Order_View' ).
lo_annotation = lo_entity_set->create_annotation( 'sap' ).
lo_annotation->add( iv_key = 'semantics' iv_value = 'fixed-values').
DATA(lo_entitytype) = model->get_entity_type( 'Z_C_Service_Order_ViewType' ).
lo_entitytype->set_is_value_list( abap_true ).
data(lo_txt_property) = model->get_entity_type( 'Z_C_Service_Order_ViewType' )->get_property( 'txt04' ).
lo_txt_property->set_value_list( /iwbep/if_mgw_odata_property=>gcs_value_list_type_property-fixed_values ).
data(lo_text_anno) = lo_txt_property->/iwbep/if_mgw_odata_annotatabl~create_annotation( 'sap' ).
lo_text_anno->add( iv_key = 'text' iv_value = 'to_statusfixedvalue/status_text').
lo_txt_property = model->get_entity_type( 'Z_C_Status_FixedvalueType' )->get_property( 'status_code' ).
lo_txt_property->set_value_list( /iwbep/if_mgw_odata_property=>gcs_value_list_type_property-fixed_values ).
lo_text_anno = lo_txt_property->/iwbep/if_mgw_odata_annotatabl~create_annotation( 'sap' ).
lo_text_anno->add( iv_key = 'text' iv_value = 'status_text').

Note: those ABAP code is necessary, or else you will only get an ugly drop down list: only status code is displayed:

Final result

In display mode and in edit mode, the status description is displayed: