金額処理

 

ABAPにおける金額項目は常に特定の通貨と結び付けられています。異なる通貨の金額換算や、内部書式と外部書式間の変換など、SAP標準から様々な汎用モジュールを用意されています。 このトピックでは、金額処理に関わる様々な方法を目的毎に纏めて説明します。

通貨換算係数取得

CURRENCY_CONVERTING_FACTOR

通貨換算係数を取得する関数。

DATA: WK_WAERS TYPE VBRK-WAERK. DATA: WK_FACTOR TYPE P DECIMALS 3.

CALL FUNCTION 'CURRENCY_CONVERTING_FACTOR'  EXPORTING   CURRENCY = WK_WAERS “ 通貨コード  IMPORTING   FACTOR = WK_FACTOR ” 通貨換算係数  EXCEPTIONS   TOO_MANY_DECIMALS = 1   OTHERS = 2.

為替レート換算係数取得

READ_EXCHANGE_RATE

為替レート取得

READ_EXCHANGE_RATE

外貨通貨→国内通貨

外貨通貨金額から国内通貨金額を換算するには、汎用モジュールCONVERT_TO_LOCAL_CURRENCYを利用できます。

REPORT  Y_TEST_XXXX.

DATA:
      F_CURR       TYPE TCURR-FCURR,
      L_CURR       TYPE TCURR-TCURR,
      F_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      L_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      EX_RATE      TYPE TCURR-UKURS,
      F_FACTOR     TYPE TCURR-FFACT,
      L_FACTOR     TYPE TCURR-TFACT.


F_CURR  = 'JPY'.
L_CURR  = 'THB'.
F_VALUE = '0.02'.

CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
  EXPORTING
*   CLIENT           = SY-MANDT
    DATE             = SY-DATUM  "為替レート自動取得時の基準日
    FOREIGN_AMOUNT   = F_VALUE   "外貨通貨金額
    FOREIGN_CURRENCY = F_CURR    "外貨通貨
    LOCAL_CURRENCY   = L_CURR    "国内通貨
*    RATE            = '29.36'   "為替レートを指定する場合は、このパラメータを利用すると
                                 "ともにREAD_TCURRを''にする
    TYPE_OF_RATE     = 'B'       "為替レートタイプ B:
    READ_TCURR       = 'X'       "'X':為替レートはTCURRより取得、'':為替レートは
                                 "RATEパラメータの値を使用
  IMPORTING
    EXCHANGE_RATE       = EX_RATE   "換算時の為替レート
    FOREIGN_FACTOR      = F_FACTOR  "換算時の換算係数(外貨)
    LOCAL_AMOUNT        = L_VALUE   "換算後国内通貨金額
    LOCAL_FACTOR        = L_FACTOR  "換算時の換算係数(国内通貨)
*   EXCHANGE_RATEX          =
*   FIXED_RATE              =
*   DERIVED_RATE_TYPE       =
* EXCEPTIONS
*   NO_RATE_FOUND           = 1
*   OVERFLOW                = 2
*   NO_FACTORS_FOUND        = 3
*   NO_SPREAD_FOUND         = 4
*   DERIVED_2_TIMES         = 5
*   OTHERS                  = 6
   .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


WRITE:/'FOREIGN CURRENCY=', F_CURR,
      /'FOREIGN_FACTOR=', F_FACTOR,
      /'FOREIGN VALUE=', F_VALUE,
      /'EXCHANGE_RATE=', EX_RATE,
      /'LOCAL CURRENCY=', L_CURR,
      /'LOCAL_FACTOR=', L_FACTOR,
      /'LOCAL VALUE=',  L_VALUE.

WRITE:/ F_CURR,F_VALUE  CURRENCY F_CURR.
WRITE:/ L_CURR,L_VALUE  CURRENCY L_CURR.

国内通貨→外貨通貨

CONVERT_TO_FOREIGN_CURRENCY 国内通貨額の外貨への換算

