Virtual Key Figures and Characteristics Values Filling via BADI Implementation


Virtual Characteristic / Key Figures are used when Info Object values determination in runtime of SAP BEx Query execution is required. Virtual Characteristics/Key Figures are used when no transformation rule exists to populate them in SAP Cube/DSO. Virtual Caracteristic/Key Figure values are calculated using either SAP BADI (RSR_OLAP_BADI) or SAP Enhancement (RSR00002).

Business Case

To update SAP BI Reports for SAP Solution Manager (SOLMAN) the external engine for data collection in the cubes/DSO is used. There is no SAP standard BI data flow under SOLMAN cubes, the data are loaded via customizing inside SOLMAN and modules. It this case BI cubes enhancement with additional attribute can not be done easily and quickly.

Based on the customer requirements, it was necessary to build a report with two additional columns: Reporter Name and Processor Name. So, for each IT incident or Service request it was necessary to show Reporter Name and Processor Name in the same line as the ticket number.

But in standard SOLMAN info cubes there is one characteristic ‘0SPRBPNO’ Business Partner for all roles of business process participants (Payer, Customer, Processor, Sold-To-Party, Reporter, etc.). The roles of every Business Partner are defined in characteristic ‘0SPRBPROLE’ Business Partner Role. So, it was not technically possible to show two Business Partners for the same ticket number, because there is only one characteristic  ‘0SPRBPNO’ Business Partner in the cube.

The solution was found via enhancement of Multiprovider with one additional characteristic with Role 0SPRBPROLE = SLFN0004 “Processor”. The Processor was filled in run time of BEx query execution.

The procedure of setup run-time update of virtual characteristic value is shown below. The values are determined using BADI (RSR_OLAP_BADI)

Step 1

The creation of a Virtual Characteristic ‘ZPRCSSR’ Processor and filling it with the value ‘#’ Not Assigned: every Message has Reporter, but Processor can not be assigned for some period of time. A new created characteristic was added to ‘0SPRDUMMY’ Dummy Cube:


Multiprovider ‘0SPRMDAT2’ Incident Management Reporting – Message Reporting is built on InfoSet ‘0SPRLAST’ Incident Management Reporting – Messages (complete data) and Infocube ‘0SPRDUMMY’ Dummy Cube. The Virtual Characteristic ‘ZPRCSSR’ was added the the Multiprovider as well:


Step 2

Query ‘ZGMC_SPR_WTQ_IN_T_OVERVIEW_01’ GMC: Total Number of Incidents – This and Last Week is built on Multiprovider (0SPRMDAT2).

The Virtual Characteristic ‘ZPRCSSR’ was added to this query:


Step 3

To determine the values for virtual characteristic, the following steps were taken:

Navigate to BADI Definition ‘RSR_OLAP_BADI (Virtual Characteristics and Key Figures in Reporting)’ through transaction SE18 or SE19 and creation of Implementation ‘ZITSM_ADD_CHARACTERS’ for BAdI RSR_OLAP_BADI:


and assigning Infoprovider (Filter) as ‘0SPRMDAT2’:


Step 4

At the tab page “Interface” a new class creation should be done.

The Name of implementing class was ZCL_IM_ITSM_ADD_CHARACTERS. There are 3 methods in this class: DEFINE, INITIALIZE and COMPUTE. To generate ABAP code for the method INITIALIZE the following was done:


Step 5

Declare the variables for Characteristics and Key Figures in the Class Interface ZCL_IM_ITSM_ADD_CHARACTERS:

Key Figure Name: P_KYF_<Key Figure Infoobject>

Characteristic Name: P_CHA_<Characteristic Infoobject>

Level: Instance Attribute, Visibiltiy: Public


Attribute Infobject
P_CHA_ZPRCSSR Characteristic: ZPRCSSR (Processor)
P_CHA_0SPRMGNO Characteristic: 0SPRMGNO (Message Number)

The next step is the creation of the ABAP Codes for the methods IF_EX_RSR_OLAP_BADI~DEFINE, IF_EX_RSR_OLAP_BADI~INITIALIZE and IF_EX_RSR_OLAP_BADI~COMPUTE.


The Method is used to append the internal tables for the Characteristic (c_t_chanm) and Key Figures (c_t_kyfnm).



DATA: l_s_chanm   TYPE rrke_s_chanm,
l_kyfnm     TYPE rsd_kyfnm.
<l_s_chanm> TYPE rrke_s_chanm.

CASE i_s_rkb1d-infocube.


*     characteristic
l_s_chanm-chanm = ‘ZPRCSSR’.
l_s_chanm-mode  = rrke_c_mode-no_selection. ” rrke_c_mode-read / rrke_c_mode-no_selection
APPEND l_s_chanm TO c_t_chanm.
CLEAR l_s_chanm.

