Function Group ----------------- Technical Name: ZBW_FX Description: Function Group for BW Virtual InfoProvid Functional Module ------------------- Technical Name: ZVI_READ_FXRATES_FROM_TCURR Description: Funtion Module for reading FX Rates from TCURR Functional Module Parameters: -------------------------------- Import: ------- Parameter Name Type Assosciated Type Default Value Optional Pass Value Short text I_INFOPROV TYPE RSINFOPROV Checked InfoProvider I_TH_SFC TYPE RSDRI_TH_SFC BW Data Manager: List of Characteristics I_TH_SFK TYPE RSDRI_TH_SFK BW Data Manager: List of Key Figures I_T_RANGE TYPE RSDRI_T_RANGE BW Data Manager: Range List I_TX_RANGETAB TYPE RSDRI_TX_RANGETAB BW Data Manager: Table from Range List I_FIRST_CALL TYPE RS_BOOL Checked Boolean I_PACKAGESIZE TYPE I 1000 Checked Checked Export: ------- Parameter Name Type Assosciated Type Pass Value Short text E_T_DATA TYPE STANDARD TABLE E_END_OF_DATA TYPE RS_BOOL Boolean E_T_MSG TYPE RS_T_MSG BW: Table with Messages (Application Log) Changing: --------- Tables: --------- Exceptions: ------------ Exception Short Text WRONG_INPUT READ_ACCESS_ERROR Source Code: -------------- FUNCTION ZVI_READ_FXRATES_FROM_TCURR. *"---------------------------------------------------------------------- *"*"Local Interface: *" IMPORTING *" VALUE(I_INFOPROV) TYPE RSINFOPROV *" REFERENCE(I_TH_SFC) TYPE RSDRI_TH_SFC *" REFERENCE(I_TH_SFK) TYPE RSDRI_TH_SFK *" REFERENCE(I_T_RANGE) TYPE RSDRI_T_RANGE *" REFERENCE(I_TX_RANGETAB) TYPE RSDRI_TX_RANGETAB *" VALUE(I_FIRST_CALL) TYPE RS_BOOL *" VALUE(I_PACKAGESIZE) TYPE I DEFAULT 1000 *" EXPORTING *" REFERENCE(E_T_DATA) TYPE STANDARD TABLE *" REFERENCE(E_END_OF_DATA) TYPE RS_BOOL *" REFERENCE(E_T_MSG) TYPE RS_T_MSG *" EXCEPTIONS *" WRONG_INPUT *" READ_ACCESS_ERROR *"---------------------------------------------------------------------- * initialize CLEAR: e_t_data, e_t_msg. * this is specific to infoprovider FX_RATES CHECK i_infoprov = 'FX_RATES'. FIELD-SYMBOLS: TYPE gt_s_tcurr, TYPE ANY. DATA: l_t_component TYPE abap_compdescr_tab, i_t_tcurr TYPE gt_t_tcurr, wa_tcurr TYPE gt_t_tcurr WITH HEADER LINE, i_t_final TYPE STANDARD TABLE OF gt_t_tcurr, l_t_range TYPE rsdri_t_range, l_s_range TYPE rsdri_t_range WITH HEADER LINE, common_date TYPE sy-datum. CONSTANTS: startper TYPE i VALUE 99999999. RANGES: r_kurst FOR tcurr-kurst, r_fcurr FOR tcurr-fcurr, r_tcurr FOR tcurr-tcurr, r_gdatu FOR tcurr-gdatu. * initialize CLEAR e_t_data. * Convert hash table i_t_range to standard table l_t_range = i_t_range. LOOP AT l_t_range INTO l_s_range. * Set FXRate Type range IF l_s_range-chanm = 'ZFXTYPE'. r_kurst-option = l_s_range-compop. " = 'EQ' r_kurst-sign = l_s_range-sign. "= 'I'. r_kurst-low = l_s_range-low. r_kurst-high = l_s_range-high. APPEND r_kurst. ENDIF. * Set ToCurrency Type range IF l_s_range-chanm = 'ZTOCURR'. r_tcurr-option = l_s_range-compop. " = 'EQ' r_tcurr-sign = l_s_range-sign. "= 'I'. r_tcurr-low = l_s_range-low. r_tcurr-high = l_s_range-high. APPEND r_tcurr. ENDIF. * Set FromCurrency Type range IF l_s_range-chanm = 'ZFCURR'. r_fcurr-option = l_s_range-compop. " = 'EQ' r_fcurr-sign = l_s_range-sign. "= 'I'. r_fcurr-low = l_s_range-low. r_fcurr-high = l_s_range-high. APPEND r_fcurr. ENDIF. * Set Date Type range * Convert the 0CALDAY (YYYYMMDD) in Inverted date format * Inverted date = 99999999 - date in format (YYYYYMMDD) IF l_s_range-chanm = '0CALDAY'. r_gdatu-option = l_s_range-compop. " = 'EQ' r_gdatu-sign = l_s_range-sign. "= 'I'. r_gdatu-low = startper - l_s_range-low. r_gdatu-high = startper - l_s_range-high. APPEND r_gdatu. ENDIF. ENDLOOP. * Data selection from TCURR table based on Selection in range SELECT * FROM tcurr INTO CORRESPONDING FIELDS OF TABLE i_t_tcurr WHERE kurst IN r_kurst AND fcurr IN r_fcurr AND tcurr IN r_tcurr AND gdatu IN r_gdatu. IF sy-subrc = 0. "Select statement got some records * Need to take care of smaller currencies like IDR, JPY, HUF etc LOOP AT i_t_tcurr INTO wa_tcurr. IF wa_tcurr-ffact NE 0 AND wa_tcurr-tfact NE 0. wa_tcurr-ukurs = wa_tcurr-ukurs / ( wa_tcurr-ffact / wa_tcurr-tfact ). ENDIF. APPEND wa_tcurr. ENDLOOP. * create a working area ASSIGN LOCAL COPY OF INITIAL LINE OF e_t_data TO . * get description of components of PERFORM get_type_components(saplrsdrc_services) USING CHANGING l_t_component. * data transformation * move line by line LOOP AT wa_tcurr ASSIGNING . PERFORM move_tcurr_to_data USING i_th_sfc i_th_sfk l_t_component CHANGING . * append to output data APPEND TO e_t_data. ENDLOOP. ENDIF. * all data are selected e_end_of_data = 'X'. ENDFUNCTION. FXTOP FUNCTION-POOL ZBW_FX. "MESSAGE-ID .. TABLES: tcurr. TYPE-POOLS: rs, rsd, rsdd, rsdpm, rsdpr, rsdu. TYPES: * Structure * types BEGIN OF gt_s_tcurr, kurst TYPE kurst_curr, fcurr TYPE fcurr_curr, tcurr TYPE tcurr_curr, gdatu TYPE gdatu_inv, ukurs TYPE ukurs_curr, ffact TYPE ffact_curr, tfact TYPE tfact_curr, END OF gt_s_tcurr, * internal TCURR Table gt_t_tcurr TYPE STANDARD TABLE OF gt_s_tcurr WITH DEFAULT KEY INITIAL SIZE 10. Subroutine: ------------ *----------------------------------------------------------------------* ***INCLUDE LZBW_FXF01 . *----------------------------------------------------------------------* *&---------------------------------------------------------------------* *& Form MOVE_TCURR_TO_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->P_ text * -->P_I_TH_SFC text * -->P_I_TH_SFK text * -->P_L_T_COMPONENT text * <--P_ text *----------------------------------------------------------------------* FORM MOVE_TCURR_TO_DATA USING i_s_tcurr TYPE gt_s_tcurr i_th_sfc TYPE rsdri_th_sfc i_th_sfk TYPE rsdri_th_sfk i_t_component TYPE abap_compdescr_tab CHANGING e_s_data TYPE any. * define FIELD-SYMBOLS FIELD-SYMBOLS: TYPE abap_compdescr, TYPE ANY, TYPE rsdri_s_sfc, TYPE rsdri_s_sfk. * Datadeclaration DATA: l_compno TYPE i, l_t_component TYPE abap_compdescr_tab, l_s_tcurr TYPE gt_s_tcurr, date_normal TYPE sy-datum. * initialize CLEAR e_s_data. l_s_tcurr = i_s_tcurr. ************ Transformation of all needed tcurr FIELDS ***************** * (1) GDATU------------------------------------------------------------- IF NOT i_s_tcurr-gdatu IS INITIAL. * get alias name from SFC READ TABLE i_th_sfc ASSIGNING WITH TABLE KEY chanm = '0CALDAY'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move CONVERT INVERTED-DATE i_s_tcurr-gdatu INTO DATE date_normal. * MOVE i_s_tcurr-gdatu TO . MOVE date_normal TO . ENDIF. ENDIF. ENDIF. * (2) KURST------------------------------------------------------------- IF NOT i_s_tcurr-kurst IS INITIAL. * get alias name from SFC READ TABLE i_th_sfc ASSIGNING WITH TABLE KEY chanm = 'ZFXTYPE'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move MOVE i_s_tcurr-kurst TO . ENDIF. ENDIF. ENDIF. * (3) FCURR------------------------------------------------------------- IF NOT i_s_tcurr-fcurr IS INITIAL. * get alias name from SFC READ TABLE i_th_sfc ASSIGNING WITH TABLE KEY chanm = 'ZFCURR'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move MOVE i_s_tcurr-fcurr TO . ENDIF. ENDIF. ENDIF. * (4) TCURR------------------------------------------------------------- IF NOT i_s_tcurr-tcurr IS INITIAL. * get alias name from SFC READ TABLE i_th_sfc ASSIGNING WITH TABLE KEY chanm = 'ZTOCURR'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -chaalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move MOVE i_s_tcurr-tcurr TO . ENDIF. ENDIF. ENDIF. * (5) UKURS ------------------------------------------------------------ IF NOT i_s_tcurr-ukurs IS INITIAL. * get alias name from SFC READ TABLE i_th_sfk ASSIGNING WITH TABLE KEY kyfnm = 'ZFXRATE'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -kyfalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move = i_s_tcurr-ukurs. ENDIF. ENDIF. ENDIF. * (6) FFACT ------------------------------------------------------------ IF NOT i_s_tcurr-ffact IS INITIAL. * get alias name from SFC READ TABLE i_th_sfk ASSIGNING WITH TABLE KEY kyfnm = 'ZFFACT'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -kyfalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move = i_s_tcurr-ffact. ENDIF. ENDIF. ENDIF. * (7) TFACT ------------------------------------------------------------ IF NOT i_s_tcurr-tfact IS INITIAL. * get alias name from SFC READ TABLE i_th_sfk ASSIGNING WITH TABLE KEY kyfnm = 'ZTFACT'. IF sy-subrc = 0. * get number of target column READ TABLE i_t_component ASSIGNING WITH KEY name = -kyfalias. IF sy-subrc = 0. * number of target data component l_compno = sy-tabix. * get target data component ASSIGN COMPONENT l_compno OF STRUCTURE e_s_data TO . * move = i_s_tcurr-tfact. ENDIF. ENDIF. ENDIF. ENDFORM. Includes: ----------- LZBW_FXTOP FUNCTION-POOL ZBW_FX. "MESSAGE-ID .. TABLES: tcurr. TYPE-POOLS: rs, rsd, rsdd, rsdpm, rsdpr, rsdu. TYPES: * Structure * types BEGIN OF gt_s_tcurr, kurst TYPE kurst_curr, fcurr TYPE fcurr_curr, tcurr TYPE tcurr_curr, gdatu TYPE gdatu_inv, ukurs TYPE ukurs_curr, ffact TYPE ffact_curr, tfact TYPE tfact_curr, END OF gt_s_tcurr, * internal TCURR Table gt_t_tcurr TYPE STANDARD TABLE OF gt_s_tcurr WITH DEFAULT KEY INITIAL SIZE 10. * INCLUDE LZBW_FXD... " Local class definition