汇率存储的表位TCURR
汇率维护的事务代码为:OB08
每一种货币汇率都有很多版本,按照时间有效性管理
汇率涉及的两种货币,第一个为从,第二个为到,一般换算比率都是1,但也有不是1的情况(主要是换算双方差别较大,防止小数点位数太多导致差异过大),比如从日元到人民币的换算的汇率就是 100日元 兑换 ?? 人民币。
汇率按照汇率类型进行管理
实际的汇率类型设计以及汇率的形式的定义都是按照相关法律法规以及实际业务的需要,汇率值是按照国际汇率的情况,定期进行更新。
另外在采购、收货、发票等环节,都会使用当时的最新的汇率进行计算,比如:
【
如果是进口件采购,使用外币签订订单则
在采购订单抬头上有货币(ekko-waers)和当时汇率(ekko-wkurs)
采购订单行项目中有相应的货币的单价(ekpo-netpr)和总价(ekpo-netwr)
采购订单收货时:除外币收货金额(ekbe-wrbtr)外,还有按照当时汇率折算的本币金额ekbe-dmbtr。在采购订单收货凭证中也有货币(ekbe-waers)
开发票时,也是按照到货金额(外币),但是还会按照当时的汇率折算一个本地金额(CNY)
在发票抬头中有开票的货币rbkp-waers(外币)及汇率rbkp-kursf(开票当时)。
】
汇率读取和计算的function module:
1,汇率读取:
FUNCTION zmm272_get_ukurs.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_DATUM) TYPE DATUM
*" VALUE(I_CURR) TYPE FWAER2
*" EXPORTING
*" VALUE(O_UKURS) TYPE UKURS_CURR
*"----------------------------------------------------------------------
DATA lt_tcurr LIKE tcurr OCCURS 0 WITH HEADER LINE.
DATA: l_gdatu LIKE sy-datum,
l_fcurr LIKE tcurr-fcurr,
l_tcurr LIKE tcurr-tcurr,
l_kurst LIKE tcurr-kurst.
CALL FUNCTION 'CONVERSION_EXIT_INVDT_INPUT'
EXPORTING
input = i_datum
IMPORTING
output = l_gdatu.
CASE i_curr.
WHEN 'EUR'. " 如果是欧元
l_fcurr = 'CNY'.
l_tcurr = i_curr.
l_kurst = 'EURX'.
WHEN OTHERS. " 如果是其它货币
l_fcurr = i_curr.
l_tcurr = 'CNY'.
l_kurst = 'M'.
ENDCASE.
SELECT kurst fcurr tcurr ukurs gdatu UP TO 1 ROWS
INTO CORRESPONDING FIELDS OF TABLE lt_tcurr
FROM tcurr "汇率
WHERE kurst EQ 'M' "汇率类型
AND fcurr EQ l_fcurr "从货币
AND tcurr EQ l_tcurr "最终货币
AND gdatu >= l_gdatu "汇率有效起始日期
ORDER BY gdatu.
read table lt_tcurr index 1.
if sy-subrc = 0.
O_UKURS = lt_tcurr-ukurs.
endif.
ENDFUNCTION.
2. 基于汇率的价格换算
FUNCTION ZMM272_GET_NETPR.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_DATUM) TYPE DATUM
*" VALUE(I_CURR) TYPE FWAER2
*" VALUE(I_NETPR) TYPE NETPR
*" VALUE(I_FLAG) TYPE CHAR1
*" VALUE(I_UKURS) TYPE UKURS_CURR OPTIONAL
*" EXPORTING
*" VALUE(O_NETPR) TYPE NETPR
*"----------------------------------------------------------------------
DATA lt_tcurr LIKE tcurr OCCURS 0 WITH HEADER LINE.
DATA: l_gdatu LIKE sy-datum,
l_fcurr LIKE tcurr-fcurr,
l_tcurr LIKE tcurr-tcurr,
l_kurst LIKE tcurr-kurst.
DATA l_ukurs TYPE ukurs_curr.
l_ukurs = i_ukurs.
IF l_ukurs IS INITIAL.
CALL FUNCTION 'ZMM272_GET_UKURS'
EXPORTING
i_datum = i_datum
i_curr = i_curr
IMPORTING
o_ukurs = l_ukurs.
ENDIF.
IF l_ukurs > 0.
IF i_flag = 'A'. " 从CNY到外币转换;
CASE i_curr.
WHEN 'EUR'. " 如果是欧元
o_netpr = i_netpr * l_ukurs.
WHEN 'JPY'. " 如果是日元,要考虑100倍的问题
o_netpr = i_netpr * 100 / l_ukurs.
WHEN OTHERS. " 如果是其它货币
o_netpr = i_netpr * 100 / l_ukurs.
ENDCASE.
ELSEIF i_flag = 'B'. " 从外币到CNY转换
CASE i_curr.
WHEN 'EUR'. " 如果是欧元
o_netpr = i_netpr / l_ukurs.
WHEN 'JPY'. " 如果是日元,要考虑100倍的问题
o_netpr = i_netpr * l_ukurs / 100 .
WHEN OTHERS. " 如果是其它货币
o_netpr = i_netpr * l_ukurs.
ENDCASE.
ENDIF.
ENDIF.
ENDFUNCTION.
3. 基于汇率的金额计算
FUNCTION zmm272_get_money.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(I_DATUM) TYPE DATUM
*" VALUE(I_CURR) TYPE FWAER2
*" VALUE(I_MONEY) TYPE DFIDPT_AMOUNT
*" VALUE(I_FLAG) TYPE CHAR1
*" VALUE(I_UKURS) TYPE UKURS_CURR OPTIONAL
*" EXPORTING
*" VALUE(O_MONEY) TYPE DFIDPT_AMOUNT
*"----------------------------------------------------------------------
DATA lt_tcurr LIKE tcurr OCCURS 0 WITH HEADER LINE.
DATA: l_gdatu LIKE sy-datum,
l_fcurr LIKE tcurr-fcurr,
l_tcurr LIKE tcurr-tcurr,
l_kurst LIKE tcurr-kurst.
DATA l_ukurs TYPE ukurs_curr.
l_ukurs = i_ukurs.
IF l_ukurs IS INITIAL.
CALL FUNCTION 'ZMM272_GET_UKURS'
EXPORTING
i_datum = i_datum
i_curr = i_curr
IMPORTING
o_ukurs = l_ukurs.
ENDIF.
IF l_ukurs > 0.
IF i_flag = 'A'. " 从CNY到外币转换;
CASE i_curr.
WHEN 'EUR'. " 如果是欧元
o_money = i_money * l_ukurs.
WHEN 'JPY'. " 如果是日元,要考虑100倍的问题
o_money = i_money * 100 / l_ukurs.
WHEN OTHERS. " 如果是其它货币
o_money = i_money * 100 / l_ukurs.
ENDCASE.
ELSEIF i_flag = 'B'. " 从外币到CNY转换
CASE i_curr.
WHEN 'EUR'. " 如果是欧元
o_money = i_money / l_ukurs.
WHEN 'JPY'. " 如果是日元,要考虑100倍的问题
o_money = i_money * l_ukurs / 100 .
WHEN OTHERS. " 如果是其它货币
o_money = i_money * l_ukurs.
ENDCASE.
ENDIF.
ENDIF.
ENDFUNCTION.