基本的な書き方

最終更新日: 2021年6月11日
R8 | R9

定義方法

モデル項目詳細定義ダイアログの「詳細 > 自動計算」の欄に、計算式を記述します。

図1 計算式の記述例

四則演算式

Wagby がサポートしている四則演算式は次のとおりです。

演算子 説明
( ) 括弧
* 乗算
/ 徐算 (注意点...)
+ 加算
- 減算または符号反転
% 余り

ワンポイント

自動計算項目は計算により値が一意に決まるため、登録・更新画面では読み取り専用項目となります。

関数

四則演算に加え、Wagbyが提供するさまざまな関数を利用することができます。関数の一覧はこちらをお読みください。

モデル項目の指定

式中に(同一モデル内の)項目を指定することができます。項目名の指定は「${...}」と記述します。(... の部分に英語項目名を指定します。)

${...}

以下に例を示します。

モデル項目 value1 に 1 を加算した値を求める。
${value1} + 1
モデル項目 kosuu とモデル項目 tanka の積に1.05を乗じた値を求める。
${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})

式の入力ダイアログ

式を入力する専用のダイアログを用意しています。図2の赤枠部分に示すボタンを押下して、入力ダイアログを開きます。

図2 ダイアログを開く

ダイアログでは、関数と項目名をマウスで選択できます。

図3 入力ダイアログ

はじめに関数の「種別」を指定します。種別の詳細は「関数」のページをお読みください。

図4 関数の種別を指定する

種別を指定すると、さらに利用できる関数を一覧から選択することができます。

図5 関数を指定する

利用したい関数を選択後、「コピー」ボタンを押します。

図6 コピーボタン

式の入力欄で CTRL-V キーで「ペースト」します。

図7 ペースト

さらに、モデル内の項目を選択することができます。

図8 項目を選択する

項目を選択後、同様にコピーボタンを押下します。

図9 項目名をコピーする

先ほど入力した関数の引数部分で、この項目に相当する箇所をマウスで選択します。

図10 引数部分をマウスで選択状態としておく

ペーストすることで、項目名が入ります。項目名はプレースホルダ表記となっています。("${" と "}" で囲まれています。)

図11 ペースト

別の関数を選択し、第二引数部分にペーストしてみます。

図12

直接、キーボード操作で入力することもできます。

図13 第三引数を手動で書き換える

OKボタンを押すことで、計算式の欄に反映されます。

図14 式を確定する

値をデータベースに保存する

標準は「値をデータベースに保存する」となっています。

図15 値をデータベースに保存するが有効な状態
  • 計算項目が「値をデータベースに保存する」となっていた場合、登録・更新時にのみ計算されます。表示時はデータベースに格納されている値がそのまま用いられます。
  • 計算項目が「値をデータベースに保存する」となっていない場合、表示のタイミングで常に最新の値で再計算されます。
更新画面を開いた時の値も、表示時という扱いなので、データベースに格納されている値が用いられます。計算は行われません。

自分自身を演算する場合

数値型項目に次の式を設定した場合を想定します。

Me()+1

このとき、データベース保存の有無により計算結果は異なります。

種別 説明
DB保存あり更新の都度、値は +1 されて保存されます。
DB保存なし初期値 0 が +1 され、常に 1 となります。

精度

Excelでは格納できる有効桁数は15桁となっています。そのため、例えば "11000.00000000001" は強制的に "11000.00000000000" となります。しかし Wagby は Java の浮動小数点仕様に準拠しているため、Excelと動きが異なります。(上記例では、強制的に小数部をゼロとすることはありません。)そのため、小数点を含む計算では Excel と結果が異なることがあります。ここでは、計算誤差を回避するいくつかの手法をご説明します。

出力フォーマットを指定する

出力フォーマットに「%」文字を指定すると、計算結果が自動的に100倍されるといったルールがあります。詳細は「数値-出力フォーマット」を参照してください。

整数型同士の計算結果を小数点型で表現する

