货币转换因子

文章详细描述了SAP系统中的CURRENCY_CONVERTING_FACTOR函数如何处理特殊货币如日元、韩元等的转换,涉及读取TCURX表中的货币小数位数计算转换因子的过程。并通过示例展示了如何在程序中调用该函数进行金额的转换操作。
摘要由CSDN通过智能技术生成

货币转换因子

事务代码SE37,输入:CURRENCY_CONVERTING_FACTOR,点击执行
在这里插入图片描述
输入CNY,点击执行:

执行结果如下,factor为0.01:
在这里插入图片描述

FUNCTION CURRENCY_CONVERTING_FACTOR.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"       IMPORTING
*"             VALUE(CURRENCY) LIKE  TCURR-TCURR
*"       EXPORTING
*"             VALUE(FACTOR) TYPE  ISOC_FACTOR
*"       EXCEPTIONS
*"              TOO_MANY_DECIMALS
*"----------------------------------------------------------------------
DATA:    CUR_FACTOR TYPE ISOC_FACTOR.
*- determine Decimal place in currency from  TCURX
CLEAR TCURX.
SELECT SINGLE * FROM TCURX WHERE CURRKEY EQ CURRENCY.
IF SY-SUBRC NE 0.
  TCURX-CURRDEC = 2.
ENDIF.
IF TCURX-CURRDEC GT 5.
*- entry in tcurx with more than 5 decimals not allowed
  RAISE TOO_MANY_DECIMALS.
ENDIF.
*- compute converting factor respecting currency
CUR_FACTOR = 100.
IF TCURX-CURRDEC NE 0.
  DO TCURX-CURRDEC TIMES.
    CUR_FACTOR = CUR_FACTOR / 10.
  ENDDO.
ENDIF.
IF CUR_FACTOR = 0.
*- factor 0 not allowed; check data definition of factor
*- entry in tcurx with more than 5 decimals not allowed
  RAISE TOO_MANY_DECIMALS.
ENDIF.
FACTOR = CUR_FACTOR.

ENDFUNCTION.

货币转换函数:CURRENCY_CONVERTING_FACTOR
【CURRENCY_CONVERTING_FACTOR】在SAP系统中,对于曰币、韩币、台币这类特殊货币的处理是有特殊规则的。

首先根据币别到DB表TCURX中读取相应的小数位数CURRDEC。
如果没有维护相应币别信息则默认CURRDEC = 2。
如果 CURRDEC GT 5.就报错。
然后默认转换比率是100。
在CURRDEC NE 0的情况下
循环CURRDEC次,每次将转换比率除以10 。
所以如果表TCURX中的CURRDEC = 0,就默认转换比率为100。
当表TCURX中没有找到相应数据时则默认CURRDEC = 2。
转换比率也就是100 / 10 / 10 = 1.

其他的比如如果表TCURX中的CURRDEC = 4,则转换比率应该为 100 / 10 / 10 / 10 / 10 = 0.01

我们在SE16中看到的货币金额基本上都经过了这个转换,如曰元,都是除以100后存入数据库的。
所以当我们从数据库中读取曰元金额时也应该作相应的转换,乘以100

在这里插入图片描述

*&---------------------------------------------------------------------*
*& Report ZTEST_CURRENCY_CONVERT_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST_CURRENCY_CONVERT_LHY.
DATA: l_netwr TYPE p DECIMALS 2.
l_netwr = '1.8'.
WRITE:/ 'JPY:',l_netwr CURRENCY 'JPY'.
WRITE:/ 'RMB:',l_netwr CURRENCY 'RMB'.
WRITE:/ 'CNY:',l_netwr CURRENCY 'CNY'.

结果:
在这里插入图片描述
输入TCURX,点击执行按钮:

结果如下:
在这里插入图片描述
这里维护的是4位小数,也就是100除以4个10,即100/10/10/10/10,也就是小数点往左移4位,100 * 0.0001 = 0.01

比如我们输入的是100,存入数据库的是1,

我在MSEG底表查询到的数据是:
在这里插入图片描述
但是我打印出来放大了100倍:
在这里插入图片描述

现在如果要显示透明表的数据,需要乘以一个转换因子:
在这里插入图片描述

在这里插入图片描述

程序

*&---------------------------------------------------------------------*
*& Report ZTEST_CURRENCY_CONVERT_LHY
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_currency_convert_lhy.
DATA: l_netwr TYPE p DECIMALS 2.
*l_netwr = '1.8'.
*WRITE:/ 'JPY:',l_netwr CURRENCY 'JPY'.
*WRITE:/ 'RMB:',l_netwr CURRENCY 'RMB'.
*WRITE:/ 'CNY:',l_netwr CURRENCY 'CNY'.
DATA currency TYPE tcurr-tcurr.
DATA factor   TYPE isoc_factor.
currency = 'CNY'.
CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'
  EXPORTING
    currency                = currency
 IMPORTING
   factor                  = factor
 EXCEPTIONS
   too_many_decimals       = 1
   OTHERS                  = 2
          .
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.

SELECT
    matnr,  "模具料号
    menge,  "数量
    dmbtr  "金额
    FROM mseg
  WHERE werks = '1000'
  AND matnr = '000000000000004290'"18位
  INTO  TABLE @DATA(lt_data).
  "cl_demo_output=>display( lt_data ).
  WRITE:/,'ls_data:', '物料号','                                         数量','           金额'.
  LOOP AT lt_data INTO DATA(ls_data).
    WRITE:/ , '------------------------处理之前------------------------------'.
    WRITE:/,'ls_data:', ls_data-matnr,ls_data-menge,ls_data-dmbtr.
    ls_data-dmbtr = ls_data-dmbtr * factor.
    WRITE:/ , '------------------------处理之后------------------------------'.
    WRITE:/,'ls_data:', ls_data-matnr,ls_data-menge,ls_data-dmbtr.
  ENDLOOP.
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值