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很烦的externalinternal的数据格式。

函数名用途备注
取得货币的转换因子 
   
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中存储的小数位实质上是根据同种币种的最大单位与最小的换算率= 10来计算得到的,式中的X即TCURX-CURRDEC表字段中的小数位,如CNY(元、角、分)中的最大单位与最小单位相差100倍(换算率为100),所以100 = 10X就为2,最后TCURX-CURRDEC存储的就是2(但如果值为2正好符合两位小数存储,是可以不需要在TCURX表中配置的,所以查不到CNY的配置数据,因为不配置时默认值也是2);另外,JPY日元没有最小单位,所以最大单位与最小单位的换算率就是1(1 = 10),所以X就为0,所以TCURX-CURRDEC就是0。而转换因子计算式为:转换因子 = 100/10,(CNY人民币:100/10=100/10 =1JPY日元:100/10=100/10 =100),即转换因子 = 100/货币的最大单位与最小单位换算率,金额入库时需要除以这个转换因子,读取出来展示前需要乘以这个转换因子。



09-26 16:50