整数型同士の計算結果を小数点で表現したい場合、計算時に(整数型を)小数点型に「型変換」することができます。
次の計算式のように項目名の前に「(double)」と「8バイト浮動小数点(double)型」への変換を明記します。この式を (A) とします。

(double)${uriagekingaku}/(double)${yosankingaku}
※ double という書式は、Java の「型」表記方法に準拠しています。

ただし上の式にはいくつかの問題があります。

  • 8バイト浮動小数点(double)型の演算では誤差が含まれることがあります。
  • 割り算の場合、分母をゼロとすることはできません。

演算誤差を回避する式の書き方

小数点型の演算誤差について説明します。次の式 (B) において

ROUND(${item1}*0.12+${item2}*0.34, 1)

ROUND関数に渡す計算値が 10.8499999999 となった場合、ROUND によって 10.9 ではなく 10.8 になってしまいます。

これを避けるために、式を工夫してできるだけ整数演算に持ち込むことで演算誤差を極小化するテクニックがあります。 上の式は、次のように記述することができます。

ROUND((${item1}*12+${item2}*34)/100.0, 1)

重要

計算結果が一時的に整数の範囲を超える場合には注意が必要です。上記の例で item1 が 10 億という値をとる場合、12倍すると 120 億になりますが、これは整数型の表現できる範囲(42億)を超えるため正しい結果になりません。整数型が表現できる数値の範囲は"モデル > 型"をお読みください。

演算誤差をできるだけ発生させない式の書き方

加減乗除の演算子 (+,-,*,/) ではなく、関数 ADD,SUB,MUL,DIV を用いると、演算誤差を考慮した加減乗除を行うことができます。大きな金額を扱う場合や、途中で小数を含むような計算で有効です。

例えば ${item1} + ${item2} という式は、次のように記述できます。

ROUND(VALUE(ADD(${item1},${item2})),1)

先に説明した (A) の式は次のように記述することができます。

ROUND(VALUE(DIV(${uriagekingaku},${yosankingaku},2)),2)

先に説明した (B) の式は次のように記述することができます。

ROUND(VALUE(ADD(MUL(${item1},"0.12"),MUL(${item2},"0.34"))), 1)

「貯水量 (waterStorageCapacity) / 利水容量 (waterCapacity)」で貯水率を求める場合、MUL と DIV を組み合わせて次のように記述できます。(ここでは貯水率を整数型としています。)

INT(VALUE(MUL(DIV(${waterStorageCapacity}, ${waterCapacity}, 2),100)))

ADD,SUB,MUL,DIV関数の戻り値は、数値の文字列表現です。例えば "123.456" となります。VALUE関数を適用することで、8バイト浮動小数点に戻すことができます。

ROUND関数は数値を四捨五入して指定された桁数にします。また、INT関数は数値を整数に変換します。詳細は、各関数の説明をお読みください。

空文字とnull

"null" は "値がない" という意味で用いられます。null がセットされた項目は、表示時に空白となります。

ワンポイント

"null" と "0" は違うものです。また、"null" と "" (空文字) も違うものです。 null は値がない、という特別な意味をもちます。

重要

必須項目に null をセットすることはできません。

未入力項目の扱い

未入力項目(入力フィールドだが、何も入力していない状態)の値は、次のようになります。

数値0
それ以外null

このため式中で "0" という値の扱いは注意が必要です。入力値が "0" なのか、未入力状態なのかを区別できないためです。

例えば数値型項目 item1 に値が入力されていればそれを使い、未入力なら item2 の値を使うという式を次のように記述した場合、意図に反して item1 が未入力でも値 "0" が返されます。

IF(${item1} >= 0, ${item1}, ${item2})

項目 item1 に格納される値は常に "0" より大きいという場合、等号 (=) を除くことで意図通りの動作になります。

IF(${item1} > 0, ${item1}, ${item2})

ISEMPTY関数

