Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
lakshminarasimhan_n4
Active Contributor

Custom Program to find the Size of the InfoCube

Applies to:

SAP  BW 7.x. For more information, visit the Business Intelligence homepage.

Summary

This Document describes how to know check the size of the individual InfoCube’s using the custom program.

Author          : Lakshminarasimhan Narasimhamurthy

Created on   : 26 August 2015

Author Bio

Lakshminarasimhan Narasimhamurthy is ABAP certified and BW certified consultant and worked on multiple implementation, development and support project's within India and outside of India. He has worked for fortune 500 clients like Nestle, Warner Bros,General Electric. He is strong in HANA modeling and BO/BI tools like WEBI, Dashboard, IDT, Lumira.

Details

InfoCube is primary InfoProvider for storing data and we create report over them. If dimension tables are too large then they can result in badly performing the table joins, at the database level, as well as result in poor query performance. SAP_INFOCUBE_DESIGNS shows the database tables of the InfoCubes on the system, the number of records in these tables & the ratio of the dimension table size to the fact table size. SAP_INFOCUBE_DESIGNS program shows the size of the fact table and dimensional tables of the InfoCube’ s. It is a program delivered by SAP and can be run in the BW system from the transaction SE38.

When you run the program, all the cubes which are active in the system are considered and results are shown for those active cubes, if in case the cube is empty then the results are not displayed in the report. There are no input fields available and hence the program runs for all of the active cubes which consume lot of time especially in the production system. Report SAP_INFOCUBE_DESIGNS reads the number of records from the database table DBA_TABLES.

When you run the program SAP_INFOCUBE_DESIGNS the output shows the “Rows” which indicate the number of rows in that Dimension and Fact table and the last column Ratio (% in the last column) indicates the percentage of number of rows in that table divided by number of rows in the fact table.

As a standard, the ratio of rows in Dimension table to rows in Fact table should not be more than 10%. If the size of the dimension table is more than 10% it will be displayed in RED, then we need to redesign the dimension. Note  : The red highlight will only show up for cubes with more than 30.000 rows to avoid false alarms).

The above error can be corrected by either creating additional dimensions or make a dimension as line item dimension as the there will be  no need of generating the “Dim ID’s” only the SID will fall directly into the fact table.

The customs  program has a “select options” that takes the input from the user and the Function module RSDU_INFOCUBE_TABLE_SIZES  will be called to get the size of the dimension table.

The standard program is copied as a  ZSAP_INFOCUBE_DESIGNS program. Select Options defined to get the data from the user and we check the entries entered by user against the table RSDCUBE and call the FM to get the size.

The custom program does 3 things

  • Select-option to get the values from user and input help has been enabled for the user to select the cubes.
  • For every entry in the select options, the Function module RSDU_INFOCUBE_TABLE_SIZES is called and size of the cube is determined
  • If the cube is empty the program displays the message that the cube is empty.
  • Also you can run this program without any input parameters to check the list of cube which are active but empty, as this program lists the cubes that are empty too. Again running without any inputs would take lot of time.

Steps –

  • Go to t-code SE38
  • Type  the Program SAP_INFOCUBE_DESIGNS and then copy it to ZSAP_INFOCUBE_DESIGNS

  • Edit the copied program in SE38

The code of the custom program is given below,

REPORT ZBW_SAP_INFOCUBE_DESIGNS.

TYPE-POOLS :     RSD,

                            RSDU,

                            SSCR.

TABLES     : RSDCUBEV.

DATA          : RESTRICT     TYPE SSCR_RESTRICT,

                     OPT_LIST TYPE SSCR_OPT_LIST,

                     LV_SSCR_*** TYPE SSCR_***,

                     IT_CUBE      TYPE STANDARD TABLE OF RSINFOCUBE,

                     WA_CUBE      TYPE RSINFOCUBE,

                      IT1_CUBE     TYPE STANDARD TABLE OF RSINFOCUBE, " To capture the empty cubes

                      WA1_CUBE TYPE RSINFOCUBE,

                      INFOCUBE     TYPE STANDARD TABLE OF ZINFOCUBE.

" Get the list of Infocubes to be tested for its Size/Design

SELECTION-SCREEN BEGIN OF BLOCK B1.

SELECT-OPTIONS : LS_CUBE FOR RSDCUBEV-INFOCUBE.

SELECTION-SCREEN END OF BLOCK B1.

