ZCONVERT_TO_CURRENCY 不同币别金额转换

        CALL FUNCTION 'ZCONVERT_TO_CURRENCY'
          EXPORTING
            lv_f_currency = lv_bsid_waerk "源货币类型
            lv_t_currency = ls_vbrk-waerk "目标货币类型
            lv_f_amount   = lv_balance    "源货币金额
            lv_data       = lv_datum   “日期
          IMPORTING
            lv_t_amount   = lv_balance.    "目标货币金额

 

注意:该rfc 是 根据入参所在日期当月第一天的汇率作为计算基准

入参:

LV_F_CURRENCY    TYPE    WAERS
LV_T_CURRENCY    TYPE    WAERS
LV_F_AMOUNT    TYPE    P
LV_DATA    TYPE    SYST_DATUM

出参:

LV_T_AMOUNT    TYPE    P
LV_WAERS    TYPE    TCURR-UKURS

FUNCTION zconvert_to_currency.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(LV_F_CURRENCY) TYPE  WAERS OPTIONAL
*"     VALUE(LV_T_CURRENCY) TYPE  WAERS OPTIONAL
*"     VALUE(LV_F_AMOUNT) TYPE  P OPTIONAL
*"     VALUE(LV_DATA) TYPE  SYST_DATUM OPTIONAL
*"  EXPORTING
*"     VALUE(LV_T_AMOUNT) TYPE  P
*"     VALUE(LV_WAERS) TYPE  TCURR-UKURS
*"----------------------------------------------------------------------

  DATA: ret TYPE bapireturn.

  "DATA: lv_f_amount_external(12) TYPE p DECIMALS 4.
  DATA firstdayofmonth TYPE sy-datum.

  TYPES:BEGIN OF gv_tcurr,
          kurst LIKE tcurr-kurst,
          fcurr LIKE tcurr-fcurr,
          tcurr LIKE tcurr-tcurr,
          gdatu LIKE tcurr-gdatu,
          ukurs LIKE tcurr-ukurs,
          ffact LIKE tcurr-ffact,
          tfact LIKE tcurr-tfact,
        END OF gv_tcurr.
  DATA: gt_tcurr TYPE STANDARD TABLE OF gv_tcurr WITH HEADER LINE.
  DATA: lv_kurst LIKE tcurr-kurst.
  "DATA: lv_waers LIKE tcurr-ukurs.
  DATA: lv_flag TYPE i.
  DATA: lv_gdatu LIKE tcurr-gdatu.


  IF lv_f_currency = lv_t_currency.
    lv_t_amount = lv_f_amount.
    EXIT.
  ENDIF.

  "lv_f_amount_external = lv_f_amount.
  lv_waers = 0.
  lv_flag = 1.

  "还是得用实时汇率计算,全部取发票日期当月第一天的汇率计算
  firstdayofmonth = lv_data.
  firstdayofmonth+6(2) = '01'.
  "lv_gdatu = 99999999 - firstdayofmonth. "有效期 = 99999999 - 有效期字段
  CONVERT DATE firstdayofmonth INTO INVERTED-DATE lv_gdatu.

  "当汇率类型为EURX时,注意欧元汇率基本上维护在这个发票类型中,且基本上为倒数汇率
  "单发票类型为M时,且从的货币是日元时,汇率被放大了100倍

  IF lv_f_currency = 'EUR' OR lv_t_currency = 'EUR'.
    lv_kurst = 'EURX'.
  ELSE.
    lv_kurst = 'M'.
  ENDIF.

  SELECT *
  FROM tcurr
  UP TO 1 ROWS
  INTO CORRESPONDING FIELDS OF TABLE gt_tcurr
  WHERE
  ( kurst EQ lv_kurst )
  AND ( fcurr EQ lv_f_currency )
  AND ( tcurr EQ lv_t_currency )
  AND ( gdatu EQ lv_gdatu ).

  IF sy-subrc <> '0'.
    lv_flag = 2.
    SELECT *
    FROM tcurr
    UP TO 1 ROWS
    INTO CORRESPONDING FIELDS OF TABLE gt_tcurr
      WHERE
      ( kurst EQ lv_kurst )
      AND ( fcurr EQ lv_t_currency )
      AND ( tcurr EQ lv_f_currency )
      AND ( gdatu EQ lv_gdatu ).

  ENDIF.

  IF gt_tcurr[] IS NOT INITIAL.
    READ TABLE gt_tcurr INDEX 1.
    lv_waers = gt_tcurr-ukurs.
  ENDIF.

  IF lv_waers < 0.
    lv_waers = 1 / lv_waers * -1.
  ENDIF.

  IF lv_waers = 0.
    lv_t_amount = 0.
  ELSE.
    IF lv_flag = 1.
      lv_t_amount = lv_f_amount * lv_waers.
      IF lv_f_currency = 'JPY' AND lv_t_currency = 'CNY'.
        lv_t_amount = lv_t_amount / 100.
      ENDIF.
    ELSE.
      lv_t_amount = lv_f_amount / lv_waers.
      IF lv_f_currency = 'CNY' AND lv_t_currency = 'JPY'.
        lv_t_amount = lv_t_amount * 100.
      ENDIF.
    ENDIF.
  ENDIF.

  "将外部金额转换为内部存储金额,实质上过程是将外部金额除以转换因子即可得到
*  CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL'
*    EXPORTING
*      currency             = lv_f_currency
*      amount_external      = lv_f_amount_external "外部金额
*      max_number_of_digits = 23 "没什么作用,一般写23即可
*    IMPORTING
*      amount_internal      = lv_f_amount "转换后的内部存储金额
*      return               = ret.

*  CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
*    EXPORTING
*      date             = lv_data
*      foreign_amount   = lv_f_amount "源货币金额(内部格式)
*      foreign_currency = lv_f_currency "源货币类型
*      local_currency   = lv_t_currency "目标货币类型
*    IMPORTING
*      local_amount     = lv_t_amount. "目标货币金额(内部格式)

ENDFUNCTION.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SAP_Damon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值