Chinaunix首页 | 论坛 | 博客
  • 博客访问: 710222
  • 博文数量: 145
  • 博客积分: 3446
  • 博客等级: 中校
  • 技术积分: 1567
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-30 13:58
文章分类

全部博文(145)

文章存档

2021年(1)

2020年(1)

2019年(1)

2018年(6)

2017年(1)

2016年(10)

2015年(12)

2014年(10)

2013年(15)

2012年(33)

2011年(21)

2010年(9)

2009年(18)

2008年(2)

2006年(5)

我的朋友

分类: Web开发

2018-11-28 14:10:32

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

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



阅读(3765) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~