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.