ABAP 金额内外部转换函数

 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/货币的最大单位与最小单位换算率,金额入库时需要除以这个转换因子,读取出来展示前需要乘以这个转换因子。

posted @ 2016-09-07 23:32  做梦都笑醒  阅读(9363)  评论(0编辑  收藏  举报