基本的な書き方
最終更新日: 2021年6月11日
R8 | R9
モデル項目詳細定義ダイアログの「詳細 > 自動計算」の欄に、計算式を記述します。
Wagby がサポートしている四則演算式は次のとおりです。
自動計算項目は計算により値が一意に決まるため、登録・更新画面では読み取り専用項目となります。
四則演算に加え、Wagbyが提供するさまざまな関数を利用することができます。関数の一覧はこちらをお読みください。
式中に(同一モデル内の)項目を指定することができます。項目名の指定は「${...}」と記述します。(... の部分に英語項目名を指定します。)
以下に例を示します。
条件判定式の書き方は、対象となる項目の「型」によって異なります。
式を入力する専用のダイアログを用意しています。図2の赤枠部分に示すボタンを押下して、入力ダイアログを開きます。
ダイアログでは、関数と項目名をマウスで選択できます。
はじめに関数の「種別」を指定します。種別の詳細は「関数」のページをお読みください。
種別を指定すると、さらに利用できる関数を一覧から選択することができます。
利用したい関数を選択後、「コピー」ボタンを押します。
式の入力欄で CTRL-V キーで「ペースト」します。
さらに、モデル内の項目を選択することができます。
項目を選択後、同様にコピーボタンを押下します。
先ほど入力した関数の引数部分で、この項目に相当する箇所をマウスで選択します。
ペーストすることで、項目名が入ります。項目名はプレースホルダ表記となっています。("${" と "}" で囲まれています。)
別の関数を選択し、第二引数部分にペーストしてみます。
直接、キーボード操作で入力することもできます。
OKボタンを押すことで、計算式の欄に反映されます。
標準は「値をデータベースに保存する」となっています。
数値型項目に次の式を設定した場合を想定します。
このとき、データベース保存の有無により計算結果は異なります。
Excelでは格納できる有効桁数は15桁となっています。そのため、例えば "11000.00000000001" は強制的に "11000.00000000000" となります。しかし Wagby は Java の浮動小数点仕様に準拠しているため、Excelと動きが異なります。(上記例では、強制的に小数部をゼロとすることはありません。)そのため、小数点を含む計算では Excel と結果が異なることがあります。ここでは、計算誤差を回避するいくつかの手法をご説明します。
出力フォーマットに「%」文字を指定すると、計算結果が自動的に100倍されるといったルールがあります。詳細は「数値-出力フォーマット」を参照してください。
整数型同士の計算結果を小数点で表現したい場合、計算時に(整数型を)小数点型に「型変換」することができます。
ただし上の式にはいくつかの問題があります。
小数点型の演算誤差について説明します。次の式 (B) において
ROUND関数に渡す計算値が 10.8499999999 となった場合、ROUND によって 10.9 ではなく 10.8 になってしまいます。
これを避けるために、式を工夫してできるだけ整数演算に持ち込むことで演算誤差を極小化するテクニックがあります。
上の式は、次のように記述することができます。
計算結果が一時的に整数の範囲を超える場合には注意が必要です。上記の例で item1 が 10 億という値をとる場合、12倍すると 120 億になりますが、これは整数型の表現できる範囲(42億)を超えるため正しい結果になりません。整数型が表現できる数値の範囲は"モデル > 型"をお読みください。
加減乗除の演算子 (+,-,*,/) ではなく、関数 ADD,SUB,MUL,DIV を用いると、演算誤差を考慮した加減乗除を行うことができます。大きな金額を扱う場合や、途中で小数を含むような計算で有効です。
例えば ${item1} + ${item2} という式は、次のように記述できます。
先に説明した (A) の式は次のように記述することができます。
先に説明した (B) の式は次のように記述することができます。
「貯水量 (waterStorageCapacity) / 利水容量 (waterCapacity)」で貯水率を求める場合、MUL と DIV を組み合わせて次のように記述できます。(ここでは貯水率を整数型としています。)
ADD,SUB,MUL,DIV関数の戻り値は、数値の文字列表現です。例えば "123.456" となります。VALUE関数を適用することで、8バイト浮動小数点に戻すことができます。
ROUND関数は数値を四捨五入して指定された桁数にします。また、INT関数は数値を整数に変換します。詳細は、各関数の説明をお読みください。
"null" は "値がない" という意味で用いられます。null がセットされた項目は、表示時に空白となります。
"null" と "0" は違うものです。また、"null" と "" (空文字) も違うものです。
null は値がない、という特別な意味をもちます。
必須項目に null をセットすることはできません。
未入力項目(入力フィールドだが、何も入力していない状態)の値は、次のようになります。
このため式中で "0" という値の扱いは注意が必要です。入力値が "0" なのか、未入力状態なのかを区別できないためです。
例えば数値型項目 item1 に値が入力されていればそれを使い、未入力なら item2 の値を使うという式を次のように記述した場合、意図に反して item1 が未入力でも値 "0" が返されます。
項目 item1 に格納される値は常に "0" より大きいという場合、等号 (=) を除くことで意図通りの動作になります。
ISEMPTY関数を使って項目に値が入っているかどうかを判定することができます。未入力の場合は true を返します。入力済の場合は false を返します。
数値型項目を例に説明します。
計算式に三項演算子 "?:" を含めることができます。
次の例は、項目 item1 の値が 0 より大きければ 1 をセットします。そうでなければ null をセットします。
ゼロで徐算することはできません。これを回避する方法を紹介します。
これは項目 bunbo (ここでは整数型とします)の値が 0 なら "0" を、そうでなければ bunsi/bunbo の計算結果を格納するという意味になります。
なお、数値が等しくないという判定は「!=」を使います。
上の式において、項目 bunsi や bunbo は整数型だが、計算結果は小数点を格納する場合は、次のように(double)を項目IDの前に付与する強制的な型指定を行うことができます。
定義方法
四則演算式
演算子
説明
( )
括弧
*
乗算
/
徐算 (注意点...)
+
加算
-
減算または符号反転
%
余り
ワンポイント
関数
モデル項目の指定
${...}
${value1} + 1
${kosuu} * ${tanka} * 1.05
条件判定式
型
数値型
文字列型
日付型 (*3)
一致
${v1}==${v2}
EXACT(${v1},${v2})
DATE(${v1})==DATE(${v2})
または
EXACT(${v1},${v2})
不一致
${v1}!=${v2}
!EXACT(${v1},${v2})
DATE(${v1})!=DATE(${v2})
または
!EXACT(${v1},${v2})
より大きい
${v1}>${v2}
-
DATE(${v1})>DATE(${v2})
より小さい
${v1}<${v2}
-
DATE(${v1})<DATE(${v2})
以上
${v1}>=${v2}
-
DATE(${v1})>=DATE(${v2})
以下
${v1}<=${v2}
-
DATE(${v1})<=DATE(${v2})
未設定
-
ISBLANK(${v1})
ISBLANK(${v1})
式の入力ダイアログ
値をデータベースに保存する
自分自身を演算する場合
Me()+1
種別
説明
DB保存あり 更新の都度、値は +1 されて保存されます。
DB保存なし 初期値 0 が +1 され、常に 1 となります。
精度
出力フォーマットを指定する
整数型同士の計算結果を小数点型で表現する
次の計算式のように項目名の前に「(double)」と「8バイト浮動小数点(double)型」への変換を明記します。この式を (A) とします。
(double)${uriagekingaku}/(double)${yosankingaku}
演算誤差を回避する式の書き方
ROUND(${item1}*0.12+${item2}*0.34, 1)
ROUND((${item1}*12+${item2}*34)/100.0, 1)
重要
演算誤差をできるだけ発生させない式の書き方
ROUND(VALUE(ADD(${item1},${item2})),1)
ROUND(VALUE(DIV(${uriagekingaku},${yosankingaku},2)),2)
ROUND(VALUE(ADD(MUL(${item1},"0.12"),MUL(${item2},"0.34"))), 1)
INT(VALUE(MUL(DIV(${waterStorageCapacity}, ${waterCapacity}, 2),100)))
空文字とnull
ワンポイント
重要
未入力項目の扱い
型 値
数値 0
それ以外 null
IF(${item1} >= 0, ${item1}, ${item2})
IF(${item1} > 0, ${item1}, ${item2})
ISEMPTY関数
型と性質 ISEMPTY関数の戻り値 説明
数値型-必須 false 必須項目の場合、初期値0がセットされているため。
数値型-非必須:未入力 true 未入力の判定が可能。
数値型-非必須:入力あり false 入力された時点でfalseになる。
三項演算子
( 式 ) ? 式が真の場合の値 : 式が偽の場合の値
書式
説明
式 ? x : y
式が真なら x を返します。式が偽なら y を返します。
x, y も式という場合もあります。例:三項演算子を使って自動計算の結果に null を設定する9.1.2
${item1} > 0 ? 1 : null
徐算の注意点
三項演算子を使う
( (${bunbo}!=0) ? ${bunsi}/${bunbo} : 0 )
( (${bunbo}!=0) ? (double)${bunsi}/(double)${bunbo} : 0.0 )
DIV関数を使う
DIV関数を使うこともできます。これは演算誤差を減らす効果もあります。
VALUE(DIV(${bunsi},${bunbo},2))
初期値との関係
初期値>基本的な書き方>初期値を設定するタイミングをお読みください。
繰り返し項目との関係
繰り返し項目は、内部では「配列」形式でデータを格納しています。 従って、配列を引数に受け取り、配列を返すような関数を使って、繰り返し項目の値を、別の繰り返し項目へセットすることができます。
例:繰り返し項目 toAddress から、メールアドレス部のみを抜き取って、同じく繰り返し項目 toEmailAddress へセットする場合、toEmailAddress へ次の式を記載します。
MAILADDRESS(${toAddress})
範囲検索項目との関係
検索条件の初期値に式を記述するとき、対象となる項目が範囲検索に対応している場合は次のルールがあります。
範囲検索の場合、内部では上限と下限を表す二つの項目が用意され、それぞれ、元の項目名に "1jshparam" "2jshparam" が付与されます。例えば、整数型の項目 num については、num1jshparam と num2jshparam が内部で用意されます。
例:検索条件項目 item1 の初期値として、同じ検索条件項目である num の上限値に 1 を加えた値を設定する場合は次のように記述します。
${num1jshparam}+1
親子モデルとの関係
親子モデル関係において、子モデルの情報が親モデル側に反映されます。
例:親モデル側の項目で、子モデルの数をかぞえるための式 COUNT(${child_lp}) を用意したとき、子モデルの登録や削除時に、親モデルの該当項目も変更されます。
モデル参照項目の扱い
式中にモデル参照項目を使うことができます。計算式 > モデル参照をお読みください。
スクリプトを利用する
計算式の設定欄に代えて、スクリプトを利用することもできます。スクリプトの「ヘルパ > 計算」のタイミングで値をセットしてください。
次のケースではスクリプトを利用します。
- 複雑な条件を記述する必要がある。
- 式を設定する項目の型がモデル参照項目で、参照しているモデルが複合主キーの場合。