作者:sap侠之大者
场景:一个接口出问题了,SAP通过RFC将SO数据传输到Java系统,错误的将100日元传为1.00日元。
其实查看SAP透明表发现,表中存储的的确是1.00,是前台真实数据的1/100,开发接口时没注意到这种情况,也就导致了接口发生错误。
这在SAP系统中是常见的,SAP各种币种的金额都有默认的小数位数,像人民币CNY,美元等都是2位小数,日元和韩元是0位,及没有小数位。各种币种的金额在透明表中存储都是同一个字段,在存储到表中是都会做一个转换,就有了货币转换因子的概念,如上述日元,转换因子为100.
有以下几种转换方式:
1、使用function module CURRENCY_CONVERTING_FACTOR 获取某个币种的货币转换因子,然后将透明表中的金额乘以货币转换因子就可以了。
2、使用function module FWOS_CURRENCY_DECIMALS_READ 获取某个币种的小数位数N,货币转换因子等于10的(2 - N)次方。
3、直接进行转换的function module CURRENCY_AMOUNT_SAP_TO_DISPLAY,另外还有反向转换的CURRENCY_AMOUNT_DISPLAY_TO_SAP可以使用。
4、使用write to语句指定币种,WRITE p_amt1 currency 'JPY' to p_amt2.
还有两个问题,
Q1、为什么在SAP系统内开发的报表或功能程序没有显示错误呢?
A: 在ALV或者screen上人为指定了币种,这样SAP系统会根据此币种的货币转换因子自动转换后显示。
Q2:使用货币转换因子,乘法还好,除法的话会出现小数位四舍五入的,导致的数据误差怎么办?
A:没法办。SAP标准程序输入金额大多不会有此问题,他根据币种限制了小数位数的输入;但是自定义开发的程序多半没有考虑,像一些报表需要复杂的金额运算,小数位误差在所难免。
在SAP条件记录中,百分比的存储也有此种情况,需要注意。