U rgent:"i want to know the work of this "conversion routine".

Hi all,
In the domain of any field in the  database table there is one option called "conversion routine" just below to "output list".
i want to know the work of this "conversion routine".
can any one please tell me the practical use of this with  real time example.
good points will be rewarded for helpful answer.
thanks in advance
Message was edited by:
        tapu abap

Hi,
REPORT  ZTEST.
TYPES: UPC_YS_API_CHASEL_T TYPE STANDARD TABLE OF UPC_YS_API_CHASEL.
TYPES: UPC_YS_API_CHAPRO_T TYPE STANDARD TABLE OF UPC_YS_API_CHAPRO.
TYPES: UPC_YS_API_KYFPRO_T TYPE STANDARD TABLE OF UPC_YS_API_KYFPRO.
CLASS CL_ABAP_CONV_ROUTINE DEFINITION DEFERRED.
TYPES: BEGIN OF CONVEXIT_LOOKUP_S,
        CONVEXIT TYPE LVC_S_FCAT-CONVEXIT,
        O_CONVEXIT TYPE REF TO CL_ABAP_CONV_ROUTINE,
       END OF CONVEXIT_LOOKUP_S.
TYPES: CONVEXIT_LOOKUP_T TYPE HASHED TABLE OF CONVEXIT_LOOKUP_S
        WITH UNIQUE KEY CONVEXIT.
TYPES: FIELDCATALOG_UNIQUE TYPE HASHED TABLE OF LVC_S_FCAT
         WITH UNIQUE KEY FIELDNAME.
TYPES: BEGIN OF PLAN_AREA_STRUCT_CACHE,
         PLANNING_AREA TYPE UPC_AREA-AREA,
         FIELDCATALOG TYPE LVC_T_FCAT,
         CHARACTERISTICS TYPE ZUPC_YS_API_CHAPRO_T,
         KEYFIGURES TYPE ZUPC_YS_API_KYFPRO_T,
         TRANSACTION_DATA_TABLE TYPE REF TO DATA,
       END OF PLAN_AREA_STRUCT_CACHE.
TYPES: PLAN_AREA_STRUCT_CACHE_T TYPE SORTED TABLE OF
PLAN_AREA_STRUCT_CACHE WITH UNIQUE KEY PLANNING_AREA.
*       CLASS CX_DATE_CONVERSION DEFINITION
CLASS CX_DATE_CONVERSION DEFINITION INHERITING FROM CX_DYNAMIC_CHECK.
  PUBLIC SECTION.
    DATA: MESSAGE TYPE STRING.
    METHODS CONSTRUCTOR
      IMPORTING MESSAGE TYPE STRING.
ENDCLASS.                   "CX_DATE_CONVERSION DEFINITION
*       CLASS CX_DATE_CONVERSION IMPLEMENTATION
CLASS CX_DATE_CONVERSION IMPLEMENTATION.
  METHOD CONSTRUCTOR.
    SUPER->CONSTRUCTOR( ).
    ME->MESSAGE = MESSAGE.
  ENDMETHOD.                   "CONSTRUCTOR
ENDCLASS.                   "CX_DATE_CONVERSION IMPLEMENTATION
*       CLASS CL_ABAP_CONV_ROUTINE DEFINITION
CLASS CL_ABAP_CONV_ROUTINE DEFINITION.
  PUBLIC SECTION.
    METHODS APPLY_CONV_INPUT
      IMPORTING
        INPUT TYPE ANY
      EXPORTING
        OUTPUT TYPE ANY .
    METHODS APPLY_CONV_OUTPUT
      IMPORTING
        INPUT TYPE ANY
      EXPORTING
        OUTPUT TYPE ANY .
    METHODS GET_CONVEXIT
      RETURNING
        VALUE(CONVEXIT) TYPE CONVEXIT .
    METHODS SET_CONVEXIT
      IMPORTING
        VALUE(CONVEXIT) TYPE CONVEXIT .
    METHODS CONSTRUCTOR
      IMPORTING
        CONVEXIT TYPE CONVEXIT OPTIONAL .
  PRIVATE SECTION.
    DATA CONVEXIT TYPE CONVEXIT .
    METHODS GET_INPUT_CONVERSION_EXIT
      RETURNING
        VALUE(FUNCTION_MODULE_NAME) TYPE STRING .
    METHODS GET_OUTPUT_CONVERSION_EXIT
      RETURNING
        VALUE(FUNCTION_MODULE_NAME) TYPE STRING .
ENDCLASS.                   "CL_ABAP_CONV_ROUTINE DEFINITION
*       CLASS CL_ABAP_CONV_ROUTINE IMPLEMENTATION
CLASS CL_ABAP_CONV_ROUTINE IMPLEMENTATION.
  METHOD APPLY_CONV_INPUT .
    DATA: FUNCT_MOD TYPE STRING.
    IF NOT ME->CONVEXIT IS INITIAL.
* Only apply conversion routine if it exits
      CALL METHOD ME->GET_INPUT_CONVERSION_EXIT
        RECEIVING
          FUNCTION_MODULE_NAME = FUNCT_MOD.
      CALL FUNCTION FUNCT_MOD
        EXPORTING
          INPUT  = INPUT
        IMPORTING
          OUTPUT = OUTPUT.
    ELSE.
* Can only hope this works
      OUTPUT = INPUT.
    ENDIF.
  ENDMETHOD.                   "APPLY_CONV_INPUT
  METHOD APPLY_CONV_OUTPUT.
    DATA: FUNCT_MOD TYPE STRING.
    IF NOT ME->CONVEXIT IS INITIAL.
* Only apply conversion routine if it exits
      CALL METHOD ME->GET_OUTPUT_CONVERSION_EXIT
        RECEIVING
          FUNCTION_MODULE_NAME = FUNCT_MOD.
      CALL FUNCTION FUNCT_MOD
        EXPORTING
          INPUT  = INPUT
        IMPORTING
          OUTPUT = OUTPUT.
    ELSE.
* Can only hope this works
      OUTPUT = INPUT.
    ENDIF.
  ENDMETHOD.                   "APPLY_CONV_OUTPUT
  METHOD CONSTRUCTOR.
    IF CONVEXIT IS SUPPLIED.
      CALL METHOD ME->SET_CONVEXIT
        EXPORTING
          CONVEXIT = CONVEXIT.
    ENDIF.
  ENDMETHOD.                   "CONSTRUCTOR
  METHOD GET_CONVEXIT.
    CONVEXIT = ME->CONVEXIT.
  ENDMETHOD.                   "GET_CONVEXIT
  METHOD SET_CONVEXIT.
    ME->CONVEXIT = CONVEXIT.
  ENDMETHOD.                   "SET_CONVEXIT
  METHOD GET_INPUT_CONVERSION_EXIT.
* Generate standard conversion routines for input conversion
* This is based on standard SAP ABAP help documentation
    CONCATENATE 'CONVERSION_EXIT_' ME->CONVEXIT
      '_INPUT' INTO FUNCTION_MODULE_NAME.
  ENDMETHOD.                   "GET_INPUT_CONVERSION_EXIT
  METHOD GET_OUTPUT_CONVERSION_EXIT.
* Generate standard conversion routines for output conversion
* This is based on standard SAP ABAP help documentation
    CONCATENATE 'CONVERSION_EXIT_' ME->CONVEXIT
      '_OUTPUT' INTO FUNCTION_MODULE_NAME.
  ENDMETHOD.                   "GET_OUTPUT_CONVERSION_EXIT
ENDCLASS.                   "CL_ABAP_CONV_ROUTINE IMPLEMENTATION
*       CLASS CL_ABAP_CONV_DECIMAL DEFINITION
CLASS CL_ABAP_CONV_DECIMAL DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA SAP_DECIMAL_FMT_SPACE TYPE USR01-DCPFM VALUE ' '
READ-ONLY .
    CLASS-DATA SAP_DECIMAL_FMT_X TYPE USR01-DCPFM VALUE 'X' READ-ONLY .
    CLASS-DATA SAP_DECIMAL_FMT_Y TYPE USR01-DCPFM VALUE 'Y' READ-ONLY .
    CLASS-DATA USER_DECIMAL_FORMAT TYPE USR01-DCPFM READ-ONLY .
    CLASS-METHODS CLASS_CONSTRUCTOR .
    CLASS-METHODS CONVERT_DECIMAL_EXT2INT
      IMPORTING
        EXTERNAL_VALUE TYPE STRING
      CHANGING
        INTERNAL_VALUE TYPE P
      RAISING
        CX_SY_CONVERSION_OVERFLOW
        CX_SY_CONVERSION_NO_NUMBER .
    CLASS-METHODS CONVERT_DECIMAL_INT2EXT
      IMPORTING
        INTERNAL_VALUE TYPE P
      CHANGING
        EXTERNAL_VALUE TYPE STRING .
ENDCLASS.                   "CL_ABAP_CONV_DECIMAL DEFINITION
*       CLASS CL_ABAP_CONV_DECIMAL IMPLEMENTATION
CLASS CL_ABAP_CONV_DECIMAL IMPLEMENTATION.
  METHOD CLASS_CONSTRUCTOR .
    SELECT SINGLE DCPFM FROM USR01 INTO USER_DECIMAL_FORMAT
      WHERE BNAME = SY-UNAME.
  ENDMETHOD.                   "CLASS_CONSTRUCTOR
  METHOD CONVERT_DECIMAL_EXT2INT .
* THE GOAL IS TO GET THIS INTO INTERNAL FORMAT WHICH IS EQUIVALENT TO
* EX. NNNNN.NN
    DATA: NUM_STR TYPE STRING.
    NUM_STR = EXTERNAL_VALUE.
    CONDENSE NUM_STR NO-GAPS.
    CASE USER_DECIMAL_FORMAT.
      WHEN SAP_DECIMAL_FMT_X.
        REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH SPACE.
        CONDENSE NUM_STR NO-GAPS.
      WHEN SAP_DECIMAL_FMT_SPACE.
        REPLACE ALL OCCURRENCES OF '.' IN NUM_STR WITH SPACE.
        CONDENSE NUM_STR NO-GAPS.
        REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH '.'.
      WHEN SAP_DECIMAL_FMT_Y.
        REPLACE ALL OCCURRENCES OF ',' IN NUM_STR WITH '.'.
    ENDCASE.
    INTERNAL_VALUE = NUM_STR.
  ENDMETHOD.                   "CONVERT_DECIMAL_EXT2INT
  METHOD CONVERT_DECIMAL_INT2EXT .
* THE GOAL IS TO GET THIS INTO EXTERNAL FORMAT WHICH IS BASED ON SAP
* USER PROFILE SETTINGS
* CURRENT INPUT FORMAT EQUIVALENT IS EX. NNNNN.NN
    DATA: TEMP(70) TYPE C.
    WRITE INTERNAL_VALUE TO TEMP.
    EXTERNAL_VALUE = TEMP.
  ENDMETHOD.                   "CONVERT_DECIMAL_INT2EXT
