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'