ISEMPTY関数を使って項目に値が入っているかどうかを判定することができます。未入力の場合は true を返します。入力済の場合は false を返します。

数値型項目を例に説明します。

型と性質ISEMPTY関数の戻り値説明
数値型-必須false必須項目の場合、初期値0がセットされているため。
数値型-非必須:未入力true未入力の判定が可能。
数値型-非必須:入力ありfalse入力された時点でfalseになる。

三項演算子

計算式に三項演算子 "?:" を含めることができます。

( 式 ) ? 式が真の場合の値 : 式が偽の場合の値
書式 説明
式 ? x : y 式が真なら x を返します。式が偽なら y を返します。
x, y も式という場合もあります。

例:三項演算子を使って自動計算の結果に null を設定する9.1.2

次の例は、項目 item1 の値が 0 より大きければ 1 をセットします。そうでなければ null をセットします。

${item1} > 0 ? 1 : null
この式を使うと、必須項目でない数値型項目に null (未入力状態) をセットすることができます。R9.1.2 以降の Wagby で利用できます。

徐算の注意点

ゼロで徐算することはできません。これを回避する方法を紹介します。

※ ゼロで除算した場合、計算結果は "NaN" (Not A Number) という扱いになります。

三項演算子を使う

( (${bunbo}!=0) ? ${bunsi}/${bunbo} : 0 )

これは項目 bunbo (ここでは整数型とします)の値が 0 なら "0" を、そうでなければ bunsi/bunbo の計算結果を格納するという意味になります。 なお、数値が等しくないという判定は「!=」を使います。

上の式において、項目 bunsi や bunbo は整数型だが、計算結果は小数点を格納する場合は、次のように(double)を項目IDの前に付与する強制的な型指定を行うことができます。

( (${bunbo}!=0) ? (double)${bunsi}/(double)${bunbo} : 0.0 )

DIV関数を使う

DIV関数を使うこともできます。これは演算誤差を減らす効果もあります。

VALUE(DIV(${bunsi},${bunbo},2))
※ DIV 関数の戻り値は文字列であるため、VALUE または INT 関数で囲って、小数または整数値としてください。

初期値との関係

初期値>基本的な書き方>初期値を設定するタイミングをお読みください。

繰り返し項目との関係

繰り返し項目は、内部では「配列」形式でデータを格納しています。 従って、配列を引数に受け取り、配列を返すような関数を使って、繰り返し項目の値を、別の繰り返し項目へセットすることができます。

例:繰り返し項目 toAddress から、メールアドレス部のみを抜き取って、同じく繰り返し項目 toEmailAddress へセットする場合、toEmailAddress へ次の式を記載します。

MAILADDRESS(${toAddress})

範囲検索項目との関係

検索条件の初期値に式を記述するとき、対象となる項目が範囲検索に対応している場合は次のルールがあります。

範囲検索の場合、内部では上限と下限を表す二つの項目が用意され、それぞれ、元の項目名に "1jshparam" "2jshparam" が付与されます。例えば、整数型の項目 num については、num1jshparam と num2jshparam が内部で用意されます。

例:検索条件項目 item1 の初期値として、同じ検索条件項目である num の上限値に 1 を加えた値を設定する場合は次のように記述します。

${num1jshparam}+1

親子モデルとの関係

親子モデル関係において、子モデルの情報が親モデル側に反映されます。

例:親モデル側の項目で、子モデルの数をかぞえるための式 COUNT(${child_lp}) を用意したとき、子モデルの登録や削除時に、親モデルの該当項目も変更されます。

モデル参照項目の扱い

式中にモデル参照項目を使うことができます。計算式 > モデル参照をお読みください。

式を設定する項目の型がモデル参照項目で、参照しているモデルが複合主キーの場合はスクリプトを利用してください。

スクリプトを利用する

計算式の設定欄に代えて、スクリプトを利用することもできます。スクリプトの「ヘルパ > 計算」のタイミングで値をセットしてください。

次のケースではスクリプトを利用します。