REPORT  Y_TEST_XXXX.

DATA:
      F_CURR       TYPE TCURR-FCURR,
      L_CURR       TYPE TCURR-TCURR,
      F_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      L_VALUE      TYPE P LENGTH 8 DECIMALS 2,
      EX_RATE      TYPE TCURR-UKURS,
      F_FACTOR     TYPE TCURR-FFACT,
      L_FACTOR     TYPE TCURR-TFACT.


F_CURR  = 'JPY'.
L_CURR  = 'THB'.
L_VALUE = '3'.


CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'
  EXPORTING
*   CLIENT           = SY-MANDT
    DATE             = SY-DATUM  "為替レート自動取得時の基準日
    LOCAL_AMOUNT   = L_VALUE   "国内通貨金額
    FOREIGN_CURRENCY = F_CURR    "外貨通貨
    LOCAL_CURRENCY   = L_CURR    "国内通貨
*    RATE            = '0.07'   "為替レートを指定する場合は、このパラメータを利用すると
                                 "ともにREAD_TCURRを''にする
    TYPE_OF_RATE     = 'B'       "為替レートタイプ B:
    READ_TCURR       = 'X'       "'X':為替レートはTCURRより取得、'':為替レートは
                                 "RATEパラメータの値を使用
  IMPORTING
    EXCHANGE_RATE       = EX_RATE   "換算時の為替レート
    FOREIGN_FACTOR      = F_FACTOR  "換算時の換算係数(外貨)
    FOREIGN_AMOUNT     = F_VALUE   "換算後外貨金額
    LOCAL_FACTOR        = L_FACTOR  "換算時の換算係数(国内通貨)
*   EXCHANGE_RATEX          =
*   FIXED_RATE              =
*   DERIVED_RATE_TYPE       =
* EXCEPTIONS
*   NO_RATE_FOUND           = 1
*   OVERFLOW                = 2
*   NO_FACTORS_FOUND        = 3
*   NO_SPREAD_FOUND         = 4
*   DERIVED_2_TIMES         = 5
*   OTHERS                  = 6
   .
IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


WRITE:
      /'LOCAL CURRENCY=', L_CURR,
      /'LOCAL_FACTOR=', L_FACTOR,
      /'LOCAL VALUE=',  L_VALUE,
      /'FOREIGN CURRENCY=', F_CURR,
      /'FOREIGN_FACTOR=', F_FACTOR,
      /'FOREIGN VALUE=', F_VALUE,
      /'EXCHANGE_RATE=', EX_RATE
      .

WRITE:/ L_CURR,L_VALUE  CURRENCY L_CURR.
WRITE:/ F_CURR,F_VALUE  CURRENCY F_CURR.

任意通貨間の換算

任意通貨間の換算に関しては、標準から以下二つの汎用モジュールが提供されていますが、

  • CONVERT_FOREIGN_TO_FOREIGN_CUR 外貨金額の別外貨通貨への換算
  • CONVERT_CURRENCY_BY_RATE 与えられたレートを使用した通貨の変換

いずれも未リリースの属性状態であり、正しく動作しないようです。

SAPシステムでは、多通貨が混在しているため、実際に内部管理された金額値は、通貨毎にそれぞれ異なります。例えば、JPYの通貨型項目は通常本来の値の1/100で内部格納されています。 そのため、金額を入出力する際に、内部⇔外部の間に都度書式を変換する必要があります。

外部書式→内部書式変換

汎用モジュール利用

 
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_INTERNAL' 
EXPORTING 
currency = 'JPY' 
amount_external = l_external_amount 
max_number_of_digits = 15 
IMPORTING 
amount_internal = l_internal_amount. 

内部書式→外部書式変換

汎用モジュール利用

 
CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL' 
EXPORTING 
currency = 'JPY' 
amount_internal = l_internal_amount 
IMPORTING 
amount_external = l_external_amount.

命令利用

WRITE XXX TO XXX 'JPY'