matsukawar’s blog

個人的な技術ブログです。SAPネタを充実したい。Twitter : https://twitter.com/matsukawar

内部値を通貨換算して表示する方法の検討 #ABAP

概要

今日は、ABAPで通貨の内部値を外部値に変換して表示する方法について検討してみました。いままでは、BAPI_CURRENCY_CONV_TO_EXTERNALというBAPIを使っていましたが、ABAPString Format(文字列フォーマット)、及び、Embedded expression(組込式)を使うこともできる様です。

 ソースコード

https://github.com/matsukawar/curr_conv2external

「BAPI_CURRENCY_CONV_TO_EXTERNAL」を使用する基本パターン

DATA :
  LW_CUKY_NEW TYPE WAERS VALUE 'JPY', " 通貨コード
  LW_INPUT LIKE BAPICURR-BAPICURR, " 内部値
  LW_OUTPUT LIKE BAPICURR-BAPICURR. " 外部値


SET COUNTRY 'JP'.


LW_INPUT = '12.34'.


CALL FUNCTION 'BAPI_CURRENCY_CONV_TO_EXTERNAL'
  EXPORTING
    CURRENCY = LW_CUKY_NEW
    AMOUNT_INTERNAL = LW_INPUT
  IMPORTING
    AMOUNT_EXTERNAL = LW_OUTPUT.

 

" 表示結果 = 1,234円
WRITE / |{ LW_OUTPUT NUMBER = ENVIRONMENT DECIMALS = 0 }円|.

 BAPIを使用し、内部値を外部値に変換した後、文字列フォーマットで出力します。この際に、出力オプションとして、NUMBERDECIMALSを指定しています。

  •  NUMBER
    千の位に付けるカンマ「,」のフォーマットなどの指定方法。ドイツなどは、日本と違い、ドット「.」を千の位の区切り記号として使用するため、頭のほうで「SET COUNTRY 'JP'.」で切り替えをしています。通常は、「NUMBER = USER」を使うことで、ログイン時の言語フォーマットに依存になります。
  • DECIMALS
    小数点以下桁数の指定。BAPICURR-BAPICURRは小数点以下桁数4なので、そのまま出力した場合、「1234.0000」といったように、ゼロが邪魔となるため、出力時に0を指定します。

組込式のみで処理するパターン

DATA :
  LW_CUKY_NEW TYPE WAERS VALUE 'JPY', " 通貨コード
  LW_INPUT LIKE BAPICURR-BAPICURR, " 内部値
  LW_DEC TYPE P DECIMALS 2. " 出力変換用

 

SET COUNTRY 'JP'.

 

LW_INPUT = '12.34'.
LW_DEC = LW_INPUT.

 

" 出力結果 = 1,234円
WRITE / |{ LW_DEC CURRENCY = LW_CUKY_NEW NUMBER = ENVIRONMENT }円|.

組込式のCURRENCYを使います。BAPICURR型の内部値をそのまま渡すことができない様なので、いったん、仕様通りのP型(小数点以下2桁)に入れなおしてから、組込式で変換をかけています。ちなみに、

DATA(ZDISP_VAL) = |{ ... }|

のような使用方法もできるので、Buid-in functionのsubstringなどと組み合わせて使うことも可能かと思います。

 

小数点以下桁数を出さなければならない場合(1,234.56円の様な表示をする場合)はどうするのか?という事が気になったので、少し調べてみましたが、この場合は、BAPIを使うしかなさそうです。組込式でやろうと思いましたが、CURRENCYに「12.3456」を与えると、出力結果が、「123,456円」となってしまいました。使い方を調べましたが、入力値は小数点以下2桁まででないとダメみたいです。

NGコード

DATA :
  LW_CUKY_NEW TYPE WAERS VALUE 'JPY', " 通貨コード
  LW_INPUT LIKE BAPICURR-BAPICURR, " 内部値
  LW_DEC TYPE P DECIMALS 4. " 出力変換用

SET COUNTRY 'JP'.

LW_INPUT = '12.3456'.
LW_DEC = LW_INPUT.

" RESULT = 123,456円 (×不正解)
WRITE / |{ LW_DEC CURRENCY = LW_CUKY_NEW NUMBER = ENVIRONMENT }円|.

 

BAPI_CURRENCY_CONV_TO_EXTERNALを使う場合は、内部値に、BAPICURR-BAPICURR型を使いますが、こちらは、小数点以下4桁なので、内部値「12.3456」を与えてあげると「1234.56」に変換してくれました。