l_s_chanm-chanm = ‘0SPRMGNO’.
l_s_chanm-mode  = rrke_c_mode-read. ” rrke_c_mode-read / rrke_c_mode-no_selection
APPEND l_s_chanm TO c_t_chanm.
CLEAR l_s_chanm.

l_s_chanm-chanm = ‘0SPRCRMGUID’.
l_s_chanm-mode  = rrke_c_mode-read. ” rrke_c_mode-read / rrke_c_mode-no_selection
APPEND l_s_chanm TO c_t_chanm.
CLEAR l_s_chanm.

**     key figure
*     l_kyfnm = ‘…’.
*     APPEND l_kyfnm TO c_t_kyfnm.




The Method is used to dynamically assign random numbers to the Characteristic and Key Figure Variables. It is filled in as a result of Step 4.



DATA: l_global_name TYPE string.
<l_global>    TYPE i,
<l_s_sfc>     TYPE rrkg_s_sfc,
<l_s_sfk>     TYPE rrkg_s_sfk.

* there’s no need to change this method
* Just create attributes for each charactersitic
* with name P_CHA_<characteristic> TYPE i.
* and constants for each key figure with name
* P_KYF_<key figure> TYPE i.

CLASS cl_exm_im_rsr_olap_badi DEFINITION LOAD.

* get field postions for characteristics in structure
LOOP AT i_th_sfc ASSIGNING <l_s_sfc>
WHERE user_exit NE rrke_c_mode-none.
* field name in structure is keyreturnnm
* name of the global variable
CONCATENATE ‘P_CHA’ <l_s_sfc>-chanm
INTO l_global_name
* fill the global variable
UNASSIGN <l_global>.
ASSIGN (l_global_name) TO <l_global>.
<l_global> = cl_exm_im_rsr_olap_badi=>get_field_position_d(
i_fieldnm = <l_s_sfc>-keyreturnnm
i_s_data  = i_s_data ).

* get field positions for key figures in structure
LOOP AT i_th_sfk ASSIGNING <l_s_sfk>
WHERE value_returnnm IS NOT INITIAL.
* name of the global variable
CONCATENATE ‘P_KYF’ <l_s_sfk>-kyfnm
INTO l_global_name
* fill the global variable
UNASSIGN <l_global>.
ASSIGN (l_global_name) TO <l_global>.
<l_global> = cl_exm_im_rsr_olap_badi=>get_field_position_d(
i_fieldnm = <l_s_sfk>-value_returnnm
i_s_data  = i_s_data ).



It is used for defining business logic for assigning the values to the characteristics or KeyFigures.


METHOD if_ex_rsr_olap_badi~compute .

DATA lv_system TYPE string.

CASE i_s_rkb1d-infocube.


FIELD-SYMBOLS <fs_0sprmgno> TYPE any.
FIELD-SYMBOLS <fs_zprcssr> TYPE any.
FIELD-SYMBOLS <fs_0sprcrmguid> TYPE any.

ASSIGN COMPONENT p_cha_0sprmgno OF STRUCTURE c_s_data TO <fs_0sprmgno>.
ASSIGN COMPONENT p_cha_zprcssr OF STRUCTURE c_s_data TO <fs_zprcssr>.
ASSIGN COMPONENT p_cha_0sprcrmguid OF STRUCTURE c_s_data TO <fs_0sprcrmguid>.

SELECT SINGLE sprbpno FROM /bi0/asprdatb00 INTO <fs_zprcssr> WHERE sprcrmguid = <fs_0sprcrmguid> AND sprbprole = ‘SLFN0004’.


Step 6: Execute

To see the result of Virtual Characteristic ZPRCSSR “Processor” filling the query, the following SAP transaction was executed: RSRT -> ZGMC_SPR_WTQ_IN_T_OVERVIEW_01 -> Execute


Showing 4 comments
  • Himanshu


    Good article but little ambiguous. Can you clarify below doubts

    1) fs_0sprcrmguid : is data for this coming from multiprovider ?
    2) fs_0sprmgno : where this field is used ? and 0sprmgno is defined but not used.
    3) P_CHA* – why its defined as I as associate type ?

    • Dzianis Chyrkun

      Hi Himanshu,

      Thanks for your questions and sorry for such big delay.
      1) yes, this data is from multiprovider. For sure, 0sprcrmguid need to be declared as variable in the class (Step 5). There is the old screenshot in the article
      2) firstly I used 0sprmgno to identify the message (row) for the Processor assigning. But this data as I remember was not unique and to identify the row I chose another field – 0sprcrmguid. So, 0sprmgno in the code just in case..
      3) this is the standard way how to define characteristics in such cases. After Step 4 some ABAP was generated automatically (method INITIALIZE). We just should go throw some definitions in this method.


  • Venkatesh

    Hi Dzianis Chyrkun,

    Very good article but im confused in few areas.
    Can you please reply to the questions asked by Himanshu.

    • Dzianis Chyrkun

      Hi Venkatesh,

      Please take a look at my reply above.


Leave a Comment