Code20110525 - ooxxvv/MySAPnotes GitHub Wiki

Code20110525

  • 在 ABAP 程式中讀取 InfoProvider (InfoCube) 資料

Function

Code

FUNCTION zfip03.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     REFERENCE(CALYEAR) TYPE  /BI0/OICALYEAR OPTIONAL
*"     REFERENCE(COMPANY) TYPE  /BI0/OICOMP_CODE OPTIONAL
*"     REFERENCE(TRAVEL_REGION) TYPE  /BIC/OIZTRAREGI OPTIONAL
*"     REFERENCE(CURRENCY) TYPE  /BI0/OILOC_CURRCY OPTIONAL
*"  EXPORTING
*"     REFERENCE(DAYAMT) TYPE  F
*"     REFERENCE(EXTAMT) TYPE  F
*"     REFERENCE(FIXAMT) TYPE  F
*"----------------------------------------------------------------------
*-For Read Cube
  TYPE-POOLS: rsdrc.
  DATA: l_end_of_data  TYPE rs_bool,
        l_first_call   TYPE rs_bool.

  TYPES: BEGIN OF l_data_type,
           0calyear    TYPE /bi0/oicalyear,
           0comp_code  TYPE /bi0/oicomp_code,
           ztraregi    TYPE /bic/oiztraregi,
           0loc_currcy TYPE /bi0/oiloc_currcy,
           zipfixamt   TYPE /bic/oizipfixamt,
           zipdayamt   TYPE /bic/oizipdayamt,
           zipextamt   TYPE /bic/oizipextamt,
         END OF l_data_type.

  DATA: ls_cube  TYPE l_data_type,
        lt_cube  TYPE STANDARD TABLE OF l_data_type
                      WITH DEFAULT KEY INITIAL SIZE 10,
        ls_data  TYPE l_data_type,
        lt_data  TYPE STANDARD TABLE OF l_data_type
                      WITH DEFAULT KEY INITIAL SIZE 10,
        ls_sfc   TYPE rsdri_s_sfc,
        lt_sfc   TYPE rsdri_th_sfc,
        ls_sfk   TYPE rsdri_s_sfk,
        lt_sfk   TYPE rsdri_th_sfk,
        ls_range TYPE rsdri_s_range,
        lt_range TYPE rsdri_t_range.

*-Check Input
  IF company       IS INITIAL OR
     travel_region IS INITIAL OR
     calyear       IS INITIAL.
    fixamt = 0.
    dayamt = 0.
    extamt = 0.
    EXIT.
  ENDIF.

*-Get Cube Data
  CLEAR: lt_sfc, lt_sfk, lt_range.

*-Set Cube Return Char.
  CLEAR: ls_sfc.
  ls_sfc-chanm    = '0CALYEAR'.
  ls_sfc-chaalias = '0CALYEAR'.
  ls_sfc-orderby  = 0.
  INSERT ls_sfc INTO TABLE lt_sfc.

  CLEAR: ls_sfc.
  ls_sfc-chanm    = '0COMP_CODE'.
  ls_sfc-chaalias = '0COMP_CODE'.
  ls_sfc-orderby  = 0.
  INSERT ls_sfc INTO TABLE lt_sfc.

  CLEAR: ls_sfc.
  ls_sfc-chanm    = 'ZTRAREGI'.
  ls_sfc-chaalias = 'ZTRAREGI'.
  ls_sfc-orderby  = 0.
  INSERT ls_sfc INTO TABLE lt_sfc.

  CLEAR: ls_sfc.
  ls_sfc-chanm    = '0LOC_CURRCY'.
  ls_sfc-chaalias = '0LOC_CURRCY'.
  ls_sfc-orderby  = 0.
  INSERT ls_sfc INTO TABLE lt_sfc.

*-Return Key Fig.
  CLEAR ls_sfk.
  ls_sfk-kyfnm    = 'ZIPFIXAMT'.
  ls_sfk-kyfalias = 'ZIPFIXAMT'.
  ls_sfk-aggr     = 'SUM'.
  INSERT ls_sfk INTO TABLE lt_sfk.

  CLEAR ls_sfk.
  ls_sfk-kyfnm    = 'ZIPDAYAMT'.
  ls_sfk-kyfalias = 'ZIPDAYAMT'.
  ls_sfk-aggr     = 'SUM'.
  INSERT ls_sfk INTO TABLE lt_sfk.

  CLEAR ls_sfk.
  ls_sfk-kyfnm    = 'ZIPEXTAMT'.
  ls_sfk-kyfalias = 'ZIPEXTAMT'.
  ls_sfk-aggr     = 'SUM'.
  INSERT ls_sfk INTO TABLE lt_sfk.

*-Restriction
  CLEAR ls_range.
  ls_range-chanm    = 'ZTRAREGI'.
  ls_range-sign     = 'I'.
  ls_range-compop   = 'EQ'.
  ls_range-low      = travel_region.
  APPEND ls_range TO lt_range.

  CLEAR ls_range.
  ls_range-chanm    = '0COMP_CODE'.
  ls_range-sign     = 'I'.
  ls_range-compop   = 'EQ'.
  ls_range-low      = company.
  APPEND ls_range TO lt_range.

  CLEAR ls_range.
  ls_range-chanm    = '0CALYEAR'.
  ls_range-sign     = 'I'.
  ls_range-compop   = 'LE'.
  ls_range-low      = calyear.
  APPEND ls_range TO lt_range.

  CLEAR ls_range.
  ls_range-chanm    = '0LOC_CURRCY'.
  ls_range-sign     = 'I'.
  ls_range-compop   = 'EQ'.
  ls_range-low      = currency.
  APPEND ls_range TO lt_range.

*-Get cube data
  l_end_of_data = ''.
  l_first_call  = 'X'.

  CLEAR: lt_data[].

  WHILE l_end_of_data = ''.
    CLEAR: lt_cube[].

    CALL FUNCTION 'RSDRI_INFOPROV_READ'
      EXPORTING
        i_infoprov             = 'ZIP_C05'
        i_th_sfc               = lt_sfc
        i_th_sfk               = lt_sfk
        i_t_range              = lt_range
        i_save_in_table        = ''
        i_save_in_file         = ''
        i_packagesize          = 10
        i_rollup_only          = ''
      IMPORTING
        e_t_data               = lt_cube
        e_end_of_data          = l_end_of_data
      CHANGING
        c_first_call           = l_first_call
      EXCEPTIONS
        illegal_input          = 1
        illegal_input_sfc      = 2
        illegal_input_sfk      = 3
        illegal_input_range    = 4
        illegal_input_tablesel = 5
        no_authorization       = 6
        illegal_download       = 8
        illegal_tablename      = 9
        OTHERS                 = 11.

    IF sy-subrc <> 0.
      EXIT.
    ELSE.
      LOOP AT lt_cube INTO ls_cube.
        COLLECT ls_cube INTO lt_data.
      ENDLOOP.
    ENDIF.
  ENDWHILE.

*-Get newest year
  CLEAR: ls_data.
  SORT lt_data BY 0calyear DESCENDING.
  READ TABLE lt_data INTO ls_data INDEX 1.

*-Return data
  fixamt = ls_data-zipfixamt.
  dayamt = ls_data-zipdayamt.
  extamt = ls_data-zipextamt.

ENDFUNCTION.