SAP货币存储
一般而言,币种的小数位为2,所以系统默认的位数也是2,但是有一些特殊币种如日元JPY,没有小数位。只要小数位不等于2,需要在系统中特殊处理(通过转换因子进行转换)。
1、如果某货币的小数位不是2位,则需要通过OY04设置其小数位数,即需在TCURX表中进行维护
2、系统中的数据表存放的日元JPY、俄卢布RUR等货币比前台输入的金额小100倍,因为它们没有小数位,所以转换因子为100,存入表之前SAP会先将金额除以这个因子后再存入
3、系统根据转换因子将原金额转换成含小位小数的金额后存储(据说根据ISO的什么标准),如日元为0位小数,转换因子为100,120日元除以因子100后转换后变成1.20,缩小100倍。如为USDN为5位小数,其转换因子为100/10/10/10/10/10=0.001,12.01230除以0.001后则转换成12012.30,扩大1000倍。SAP在金额数据存储时会自动的转换,即SAP很烦的external及internal的数据格式。
函数名 | 用途 | 备注 |
CURRENCY_CONVERTING_FACTOR | 取得货币的转换因子 | |
BAPI_CURRENCY_CONV_TO_INTERNAL | 根据货币把金额从外部转为内部 | |
BAPI_CURRENCY_CONV_TO_EXTERNAL | 根据货币把金额从内部转为外部 | |
CURRENCY_AMOUNT_DISPLAY_TO_SAP | 根据货币把金额从外部转为内部 | 参数类型固定(15,4) |
CURRENCY_AMOUNT_SAP_TO_DISPLAY | 根据货币把金额从内部转为外部 | 参数类型固定(15,4) |
UNITS_STRING_CONVERT | 将带分隔符的字符型金额转为数字型 | 不能转带有正负号的金额 |
CLOI_PUT_SIGN_IN_FRONT | 金额负号提前 | 只能用字符类型进行操作 |
WRITE | 格式化(转为字符型,加千分位) | WRITE <f> CURRENCY <c>. |
函数使用
- BAPI_CURRENCY_CONV_TO_INTERNAL
作用:将外部金额转换为内部存储金额,实质上过程是将外部金额除以转换因子即可得到
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' EXPORTING currency = 'JPY' "金额币别 amount_external = jpy_e "外部金额 max_number_of_digits = 23 "转换后金额最大长度 IMPORTING amount_internal = jpy_i "转换后的内部存储金额 return = ret. "消息
-
UNITS_STRING_CONVERT
作用:根据当前用户的金额显示方式,将带有分隔符的金额(字符型)转换为P类型的数值。
例如:将“1,000.123”转换为 1000.123
SAP中数字显示的三种方式:
1.小数点是逗号,分隔符是句号 N.NNN,NN
2.小数点是句号,分隔符是逗号 N,NNN.NN
3.小数点是逗号,分隔符是空格 N NNN,NN
系统以哪种方式显示,存储在用户表USR01的DCPFM字段,值分别是"空" 、“X”、“Y”。
调用函数的时候将这个字段将作为其中的一个输入参数.函数会根据当前显示转换.
DATA: l_clabs TYPE p DECIMALS 3, l_dcpfm LIKE usr01-dcpfm. SELECT SINGLE dcpfm INTO l_dcpfm FROM usr01 WHERE bname = sy-uname. CALL FUNCTION 'UNITS_STRING_CONVERT' EXPORTING units_string = '123,456.789' "-123,456.789 会报错 dcpfm = l_dcpfm "此时为 * MLLN = 'M' * TSND = 'T' IMPORTING units = l_clabs EXCEPTIONS invalid_type = 1 OTHERS = 2.
PS:转换因子是如何得到的
换算率:货币中最大单位与最小单位相差倍数
转换因子:转换因子 = 100/换算率
TCURX-CURRDEC中存储的小数位实质上是根据同种币种的最大单位与最小的换算率= 10X来计算得到的,式中的X即TCURX-CURRDEC表字段中的小数位,如CNY(元、角、分)中的最大单位元与最小单位分相差100倍(换算率为100),所以100 = 10X,X就为2,最后TCURX-CURRDEC存储的就是2(但如果值为2正好符合两位小数存储,是可以不需要在TCURX表中配置的,所以查不到CNY的配置数据,因为不配置时默认值也是2);另外,JPY日元没有最小单位,所以最大单位与最小单位的换算率就是1(1 = 10X),所以X就为0,所以TCURX-CURRDEC就是0。而转换因子计算式为:转换因子 = 100/10X,(CNY人民币:100/10X=100/102 =1,JPY日元:100/10X=100/100 =100),即转换因子 = 100/货币的最大单位与最小单位换算率,金额入库时需要除以这个转换因子,读取出来展示前需要乘以这个转换因子。