ENDCLASS.                   "CL_ABAP_CONV_DECIMAL IMPLEMENTATION
*       CLASS CL_ABAP_CONV_DATE DEFINITION
CLASS CL_ABAP_CONV_DATE DEFINITION.
  PUBLIC SECTION.
    CLASS-DATA SAP_DATE_FMT_5 TYPE USR01-DATFM VALUE '5' READ-ONLY .
    CLASS-DATA SAP_DATE_FMT_6 TYPE USR01-DATFM VALUE '6' READ-ONLY .
    CLASS-DATA SAP_DATE_FMT_3 TYPE USR01-DATFM VALUE '3' READ-ONLY .
    CLASS-DATA SAP_DATE_FMT_4 TYPE USR01-DATFM VALUE '4' READ-ONLY .
    CLASS-DATA SAP_DATE_FMT_1 TYPE USR01-DATFM VALUE '1' READ-ONLY .
    CLASS-DATA SAP_DATE_FMT_2 TYPE USR01-DATFM VALUE '2' READ-ONLY .
    CLASS-DATA USER_DATE_FORMAT TYPE USR01-DATFM READ-ONLY .
    CLASS-METHODS CONVERT_DATE_EXT2INT
      IMPORTING
        EXTERNAL_DATE TYPE STRING
      RETURNING
        VALUE(INTERNAL_DATE) TYPE D
      RAISING
        CX_DATE_CONVERSION .
    CLASS-METHODS CONVERT_DATE_INT2EXT
      IMPORTING
        INTERNAL_DATE TYPE D
      RETURNING
        VALUE(EXTERNAL_DATE) TYPE STRING .
    CLASS-METHODS CLASS_CONSTRUCTOR .
ENDCLASS.                   "CL_ABAP_CONV_DATE DEFINITION
*       CLASS CL_ABAP_CONV_DATE IMPLEMENTATION
CLASS CL_ABAP_CONV_DATE IMPLEMENTATION.
  METHOD CLASS_CONSTRUCTOR.
    SELECT SINGLE DATFM FROM USR01 INTO USER_DATE_FORMAT
      WHERE BNAME = SY-UNAME.
  ENDMETHOD.                   "CLASS_CONSTRUCTOR
  METHOD CONVERT_DATE_EXT2INT.
