SPO with BAdi can be used to implement rollowing snapshots scenarios. For example, 24 monthly forecast snapshots are stored in SPO cube. Every month new snapshot is stored replacing one which is 2 years old.

FCST Cube 2014-11.jpg

BW supports you all steps of the way helping create Transformations, DTPs, Process Chain and maintain SPO partitions. Generated Process Chain though is not ideally suited for rolling snapshots scenario (has 24 parallel processes to update all 24 partitions) and needs to be enhanced.

Generated Process Chain.jpg

Enhanced Process Chain has Decision step added to update only one partition.

Modified Process Chain.jpg

Decision step serves two purposes:

  • Saves system resources (no unnecessary loads, indexes deletion / creation and statistic updates);
  • Handles scheduling errors (if process chain runs second time after current month snapshot is loaded then Decision step ends in error).

Please note that Decision step runs prior to ABAP re-partitioning step (RSLPO_MASS_ACT_BDG program) comparing current SPO partition criteria with new one from SPO BAdi. No matter how complex SPO partitioning criteria can be comparison is as simple as comparing two ABAP tables. ABAP coding is kept generic to be reusable for other rolling snapshots scenarios.

Below are step by step instructions for adding Decision step:

1. Implement C_SPO_PARTITION_CHANGED custom function logic in ABAP class method:

CLASS zcl_rslpo_badi_partitioning DEFINITION
 
PUBLIC
 
FINAL
 
CREATE PUBLIC .

PUBLIC SECTION.

  CLASS-METHODS partition_changed
   
IMPORTING
      iv_spo  
TYPE rslponame
      iv_idpart
TYPE rslpo_idpart
   
RETURNING
     
VALUE(rv_partition_changed) TYPE char1 .
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS zcl_rslpo_badi_partitioning IMPLEMENTATION.
* <SIGNATURE>—————————————————————————————+
* | Static Public Method ZCL_RSLPO_BADI_PARTITIONING=>PARTITION_CHANGED
* +————————————————————————————————-+
* | [—>] IV_SPO                        TYPE        RSLPONAME
* | [—>] IV_IDPART                      TYPE        RSLPO_IDPART
* | [<-()] RV_PARTITION_CHANGED          TYPE        CHAR1
* +————————————————————————————–</SIGNATURE>
METHOD partition_changed.
DATA: wt_badi_part_crit_new TYPE rslpo_badi_t_part_crit,
      wt_badi_part_crit_old
TYPE rslpo_badi_t_part_crit.
DATA: partitioning TYPE REF TO rslpo_badi_partitioning.

  GET BADI partitioning.
 
CALL BADI partitioning->get_t_part_crit
     
EXPORTING
            i_spo       
= iv_spo
     
RECEIVING
            r_t_part_crit
= wt_badi_part_crit_new.

  SELECT *
 
INTO CORRESPONDING FIELDS OF TABLE wt_badi_part_crit_old
 
FROM rslpopartrange
 
WHERE lpo    = iv_spo
   
AND objvers = ‘A’.
 
SORT: wt_badi_part_crit_old,
        wt_badi_part_crit_new.
 
DELETE: wt_badi_part_crit_old WHERE idpart <> iv_idpart,
          wt_badi_part_crit_new
WHERE idpart <> iv_idpart.
 
IF wt_badi_part_crit_old[] <> wt_badi_part_crit_new[].
    rv_partition_changed
= abap_true.
 
ELSE.
    rv_partition_changed
= abap_false.
 
ENDIF.

ENDMETHOD.
ENDCLASS.

2. Implement RSAR_CONNECTOR classic BAdi for C_SPO_PARTITION_CHANGED custom function

RSAR_CONNECTOR BAdi.jpg

METHOD if_ex_rsar_connector~get.
DATA: w_function TYPE sfbeoprnd.

CASE i_key.
WHEN ‘CUSTOM’.

  w_functiontech_name = ‘C_SPO_PARTITION_CHANGED’.
  w_functiondescriptn
= ‘SPO Partition changed’.
  w_function
class = ‘ZCL_RSLPO_BADI_PARTITIONING’.
  w_function
method = ‘PARTITION_CHANGED’.
 
APPEND w_function TO c_operands.

ENDCASE.

ENDMETHOD.

3. Add Decision Process Chain step

Decision Process Chain Step.jpg

Each If or Else If command formula looks like this

Formula 01.jpg

Note: first parameter is SPO name and second one is a partition number.

Lets execute enhanced Process Chain to load 2014/12 shapshot

Process Chain Log 1.jpg

This is how SPO looks after 2014/12 shapshot loadFCST Cube 2014-12.jpg

Finally, lets see if scheduling error handling works by trying load the same 2014-12 snapshot second time. Sure it does:

Process Chain Log 2.jpg

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply