在SAP系统内,不同的货币的小数的位数有可能不一样的,比如:日币和人民币的就不同。
代码:
1 2 3 4 5 |
REPORT ztest_currency_convert. DATA: l_netwr TYPE p DECIMALS 2. l_netwr = '1.8'. WRITE:/ 'JPY:',l_netwr CURRENCY 'JPY'. WRITE:/ 'RMB:',l_netwr CURRENCY 'RMB'. |
运行结果:
同样输入了1.8,但是输出的结果却不同,日币扩大了100倍,变成了180日元,而RMB还保持原样,1.8元,想想很合理,日元最小单位是元,而rmb最小是分。
换句话,系统自动给日元加了个转换因子100,rmb的转换因子是1.
这个转换因子学名叫货币转换因子(Currency Converting Factor),是在abap开发中的一个重要的概念。计算公式如下:
货币转换因子 = 100 × 货币的最小单位(小数点后位数,例如,小数点3位,最小单位就是0.001).
当没有小数点时,货币转换因子就是100 × 1 = 100.
货币的小数位数是保存在表TCURX中的,正常的货币都是小数点后2位的,这个是默认的,不保存在这个表中,也就是凡是在表tcurx中找不到的货币的转换因子都是100 × 0.01 = 1,比如rmb。
在上图中能看到日元的是没有小数点,是0,所以日元的转换因子 = 100 × 1 = 100.
SAP提供了一个函数CURRENCY_CONVERTING_FACTOR能直接得到货币的转换因子,
上面这个货币的转换过程是SAP自动实现的,比如180日元在数据库中会自动保存成1.8,但是有个前提就是一定要指定币种。
数据库中显示:
而在屏幕上,读出来的就是自动转换后的正确金额。
我们在ABAP编程时要注意指定币种:
1) write输出时,指定currency
1 |
WRITE: g_netwr CURRENCY vbap-waerk. |
2) screen中指定参考单位
3) ALV 中也要在catelog中指定参考货币单位,
SLIS_T_FIELDCAT_ALV-cfieldname
SLIS_T_FIELDCAT_ALV-slis_tabname
OO ALV中
另外:货币的一些相关表:
TCURT:货币描述文本
TCURC:货币代码(Currency Codes)
CURRENCY_AMOUNT_BAPI_TO_SAP 和CURRENCY_AMOUNT_SAP_TO_BAPI可以进行货币倍数之间的互相转换
以上。
发表评论