計算式の関数機能を使ってみた

# 概要
12/13にリリースされた新機能「計算式の関数機能」を紹介します。

# 計算式
プリザンターには今までも計算式機能がありましたが、数値項目に対する四則演算のみしかできませんでした。そのため、日付計算や条件に応じて計算式を入れ替えるなどの処理はスクリプトやサーバスクリプトで対応する必要がありましたが、今回計算式で専用の関数が利用できるようになり、javascriptの知識がなくても様々な計算ができるになりました。また数値項目以外の分類、日付、説明、チェックを対象にすることができますので、利用用途も広がります。
詳しくは[オンラインマニュアル](https://pleasanter.org/manual?category=0435)を参照ください。

# 使ってみよう！
まずは計算式を設定してみます。「テーブルの管理」－「エディタ」であらかじめ画面項目を設定した後で「計算式」から「新規作成」ボタンをクリックすると、詳細設定ダイアログが開きます。
新たに表示する「計算方法」で"拡張"を選択すると専用の関数が利用できます。（"既定"は今まで通りの計算式です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/546821c9-140e-bae2-8d39-88111991ef66.png)
利用できる関数は[計算式（拡張）の関数一覧](https://pleasanter.org/manual/formula-function-list)に記載されていますので、用途に合わせた関数を使って計算式を登録します。

# 例1：年齢計算
日付計算でよくありそうなケースとして、年齢を求める計算式を紹介します。
画面上には「生年月日」（日付項目）「年齢算出基準日」（日付項目）「年齢」（数値項目）を設定し、「計算式」で以下のような計算式を設定します。
![計算式：年齢.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/04ea8193-902d-f3b4-7565-9f1e0d2d8f08.png)

計算式では[$DATEDIF関数](https://pleasanter.org/manual/formula-function-datedif)を利用します。＄DATEDIF関数は2つの日付の間の日数、月数、年数を計算する関数です。第一引数に開始日である「生年月日」、第二引数に終了日である「年齢算出基準日」を指定し、第三引数は年数を計算したいので「'Y'」を指定します。
「生年月日」「年齢算出基準日」に自動ポストバックを設定してありますので、双方の日付を変更すると即座に計算された年齢が表示します。
![年齢計算.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/6baab9ca-9911-6f98-9856-5b3360950e9c.gif)

# 例2：条件分岐
条件分岐のケースとして、「通常は税率10％で税込金額を計算し、軽減税率にチェックがある場合は税率8％で計算する」計算式を紹介します。
画面上に「明細」（分類項目）、「数量」「単価」「金額」「税込金額」（数値項目）、「軽減税率適用」（チェック項目）を設定し、「計算式」で以下のような計算式を設定します。
![計算式：軽減税率.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/4e03761c-e706-e661-eac4-4f458395733d.png)

ID:1は金額＝数量×単価という単純な乗算です。この計算は対象とする項目も計算式で使用する項目も数値項目ですので、今までの計算式でも問題ありませんが今回は計算方法：拡張で設定しました。
ID:2は[$IF関数](https://pleasanter.org/manual/formula-function-if)を利用します。$IF関数は論理式の結果（true／false）に応じて、指定した値を返す関数です。第一引数には「軽減税率適用」を指定します。第二引数には「軽減税率適用」がチェックONの場合の計算内容（ID:1で計算した金額に税率8％を加算した値）、第三引数には「軽減税率適用」がチェックOFFの場合の計算内容（ID:1で計算した金額に税率10％を加算した値）を設定します。
こちらの例では各項目に自動ポストバックを設定しないので、「登録」「更新」ボタンクリックで計算を実行します。
実行結果は以下の通りです。「軽減税率適用」がチェックOFFの場合に税込金額は数量×単価×1.1の値が登録され、チェックONの場合は数量×単価×1.08の値が登録されるすることが確認できます。
![軽減税率.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/7df2d0d8-8b57-9a1b-4aa1-52aa3f18b646.gif)

# 例3：年度計算
「自動採番を年度単位で実施したい」ことはありませんか？プリザンターの自動採番機能は採番する単位（自動カウントをリセットする単位：「リセット種別」）を年、月、日、文字列の４つから選択することができますが、"年度"という選択はできません。そのため年度で採番する場合は、リセット種別で「文字列」を選択し、対象の項目に年度を手入力 or スクリプトで年度を設定する対応が必要でした。
計算式で年度を求めることができますので、スクリプトで実装することなく実現することができます。
ここでは計算式と組み合わせてプロセス機能で自動採番する例をご紹介します。

画面上には「決裁日」（日付項目）、「年度」（分類項目）、「決裁番号」（分類項目）を設定し、プロセス機能で状況が「申請」から「承認」に変更する「承認」ボタンを追加し、自動採番ではリセット種別：文字列で採番するように設定します。
![プロセス1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/10bcb6c9-bf38-9f60-5913-9f9b52e1fc6f.png)
![プロセス2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/6913ce3c-d15f-f70b-bda6-6edd91ac6baa.png)

「計算式」では以下のような計算式を設定します。この計算式は「決裁日の初日の3か月前の日付の年を取得」と年度は4月はじまりを想定しています。[$YEAR関数](https://pleasanter.org/manual/formula-function-year)、[$MONTH関数](https://pleasanter.org/manual/formula-function-month)は引数の日付の年、月を取得します。どちらも引数に「決裁日」を指定しますので、決裁日の年、月をそれぞれ取得します。[$DATE関数](https://pleasanter.org/manual/formula-function-date)は引数（年、月、日）で指定した日付を求める関数です。第一引数には決裁日の年、第二引数は決裁日の月から−3した値、第三引数は1（初日）を指定して求めた日付を[$YEAR関数](https://pleasanter.org/manual/formula-function-year)の引数とすることで、年度が求めることができます。
![計算式：年度.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/f6a38987-4818-b022-96e2-9492c76ef9f4.png)

実行結果は以下の通りです。決裁日の年度に応じて自動採番が切り替わることが確認できます。
![自動採番2023.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/28fa23ff-6030-b47a-c9a1-ffb0eff98899.gif)
![自動採番2024.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314422/47abeda9-9ca0-4ed3-db8a-02b14433536f.gif)

# まとめ
[$DATEDIF関数](https://pleasanter.org/manual/formula-function-datedif)と[$IF関数](https://pleasanter.org/manual/formula-function-if)および[$DATE関数](https://pleasanter.org/manual/formula-function-date)、[$YEAR関数](https://pleasanter.org/manual/formula-function-year)、[$MONTH関数](https://pleasanter.org/manual/formula-function-month)の組み合わせを紹介しましたが、そのほかにも関数を多く準備してあります。ちょっとしたことでもスクリプトで対応していたことが計算式で簡単に実行できるようになりました。
計算式の関数対応でより皆様のニーズにこたえられる製品になったと思いますので、ぜひ使ってみてください。