Questetra BPM Suite の[データ更新]工程や各種設定式では、Spring Expression Language(SpEL)を使ってデータ項目の値を参照・操作できます。本記事では、各データ型が SpEL 内でどのオブジェクトとして扱われるか、また利用できる主なメソッドを解説します。
データ項目へのアクセス方法
データ項目の値には #フィールド名 でアクセスします。フィールド名はアプリの「データ項目」設定で確認できます。
データ項目が未入力の場合、値は null になります。null に対してメソッドを呼び出すとエラーになるため、基本的に ?.(null セーフ演算子)を付けてメソッドを呼び出すことを推奨します。
メソッドをチェーンして連続呼び出しする場合も、各呼び出しに ?. を付けることを推奨します。最初の ?. の後に続くメソッドも null を返す可能性があるためです。
// q_Assignee が未入力(null)の場合はエラーになる #q_Assignee.getName() // null の場合は null を返す(エラーにならない) #q_Assignee?.getName() // チェーン呼び出し時も各メソッドに ?. を付ける #q_Date?.addMonths(1)?.getFirstDateInMonth()
SpEL 式と SpEL テンプレート
データ更新工程での値の書き方は、設定先のデータ型によって異なります。
| 設定先のデータ型 | 書き方 |
|---|---|
| 文字型・件名 |
SpEL テンプレート:テキスト内の #{...} の中が SpEL として評価される |
| 日付型・日時型・選択型・ユーザ型・組織型 | SpEL 式:フィールド全体が SpEL 式として評価される |
| 数値型 | SpEL ではなく独自の数値演算式(→ R2270) |
// 文字型・件名:#{...} の外は文字列として出力。複数混在も可
申請者:#{#q_Assignee?.getName()}、受付番号:#{processInstanceId}
// 日付型・日時型:式そのものを書く(#{...} は不要)
#q_ApplyDate?.addDays(7)
// 選択型:選択肢 ID となる文字列式を書く
#q_OtherSelect
プロパティの省略記法(getter ショートハンド)
SpEL では getXxx() のようなメソッドを .xxx と短く書くことができます(どちらも同じ意味)。
// 同じ意味
#{#q_Assignee?.getName()}
#{#q_Assignee?.name}
コレクション演算子(選択型・ファイル型・テーブル型の List に適用可能)
| 演算子 | 意味 | 例 |
|---|---|---|
.?[条件] |
条件に一致する要素を抽出 | #q_Tags?.?[getValue() == 'urgent'] |
.![式] |
各要素を変換した新リストを返す | #q_Tags?.![getValue()] |
.size() |
要素数 | #q_Tags?.size() |
テーブル型(ScriptListArray)は List ではありませんが、.getRows() で取得した List<ScriptListRow> に対してコレクション演算子を適用できます。
// 【値変更式】テーブル型の全行から特定列の値を取得(ScriptListRow の ['フィールド名'] でアクセス;詳細は『テーブル型』セクション参照)
#q_Items?.rows?.![#this['name']]
// 【文字型フィールドへの埋め込み】ファイル型:PDF ファイルのみのファイル名一覧
#{#q_Files?.?[getContentType() == 'application/pdf']?.![getName()]}
データ型と Java クラスの対応
| データ型 | Java クラス |
|---|---|
| 文字型 | java.lang.String |
| 数値型 | java.math.BigDecimal |
| 選択型 | java.util.List<com.questetra.bpms.core.event.scripttask.ItemView> |
| 日付型 | com.questetra.bpms.util.AddableDate |
| 日時型 | com.questetra.bpms.util.AddableTimestamp |
| ユーザ型 | com.questetra.bpms.core.event.scripttask.QuserView |
| 組織型 | com.questetra.bpms.core.event.scripttask.QgroupView |
| ファイル型 | java.util.List<com.questetra.bpms.core.event.scripttask.QfileView> |
| テーブル型 | com.questetra.bpms.core.event.scripttask.ScriptListArray |
各型のメソッド詳細
文字型(String)
標準の java.lang.String です。
// 値をそのまま別フィールドにコピー
#{#q_CustomerName}
// 大文字に変換
#{#q_Code?.toUpperCase()}
// 部分文字列
#{#q_Serial?.substring(0, 5)}
数値型(BigDecimal)
// 文字型フィールドや通知メールへの埋め込み時: 桁区切り・小数点はデータ項目の表示設定に従う
// ただしデータ項目に設定した「接頭辞」「接尾辞」(円記号など)は出力されない。例: 12,345.67
#{#q_Amount}
// 整数値に変換(小数点以下を切り捨てて数値として扱いたい場合)
#{#q_Score?.intValue()}
選択型(List<ItemView>)
各要素は ItemView オブジェクトです。
ItemView のメソッド:
| メソッド | 意味 |
|---|---|
.getValue() |
選択肢 ID(キー文字列)を返す |
.getDisplay() |
選択肢のラベルを返す |
// 最初の選択肢 ID を取得(単一選択)
#{#q_Status?.get(0)?.getValue()}
// 最初の選択肢ラベルを取得
#{#q_Status?.get(0)?.getDisplay()}
// 選択肢の件数をカウント
#{#q_Tags?.size()}
// 各選択肢の ID を変換したリストを生成(戻り値は List<String>。文字型フィールドへ埋め込む場合、[id1, id2] のような形式になる)
#{#q_Tags?.![getValue()]}
// 単一選択: ラベル 1 件、複数選択: ", " 区切りで連結されたラベル文字列として埋め込まれる
#{#q_Status}
日付型(AddableDate)
日付・日時型データ項目の値変更では、SpEL 式を直接使用します。
主なメソッド:
| メソッド | 意味 |
|---|---|
.addDays(int days) |
指定日数を加えた AddableDate を返す(マイナス値で過去) |
.addMonths(int months) |
指定月数を加えた AddableDate を返す |
.getFirstDateInMonth() |
その月の 1 日を返す |
.getLastDateInMonth() |
その月の最終日を返す |
.getFirstDateInWeek() |
その週の月曜日を返す |
.getFirstTimeInDate() |
その日の 0 時 0 分 0 秒を AddableTimestamp で返す(日付型 → 日時型への変換) |
.toString() |
サブタイプに応じた文字列(年月日: yyyy-MM-dd など)を返す |
// 申請日の7日後を期限日に設定
#q_ApplyDate?.addDays(7)
// 翌月1日を設定(当月末日の翌日として計算)
#q_TargetDate?.getLastDateInMonth()?.addDays(1)
// 翌月1日を設定(別の書き方)
#q_TargetDate?.addMonths(1)?.getFirstDateInMonth()
// 日付型 → 日時型に変換(その日の 0 時 0 分 0 秒、AddableTimestamp を返す)
#q_StartDate?.getFirstTimeInDate()
// 文字型フィールドや通知メールに日付を埋め込む場合は #{...} を使用します(値変更とは異なる用途)
// サブタイプに応じた日付文字列として埋め込まれる(年月日: yyyy-MM-dd など)
#{#q_StartDate}
日時型(AddableTimestamp)
日付型と同様に、値変更では SpEL 式を直接使用します。文字型フィールドへの埋め込みには #{...} を使用します。
主なメソッド:
| メソッド | 意味 |
|---|---|
.addMinutes(int minutes) |
指定分を加えた AddableTimestamp を返す |
.addHours(int hours) |
指定時間を加えた AddableTimestamp を返す |
.addDays(int days) |
指定日数を加えた AddableTimestamp を返す |
.addMonths(int months) |
指定月数を加えた AddableTimestamp を返す |
.getFirstTimeInDate() |
その日の 0 時 0 分 0 秒にリセットした AddableTimestamp を返す(時刻のリセット) |
.getFirstTimeInWeek() |
その週の月曜日の 0 時 0 分 0 秒を返す |
.getFirstTimeInMonth() |
その月の 1 日の 0 時 0 分 0 秒を返す |
.toString() |
yyyy-MM-dd HH:mm 形式の文字列を返す |
// 受付日時の24時間後を設定
#q_ReceivedAt?.addHours(24)
// その週の月曜 0:00 を設定
#q_Deadline?.getFirstTimeInWeek()
// その月の 1 日 0:00 を設定
#q_Deadline?.getFirstTimeInMonth()
// 文字型フィールドや通知メールに日時を埋め込む場合は #{...} を使用します(値変更とは異なる用途)
// yyyy-MM-dd HH:mm 形式の日時文字列として埋め込まれる
#{#q_Timestamp}
日付型・日時型のメソッド使い分け:
addMinutes()/addHours()は日時型専用で、日付型(AddableDate)には使用できません。逆に、getFirstDateInMonth()/getLastDateInMonth()/getFirstDateInWeek()は日付型専用で、日時型(AddableTimestamp)には使用できません。
ユーザ型(QuserView)
| メソッド | 意味 |
|---|---|
.getId() |
ユーザ ID を整数値(Long)で返す |
.getName() |
ユーザ名を返す |
.getEmail() |
メールアドレスを返す |
.isDeletedInFuture() |
将来削除予定のユーザかどうかを true/false で返す(現在有効だが将来無効化予定の場合に true) |
// 「名前 <メール>」形式の文字列として埋め込まれる(例: SUZUKI Ichiro <suzuki@example.com>)
#{#q_Assignee}
// 文字型フィールドにユーザ名を設定
#{#q_Assignee?.getName()}
// 文字型フィールドにメールアドレスを設定
#{#q_Assignee?.getEmail()}
組織型(QgroupView)
| メソッド | 意味 |
|---|---|
.getId() |
組織 ID を整数値(Long)で返す |
.getName() |
組織名を返す |
.getEmail() |
組織のメールアドレスを返す |
.isDeletedInFuture() |
将来削除予定の組織かどうかを true/false で返す(現在有効だが将来無効化予定の場合に true) |
// 「組織名 <メール>」形式の文字列として埋め込まれる(例: Sales <sales@example.com>)
#{#q_Department}
// 文字型フィールドに組織名を設定
#{#q_Department?.getName()}
ファイル型(List<QfileView>)
各要素は QfileView オブジェクトです。
| メソッド | 意味 |
|---|---|
.getName() |
ファイル名を返す |
.getContentType() |
ファイルの Content-Type を返す(例: application/pdf、text/plain; charset=UTF-8 など) |
.getCharset() |
ファイルの文字コードを返す(getContentType() の Content-Type ヘッダー内 charset パラメータ;例: UTF-8) |
.getLength() |
ファイルサイズ(バイト)を返す |
// 添付ファイル数を取得
#{#q_Files?.size()}
// 最初のファイル名を取得
#{#q_Files?.get(0)?.getName()}
// ファイル名を ", " で連結した文字列として埋め込まれる
#{#q_Files}
// ファイル名とサイズを組み合わせたリスト
#{#q_Files?.![getName() + ' (' + getLength() + ' bytes)']}
テーブル型(ScriptListArray)
| メソッド | 意味 |
|---|---|
.size() |
行数を返す |
.get(int rowIndex, int colIndex) |
セルデータを文字列で返す(0 始まり) |
.get(int rowIndex, String fieldName) |
フィールド名でセルデータを文字列で返す |
.getObject(int rowIndex, int colIndex) |
セルの元オブジェクトを返す(文字型: String、数値型: BigDecimal、選択型: ItemView、日付型: AddableDate など) |
.getObject(int rowIndex, String fieldName) |
フィールド名でセルの元オブジェクトを返す |
.getSummary() |
数値型列の合計を返す(戻り値は ScriptListRow 形式; .get('列名') で BigDecimal を取得) |
.getRow(int rowIndex) |
指定行の ScriptListRow を返す |
.getRows() |
全行を List<ScriptListRow> で返す |
ScriptListRow は1行分のデータを表すオブジェクトです。
| アクセス方法 | 意味 |
|---|---|
#this['フィールド名'] |
フィールドの値を文字列で返す(.get('フィールド名') と同等) |
.getCol(int colIndex) |
列番号(0始まり)で指定した列の値を文字列で返す |
.getCols() |
全列の値を List<String> で返す |
.getObject(String fieldName) |
フィールド名で指定した列の元オブジェクトを返す(文字型: String、数値型: BigDecimal、選択型: ItemView、日付型: AddableDate など) |
.getObject(int colIndex) |
列番号で指定した列の元オブジェクトを返す(型は上記と同様) |
.size() |
列数を返す |
// テーブルの行数を取得
#{#q_Items?.size()}
// 数値型列の合計を取得(列名を指定)
#{#q_Items?.getSummary()?.get('price')}
// 選択型列のセルを ItemView として取得し、ラベルを参照
#{#q_Items?.getObject(0, 'kind')?.getDisplay()}
// 各行から複数列を組み合わせた文字列リストを生成
#{#q_Items?.rows?.![#this['name'] + ' | ' + #this['price']]}
// 行数を表す文字列として埋め込まれる(例: 2 row(s))
#{#q_Items}