货币转换因子
事务代码SE37,输入:CURRENCY_CONVERTING_FACTOR,点击执行
输入CNY,点击执行:
执行结果如下,factor为0.01:
FUNCTION CURRENCY_CONVERTING_FACTOR.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(CURRENCY) LIKE TCURR-TCURR
*" EXPORTING
*" VALUE(FACTOR) TYPE ISOC_FACTOR
*" EXCEPTIONS
*" TOO_MANY_DECIMALS
*"----------------------------------------------------------------------
DATA: CUR_FACTOR TYPE ISOC_FACTOR.
*- determine Decimal place in currency from TCURX
CLEAR TCURX.
SELECT SINGLE * FROM TCURX WHERE CURRKEY EQ CURRENCY.
IF SY-SUBRC NE 0.
TCURX-CURRDEC = 2.
ENDIF.
IF TCURX-CURRDEC GT 5.
*- entry in tcurx with more than 5 decimals not allowed
RAISE TOO_MANY_DECIMALS.
ENDIF.
*- compute converting factor respecting currency
CUR_FACTOR = 100.
IF TCURX-CURRDEC NE 0.
DO TCURX-CURRDEC TIMES.
CUR_FACTOR = CUR_FACTOR / 10.
ENDDO.
ENDIF.
IF CUR_FACTOR = 0.
*- factor 0 not allowed; check data definition of factor
*- entry in tcurx with more than 5 decimals not allowed
RAISE TOO_MANY_DECIMALS.
ENDIF.
FACTOR = CUR_FACTOR.
ENDFUNCTION.
货币转换函数:CURRENCY_CONVERTING_FACTOR
【CURRENCY_CONVERTING_FACTOR】在SAP系统中,对于曰币、韩币、台币这类特殊货币的处理是有特殊规则的。
首先根据币别到DB表TCURX中读取相应的小数位数CURRDEC。
如果没有维护相应币别信息则默认CURRDEC = 2。
如果 CURRDEC GT 5.就报错。
然后默认转换比率是100。
在CURRDEC NE 0的情况下
循环CURRDEC次,每次将转换比率除以10 。
所以如果表TCURX中的CURRDEC = 0,就默认转换比率为100。
当表TCURX中没有找到相应数据时则默认CURRDEC = 2。
转换比率也就是100 / 10 / 10 = 1.
其他的比如如果表TCURX中的CURRDEC = 4,则转换比率应该为 100 / 10 / 10 / 10 / 10 = 0.01
我们在SE16中看到的货币金额基本上都经过了这个转换,如曰元,都是除以100后存入数据库的。
所以当我们从数据库中读取曰元金额时也应该作相应的转换,乘以100
*&---------------------------------------------------------------------*
*& Report ZTEST_CURRENCY_CONVERT_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_CURRENCY_CONVERT_LHY.
DATA: l_netwr TYPE p DECIMALS 2.
l_netwr = '1.8'.
WRITE:/ 'JPY:',l_netwr CURRENCY 'JPY'.
WRITE:/ 'RMB:',l_netwr CURRENCY 'RMB'.
WRITE:/ 'CNY:',l_netwr CURRENCY 'CNY'.
结果:
输入TCURX,点击执行按钮:
结果如下:
这里维护的是4位小数,也就是100除以4个10,即100/10/10/10/10,也就是小数点往左移4位,100 * 0.0001 = 0.01
比如我们输入的是100,存入数据库的是1,
我在MSEG底表查询到的数据是:
但是我打印出来放大了100倍:
现在如果要显示透明表的数据,需要乘以一个转换因子:
程序
*&---------------------------------------------------------------------*
*& Report ZTEST_CURRENCY_CONVERT_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_currency_convert_lhy.
DATA: l_netwr TYPE p DECIMALS 2.
*l_netwr = '1.8'.
*WRITE:/ 'JPY:',l_netwr CURRENCY 'JPY'.
*WRITE:/ 'RMB:',l_netwr CURRENCY 'RMB'.
*WRITE:/ 'CNY:',l_netwr CURRENCY 'CNY'.
DATA currency TYPE tcurr-tcurr.
DATA factor TYPE isoc_factor.
currency = 'CNY'.
CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
EXPORTING
currency = currency
IMPORTING
factor = factor
EXCEPTIONS
too_many_decimals = 1
OTHERS = 2
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
SELECT
matnr, "模具料号
menge, "数量
dmbtr "金额
FROM mseg
WHERE werks = '1000'
AND matnr = '000000000000004290'"18位
INTO TABLE @DATA(lt_data).
"cl_demo_output=>display( lt_data ).
WRITE:/,'ls_data:', '物料号',' 数量',' 金额'.
LOOP AT lt_data INTO DATA(ls_data).
WRITE:/ , '------------------------处理之前------------------------------'.
WRITE:/,'ls_data:', ls_data-matnr,ls_data-menge,ls_data-dmbtr.
ls_data-dmbtr = ls_data-dmbtr * factor.
WRITE:/ , '------------------------处理之后------------------------------'.
WRITE:/,'ls_data:', ls_data-matnr,ls_data-menge,ls_data-dmbtr.
ENDLOOP.