CDS VIEW上で直接通貨換算を行う方法
執筆の経緯
システム間連携のためをAPI作成することになったが、カスタムCDS VIEWではカスタムクエリの様に、通貨の換算処理をすることができないため、テーブルから換算前後の通貨を複合キーにすることで比率を呼び出し、換算を実施しようとした。しかし、カスタムCDSアプリではループ処理を回すような記述?が使用できないためSAP標準の関数を使用することとした。その調査を実施したため備忘として書き残す。
サンプルコード
currency_conversion(
amount => DataSauce.NetAmount,
source_currency => DataSauce.TransactionCurrency,
target_currency => cast( 'USD' as ABAP.CUKY( 5 ) ),
exchange_rate_date => DataSauce.ConversionDate,
exchange_rate_type => 'M',
error_handling => 'SET_TO_NULL',
round => 'false',
decimal_shift => 'true',
decimal_shift_back => 'false'
)
各パラメータの詳細
パラメータ名称 | データ型 | 制御項目 |
---|---|---|
amount | CURR | 換算対象の金額 |
source_currency | CUKY | 換算元の通貨 |
target_currency | CUKY | 換算後の通貨 |
exchange_rate_date | DATS | 換算レートの基準日 |
exchange_rate_type | CHAR | 換算レートタイプ |
client | CLNT | クライアント番号(パブクラでは指定不要) |
round | CHAR | 四捨五入の要否。trueの場合、returnが丸められる。 |
decimal_shift | CHAR | trueの場合引数は変換前に、変換元通貨の小数点以下の桁数を引いた 2^10倍される。 |
decimal_shift_back | CHAR | trueの場合引数は変換前に、変換元通貨の小数点以下の桁数を引いた 2^10除される。 |
error_handling | CHAR | エラー時の挙動を制御。nullもしくはerrorを返却する。 |
本関数で実現可能なこと
CURRENCY_CONVERSIONでは、正式なパラメータamountに渡された値の通貨変換が可能。 returnはamountに渡された実際のパラメータと同じ技術的属性を持つデータ型CURRを保持し、通貨変換は、パッケージSFIBのデータベーステーブルTCURに保存されたクライアント固有のルールに基づいて実行される。 これらのルールは、Trcd:OB08 を使用して編集可能。
警告
本関数では換算元の金額と換算レートの少数第3位以下がデフォルトで丸められるため誤差が発生する。
金額的なインパクトは少ないが、完全な値が欲しい場合は換算レートと伝票のテーブルを使用して直接換算を実施する必要がある。
まとめ
一部の制約はあるものの一部用途では活用出来るというのが所感。
デフォルトで丸め誤差が発生するため、AP,AR,受発注側でのレポート利用は、クライアントの反応を見た感じでは利用は困難というのが所感。デフォルトの丸め誤差については、無効化が不可であるとの情報を受領しており、今後の機能拡充も見込めないとのこと。さらなる詳細については後述のリファレンスを確認されたし。