CALL FUNCTION 'ZCONVERT_TO_CURRENCY'
EXPORTING
lv_f_currency = lv_bsid_waerk "源货币类型
lv_t_currency = ls_vbrk-waerk "目标货币类型
lv_f_amount = lv_balance "源货币金额
lv_data = lv_datum “日期
IMPORTING
lv_t_amount = lv_balance. "目标货币金额
注意:该rfc 是 根据入参所在日期当月第一天的汇率作为计算基准
入参:
LV_F_CURRENCY TYPE WAERS
LV_T_CURRENCY TYPE WAERS
LV_F_AMOUNT TYPE P
LV_DATA TYPE SYST_DATUM
出参:
LV_T_AMOUNT TYPE P
LV_WAERS TYPE TCURR-UKURS
FUNCTION zconvert_to_currency.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(LV_F_CURRENCY) TYPE WAERS OPTIONAL
*" VALUE(LV_T_CURRENCY) TYPE WAERS OPTIONAL
*" VALUE(LV_F_AMOUNT) TYPE P OPTIONAL
*" VALUE(LV_DATA) TYPE SYST_DATUM OPTIONAL
*" EXPORTING
*" VALUE(LV_T_AMOUNT) TYPE P
*" VALUE(LV_WAERS) TYPE TCURR-UKURS
*"----------------------------------------------------------------------
DATA: ret TYPE bapireturn.
"DATA: lv_f_amount_external(12) TYPE p DECIMALS 4.
DATA firstdayofmonth TYPE sy-datum.
TYPES:BEGIN OF gv_tcurr,
kurst LIKE tcurr-kurst,
fcurr LIKE tcurr-fcurr,
tcurr LIKE tcurr-tcurr,
gdatu LIKE tcurr-gdatu,
ukurs LIKE tcurr-ukurs,
ffact LIKE tcurr-ffact,
tfact LIKE tcurr-tfact,
END OF gv_tcurr.
DATA: gt_tcurr TYPE STANDARD TABLE OF gv_tcurr WITH HEADER LINE.
DATA: lv_kurst LIKE tcurr-kurst.
"DATA: lv_waers LIKE tcurr-ukurs.
DATA: lv_flag TYPE i.
DATA: lv_gdatu LIKE tcurr-gdatu.
IF lv_f_currency = lv_t_currency.
lv_t_amount = lv_f_amount.
EXIT.
ENDIF.
"lv_f_amount_external = lv_f_amount.
lv_waers = 0.
lv_flag = 1.
"还是得用实时汇率计算,全部取发票日期当月第一天的汇率计算
firstdayofmonth = lv_data.
firstdayofmonth+6(2) = '01'.
"lv_gdatu = 99999999 - firstdayofmonth. "有效期 = 99999999 - 有效期字段
CONVERT DATE firstdayofmonth INTO INVERTED-DATE lv_gdatu.
"当汇率类型为EURX时,注意欧元汇率基本上维护在这个发票类型中,且基本上为倒数汇率
"单发票类型为M时,且从的货币是日元时,汇率被放大了100倍
IF lv_f_currency = 'EUR' OR lv_t_currency = 'EUR'.
lv_kurst = 'EURX'.
ELSE.
lv_kurst = 'M'.
ENDIF.
SELECT *
FROM tcurr
UP TO 1 ROWS
INTO CORRESPONDING FIELDS OF TABLE gt_tcurr
WHERE
( kurst EQ lv_kurst )
AND ( fcurr EQ lv_f_currency )
AND ( tcurr EQ lv_t_currency )
AND ( gdatu EQ lv_gdatu ).
IF sy-subrc <> '0'.
lv_flag = 2.
SELECT *
FROM tcurr
UP TO 1 ROWS
INTO CORRESPONDING FIELDS OF TABLE gt_tcurr
WHERE
( kurst EQ lv_kurst )
AND ( fcurr EQ lv_t_currency )
AND ( tcurr EQ lv_f_currency )
AND ( gdatu EQ lv_gdatu ).
ENDIF.
IF gt_tcurr[] IS NOT INITIAL.
READ TABLE gt_tcurr INDEX 1.
lv_waers = gt_tcurr-ukurs.
ENDIF.
IF lv_waers < 0.
lv_waers = 1 / lv_waers * -1.
ENDIF.
IF lv_waers = 0.
lv_t_amount = 0.
ELSE.
IF lv_flag = 1.
lv_t_amount = lv_f_amount * lv_waers.
IF lv_f_currency = 'JPY' AND lv_t_currency = 'CNY'.
lv_t_amount = lv_t_amount / 100.
ENDIF.
ELSE.
lv_t_amount = lv_f_amount / lv_waers.
IF lv_f_currency = 'CNY' AND lv_t_currency = 'JPY'.
lv_t_amount = lv_t_amount * 100.
ENDIF.
ENDIF.
ENDIF.
"将外部金额转换为内部存储金额,实质上过程是将外部金额除以转换因子即可得到
* CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
* EXPORTING
* currency = lv_f_currency
* amount_external = lv_f_amount_external "外部金额
* max_number_of_digits = 23 "没什么作用,一般写23即可
* IMPORTING
* amount_internal = lv_f_amount "转换后的内部存储金额
* return = ret.
* CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
* EXPORTING
* date = lv_data
* foreign_amount = lv_f_amount "源货币金额(内部格式)
* foreign_currency = lv_f_currency "源货币类型
* local_currency = lv_t_currency "目标货币类型
* IMPORTING
* local_amount = lv_t_amount. "目标货币金额(内部格式)
ENDFUNCTION.