演算トリガ
最終更新日:2024年02月29日
概要
条件分岐(if)、四則演算、文字列結合(CONCATENATE)、文字列操作ができるトリガです。
<例えばこんなとき!>
「有給休暇申請」フォームから申請があった際に、社員DBの「有給残日数」を自動計算する。
1. 演算トリガ設定
【例】「有給休暇」を申請するフォームから登録があった際に、「有給残日数」を自動計算する更新タイプの演算トリガ
トリガはデータベースに対して設定を行います。
「DB」>「トリガ」に進み、DB一覧から設定するデータベースの「トリガ設定」に進みます。
レコードに登録(INSERT)が発生した際に実行されるトリガ、更新(UPDATE) が発生した際に実行されるトリガをそれぞれ設定します。
「新規作成」からトリガの種別、作成方法を選択して「作成」に進みます。
トリガ名を入力し「設定」へ進みます。
演算結果格納フィールドとして、【有給残日数】フィールドを選択して「追加」を押すと演算式を設定する画面が表示されます。
有給残日数を計算する演算式を設定します。
【操作手順】
ア. 「フィールド」から「有給残日数」を選択
イ. 「ADD」をクリックし、「有給残日数」のフィールドコード(f000005357)を演算式に反映
ウ. 「-(マイナス)」をクリックし、演算式に反映
エ. 「フィールド」から「有給申請日数」を選択
オ. 「ADD」をクリックし、「有給申請日数」のフィールドコード(f000005358)を演算式に反映
カ. 演算式が確定したら「保存」をクリック
<例えばこんなとき!>
演算トリガとルックアップトリガを組み合わせれば様々な応用にフィットします。
例えば商品Aの購入フォームから数量を入力すれば、商品マスタからルックアップトリガで単価を参照した上で、
購入の合計金額を演算トリガにて設定できます。
2. 演算トリガの仕様
(1)設定上限
トリガ設定数上限 | 1DBに対して新規登録、更新ともに10設定まで |
---|---|
演算式設定数上限 | 1DBに対して新規登録、更新ともに50設定まで |
演算式の長さ上限 | ありません |
(2)DBタイプ別対応表
DBタイプ | 新規登録 | 更新 | 削除 |
---|---|---|---|
通常DB [normal] | ○ | ○ | × |
履歴DB [history] | ○ | ○ | × |
仮想DB(フィルタ型) [view_1] | × | × | × |
仮想DB(連携型) [view_n] | × | × | × |
仮想DB(集合型) [union] | × | × | × |
ステップアンケート|DB [inquire] | × | × | × |
ガジェット [gadget] | × | × | × |
ストップDB [stop] | × | × | × |
画像型 [attachment] | × | × | × |
トピックDB [forum.topic] | × | × | × |
コメントDB [forum.comment] | × | × | × |
トランザクションDB [transaction] | ○ | × | × |
(3)演算式
演算結果格納フィールドに格納する演算式を設定します。
(参照)演算トリガフィールド別対応表
※ 演算結果格納フィールドのフィールドタイプによって格納できる値が異なるため、それぞれのタイプに合わせた式を構築する必要があります。
※ セレクト、マルチセレクト、マルチセレクト(128項目)のフィールドは設定されているラベルの値のみ、固定値として演算式に格納できます。
※ 曜日(○曜日)のフィールドは日から月までのいずれかの値を固定値として演算式に格納できます。
※セミコロンを式に使用できません。
※演算式を保存する際、使用するフィールドタイプにサンプル値を当てはめ式を実行し、演算式に問題がないかチェックをしています。
式として成立しないもの、不正な文字列が存在するもの、演算式の合計値が演算結果格納フィールドの上限を超えるものは設定できません。
※実際の数値を当てはめて演算した結果が、演算結果格納フィールドの上限を超える場合はDBの登録・更新時にエラーが発生します。
演算結果格納フィールドには予想される演算結果の最大値を登録できるフィールドタイプをご利用ください。
演算式には以下の項目を利用できます。
【演算式に利用可能な項目】
・演算トリガフィールド別対応表に存在するフィールド
・演算子 (以下参照)
・関数 (以下参照)
・シングルクォーテーションで囲んだ固定文字列
・数字
・括弧()
・NULL
・IS NULL、IS NOT NULL(値の存在判定時に使用)
(4)式の操作
演算結果格納フィールドでは以下のような設定項目が表示されます。
(演算結果格納フィールドでセレクト、マルチセレクト、マルチセレクト[128項目]を選択した場合)
(演算結果格納フィールドで曜日を選択した場合)
(演算結果格納フィールドで上記以外を選択した場合)
・ラベル
演算結果格納フィールドがセレクト、マルチセレクト、マルチセレクト(128項目)の場合、格納する固定値を選択できます。
・曜日
演算結果格納フィールドが曜日(○曜日)の場合、格納する固定値を選択できます。
・フィールド
演算式及び条件式に使用するフィールドを選択します。
・固定値
固定値を入力できます。
・関数
演算式及び条件式に使用できる関数を選択できます
関数 | 入力例 |
---|---|
文字数 | length(対象の文字列(1)) 関数 : length('111-222-333') 結果 : 11 |
バイト数 | octet_length(対象の文字列(1)) 関数 : octet_length('番号111-222-333') 結果 : 15 |
絶対値 | abs(引数(1)) 関数 : abs:(-12.2) 結果 : 12.2 |
四捨五入(最近接偶数への丸め) | round(引数(1), 引数(2)) 関数 : round(12.456, 2) 結果 : 12.46 |
切り捨て(小数点) | trunc(引数(1), 引数(2)) 関数 : trunc(12.456, 2) 結果 : 12.45 切り上げの場合: trunc(12.456 + 0.009, 2) |
文字列検索 | strpos(対象の文字列(1), 検索する文字列(2)) 関数 : strpos('111-222-333', '-') 結果 : 4 |
文字列分割 | split_part(対象の文字列(1), 分割する文字列(2)), 取得する要素番号(3)) 関数 : split_part('111-222-333', '-' , 1) 結果 : 111 |
文字列切り出し | substr(対象の文字列(1), 開始位置(2)、切り出し文字数(3)) 関数 : substr('111-222-333', 5 , 3) 結果 : 222 |
文字列置換 | replace(対象の文字列(1), 変換前文字列(2)、変換後文字列(3)) 関数 : replace('111-222-333', '-' , '@') 結果 : 111@222@333 |
最大値 | greatest(引数(1)、引数(2)・・・(30)) 関数 : greatest(15, 20.5, 24.5) 結果 : 24.5 |
最小値 | least(引数(1)、引数(2)・・・(30)) 関数 : least(15, 20.5, 24.5) 結果 : 15 |
・演算子
式に使用できる演算子を選択できます。
演算子 | 意味 | 入力例 |
---|---|---|
+ | 数字同士で加算をする | $intA$ + 1 |
− | 数字同士で減算をする | $intA$ - 1 |
× | 数字同士で乗算をする | $intA$ * 2 |
÷ | 数字同士で除算をする | $intA$ / 2 |
% | 数字同士で除予算をする | $intA$ % 2 |
( | 先に計算したい式を囲む | $intA$ * ($intB$ - 2) |
) | 先に計算したい式を囲む | $intA$ * ($intB$ - 2) |
|| | 文字列を結合する | $textA$ || '_example' |
NULL | 値がNULLかどうかを判定する | $textA$ IS NULL |
NOT | 式を否定するNOT | NOT $textA$ IS NULL または $textA$ IS NOT NULL |
AND | 二つの式の論理積を求める | $textA$ IS NULL AND $intA$ > 0 |
OR | 二つの式の論理和を求める | $textA$ IS NULL OR $intA$ > 0 |
= | 二つの値が等価である事を表す | $textA$ = $textB$ |
!= | 二つの値が等価でない事を表す | $textA$ != $textB$ |
>= | 辺の値が右辺の値より大きいか等しい事を表す | $intA$ >= $intB$ |
<= | 右辺の値が左辺の値より大きいか等しい事を表す | $intA$ <= $intB$ |
> | 左辺の値が右辺の値より大きい事を表す | $intA$ > $intB$ |
< | 右辺の値が左辺の値より大きい事を表す | $intA$ < $intB$ |
(5)その他
トリガの発動時の処理は、「BEFORE INSERT/UPDATE」です。また、TRDBの処理は、「AFTER INSERT/UPDATE」です。
従って、トリガで処理されたものがそのままトランザクションDBにインサートされます。
3. 制限事項
(1)使用できない記号
・セミコロン「 ; 」
(2)特定の場合の書き方
項目 | 書き方 | 例 |
---|---|---|
固定値で文字列を使用する | クォーテーションでくくる | 'テスト' || $mm_text$ |
文字列内でクォーテーションを使用する | 文字列内のクォーテーションは バックスラッシュでエスケープする |
'\'テスト\'' || $mm_text$ |
値がNULLかどうかを判定する | ・ *** IS NULL (NULLならtrue)・ *** IS NOT NULL (NULLでなければtrue) |
- |
性別の固定値 | ・男性 : '男' ・女性 : '女' |
- |
日付計算、時間計算をする 場合の固定値 |
・ 年 : '1years' or '-1years' ・ 月 : '1months' or '-1months' ・ 週 : '1weeks' or '-1weeks' ・ 日 : '1days' or '-1days' ・ 時 : '1hours' or '-1hours' ・ 分 : '1minutes' or '-1minutes' ・ 秒 : '1seconds' or '-1seconds' |
$mm_regist_date$ + '-1years' +'1months' |
予約語 | 現在日時の取得 : 'now' |
'now' |
(3)日付計算の制限
・日付型のフィールドと日付型のフィールドを計算することはできない。
例)
× $mm_regist_date$ + $mm_date_ymdhhmmss$
× $mm_date_ymdhhmmss$ - '-mm_date_ymd'
・日付型のフィールドを比較する場合、比較する2つ以上のフィールドのタイプ(型)が完全に一致しなければならない。
例)
○ $mm_date_ymdhhmmss$ > $mm_date_ymdhhmmss$
× $mm_date_ymdhhmmss$ > $mm_date_ymdhhmm$
※比較する2つ以上のフィールドのタイプが異なる場合、
同一のフィールドタイプに値を格納するトリガを作成の上比較してください。
(4)時間計算の固定値の制限
・固定値を時間計算に使用する場合、+ を使用することはできない。
例)
× $mm_interval_ym$ + '1day'
○ $mm_interval_ym$ - '-1day'
(5)時間計算の計算制限
・時間型(mm_interval_*)から日付型(mm_date_*、mm_regist_date, mm_optout)を足したり引いたりできない。
例)
× $mm_interval_ym$ + $mm_date_ymdhhmmss$
× $mm_interval_ym$ - $mm_date_ymdhhmmss$
(6)オプトアウトフィールドの固定値の制限
・固定値をオプトアウトフィールドとの計算に使用する場合、- を使用することはできない。
例)
× $mm_optout$ - '1days'
○ $mm_optout$ + '-1days'
(7)数値計算の制限
・数値計算する際、0で割る計算をすると、必ずエラーになる。
※ 割るフィールドの値が0になる際も同じくエラーになる。
例)
$mm_integer$ / 0
$mm_real$ / $mm_integer$
← $mm_integer$に0が入る
(8)関数の制限
・引数には適切な型の値(もしくはフィールド、返り値が適切な型である関数)を設定する必要がある。
例)
○ substr ($mm_number32$, 0 , $mm_integer$)
○ substr ($mm_number32$, 0, octet_length($mm_email$))
○ substr ($mm_number32$, 0, octet_length($mm_email$))
・四捨五入の関数「round()」において、端数処理は「最近接偶数への丸め」である。
例)2つの整数間のちょうど真ん中の場合、偶数に丸められる。
「39.5」→40.
「50.5」→51ではなく、50。
(9)ファイル型フィールドの制限
・ファイル型フィールドの値の有無を条件とする場合、「*** IS NULL」「*** IS NULL」を使用することはできない。
例)
× $file$ IS NULL$
× $file$ IS NOT NULL$
○ $file$
例)ファイル型フィールドに値がある場合、セレクトフィールドにフラグを立てる際の設定方法
演算結果格納フィールド:select
IF $file$
select =1