DATA: L_T_CUBE TYPE RSD_T_CUBE,

           L_S_CUBE            TYPE RSD_S_CUBE,

           L_FACTROWS          TYPE I,

           L_S_TABLSIZE        TYPE RSDU_S_TABLSIZE,

           L_T_TABLSIZE        TYPE RSDU_T_TABLSIZE,

           L_DENSITY           TYPE F,

           L_PDENSITY          TYPE P DECIMALS 1,

           L_COUNTER           TYPE I,

           L_ODD               TYPE I.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR LS_CUBE-LOW. " F4 help for the select options

  PERFORM LS_CUBE_F4_HELP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR LS_CUBE-HIGH. " F4 help for the select options

  PERFORM LS_CUBE_F4_HELP.

*&---------------------------------------------------------------------*

*&      Form LS_CUBE_F4_HELP

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM LS_CUBE_F4_HELP.

  SELECT DISTINCT INFOCUBE FROM RSDCUBE INTO TABLE IT_CUBE WHERE OBJVERS = 'A'.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

      DDIC_STRUCTURE         = 'ZINFOCUBE'   “ Create a custom structure

      RETFIELD               = 'INFOCUBE'

*     PVALKEY                = ' '

      DYNPPROG               = SY-REPID

      DYNPNR                 =  SY-DYNNR

      DYNPROFIELD            = 'LS_CUBE'

*     STEPL                  = 0

*     WINDOW_TITLE           =

*     VALUE                  = ' '

      VALUE_ORG              = 'S'

*     MULTIPLE_CHOICE        = ' '

*     DISPLAY                = ' '

*     CALLBACK_PROGRAM       = ' '

*     CALLBACK_FORM          = ' '

*     CALLBACK_METHOD        =

*     MARK_TAB               =

*  IMPORTING

*     USER_RESET             =

   TABLES

      VALUE_TAB              = IT_CUBE

*     FIELD_TAB              =

*     RETURN_TAB             =

*     DYNPFLD_MAPPING        =

   EXCEPTIONS

      PARAMETER_ERROR        = 1

     NO_VALUES_FOUND        = 2

     OTHERS                 = 3

            .

  IF SY-SUBRC <> 0.

* Implement suitable error handling here

  ENDIF.


"LS_CUBE_F4_HELP

START-OF-SELECTION.

     CLEAR : IT_CUBE[].

     SELECT DISTINCT

     INFOCUBE

    FROM

    RSDCUBE " Cube table

    INTO TABLE IT_CUBE

    WHERE

    OBJVERS = 'A'

   AND

   INFOCUBE IN LS_CUBE. " IN operator

  LOOP AT IT_CUBE INTO WA_CUBE.

* get cube layout information

    CALL FUNCTION 'RSDU_INFOCUBE_TABLE_SIZES'

      EXPORTING

      I_INFOCUBE   = WA_CUBE     " Technical name of the cube

      I_CHECK      = RS_C_TRUE

      IMPORTING

      E_FACTROWS   = L_FACTROWS

      E_T_TABLSIZE = L_T_TABLSIZE

      E_DENSITY    = L_DENSITY.

* give details only for non-empty cubes

    IF L_FACTROWS = 0.

      APPEND WA_CUBE TO IT1_CUBE.   " Empty cube with no data

      CONTINUE.

    ENDIF.

* count non-empty cubes

    L_COUNTER = L_COUNTER + 1.

* set format

    FORMAT COLOR COL_BACKGROUND INVERSE ON.

* print cube infos

    L_PDENSITY = L_DENSITY.

    WRITE: AT /   L_S_CUBE-INFOCUBE,

           AT 20  'ROWS:', L_FACTROWS,

           AT 40  'DENSITY:', L_PDENSITY, '%'.

* print cube table infos

    LOOP AT L_T_TABLSIZE INTO L_S_TABLSIZE.

*   swap formats

      L_ODD = L_COUNTER MOD 2.

      IF L_ODD = 1.

        FORMAT COLOR COL_BACKGROUND INTENSIFIED OFF INVERSE OFF.

      ELSE.

        FORMAT COLOR COL_BACKGROUND INTENSIFIED ON INVERSE OFF.

      ENDIF.

*   write ...

      IF L_S_TABLSIZE-SIZE_CHECK <> RSDU_C_CHECK-GREEN.

        FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF INVERSE ON.

      ENDIF.

      WRITE: AT /   L_S_CUBE-INFOCUBE,

             AT 20  L_S_TABLSIZE-TABLNM,

             AT 40  'ROWS:', L_S_TABLSIZE-ROWS,

             AT 60  'DENSITY:', L_S_TABLSIZE-PERCENT, '%'.

    ENDLOOP.

  ENDLOOP.

  ULINE.

  " Cubes with no data stored on IT1_CUBE

  LOOP AT IT1_CUBE INTO WA_CUBE.

    WRITE : AT / 'INFOCUBE ', AT 20 WA_CUBE, AT 40 ' IS EMPTY'.

  ENDLOOP.

