動作例
巨大な数「単価」「購入数」「金額」を扱うモデルの例です。入力欄は数値ではなく文字列型を使います。
数値型を使わない理由
Wagbyの数値型は最大入力桁数の制限があります。具体的には、入力できる数値の範囲は -9,000,000,000,000,000 から 9,000,000,000,000,000 までとなっています。文字列型とすることで桁数の制限をなくします。さらに、計算式をすべてWagbyが提供する関数ADD,SUB,MUL,DIVを使うようにすることで演算誤差も抑えることができます。
巨大な数を文字列型として表示しています。3桁区切りのフォーマットを適用しています。
巨大な数を扱う(1)
登録・更新画面で、入力値を変更すると計算を行うこともできます。
巨大な数を扱う(2)
定義方法
項目ルール
項目ルールに基本的な設定を用意します。次の内容を含めます。
項目ルールを用意する
| カテゴリ | リポジトリキー | 設定値の例 | 説明 |
| 詳細 | model/modelitem/@rdbdatatype | numeric(15,2) | テーブル定義の型。DBごとに変わる。※後述。 |
| 詳細 | model/modelitem/write | CAST(NULLIF(REPLACE(?, ',', ''), '') AS numeric(15,2)) | SQL書き込み時に適用する式。DBごとに変わる。※後述。 |
| 出力制御 | presentation/displayitem/@numberformat | #,##0.00 | フォーマット(ユーザ定義)。テーブル定義の型に合わせる。 |
| 出力制御 | presentation/displayitem/@alignForShowList | 右寄せ | 一覧表示の値の表示位置(横) |
テーブル定義の型
テーブル定義の型はデータベースごとに指定方法が変わります。ここでは「兆」を扱う15桁(小数2桁)の定義例を示します。
| データベース | 型 |
| Oracle | NUMBER(15,2) |
| SQL Server | DECIMAL(15,2) |
| PostgreSQL | numeric(15,2) |
| MySQL 8 | decimal(15,2) |
| DB2 | DECIMAL(15,2) |
| HSQLDB | DECIMAL(15,2) |
書き込み時に適用する式
SQLに含める関数の詳細で説明します。
サンプルモデルへの適用
サンプルモデルでは、数字を扱う項目がすべて文字列型となっています。
サンプルモデル
これらの項目に、項目ルールを適用します。(上の例では「単価」「購入数」「金額」の3項目に、項目ルールを適用します。)
項目ルールを適用する
「読み込み時に適用する式」を指定します。これはデータベース固有の関数で、文字列型と数字型を変換するようにします。データベースから読み込み(SELECT)を行うSQLに、この関数が適用されます。なお「書き込み時に適用する式」は上で説明した項目ルールで指定した式が適用されます。
SQLに含める関数
SQLに含める関数の詳細
データベースごとに文字列型と数字型を変換する関数を指定します。読み込み時は数値を文字列に変換します。書き込み時はコンマを除去するREPLACE関数を適用するようにします。整数15桁小数2桁の場合の例を示します。
| データベース | 読み込み時に適用する式 | 書き込み時に適用する式 |
| Oracle | TO_CHAR(カラム名) | TO_NUMBER(NULLIF(REPLACE(?, ',', ''), ''), '9999999999999D99') |
| SQL Server | CAST(カラム名 AS varchar) | CAST(NULLIF(REPLACE(?, ',', ''), '') AS DECIMAL(15,2)) |
| PostgreSQL | CAST(カラム名 AS text) | CAST(NULLIF(REPLACE(?, ',', ''), '') AS numeric(15,2)) |
|
| MySQL 8 | CAST(カラム名 AS CHAR) | CAST(NULLIF(REPLACE(?, ',', ''), '') AS DECIMAL(15,2)) |
| DB2 | CHAR(カラム名) | DECIMAL(NULLIF(REPLACE(?, ',', ''), ''),15,2) |
| HSQLDB | CAST(カラム名 AS VARCHAR) | CAST(NULLIF(REPLACE(?, ',', ''), '') AS DECIMAL(15,2)) |
読み込みの式はカラム名を記載するため項目ごとに定義してください。書き込み時の式は共通利用できるため、項目ルールに記述する方法を推奨します。
※ この設定は Hibernate Mapping File (.hbm.xml) の column/@read と column/@write 属性に反映されます。
計算
桁数の大きな数字の演算は、Wagbyが提供する四則演算関数 ADD,SUB,MUL,DIV を使います。
四則演算関数を使う
仕様・制約
- 計算を行う場合、ADD,SUB,MUL,DIV 関数だけを使うことで演算誤差を抑えることができます。途中で一度でも浮動小数点数に変換してしまうと、その時点で誤差が混入する可能性があります。
- 最大で扱う桁数にあわせてデータベースの型と、出力フォーマットを設定してください。