*  HERE ARE THE CURRENT DATE FORMATS FROM SAP GUI
*1 DD.MM.YYYY
*2 MM/DD/YYYY
*3 MM-DD-YYYY
*4 YYYY.MM.DD
*5 YYYY/MM/DD
*6 YYYY-MM-DD
    DATA: PERMITTED_NUMBERS TYPE STRING VALUE '0123456789'.
    DATA: TEMP_DATE TYPE D.
    DATA: MESSAGE_VALID_NUMERICS TYPE STRING
      VALUE 'Only Numerics (0-9) are acceptable.'.
    DATA: MESSAGE_VALID_FORMAT TYPE STRING
      VALUE 'Invalid date format.'.
    IF STRLEN( EXTERNAL_DATE ) = 10.
      CASE USER_DATE_FORMAT.
        WHEN SAP_DATE_FMT_1.
          IF EXTERNAL_DATE+2(1) = '.' AND EXTERNAL_DATE+5(1) = '.'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+3(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+0(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
        WHEN SAP_DATE_FMT_2.
          IF EXTERNAL_DATE+2(1) = '/' AND EXTERNAL_DATE+5(1) = '/'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+0(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+3(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS. " ISSUE
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
        WHEN SAP_DATE_FMT_3.
          IF EXTERNAL_DATE+2(1) = '-' AND EXTERNAL_DATE+5(1) = '-'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+6(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+0(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+3(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
        WHEN SAP_DATE_FMT_4.
          IF EXTERNAL_DATE+4(1) = '.' AND EXTERNAL_DATE+7(1) = '.'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
        WHEN SAP_DATE_FMT_5.
          IF EXTERNAL_DATE+4(1) = '/' AND EXTERNAL_DATE+7(1) = '/'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
        WHEN SAP_DATE_FMT_6.
          IF EXTERNAL_DATE+4(1) = '-' AND EXTERNAL_DATE+7(1) = '-'.
            TEMP_DATE+0(4) = EXTERNAL_DATE+0(4). " YEAR
            TEMP_DATE+4(2) = EXTERNAL_DATE+5(2). " MONTH
            TEMP_DATE+6(2) = EXTERNAL_DATE+8(2). " DAY
            IF NOT ( TEMP_DATE CO PERMITTED_NUMBERS ).
              RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_NUMERICS." ISSUE ERROR
            ENDIF.
          ELSE.
            RAISE EXCEPTION TYPE CX_DATE_CONVERSION
                EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
          ENDIF.
      ENDCASE.
      INTERNAL_DATE = TEMP_DATE.
    ELSEIF STRLEN( EXTERNAL_DATE ) = 8.
* ASSUME NORMAL DATE FORMAT (YYYYMMDD)
      INTERNAL_DATE = EXTERNAL_DATE.
    ELSE.
      RAISE EXCEPTION TYPE CX_DATE_CONVERSION
        EXPORTING MESSAGE = MESSAGE_VALID_FORMAT. " ISSUE ERROR
    ENDIF.
  ENDMETHOD.                   "CONVERT_DATE_EXT2INT
  METHOD CONVERT_DATE_INT2EXT.
*  HERE ARE THE CURRENT DATE FORMATS FROM SAP GUI
*1     DD.MM.YYYY
*2     MM/DD/YYYY
*3     MM-DD-YYYY
*4     YYYY.MM.DD
*5     YYYY/MM/DD
*6     YYYY-MM-DD
    DATA: EXTERNAL_DATE_TEMP(10) TYPE C.
    WRITE INTERNAL_DATE TO EXTERNAL_DATE_TEMP.
    EXTERNAL_DATE = EXTERNAL_DATE_TEMP.
  ENDMETHOD.                   "CONVERT_DATE_INT2EXT
ENDCLASS.                   "CL_ABAP_CONV_DATE IMPLEMENTATION
*       CLASS CX_SEM_BPS_DATA_ACCESS DEFINITION
CLASS CX_SEM_BPS_DATA_ACCESS DEFINITION INHERITING FROM CX_DYNAMIC_CHECK
  PUBLIC SECTION.
    DATA: MESSAGE TYPE STRING.
    DATA: RETURN_T TYPE BAPIRET2_T.
    METHODS CONSTRUCTOR
      IMPORTING
        MESSAGE TYPE STRING
        RETURN_T TYPE BAPIRET2_T OPTIONAL.
ENDCLASS.                   "CX_SEM_BPS_DATA_ACCESS DEFINITION
*       CLASS CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION
CLASS CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION.
  METHOD CONSTRUCTOR.
    SUPER->CONSTRUCTOR( ).
    ME->MESSAGE = MESSAGE.
    ME->RETURN_T = RETURN_T.
  ENDMETHOD.                   "CONSTRUCTOR
ENDCLASS.                   "CX_SEM_BPS_DATA_ACCESS IMPLEMENTATION
*       CLASS CL_SEMBPS_DATA_ACCESSOR DEFINITION
CLASS CL_SEMBPS_DATA_ACCESSOR DEFINITION.
  PUBLIC SECTION.
    DATA TRANSACTION_DATA TYPE REF TO DATA .
    CLASS-DATA C_LEVEL TYPE UPC_PLEVEL-PLEVEL VALUE 'ZLABAP' READ-ONLY .
    CLASS-DATA C_LAYOUT TYPE UPP_PARAM-PARAM VALUE 'ZMABAP' READ-ONLY .
    CLASS-DATA C_ADHOC_PACK TYPE UPC_PACKAGE-PPACKAGE VALUE '0-ADHOC'
READ-ONLY .
    CLASS-DATA C_MULTIPLAN_AREA TYPE UPC_YS_API_CHAPRO-CHANM VALUE
'_AREA_____' READ-ONLY .
    METHODS GET_INFOCUBE
      RETURNING
        VALUE(INFOCUBE) TYPE UPC_BW_AREA-INFOCUBE .
    METHODS GET_CHARACTERISTIC_SELECTIONS
      EXPORTING
        CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
    METHODS REFRESH
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    METHODS CONSTRUCTOR
      IMPORTING
        PLANNING_AREA TYPE UPC_AREA-AREA
        IT_FIELDCATALOG TYPE LVC_T_FCAT
        TRANSACTION_DATA_TABLE TYPE REF TO DATA
        CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    METHODS GET_PLANNING_AREA
      RETURNING
        VALUE(PLANNING_AREA) TYPE UPC_AREA-AREA .
    METHODS GET_CHARACTERISTICS
      EXPORTING
        CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T .
    METHODS GET_KEYFIGURES
      EXPORTING
        KEYFIGURES TYPE UPC_YS_API_KYFPRO_T .
    METHODS SAVE
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
  PRIVATE SECTION.
    DATA CONVEXIT_LOOKUP TYPE CONVEXIT_LOOKUP_T .
    DATA INFOCUBE TYPE UPC_BW_AREA-INFOCUBE .
    DATA IT_FIELDCATALOG TYPE FIELDCATALOG_UNIQUE .
    DATA PLANNING_AREA TYPE UPC_AREA-AREA .
    DATA CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T .
    DATA KEYFIGURES TYPE UPC_YS_API_KYFPRO_T .
    DATA CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
    DATA LAYOUT_COL_SPEC TYPE STANDARD TABLE OF UPC_YS_API_COL .
    CLASS-METHODS FORCE_ERROR_MESSAGE
      IMPORTING
        MESSAGE TYPE STRING OPTIONAL
        RETURN_STRUCT TYPE BAPIRET2 OPTIONAL
        RETURN_STRUCTS TYPE BAPIRET2_T OPTIONAL
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    CLASS-METHODS CHECK_MESSAGE
      IMPORTING
        E_SUBRC TYPE SY-SUBRC
        RETURN_STRUCT TYPE BAPIRET2
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    METHODS SET_CHARACTERISTIC_SELECTION
      IMPORTING
        CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T .
    METHODS SET_PLANNING_AREA
      IMPORTING
        PLANNING_AREA TYPE UPC_AREA-AREA
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    METHODS VALIDATE_PLANNING_OBJECTS
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    CLASS-METHODS CHECK_MESSAGES
      IMPORTING
        RETURN_STRUCTS TYPE BAPIRET2_T
        E_SUBRC TYPE SY-SUBRC
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    METHODS READ_DATA
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
ENDCLASS.                   "CL_SEMBPS_DATA_ACCESSOR DEFINITION
*       CLASS CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION
CLASS CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION.
  METHOD CONSTRUCTOR .
    DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
    DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
* BUILD CONVERSION EXITS AND FIELDCATALOG
    LOOP AT IT_FIELDCATALOG INTO WA_FIELDCATALOG.
      INSERT WA_FIELDCATALOG INTO TABLE ME->IT_FIELDCATALOG[].
      IF NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
        CLEAR CONVEXIT_WA.
        CONVEXIT_WA-CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
        CREATE OBJECT CONVEXIT_WA-O_CONVEXIT
            EXPORTING
              CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
        INSERT CONVEXIT_WA INTO TABLE ME->CONVEXIT_LOOKUP.
      ENDIF.
    ENDLOOP.
    CALL METHOD ME->SET_PLANNING_AREA
      EXPORTING
        PLANNING_AREA = PLANNING_AREA.
    CALL METHOD ME->SET_CHARACTERISTIC_SELECTION
      EXPORTING
        CHARACTERISTIC_SELECTION = CHARACTERISTIC_SELECTION.
* POINT TO TABLE CONTAINING TRANSACTION DATA
    ME->TRANSACTION_DATA = TRANSACTION_DATA_TABLE.
* READ DATA
    CALL METHOD ME->REFRESH.
  ENDMETHOD.                   "CONSTRUCTOR
  METHOD GET_CHARACTERISTICS .
    CHARACTERISTICS[] = ME->CHARACTERISTICS[].
  ENDMETHOD.                   "GET_CHARACTERISTICS
  METHOD GET_CHARACTERISTIC_SELECTIONS.
    CHARACTERISTIC_SELECTION[] = ME->CHARACTERISTIC_SELECTION[].
  ENDMETHOD.                   "GET_CHARACTERISTIC_SELECTIONS
  METHOD GET_INFOCUBE .
    INFOCUBE = ME->INFOCUBE.
  ENDMETHOD.                   "GET_INFOCUBE
  METHOD GET_KEYFIGURES .
    KEYFIGURES[] = ME->KEYFIGURES[].
  ENDMETHOD.                   "GET_KEYFIGURES
  METHOD GET_PLANNING_AREA .
    PLANNING_AREA = ME->PLANNING_AREA.
  ENDMETHOD.                   "GET_PLANNING_AREA
  METHOD REFRESH.
    CALL METHOD ME->READ_DATA.
  ENDMETHOD.                   "REFRESH
  METHOD SAVE .
    DATA: E_SUBRC TYPE SY-SUBRC.
    DATA: ES_RETURN TYPE BAPIRET2.
    DATA: CHARACTERISTICS_WA TYPE UPC_YS_API_CHAPRO.
    DATA: WA_REF TYPE REF TO DATA.
    DATA: ITK_ROW TYPE TABLE OF UPC_YS_API_ROW.
    DATA: ITK_ROW_WA TYPE UPC_YS_API_ROW.
    DATA: LAYOUT_COL_SPEC_WA TYPE UPC_YS_API_COL.
    DATA: ITK_DATA TYPE TABLE OF UPC_YS_API_DATA.
    DATA: ITK_DATA_WA TYPE UPC_YS_API_DATA.
    DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
    DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
    DATA: CONVERSION_EXIT TYPE STRING.
    DATA: KEYFIG TYPE STRING.
    DATA: DATE_CHAR TYPE STRING.
    DATA: MESSAGE TYPE STRING.
    CONSTANTS: FIND_FIELD_ERR TYPE STRING VALUE 'Unable to find field'.
    FIELD-SYMBOLS: <TD_FIELD> TYPE ANY.
    FIELD-SYMBOLS: <TD_WA> TYPE ANY.
    FIELD-SYMBOLS: <TD_TAB> TYPE STANDARD TABLE.
    ASSIGN ME->TRANSACTION_DATA->* TO <TD_TAB>.
    CREATE DATA WA_REF LIKE LINE OF <TD_TAB>.
    ASSIGN WA_REF->* TO <TD_WA>.
    CLEAR <TD_WA>.
    DATA: ROWC TYPE I.
    ROWC = 1.
    LOOP AT <TD_TAB> INTO <TD_WA>.
* FILL CHARACTERISTIC DATA
      LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTICS_WA.
        ASSIGN COMPONENT CHARACTERISTICS_WA-CHANM OF STRUCTURE <TD_WA>
          TO <TD_FIELD>.
        IF SY-SUBRC = 0.
          ITK_ROW_WA-ROW = ROWC.
          ITK_ROW_WA-CHANM = CHARACTERISTICS_WA-CHANM.
          CLEAR ITK_ROW_WA-CHAVLEXT.
* APPLY OUTPUT CONVERSION EXIT FOR SAP EXTERNAL TYPE
* ONLY APPLIES WHEN VALUE IS NOT UNASSIGNED ('#') MEANING INITIAL(ABAP)
* FOR EXTERNAL CONVERSION UNASSIGED ('#') IS JUST A BLANK
          IF NOT <TD_FIELD> IS INITIAL.
            READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
              WITH TABLE KEY FIELDNAME = ITK_ROW_WA-CHANM.
            IF SY-SUBRC = 0 AND NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
              DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
              READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
                WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
              CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
                EXPORTING
                  INPUT  = <TD_FIELD>
                IMPORTING
                  OUTPUT = <TD_FIELD>.
              ITK_ROW_WA-CHAVLEXT = <TD_FIELD>.
            ELSEIF SY-SUBRC = 0 AND WA_FIELDCATALOG-INTTYPE = 'D'.
* APPLY DATE CONVERSION TO EXTERNAL FORMAT BASED ON USER PROFILE
              CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
                EXPORTING
                  INTERNAL_DATE = <TD_FIELD>
                RECEIVING
                  EXTERNAL_DATE = DATE_CHAR.
              ITK_ROW_WA-CHAVLEXT = DATE_CHAR.
            ELSE.
              ITK_ROW_WA-CHAVLEXT = <TD_FIELD>.
            ENDIF.
          ENDIF.
          APPEND ITK_ROW_WA TO ITK_ROW.
        ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
          CONCATENATE FIND_FIELD_ERR CHARACTERISTICS_WA-CHANM
        INTO MESSAGE.
          CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
            EXPORTING
              MESSAGE = MESSAGE.
        ENDIF.
      ENDLOOP.
* FILL KEY FIGURE DATA
      LOOP AT ME->LAYOUT_COL_SPEC INTO LAYOUT_COL_SPEC_WA.
        ASSIGN COMPONENT LAYOUT_COL_SPEC_WA-CHAVLEXT
          OF STRUCTURE <TD_WA> TO <TD_FIELD>.
        IF SY-SUBRC = 0.
          ITK_DATA_WA-ROW = ROWC.
          ITK_DATA_WA-COL = LAYOUT_COL_SPEC_WA-COL.
          READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
            WITH TABLE KEY FIELDNAME = LAYOUT_COL_SPEC_WA-CHAVLEXT.
          IF WA_FIELDCATALOG-INTTYPE = 'P'.
* MUST CONVERT TO EXTERNAL FORMAT FOR DECIMALS
            CALL METHOD CL_ABAP_CONV_DECIMAL=>CONVERT_DECIMAL_INT2EXT
              EXPORTING
                INTERNAL_VALUE = <TD_FIELD>
              CHANGING
                EXTERNAL_VALUE = KEYFIG.
          ELSEIF WA_FIELDCATALOG-INTTYPE = 'F'
            OR WA_FIELDCATALOG-INTTYPE = 'I'.
            KEYFIG = <TD_FIELD>.
          ENDIF.
          ITK_DATA_WA-VALUE = KEYFIG.
          APPEND ITK_DATA_WA TO ITK_DATA.
        ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
          CONCATENATE FIND_FIELD_ERR LAYOUT_COL_SPEC_WA-CHAVLEXT
            INTO MESSAGE.
          CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
            EXPORTING
              MESSAGE = MESSAGE.
        ENDIF.
      ENDLOOP.
      ROWC = ROWC + 1.
    ENDLOOP.
* SET ADHOC PACKAGE SELECTIONS
    CALL FUNCTION 'API_SEMBPS_ADHOCPACKAGE_SET'
      EXPORTING
        I_AREA     = ME->PLANNING_AREA
        I_PLEVEL   = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
      IMPORTING
        E_SUBRC    = E_SUBRC
        ES_RETURN  = ES_RETURN
      TABLES
        ITK_CHASEL = CHARACTERISTIC_SELECTION.
* THROW EXCEPTIONS IF NECESSARY
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
    CALL FUNCTION 'API_SEMBPS_SETDATA'
      EXPORTING
        I_AREA     = ME->PLANNING_AREA
        I_PLEVEL   = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
        I_PACKAGE  = CL_SEMBPS_DATA_ACCESSOR=>C_ADHOC_PACK
        I_LAYOUT   = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
      IMPORTING
        E_SUBRC    = E_SUBRC
      TABLES
        ITK_ROW    = ITK_ROW
        ITK_DATA   = ITK_DATA
        ETK_RETURN = ETK_RETURN.
* THROW EXCEPTIONS IF NECESSARY
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
      EXPORTING
        E_SUBRC        = E_SUBRC
        RETURN_STRUCTS = ETK_RETURN.
* SAVE THE DATA INTO THE CUBE
    CALL FUNCTION 'API_SEMBPS_POST'
      IMPORTING
        E_SUBRC   = E_SUBRC
        ES_RETURN = ES_RETURN.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
* CLEAR SEM BPS DATA BUFFER AS WEIRD BEHAVIOR MAY OCCUR IF
* NOT CLEARED WHETHER IF SUCCESSFUL OR NOT
    CALL FUNCTION 'API_SEMBPS_REFRESH'
      IMPORTING
        E_SUBRC   = E_SUBRC
        ES_RETURN = ES_RETURN.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
  ENDMETHOD.                   "SAVE
  METHOD CHECK_MESSAGE .
    DATA: RETURN_T TYPE BAPIRET2_T.
    APPEND RETURN_STRUCT TO RETURN_T.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
      EXPORTING
        RETURN_STRUCTS = RETURN_T
        E_SUBRC        = E_SUBRC.
  ENDMETHOD.                   "CHECK_MESSAGE
  METHOD CHECK_MESSAGES .
    IF E_SUBRC <> 0.
      DATA: MESSAGE TYPE STRING.
      DATA: RETURN TYPE BAPIRET2.
      READ TABLE RETURN_STRUCTS INTO RETURN WITH KEY TYPE = 'E'.
      IF SY-SUBRC <> 0.
        READ TABLE RETURN_STRUCTS INTO RETURN WITH KEY TYPE = 'A'.
      ENDIF.
      MESSAGE = RETURN-MESSAGE.
      RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
        EXPORTING
          MESSAGE = MESSAGE
          RETURN_T = RETURN_STRUCTS.
    ENDIF.
  ENDMETHOD.                   "CHECK_MESSAGES
  METHOD FORCE_ERROR_MESSAGE.
    DATA: RC TYPE SY-SUBRC VALUE 4.
    IF MESSAGE IS SUPPLIED.
      DATA: RETURN TYPE BAPIRET2.
      RETURN-TYPE = 'E'.
      RETURN-MESSAGE = MESSAGE.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
        EXPORTING
          RETURN_STRUCT = RETURN
          E_SUBRC       = RC.
    ENDIF.
    IF RETURN_STRUCT IS SUPPLIED.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
        EXPORTING
          RETURN_STRUCT = RETURN_STRUCT
          E_SUBRC       = RC.
    ENDIF.
    IF RETURN_STRUCTS IS SUPPLIED.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
        EXPORTING
          RETURN_STRUCTS = RETURN_STRUCTS
          E_SUBRC        = RC.
    ENDIF.
  ENDMETHOD.                   "FORCE_ERROR_MESSAGE
  METHOD READ_DATA .
    DATA: CHAR_DATA TYPE TABLE OF UPC_YS_API_ROW.
    DATA: KEYFIG_DATA TYPE TABLE OF UPC_YS_API_DATA.
    DATA: ETK_ROW_WA TYPE UPC_YS_API_ROW.
    DATA: ETK_COL TYPE TABLE OF UPC_YS_API_COL.
    DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
    DATA: KEYFIGURES_WA TYPE UPC_YS_API_KYFPRO.
    DATA: E_SUBRC TYPE SY-SUBRC.
    DATA: ES_RETURN TYPE BAPIRET2.
    DATA: ETK_COL_WA TYPE UPC_YS_API_COL.
    DATA: WA_REF TYPE REF TO DATA.
    DATA: HAS_DATA TYPE BOOLEAN.
    DATA: KEYFIG_DATA_WA TYPE UPC_YS_API_DATA.
    DATA: LINE1 TYPE I.
    DATA: LINE2 TYPE I.
    DATA: MESSAGE TYPE STRING.
    CONSTANTS: FIND_FIELD_ERR TYPE STRING VALUE 'Unable to find field '.
    FIELD-SYMBOLS: <TD_FIELD> TYPE ANY.
    FIELD-SYMBOLS: <TD_WA> TYPE ANY.
    FIELD-SYMBOLS: <TD_TAB> TYPE STANDARD TABLE.
    CALL FUNCTION 'API_SEMBPS_ADHOCPACKAGE_SET'
      EXPORTING
        I_AREA     = ME->PLANNING_AREA
        I_PLEVEL   = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
      IMPORTING
        E_SUBRC    = E_SUBRC
        ES_RETURN  = ES_RETURN
      TABLES
        ITK_CHASEL = ME->CHARACTERISTIC_SELECTION.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
    CALL FUNCTION 'API_SEMBPS_GETDATA'
      EXPORTING
        I_AREA      = ME->PLANNING_AREA
        I_PLEVEL    = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
        I_PACKAGE   = CL_SEMBPS_DATA_ACCESSOR=>C_ADHOC_PACK
        I_LAYOUT    = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
        I_READ_ONLY = 'X'
      IMPORTING
        E_SUBRC     = E_SUBRC
      TABLES
        ETK_ROW     = CHAR_DATA
        ETK_COL     = ETK_COL
        ETK_DATA    = KEYFIG_DATA
        ETK_RETURN  = ETK_RETURN.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
      EXPORTING
        E_SUBRC        = E_SUBRC
        RETURN_STRUCTS = ETK_RETURN.
* SET LAYOUT COLUMN SPECIFICATION
    ME->LAYOUT_COL_SPEC[] = ETK_COL[].
* CHECK TO SEE IF THE COLUMN SPEC CONTAINS ALL KEY FIGURES REQUIRED
* THIS WOULD GUARANTEE THAT ALL THE KEY FIGURES PRESENT IN THE CUBE
* ARE ALSO IN THE LAYOUT
    DESCRIBE TABLE ME->KEYFIGURES LINES LINE1.
    DESCRIBE TABLE ME->LAYOUT_COL_SPEC LINES LINE2.
    IF LINE1 <> LINE2.
      LOOP AT ME->KEYFIGURES INTO KEYFIGURES_WA.
        READ TABLE ME->LAYOUT_COL_SPEC
          WITH KEY CHAVLEXT = KEYFIGURES_WA-KYFNM
          TRANSPORTING NO FIELDS.
        IF SY-SUBRC <> 0.
          CLEAR ES_RETURN.
          ES_RETURN-TYPE = 4.
          CONCATENATE 'Layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
            ' is missing keyfigure: ' KEYFIGURES_WA-KYFNM
            INTO ES_RETURN-MESSAGE.
          APPEND ES_RETURN TO ETK_RETURN.
        ENDIF.
      ENDLOOP.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
        EXPORTING
          RETURN_STRUCTS = ETK_RETURN.
    ENDIF.
* CLEAR TRANSACTION DATA IF ANY
    ASSIGN TRANSACTION_DATA->* TO <TD_TAB>.
    REFRESH <TD_TAB>.
    CREATE DATA WA_REF LIKE LINE OF <TD_TAB>.
    ASSIGN WA_REF->* TO <TD_WA>.
    DATA: PREV_ROWID TYPE UPC_YS_API_ROW-ROW VALUE 1.
    DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
    DATA: CONVERSION_EXIT TYPE STRING.
    DATA: DECIMAL_CONV TYPE STRING.
    DATA: DATE_CONV TYPE STRING.
    CLEAR <TD_WA>.
* SORT DATA
    SORT KEYFIG_DATA BY ROW.
    SORT ETK_COL BY COL.
    SORT CHAR_DATA BY ROW.
* INSERT ALL CHARACTERISTIC ROWS
    LOOP AT CHAR_DATA INTO ETK_ROW_WA.
      IF ETK_ROW_WA-CHANM IS NOT INITIAL.
        IF ETK_ROW_WA-ROW <> PREV_ROWID.
          CLEAR HAS_DATA.
          PREV_ROWID = ETK_ROW_WA-ROW.
          APPEND <TD_WA> TO <TD_TAB>.
          CLEAR <TD_WA>.
        ENDIF.
        HAS_DATA = 'X'.
        ASSIGN COMPONENT ETK_ROW_WA-CHANM OF STRUCTURE
          <TD_WA> TO <TD_FIELD>.
        IF SY-SUBRC = 0.
          CLEAR <TD_FIELD>.
          IF ETK_ROW_WA-CHAVLEXT <> '#'.
* APPLY INPUT CONVERSION EXIT FOR SAP INTERNAL DATA ELEMENTS
* ONLY APPLIES WHEN VALUE IS NOT UNASSIGNED ('#')
            READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
              WITH TABLE KEY FIELDNAME = ETK_ROW_WA-CHANM.
            IF SY-SUBRC = 0 AND NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
              <TD_FIELD> = ETK_ROW_WA-CHAVLEXT.
* APPLY INPUT CONVERSION EXIT IF ANY, CHECK INFOOBJECT RSD1 TRANSACTION
              DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
              READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
                WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
              CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_INPUT
                EXPORTING
                  INPUT  = <TD_FIELD>
                IMPORTING
                  OUTPUT = <TD_FIELD>.
            ELSEIF SY-SUBRC = 0 AND WA_FIELDCATALOG-INTTYPE = 'D'.
* APPLY DATE CONVERSION AS THERE IS NO COVERSION EXIT FOR DATES DUE TO
* SAPGUI DISPLAY FORMATS BASED ON USER PROFILES
              TRY.
                  DATE_CONV = ETK_ROW_WA-CHAVLEXT.
                  CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_EXT2INT
                    EXPORTING
                      EXTERNAL_DATE = DATE_CONV
                    RECEIVING
                      INTERNAL_DATE = <TD_FIELD>.
                CATCH CX_DATE_CONVERSION .
* THERE SHOULD BE NO DATE CONVERSION ERROR.
              ENDTRY.
            ELSE.
              <TD_FIELD> = ETK_ROW_WA-CHAVLEXT.
            ENDIF.
          ENDIF.
        ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
          CONCATENATE FIND_FIELD_ERR ETK_ROW_WA-CHANM
            INTO MESSAGE.
          CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
            EXPORTING
              MESSAGE = MESSAGE.
        ENDIF.
      ENDIF.
    ENDLOOP.
* APPEND THE LAST ROW
    IF HAS_DATA IS NOT INITIAL.
      APPEND <TD_WA> TO <TD_TAB>.
    ENDIF.
* INSERT ALL KEY FIGURES
    LOOP AT KEYFIG_DATA INTO KEYFIG_DATA_WA.
      READ TABLE <TD_TAB> INTO <TD_WA> INDEX KEYFIG_DATA_WA-ROW.
      IF SY-SUBRC <> 0.
* SUMMARY LINE WHICH INDICATES COMPLETION
        EXIT.
      ENDIF.
* AVAILABLE KEY FIGURES
      READ TABLE ETK_COL INTO ETK_COL_WA
        INDEX KEYFIG_DATA_WA-COL.
      ASSIGN COMPONENT ETK_COL_WA-CHAVLEXT OF STRUCTURE
        <TD_WA> TO <TD_FIELD>.
      IF SY-SUBRC = 0.
        READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
          WITH TABLE KEY FIELDNAME = ETK_COL_WA-CHAVLEXT.
        IF WA_FIELDCATALOG-INTTYPE = 'P'.
          DECIMAL_CONV = KEYFIG_DATA_WA-VALUE.
          CALL METHOD CL_ABAP_CONV_DECIMAL=>CONVERT_DECIMAL_EXT2INT
            EXPORTING
              EXTERNAL_VALUE = DECIMAL_CONV
            CHANGING
              INTERNAL_VALUE = <TD_FIELD>.
        ELSEIF WA_FIELDCATALOG-INTTYPE = 'F' OR
          WA_FIELDCATALOG-INTTYPE = 'I'.
          <TD_FIELD> = KEYFIG_DATA_WA-VALUE.
        ENDIF.
        MODIFY <TD_TAB> INDEX KEYFIG_DATA_WA-ROW FROM <TD_WA>
          TRANSPORTING (ETK_COL_WA-CHAVLEXT) .
      ELSE.
* FAILURE TO FIND THE FIELD IN THE POINTER WILL RESULT IN
* TRANSACTION DATA INTEGRITY ISSUES, WE SHOULD ERROR OUT
        CONCATENATE FIND_FIELD_ERR ETK_ROW_WA-CHANM
          INTO MESSAGE.
        CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
          EXPORTING
            MESSAGE = MESSAGE.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                   "READ_DATA
  METHOD SET_CHARACTERISTIC_SELECTION.
    DATA: CHARACTERISTIC_SELECTION_WA TYPE UPC_YS_API_CHASEL.
    DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
    DATA: CONV_EXIT TYPE STRING.
    DATA: DATE_CONV TYPE STRING.
    DATA: TEMP_DATE TYPE D.
* basically convert the selection criteria to external values and hold
* copy of that
    REFRESH ME->CHARACTERISTIC_SELECTION.
    LOOP AT CHARACTERISTIC_SELECTION INTO CHARACTERISTIC_SELECTION_WA.
      READ TABLE ME->IT_FIELDCATALOG INTO WA_FIELDCATALOG
        WITH TABLE KEY FIELDNAME = CHARACTERISTIC_SELECTION_WA-CHANM.
      IF SY-SUBRC = 0.
        IF NOT WA_FIELDCATALOG-CONVEXIT IS INITIAL.
          DATA: CONVEXIT_WA TYPE CONVEXIT_LOOKUP_S.
          READ TABLE ME->CONVEXIT_LOOKUP INTO CONVEXIT_WA
            WITH TABLE KEY CONVEXIT = WA_FIELDCATALOG-CONVEXIT.
          CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
            EXPORTING
              INPUT  = CHARACTERISTIC_SELECTION_WA-LOW
            IMPORTING
              OUTPUT = CHARACTERISTIC_SELECTION_WA-LOW.
          CALL METHOD CONVEXIT_WA-O_CONVEXIT->APPLY_CONV_OUTPUT
            EXPORTING
              INPUT  = CHARACTERISTIC_SELECTION_WA-HIGH
            IMPORTING
              OUTPUT = CHARACTERISTIC_SELECTION_WA-HIGH.
        ELSEIF WA_FIELDCATALOG-INTTYPE = 'D'.
* DATE TYPE CONVERSION BASED ON SAP GUI
          IF NOT CHARACTERISTIC_SELECTION_WA-LOW IS INITIAL.
            TEMP_DATE = CHARACTERISTIC_SELECTION_WA-LOW.
            CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
              EXPORTING
                INTERNAL_DATE = TEMP_DATE
              RECEIVING
                EXTERNAL_DATE = DATE_CONV.
            CHARACTERISTIC_SELECTION_WA-LOW = DATE_CONV.
          ENDIF.
          IF NOT CHARACTERISTIC_SELECTION_WA-HIGH IS INITIAL.
            TEMP_DATE = CHARACTERISTIC_SELECTION_WA-HIGH.
            CALL METHOD CL_ABAP_CONV_DATE=>CONVERT_DATE_INT2EXT
              EXPORTING
                INTERNAL_DATE = TEMP_DATE
              RECEIVING
                EXTERNAL_DATE = DATE_CONV.
            CHARACTERISTIC_SELECTION_WA-HIGH = DATE_CONV.
          ENDIF.
        ENDIF.
        APPEND CHARACTERISTIC_SELECTION_WA TO
ME->CHARACTERISTIC_SELECTION.
      ENDIF.
    ENDLOOP.
  ENDMETHOD.                   "SET_CHARACTERISTIC_SELECTION
  METHOD SET_PLANNING_AREA.
    DATA: ES_RETURN TYPE BAPIRET2.
    DATA: E_SUBRC TYPE SY-SUBRC.
* CHECK TO SEE OF PLANNING AREA IS A MULTI-PLANNING AREA
    CALL FUNCTION 'API_SEMBPS_AREA_GETDETAIL'
      EXPORTING
        I_AREA     = PLANNING_AREA
      IMPORTING
        E_SUBRC    = E_SUBRC
        ES_RETURN  = ES_RETURN
      TABLES
        ETK_CHAPRO = ME->CHARACTERISTICS
        ETK_KYFPRO = ME->KEYFIGURES.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
    ME->PLANNING_AREA = PLANNING_AREA.
* FIND THE INFOCUBE RELATED TO THE PLANNING AREA
    SELECT SINGLE INFOCUBE FROM UPC_BW_AREA INTO ME->INFOCUBE
      WHERE AREA = PLANNING_AREA.
    CALL METHOD ME->VALIDATE_PLANNING_OBJECTS.
  ENDMETHOD.                   "SET_PLANNING_AREA
  METHOD VALIDATE_PLANNING_OBJECTS.
    DATA: E_SUBRC TYPE SY-SUBRC.
    DATA: ES_RETURN TYPE BAPIRET2.
    DATA: ES_RETURN_T TYPE TABLE OF BAPIRET2.
    DATA: ETK_CHA TYPE TABLE OF UPC_YS_API_PLEVEL_CHA.
    DATA: ETK_CHA_WA TYPE UPC_YS_API_PLEVEL_CHA.
    DATA: CHARACTERISTIC_WA TYPE UPC_YS_API_CHAPRO.
    DATA: KEYFIGURES_WA TYPE UPC_YS_API_KYFPRO.
    DATA: ETK_CHASEL TYPE TABLE OF UPC_YS_API_CHASEL.
    DATA: ETK_KYF TYPE TABLE OF UPC_YS_KYF.
    DATA: ETK_RETURN TYPE TABLE OF BAPIRET2.
    DATA: LINES1 TYPE I.
    DATA: LINES2 TYPE I.
    DATA: E_LEADCOL_COMPL TYPE UPC_YS_API_INFO-LEADCOL_COMPL.
    DATA: ETK_HEAD_INFO TYPE TABLE OF UPC_YS_API_HEAD_INFO.
    DATA: ETK_ROW_INFO TYPE TABLE OF UPC_YS_API_ROW_INFO.
    DATA: ETK_COL_INFO TYPE TABLE OF UPC_YS_API_COL_INFO.
* CHECK TO SEE IF ITS A MULTI-PLANNING AREA
    READ TABLE ME->CHARACTERISTICS TRANSPORTING NO FIELDS
      WITH KEY CHANM = CL_SEMBPS_DATA_ACCESSOR=>C_MULTIPLAN_AREA.
* MULTI-PLANNING AREAS SHOULD NOT BE ACCEPTABLE TO THIS AS IT LEADS
* TO REFERENCING OF PLANNING AREAS IN ITS LEVEL/PACKAGES/LAYOUTS WHICH
* IS HARDER TO MAINTAIN
    IF SY-SUBRC = 0.
      REFRESH ME->CHARACTERISTICS.
      REFRESH ME->KEYFIGURES.
      CLEAR ES_RETURN.
      ES_RETURN-TYPE = 'E'.
      ES_RETURN-MESSAGE = 'DO NOT USE MULTI-PLANNING AREAS'.
      APPEND ES_RETURN TO ES_RETURN_T.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
        EXPORTING
          RETURN_STRUCTS = ES_RETURN_T.
    ENDIF.
* CHECK THE PLANNING LEVEL
    CALL FUNCTION 'API_SEMBPS_PLEVEL_GETDETAIL'
      EXPORTING
        I_AREA     = ME->PLANNING_AREA
        I_PLEVEL   = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
      IMPORTING
        E_SUBRC    = E_SUBRC
        ES_RETURN  = ES_RETURN
      TABLES
        ETK_CHA    = ETK_CHA
        ETK_CHASEL = ETK_CHASEL
        ETK_KYF    = ETK_KYF.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGE
      EXPORTING
        E_SUBRC       = E_SUBRC
        RETURN_STRUCT = ES_RETURN.
* CHECK TO SEE IF THE SAME NUMBER OF CHARACTERISTICS EXISTS IN LEVEL
    DESCRIBE TABLE ME->CHARACTERISTICS LINES LINES1.
    DESCRIBE TABLE ETK_CHA LINES LINES2.
    IF LINES1 <> LINES2.
* ERROR OUT THE MISSING CHARACTERISTICS FROM THE PLANNING LEVEL
      LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTIC_WA.
        READ TABLE ETK_CHA WITH KEY CHANM = CHARACTERISTIC_WA-CHANM
          TRANSPORTING NO FIELDS.
        IF SY-SUBRC <> 0.
          CLEAR ES_RETURN.
          ES_RETURN-TYPE = 'E'.
          CONCATENATE 'Missing characteristic ' CHARACTERISTIC_WA-CHANM
            ' from planning level ' CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
            INTO ES_RETURN-MESSAGE.
          APPEND ES_RETURN TO ES_RETURN_T.
        ENDIF.
      ENDLOOP.
    ENDIF.
* CHECK TO SEE IF EVERY CHARACTERISTIC IS AVAIABLE FOR SELECTION IN
* PACKAGE
    READ TABLE ETK_CHA WITH KEY PACKSEL = SPACE TRANSPORTING NO FIELDS.
    IF SY-SUBRC = 0.
* ERROR OUT THE CHARACTERISTICS THAT ARE NOT AVAILABLE FOR PACKAGE
* SELECTIONS
      LOOP AT ETK_CHA INTO ETK_CHA_WA WHERE PACKSEL = SPACE.
        CLEAR ES_RETURN.
        ES_RETURN-TYPE = 'E'.
        CONCATENATE 'Characteristic ' ETK_CHA_WA-CHANM
          ' needs to be available for selection in planning level '
          CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL INTO ES_RETURN-MESSAGE.
        APPEND ES_RETURN TO ES_RETURN_T.
      ENDLOOP.
    ENDIF.
* CHECK TO SEE IF THE SAME NUMBER OF KEYFIGURES EXISTS IN LEVEL
    DESCRIBE TABLE ME->KEYFIGURES LINES LINES1.
    DESCRIBE TABLE ETK_KYF LINES LINES2.
    IF LINES1 <> LINES2.
* ERROR OUT THE MISSING KEYFIGURES FROM THE PLANNING LEVEL
      LOOP AT ME->KEYFIGURES INTO KEYFIGURES_WA.
        READ TABLE ETK_KYF WITH KEY KYFNM = KEYFIGURES_WA-KYFNM
          TRANSPORTING NO FIELDS.
        IF SY-SUBRC <> 0.
          CLEAR ES_RETURN.
          ES_RETURN-TYPE = 'E'.
          CONCATENATE 'Missing keyfigure ' KEYFIGURES_WA-KYFNM
            ' from planning level ' CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
            INTO ES_RETURN-MESSAGE.
          APPEND ES_RETURN TO ES_RETURN_T.
        ENDIF.
      ENDLOOP.
    ENDIF.
* CHECK THE PLANNING LAYOUT
    CALL FUNCTION 'API_SEMBPS_LAYOUT_GETDETAIL'
      EXPORTING
        I_AREA          = ME->PLANNING_AREA
        I_PLEVEL        = CL_SEMBPS_DATA_ACCESSOR=>C_LEVEL
        I_LAYOUT        = CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
      IMPORTING
        E_SUBRC         = E_SUBRC
        E_LEADCOL_COMPL = E_LEADCOL_COMPL
      TABLES
        ETK_HEAD_INFO   = ETK_HEAD_INFO
        ETK_ROW_INFO    = ETK_ROW_INFO
        ETK_COL_INFO    = ETK_COL_INFO
        ETK_RETURN      = ETK_RETURN.
    CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>CHECK_MESSAGES
      EXPORTING
        E_SUBRC        = E_SUBRC
        RETURN_STRUCTS = ETK_RETURN.
* MAKE SURE THAT HEADER AREA IS EMPTY AS ALL THE DATA READ IS IN LEAD
* COLUMNS ONLY
    IF NOT ETK_HEAD_INFO[] IS INITIAL.
      CLEAR ES_RETURN.
      ES_RETURN-TYPE = 'E'.
      CONCATENATE 'Header area must be empty in layout '
        CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
        INTO ES_RETURN-MESSAGE.
      APPEND ES_RETURN TO ES_RETURN_T.
    ENDIF.
* MAKE SURE THAT LAYOUT TYPE IS KEY FIGURES IN DATA COLUMNS
    IF NOT E_LEADCOL_COMPL IS INITIAL.
      CLEAR ES_RETURN.
      ES_RETURN-TYPE = 'E'.
      CONCATENATE 'Layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
        ' must be of type "Key Figs in data columns"'
        INTO ES_RETURN-MESSAGE.
      APPEND ES_RETURN TO ES_RETURN_T.
    ENDIF.
* CHECK FOR THE SAME NUMBER OF CHARACTERISTICS IN LEAD COLUMNS OF LAYOUT
* AND IN PLANNING AREA
    DESCRIBE TABLE ME->CHARACTERISTICS LINES LINES1.
    DESCRIBE TABLE ETK_ROW_INFO LINES LINES2.
    IF LINES1 <> LINES2.
* ERROR OUT THE MISSING CHARACTERISTICS FROM THE PLANNING LEVEL
      LOOP AT ME->CHARACTERISTICS INTO CHARACTERISTIC_WA.
        READ TABLE ETK_ROW_INFO WITH KEY CHANM = CHARACTERISTIC_WA-CHANM
          TRANSPORTING NO FIELDS.
        IF SY-SUBRC <> 0.
          CLEAR ES_RETURN.
          ES_RETURN-TYPE = 'E'.
          CONCATENATE 'Missing characteristic ' CHARACTERISTIC_WA-CHANM
            ' from planning layout ' CL_SEMBPS_DATA_ACCESSOR=>C_LAYOUT
            INTO ES_RETURN-MESSAGE.
          APPEND ES_RETURN TO ES_RETURN_T.
        ENDIF.
      ENDLOOP.
    ENDIF.
* IF MESSAGES ARE AVAILBLE FROM CUSTOM CHECKS THROW EXCEPTION
    IF NOT ES_RETURN_T[] IS INITIAL.
      CALL METHOD CL_SEMBPS_DATA_ACCESSOR=>FORCE_ERROR_MESSAGE
        EXPORTING
          RETURN_STRUCTS = ES_RETURN_T.
    ENDIF.
  ENDMETHOD.                   "VALIDATE_PLANNING_OBJECTS
ENDCLASS.                   "CL_SEMBPS_DATA_ACCESSOR IMPLEMENTATION
*       CLASS CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION
CLASS CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS CREATE_DATA_ACCESSOR
      IMPORTING
        PLAN_AREA TYPE UPC_AREA-AREA
        CHARACTERISTIC_SELECTION TYPE UPC_YS_API_CHASEL_T
        DDIC_STRUCTURE_NAME TYPE DD02L-TABNAME OPTIONAL
      EXPORTING
        O_DATA_ACCESSOR TYPE REF TO CL_SEMBPS_DATA_ACCESSOR
      CHANGING
        TRANSACTION_DATA_TABLE TYPE STANDARD TABLE OPTIONAL
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
    CLASS-METHODS GET_PLANNING_AREA_SPECS
      IMPORTING
        PLANNING_AREA TYPE UPC_AREA-AREA
      EXPORTING
        TRANSACTION_DATA_STRUCT TYPE REF TO DATA
        KEYFIGURES TYPE UPC_YS_API_KYFPRO_T
        FIELDCATALOG TYPE LVC_T_FCAT
        CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
  PRIVATE SECTION.
    CLASS-DATA PLAN_AREA_CACHE TYPE PLAN_AREA_STRUCT_CACHE_T .
    CLASS-METHODS CREATE_DYNAMIC_STRUCTURE
      IMPORTING
        PLANNING_AREA TYPE UPC_AREA-AREA
      EXPORTING
        TRANSACTION_DATA_STRUCT TYPE REF TO DATA
        KEYFIGURES TYPE UPC_YS_API_KYFPRO_T
        FIELDCATALOG TYPE LVC_T_FCAT
        CHARACTERISTICS TYPE UPC_YS_API_CHAPRO_T
      RAISING
        CX_SEM_BPS_DATA_ACCESS .
ENDCLASS.                   "CL_SEMBPS_DATA_ACCESS_FACTORY DEFINITION
*       CLASS CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION
CLASS CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION.
  METHOD CREATE_DATA_ACCESSOR.
    DATA: TRANSACTION_DATA_STRUCT TYPE REF TO DATA.
    DATA: FIELDCATALOG TYPE LVC_T_FCAT.
    IF TRANSACTION_DATA_TABLE IS SUPPLIED
      AND DDIC_STRUCTURE_NAME IS SUPPLIED AND
      NOT DDIC_STRUCTURE_NAME IS INITIAL.
* RETRIEVE FIELD CATALOG OF THE DDIC STRUCTURE TO PROVIDE
      CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
        EXPORTING
          I_STRUCTURE_NAME       = DDIC_STRUCTURE_NAME
        CHANGING
          CT_FIELDCAT            = FIELDCATALOG
        EXCEPTIONS
          INCONSISTENT_INTERFACE = 1
          PROGRAM_ERROR          = 2
          OTHERS                 = 3.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
                WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
      GET REFERENCE OF TRANSACTION_DATA_TABLE INTO
TRANSACTION_DATA_STRUCT.
    ELSE.
* GENERATE INTERNAL TABLE AND ITS FIELD CATALOG DYNAMICALLY
      CALL METHOD CL_SEMBPS_DATA_ACCESS_FACTORY=>GET_PLANNING_AREA_SPECS
        EXPORTING
          PLANNING_AREA           = PLAN_AREA
        IMPORTING
          TRANSACTION_DATA_STRUCT = TRANSACTION_DATA_STRUCT
          FIELDCATALOG            = FIELDCATALOG.
    ENDIF.
* CREATE DATA ACCESSOR
    CREATE OBJECT O_DATA_ACCESSOR
      EXPORTING
        PLANNING_AREA = PLAN_AREA
        IT_FIELDCATALOG = FIELDCATALOG
        TRANSACTION_DATA_TABLE = TRANSACTION_DATA_STRUCT
        CHARACTERISTIC_SELECTION = CHARACTERISTIC_SELECTION.
  ENDMETHOD.                   "CREATE_DATA_ACCESSOR
  METHOD GET_PLANNING_AREA_SPECS.
    DATA: PLAN_AREA_CACHE_WA TYPE PLAN_AREA_STRUCT_CACHE.
    FIELD-SYMBOLS: <TD_TAB_DEFINITION> TYPE STANDARD TABLE.
    READ TABLE PLAN_AREA_CACHE
      WITH TABLE KEY PLANNING_AREA = PLANNING_AREA
      INTO PLAN_AREA_CACHE_WA.
* CREATE INTERNAL TABLE REFLECTING THE PLANNING AREA AND CACHE IT
* TO AVOID TOO MANY CALLS TO CREATION OF DYNAMIC INTERNAL TABLES
* SAP HAS RESTRICTED DEVELOPERS FROM CREATING
    IF SY-SUBRC <> 0.
      CLEAR PLAN_AREA_CACHE_WA.
      CALL METHOD
CL_SEMBPS_DATA_ACCESS_FACTORY=>CREATE_DYNAMIC_STRUCTURE
        EXPORTING
          PLANNING_AREA           = PLANNING_AREA
        IMPORTING
          TRANSACTION_DATA_STRUCT =
PLAN_AREA_CACHE_WA-TRANSACTION_DATA_TABLE
          KEYFIGURES              = PLAN_AREA_CACHE_WA-KEYFIGURES
          FIELDCATALOG            = PLAN_AREA_CACHE_WA-FIELDCATALOG
          CHARACTERISTICS         = PLAN_AREA_CACHE_WA-CHARACTERISTICS.
      PLAN_AREA_CACHE_WA-PLANNING_AREA = PLANNING_AREA.
      INSERT PLAN_AREA_CACHE_WA INTO TABLE PLAN_AREA_CACHE.
    ENDIF.
    FIELDCATALOG[] = PLAN_AREA_CACHE_WA-FIELDCATALOG.
    CHARACTERISTICS[] = PLAN_AREA_CACHE_WA-CHARACTERISTICS[].
    KEYFIGURES[] = PLAN_AREA_CACHE_WA-KEYFIGURES[].
    ASSIGN PLAN_AREA_CACHE_WA-TRANSACTION_DATA_TABLE->*
      TO <TD_TAB_DEFINITION>.
* CREATE A NEW REFERENCE
    CREATE DATA TRANSACTION_DATA_STRUCT LIKE
      <TD_TAB_DEFINITION>.
  ENDMETHOD.                   "GET_PLANNING_AREA_SPECS
  METHOD CREATE_DYNAMIC_STRUCTURE.
    DATA: ES_RETURN TYPE BAPIRET2.
    DATA: E_SUBRC TYPE SY-SUBRC.
    DATA: MESSAGE TYPE STRING.
    CALL FUNCTION 'API_SEMBPS_AREA_GETDETAIL'
      EXPORTING
        I_AREA     = PLANNING_AREA
      IMPORTING
        E_SUBRC    = E_SUBRC
        ES_RETURN  = ES_RETURN
      TABLES
        ETK_CHAPRO = CHARACTERISTICS
        ETK_KYFPRO = KEYFIGURES.
    IF E_SUBRC <> 0.
      MESSAGE = ES_RETURN-MESSAGE.
      RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
        EXPORTING MESSAGE = MESSAGE.
    ENDIF.
    READ TABLE CHARACTERISTICS TRANSPORTING NO FIELDS
      WITH KEY CHANM = CL_SEMBPS_DATA_ACCESSOR=>C_MULTIPLAN_AREA.
    IF SY-SUBRC = 0.
      MESSAGE = 'DO NOT USE MULTI-PLANNING AREAS'.
      RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
        EXPORTING MESSAGE = MESSAGE.
    ENDIF.
    DATA: CHAR_WA TYPE UPC_YS_API_CHAPRO.
    DATA: KEYFIG_WA TYPE UPC_YS_API_KYFPRO.
    DATA: WA_FIELDCATALOG TYPE LVC_S_FCAT.
    DATA: RETURN TYPE BAPIRET2.
    DATA: DETAILS TYPE BAPI6108.
* CHARACTERISTIC FIELDCATALOG
    LOOP AT CHARACTERISTICS INTO CHAR_WA.
      WA_FIELDCATALOG-INTTYPE = CHAR_WA-INTTP.
      WA_FIELDCATALOG-FIELDNAME = CHAR_WA-CHANM.
      WA_FIELDCATALOG-DATATYPE = CHAR_WA-DATATP.
      WA_FIELDCATALOG-INTLEN = CHAR_WA-INTLEN.
      WA_FIELDCATALOG-DECIMALS = CHAR_WA-DECIMALS.
      WA_FIELDCATALOG-OUTPUTLEN = CHAR_WA-OUTPUTLEN.
      CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
        EXPORTING
          INFOOBJECT = CHAR_WA-CHANM
        IMPORTING
          DETAILS    = DETAILS
          RETURN     = RETURN.
      IF RETURN-TYPE = 'E'.
        MESSAGE = RETURN-MESSAGE.
        RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
          EXPORTING MESSAGE = MESSAGE.
      ENDIF.
      WA_FIELDCATALOG-CONVEXIT = DETAILS-CONVEXIT.
      APPEND WA_FIELDCATALOG TO FIELDCATALOG.
    ENDLOOP.
* KEYFIGURE FIELDCATALOG
    LOOP AT KEYFIGURES INTO KEYFIG_WA.
      WA_FIELDCATALOG-INTTYPE = KEYFIG_WA-INTTP.
      WA_FIELDCATALOG-FIELDNAME = KEYFIG_WA-KYFNM.
      WA_FIELDCATALOG-DATATYPE = KEYFIG_WA-DATATP.
      WA_FIELDCATALOG-INTLEN = KEYFIG_WA-DIGITS.
      WA_FIELDCATALOG-DECIMALS = KEYFIG_WA-DECIMALS.
      WA_FIELDCATALOG-DD_OUTLEN = KEYFIG_WA-OUTPUTLEN.
      CALL FUNCTION 'BAPI_IOBJ_GETDETAIL'
        EXPORTING
          INFOOBJECT = KEYFIG_WA-KYFNM
        IMPORTING
          DETAILS    = DETAILS
          RETURN     = RETURN.
      IF RETURN-TYPE = 'E'.
        MESSAGE = RETURN-MESSAGE.
        RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS
          EXPORTING MESSAGE = MESSAGE.
      ENDIF.
      WA_FIELDCATALOG-CONVEXIT = DETAILS-CONVEXIT.
      APPEND WA_FIELDCATALOG TO FIELDCATALOG.
    ENDLOOP.
* AVOID TOO MANY CALLS TO THIS FUNCTION MODULE
    IF NOT FIELDCATALOG[] IS INITIAL.
      CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
        EXPORTING
          IT_FIELDCATALOG           = FIELDCATALOG
        IMPORTING
          EP_TABLE                  = TRANSACTION_DATA_STRUCT
        EXCEPTIONS
          GENERATE_SUBPOOL_DIR_FULL = 1
          OTHERS                    = 2.
      CASE SY-SUBRC.
        WHEN 1.
          RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS EXPORTING
              MESSAGE = 'Dynamic table creation failure on subpool'.
        WHEN 2.
          RAISE EXCEPTION TYPE CX_SEM_BPS_DATA_ACCESS EXPORTING
              MESSAGE = 'Dynamic table creation failure'.
      ENDCASE.
    ENDIF.
  ENDMETHOD.                   "CREATE_DYNAMIC_STRUCTURE
ENDCLASS.           "CL_SEMBPS_DATA_ACCESS_FACTORY IMPLEMENTATION
Look at this link:
<a href="http://help.sap.com/saphelp_nw04/helpdata/en/cf/21ee19446011d189700000e8322d00/frameset.htm">http://help.sap.com/saphelp_nw04/helpdata/en/cf/21ee19446011d189700000e8322d00/frameset.htm</a>
Pls reward points.
Regards,
Ameet

Similar Messages

  • When I oppen the internet, I want this to be made by Mozilla Firefox, not by Internet Explorer how it made now. I want to know the steps for this setting. I have installed windows X. Thank you very much in advance!P.

    Question
    When I oppen the internet, I want this to be made by Mozilla Firefox, not by Internet Explorer how it made now. I want to know the steps for this setting. I have installed windows X. Thank you very much in advance!P

    Hi,
    This is [[How to make Firefox the default browser]]

  • HT1688 i want to know the country of this phone??

    i want to know the country of iphone with imei 012761009787014

    What do you see
    Settings > General > About, against - Carrier

  • I have a value 'JPM'.wants to know the table containing this value.

    My application is throwing error becouse of one of the value (JPM) .
    Can i know which table has this value.
    I cannot use USER_TABB_COLUMNS since i dont know the COLUMN_TYPE.
    i dont know wat kind of field is this.
    the schema is not big and it contains approx. 500 objects.
    Kindly suggest.

    Mysterious. This is why I dislike dynamic SQL: you can't tell whether it's really going to work until you run it. All I can suggest is some debugging. I don't really like to encourgae the use of the Devil's Debugger, but you can change the inner loop to show which column it's about to execute and hence try to figure out what goes wrong when it fails....
    SQL> DECLARE
      2     n NUMBER;
      3  BEGIN
      4      FOR r IN ( SELECT owner, table_name, column_name
      5                 FROM all_tab_columns
      6                 WHERE  data_type IN ('CHAR', 'VARCHAR2')
      7                 AND   owner = 'A'
      8                 AND    data_length >=3 )
      9      LOOP
    10          dbms_output.put_line(r.owner||'.'||r.table_name||'.'||r.column_name);
    11          EXECUTE IMMEDIATE
    12              'select count(*) from '||r.owner||'.'||r.table_name||
    13              ' where '||r.column_name||' = ''JPM''' INTO n;
    14          IF n != 0 THEN
    15              dbms_output.put_line('FOUND='||r.owner||'.'||r.table_name||'.'||r.column_name);
    16          END IF;
    17      END LOOP;
    18  END;
    19  /
    A.DEPTREE.TYPE
    A.DEPTREE.SCHEMA
    A.DEPTREE.NAME
    A.IDEPTREE.DEPENDENCIES
    A.T1.COL2
    A.TEO.WHATEVER
    A.TT1.COL1
    PL/SQL procedure successfully completed.
    SQL> Cheers, APC

  • Want to know the tables of a particualr transaction code

    Hi,
    whatz the technique of knowing the tables of a particular transaction code.
    I have got a tcode - va01.
    Want to know the tables of this transaction code.
    How...?

    Hi,
    If you want know about transaction code table details
    1. Enter Tcode 'ST05' (SQL Trace on), You can find how many tables are involved in the tcode
    2. Goto SE93, enter VA01 and find the program name, Go to object browse (se80) and enter program name and find out how many tables are invloved (Another way go to search- Give search term 'Tables' -> there u can find the tables involved.
    Regards
    Bhupal Reddy

  • I have a new iPhone for work, set up on a new iTunes account (PC).  I was told i can associate it to my home iTunes account (iMac) but don't know how.  I want to save the work related apps as well.  Any advice?  Thanks

    I have a new iPhone for work, set up on a new iTunes account (PC).  I was told i can associate it to my home iTunes account (iMac) but don't know how.  I want to save the work related apps as well.  Any advice?  Thanks

    Thanks. I messed up with my husbands iphone because I was told the wrong thing. Now everytime I sync his phone it makes it look just like the other phone I had. Do you know how I can fix taht for his phone? Any settings I can turn off that will prevent all of my apps/contacts, etc from auto populating his phone?

  • How do I know games and programs that become free? I want to know the programs and games that become free first first

    How do I know games and programs that become free?
    I want to know the programs and games that become free first first

    You are allowed to have two activated installations so there should not be a problem having working installations on the two machines.  If by chance you have somehow tied up two activations for the one machine you can have Adobe support help resolve that thru chat.
    Serial number and activation chat support (non-CC)
    http://helpx.adobe.com/x-productkb/global/service1.html ( http://adobe.ly/1aYjbSC )

  • Want to know the difference among the sap standard schemas TM00/TM01/TM04

    hi, experts
    i have read the standard courses HR310 and HR311,but i am still confused about the difference among the three standard TM schemas TM00,TM01 and TM04.
      i only learn from the book about it as follows:
      TM00: Time evaluation with time events
      TM01: Time evaluation for work schedule deviations
      TM04: Time evaluation for times entered as hours.
    i want to know the details about different forms of time data and different strategies in evaluating the time data in the three standard schemas.
       thanks in advance

    Hi,
    TM01: read the actual data, Automatically calculate the overtime with the help of events.
    TM04: Negative time evaluation, Get the data from the Work schedules
    TM01: Positive/Negative time evaluation: Read the exception of workschedules, get the data from the time events form the 2011IT.
    TM01:
    Schema TM01 can be used for time evaluation if you only record
    exceptions to the work schedule, and not all times that count as working
    time (actual times).
    You can use schema TM01 to import and process time data that has been
    recorded online.
    The schema forms time balances, time wage types, and time quotas, and is
    processed using the time evaluation driver, RPTIME00.
    The valuation basis for time evaluation forms a planned pair, which is
    generated according to the planned specifications in the employee's
    personal work schedule.
    The planned pairs generally correspond to the time worked. Only
    attendances from infotype 2002 and absences from infotype 2001 result in
    a difference between planned and actual.
    Schema TM01 automatically generates overtime for all attendance times
    recorded over and above the planned specifications in the personal work
    schedule. If overtime is recorded in infotype 2005, it can be approved
    systematically taking account of overtime breaks.
    TM00:
    Schema TM00 processes time events that have been recorded at a time
    recording terminal, or the time pairs formed from the time events in
    pair formation. Attendances and absences are also imported.
    Schema TM00 is based on positive recording of time data, that is,
    recording all times that count as working time (actual times).
    Schema TM00 only evaluates time data with clock times (or full-day
    records). The main task of schema TM00 is to classify the actual times
    by comparing them to the planned specifications in the daily work
    schedule (start and end of planned working time, core times, breaks, and
    so on).
    TM04:
    The time worked by the employee is recorded in the Attendances infotype
    (2002), and not as clock-in and clock-out times. When processing
    clock-in/out times, the emphasis is on the length of time between the
    postings and not on the times at which the postings were made.
    You can use schema TM04 to process attendances and absences that specify
    a number of hours only, rather than concrete start and end times.
    The times stipulated in the daily work schedule are not relevant. Only
    specifications such as planned hours and minimum daily working time are
    evaluated from the daily work schedule.
    TM04 caters both for negative time recording (recording of exceptions to
    the work schedule) and positive time recording (recording all
    attendances or actual times).
    If negative recording is used, the planned hours are generated on the
    basis of the daily work schedule. Recorded absences and some attendance
    times are deducted (see schema TP01.)
    The "Time Management status" indicator in the Planned Working Time
    infotype (0007) shows whether all actual times are recorded for an
    employee, or only exceptions to the planned specifications.
    Regards:
    Devi.

  • How can I control stepping motor with PCI-7344 & UMI-7764? And I want to know the simplest circuit that I can do by myself?

    Now I don't want to by commercial stepping motor driver, I want to do it by myself. I want to know the simplest driver circuit to drive and control my stepping motor (+5V 4 phases).

    From the 7344's perspective, in open loop stepper mode, the only necessary outputs are the pulse train for steps and a TTL flag for direction. You can also set it for CW/CCW mode, which will output two separate pulse trains: one for clockwise motion, one for counter-clockwise motion.
    If you only need to decode the signals into four phases and not amplify them above 5V, then a small IC might work for you (as long as you don't need a lot of current). A reconfigurable FPGA could be programmed to decode the incoming signal and output the four phases pretty easily. However, I honestly believe your best bet is just to buy a recommended amplifier for the motors.
    Good Luck
    Kyle V
    Applications Engineer
    National Instruments

  • I want to know the top 10-20 Store procedures used in the table.

    Hello All, 
    There are total 3500+ Store procedures created in the server. So,  I want to know the top 10-20 Store procedures used in the table. Like which store procedures are important and what are they, is there any code to find them? 
    I think the question might be very silly, but i don't know which store procedure to look at it. 
    Please help me on this issue.
    Thanks.
    Thanks, Shyam.

    By what? CPU? Memory? Execution count?
    Glenn Berry wrote this
    -- HIGH CPU ************
          -- Get Top 100 executed SP's ordered by execution count
          SELECT TOP 100 qt.text AS 'SP Name', qs.execution_count AS 'Execution Count',  
          qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()) AS 'Calls/Second',
          qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
          qs.total_worker_time AS 'TotalWorkerTime',
          qs.total_elapsed_time/qs.execution_count AS 'AvgElapsedTime',
          qs.max_logical_reads, qs.max_logical_writes, qs.total_physical_reads, 
          DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'
          FROM sys.dm_exec_query_stats AS qs
          CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
          WHERE qt.dbid = db_id() -- Filter by current database
          ORDER BY qs.execution_count DESC
          -- HIGH CPU *************
          -- Get Top 20 executed SP's ordered by total worker time (CPU pressure)
          SELECT TOP 20 qt.text AS 'SP Name', qs.total_worker_time AS 'TotalWorkerTime', 
          qs.total_worker_time/qs.execution_count AS 'AvgWorkerTime',
          qs.execution_count AS 'Execution Count', 
          ISNULL(qs.execution_count/DATEDIFF(Second, qs.creation_time, GetDate()), 0) AS 'Calls/Second',
          ISNULL(qs.total_elapsed_time/qs.execution_count, 0) AS 'AvgElapsedTime', 
          qs.max_logical_reads, qs.max_logical_writes, 
          DATEDIFF(Minute, qs.creation_time, GetDate()) AS 'Age in Cache'
          FROM sys.dm_exec_query_stats AS qs
          CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
          WHERE qt.dbid = db_id() -- Filter by current database
          ORDER BY qs.total_worker_time DESC
    Best Regards,Uri Dimant SQL Server MVP,
    http://sqlblog.com/blogs/uri_dimant/
    MS SQL optimization: MS SQL Development and Optimization
    MS SQL Consulting:
    Large scale of database and data cleansing
    Remote DBA Services:
    Improves MS SQL Database Performance
    SQL Server Integration Services:
    Business Intelligence

  • I want to know itunes work properly in windows 8.1

    i want to know itunes work properly in windows 8.1????
    Plz and my question

    Hi JavierBalmaceda,
    Welcome to the BestBuy forums! There is not one specifically stating "spanish" however all of them should have language packs already installed so you can select your language.
    8.1 PRO(Retail)
    http://www.bestbuy.com/site/windows-8-1-pro-window​s/1805804.p?id=1219064878912&skuId=1805804&st=cate​...
    8.1 PRO ( for builders - 32 bit )
    http://www.bestbuy.com/site/windows-8-1-profession​al-32-bit-system-builder-oem-windows/2442036.p?id=​...
    8.1 PRO ( for builders - 64bit )
    http://www.bestbuy.com/site/windows-8-1-profession​al-64-bit-system-builder-oem-windows/2441983.p?id=​...
    Please keep in mind you should only use 32 bit if your system has less than 4 GB of memory. I would also personally get the OEM however it is your option.
    I am not affiliated with Best Buy nor have I ever been employed by Best Buy. All of my thoughts and posts are of my own opinion and personal experience.
    I may not always know the right answer, but I will always tell you what I do know. I also do free computer analysis and consultation via private message.

  • I want to use my ipad to display song lyrics. I have all the lyrics on my computer in Word format and want to know the easiest way to convert them to my ipad and what apps I should use..

    I want to use my ipad to display song lyrics. I have all the lyrics on my computer in Word format and want to know the easiest way to convert them to my ipad and what apps I should use.

    I would just leave them in Word...GR reads many formats very easily.
    If our goal is to work on/edit the files it may be useful to look into something like Pages if you have a Mac, and the Pages for iOS devices so you could use the same word processor on both machines.
    But if you convert the Word to PDF and then use GR you can still edit the files...GR will edit and annotated PDF files rather easily.

  • Want to know the job of 20k1 Audio Processor on X-Fi Cards

    :Want to know the job of 20k Audio Processor on X-Fi Cards? <!-- [endif] -->
    <p class="MsoNormal">X-Fi Processor claimed as world?s most powerful audio processor. i.e. 0,000 MIPS.
    <p class="MsoNormal">This speed is more than the central processor.
    <p class="MsoNormal">If most of X-Fi cards does not have decoding capabilities, for what this much of processing power is required for audio reproduction.
    <p class="MsoNormal">Is this just a manufacturer?s advertisement to exaggerate about the product?
    <p class="MsoNormal">AFAIK, CMSS-3D, 24-bit crystallizer does not require much processing power, if it were required then creative Mp3 players, Xtreme audio, Xtreme notebooks would not have the crystallizer feature.
    <p class="MsoNormal">?
    <p class="MsoNormal">Coming to Games, Direct X engine also does not require more power because to just run the Direct X API on Direct X engine, this much power is not required.
    <p class="MsoNormal">?
    <p class="MsoNormal">Thanks,
    <p class="MsoNormal">Ravi Sankar

    A. owh nice answer mister guru DWH well bout DAC well...i comparing recording 48 khz and 96khz 24 bit cannot hear much diffrent cuz the result sound same and exact like from sources but with sounforges i push the limit 92 khz the result diffrent ( but sometimes i suspicious this card have built in compresor inside it to minimize peak)
    about compressor built in : ok its really confuse for a while cuz sometimes the sound not kick off but while reach -6 /-3 db the sound kickin somehow
    comparing with HD realtek on my notebook asus x5rl
    well i experimenting using reaper theres an option 64bit mix wave which i realize HD meaning 64 bit
    if i turn off 64 bit option mix then i feel the sound not becoming HD in this soundblaster < thats i think which something getin losing
    B. well about software FX? i think all soundcard have a mixer software features like reverbing / echo / equlizer builtin decoder console
    i dont know is it FX console u talk bout it is the way optional mixer console whichs is already builtin inside the chipset or not? but if the FX u talkin bout is from console and as a trademark , i dont think thats a reall big surprise for me
    becuz i dont wanna mess my project mixing song eq coloring when i recording or playbacking using those FX from console such put crystalize/3D room / reverbing
    infact while i recording again / making mix tapes > there only fx i see on that console whois really effecting the recording result such echos, any EQ or Crystalize i dont think really effecting the recording from input DAC, the question is do i need this echos?
    cuz while i using profesionnal software music programe for composing i can use mixer EQ event surround 5. option from the software rather than using from a console
    but then with this 5. card output that i have in this usb card i think is good idea to make a project making surround sounding via 5. speaker / but is there any 5. speaker profesional compatibles with this card sinces i read some ppl complaining bout uncompabtibles speaker connecting to this card?
    which i know if i buy some other profesional card event digidesign prootools card/ alesis or else i cant put 5. soundsystem speaker directyly from the card
    but then is come back to the reallity do the disco club already use surround 5. or maybe 7. soundsystem or not
    becuz i still know they just using a MONO soundsystem setup some of them LOL
    C. owh ok i got it this card chipset cannot act like a micro controller or maybe some kinda intelegent CPU to makes VST worx cuz i know some other product already making some kinda CPU external as VST plugins generator so the CPU desktop / notebook dont have to working hard again to act as VST
    thnx
    PS: when fresh driver for this card goin be done, since till now i still use driver plug n play detect from windows xp to avoid bugs and BSOD, and then somehow i googles in internet i found PAX driver version but still cannot hold 96khz or 92 khz? via asio
    can u make a lighter console? everytimes i put console somehow its pop up so heavy , page 2 pages so heavy

  • I purchased CS5 Design Standard about 5 years ago. Now I am trying to install  second PC, but I got a message like " This serial number is not correct."  I want to know the correct serial number, but I missed my ex adobe ID because I've changed my E-mail

    I purchased CS5 Design Standard about 5 years ago. Now I am trying to install  second PC, but I got a message like " This serial number is not correct."  I want to know the correct serial number, but I missed my ex adobe ID because I've changed my E-mail address.

    It is not clear to me what your issue is with not being able to sign in to your Adobe account to find the serial number.  You should still be able to sign in and find your serial number if you registered the software.
    If your first PC is a Windows machine you might be able to extract the serial number from it using the Belarc Advisor
    http://www.belarc.com/free_download.html

  • How do i connect my macbook pro to another screen (a fujitsu siemens) i got the cable for it but i want to know the settings so i transfer desc to the fujitsu screen.

    How do i connect my macbook pro to another screen (a fujitsu siemens) i got the cable for it but i want to know the settings so i transfer desc to the fujitsu screen.

    Welcome to Apple Support Communities
    If you have the cable, just connect it to both and the desktop will show up on the external display. Then, you can select different modes, changing arrangement in System Preferences > Displays > Arrangement, or using shortcuts > http://support.apple.com/kb/ht5019

Maybe you are looking for

  • Photosmart premium all in one and wireless G network

    Is the new photosmart premium with built-in Ethernet, WiFi 802.11n backward compatible on b/g wireless network?  Will it connect wirelessly to my Linksys WiFi 802.11g network? Thanks!

  • Failure of server APACHE bridge::No backend server available for connection

    All, I have an env: Browser -> OHS -> WLS(Apex Listener) -> Oracle DB. If any SQL run for more than 5 mins, i get the below error. Failure of server APACHE bridge: No backend server available for connection: timed out after 10 seconds or idempotent s

  • Motion 5 is hanging with the simplest emitter effects (qtkitserver)

    On both my retina MBP and new Mac Pro (6 core d500) I am finding Motion unusable. Just a simple effect (like any of the emitters) is very unstable. Activity monitor shows qtkitserver stops responding. Motion gets extremely laggy....beachballs....long

  • Formatting dates in xsl transformation

    Hi: We have a problem transforming dates inside an xls mapping. Date and Time come from different fields in DDBB, so the straight way should be extract year, month and day from date, hour from time, concat everything together and finally push that st

  • Horizontal scroll bar for the adf page

    Hi, We have around 7 tables in single jsff page. Here , we have a requirement like : We need to show horizontal scroll bar for the entire page instead of each table. Is there any way to get this. As of now, we have horizontal scroll bar for each tabl