Explanation on the code

Given below statement declares “select-options”  to get the input from the user

" Get the list of Infocubes to be tested for its Size/Design

SELECTION-SCREEN BEGIN OF BLOCK B1.

SELECT-OPTIONS : LS_CUBE FOR RSDCUBEV-INFOCUBE.

SELECTION-SCREEN END OF BLOCK B1.

We need to provide F4 help for the “select-options” and hence we create the below statements. We must provide the list of active cubes for the user to select. The lists of active cubes are present in the SAP BW system in the table RSDCUBE. We take those cubes and put them in internal table IT_CUBE. I have created a structure ZINFOCUBE as given below.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR LS_CUBE-LOW. " F4 help for the select options

  PERFORM LS_CUBE_F4_HELP.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR LS_CUBE-HIGH. " F4 help for the select options

  PERFORM LS_CUBE_F4_HELP.

*&---------------------------------------------------------------------*

*&      Form  LS_CUBE_F4_HELP

*&---------------------------------------------------------------------*

*       text

*----------------------------------------------------------------------*

FORM LS_CUBE_F4_HELP.

  SELECT DISTINCT INFOCUBE FROM RSDCUBE INTO TABLE IT_CUBE WHERE OBJVERS = 'A'.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'

    EXPORTING

      DDIC_STRUCTURE         = 'ZINFOCUBE'

      RETFIELD               = 'INFOCUBE'

*     PVALKEY                = ' '

      DYNPPROG               =  SY-REPID

      DYNPNR                 =  SY-DYNNR

      DYNPROFIELD            = 'LS_CUBE'

*     STEPL                  = 0

*     WINDOW_TITLE           =

*     VALUE                  = ' '

      VALUE_ORG              = 'S'

*     MULTIPLE_CHOICE        = ' '

*     DISPLAY                = ' '

*    CALLBACK_PROGRAM       = ' '

*     CALLBACK_FORM          = ' '

*     CALLBACK_METHOD        =

*     MARK_TAB               =

* IMPORTING

*     USER_RESET             =

      TABLES

      VALUE_TAB              = IT_CUBE

*     FIELD_TAB              =

*     RETURN_TAB             =

*     DYNPFLD_MAPPING        =

EXCEPTIONS

       PARAMETER_ERROR        = 1

       NO_VALUES_FOUND        = 2

       OTHERS                 = 3

            .

  IF SY-SUBRC <> 0.

* Implement suitable error handling here

  ENDIF.


"LS_CUBE_F4_HELP

User can select single cube or multiple single cubes or range of cubes. So we have the below select statement to pick the list of cubes given in the select-options.

START-OF-SELECTION.

CLEAR : IT_CUBE[].

SELECT DISTINCT

INFOCUBE

FROM

RSDCUBE " Cube table

INTO TABLE IT_CUBE

WHERE

OBJVERS = 'A'

AND

INFOCUBE IN LS_CUBE. " IN operator

We  loop at the internal table IT_CUBE and call the FM RSDU_INFOCUBE_TABLE_SIZES to determine  its size. In case if the cube is empty it is captured in the internal table IT1_CUBE.

LOOP AT IT_CUBE INTO WA_CUBE.

* get cube layout information

    CALL FUNCTION 'RSDU_INFOCUBE_TABLE_SIZES'

      EXPORTING

I_INFOCUBE   = WA_CUBE     " Technical name of the cube

        I_CHECK      = RS_C_TRUE

      IMPORTING

E_FACTROWS   = L_FACTROWS

        E_T_TABLSIZE = L_T_TABLSIZE

        E_DENSITY    = L_DENSITY.

* give details only for non-empty cubes

    IF L_FACTROWS = 0.

      APPEND WA_CUBE TO IT1_CUBE.   " Empty cube with no data

      CONTINUE.

    ENDIF.

We print the details of the empty cubes.

  " Cubes with no data stored on IT1_CUBE

  LOOP AT IT1_CUBE INTO WA_CUBE.

    WRITE : AT / 'INFOCUBE ', AT 20 WA_CUBE, AT 40 ' IS EMPTY'.

  ENDLOOP.

Remaining code is unaltered copy of the SAP_INFOCUBE_DESIGNS.

Some times  even if you run the standard program, "SAP_INFOCUBE_DESIGNS" for few cubes the result will not be shown, because it is not just enough to load the data we need to maintain the statistics for the Infocube too. Right click the cube --> Manage ----> Performance ---> Build Statistics.

After building statistics immediately the program does not recognize the cube 🙂 After sometimes it does recognize the cube!! Strange but true.

Related Content

For more information visit the webpage SAP Business Warehouse – SAP Help Portal Page


Labels in this area