スクリプトタスクでデータ項目の値を参照・更新する

スクリプトタスクでは、ケース上のデータ項目(業務データ)をスクリプトから自由に読み書きできます。この記事では、データ項目への基本的なアクセス方法をサンプルコードとともに解説します。

スクリプトの実行環境
スクリプトタスクのスクリプトは EcmaScript(JavaScript)をベースとしていますが、ブラウザではなくワークフローエンジン上で実行されます。

  • document や fetch などのブラウザ固有 API は利用できません
  • java.math.BigDecimal や java.util.ArrayList など、エンジンが提供する Java クラスをスクリプト内で直接使えます

各データ型のメソッド詳細・全データ型のサンプルについては、リファレンス「R2301: スクリプトタスクでのデータ取得/更新」を参照してください。


データ項目を「参照」するには

engine.findDataByVarName() を使うのが最もわかりやすい方法です。引数には、データ項目に設定した フィールド名 を指定します。

const value = engine.findDataByVarName("フィールド名");

フィールド名のルール
フィールド名は必ず q_ で始まり、それ以降は半角英数字とアンダースコア(_)だけが使えます(例:q_amountq_item_name)。日本語やハイフン、記号などは使えません。

フィールド名のかわりに、日本語のデータ項目名や定義番号でも指定できます。

const value = engine.findDataByName("データ項目名");    // データ項目名(日本語可)
const value = engine.findDataByNumber("3");             // データ項目番号(文字列)
const value = engine.findDataByNumber(3);               // データ項目番号(数値)

どれを使えばいい?
フィールド名は設計者が自分でつける識別子なので、わかりやすい名前をつけておけばコードが読みやすくなります。データ項目番号は変わりませんが可読性が下がります。チームの運用に合わせて選択してください。

参考:フィールド名と同名の変数で直接参照できる

フィールド名が設定されたデータ項目は、同名の変数としてそのままスクリプト内で参照 できます。engine.findDataByVarName() を呼ばずに済むので、短く書きたい場合に便利です。

// engine.findDataByVarName("q_customer") と等価
const text = q_customer;

ただし、これは 参照のみ です。次のように代入してもローカル変数を書き換えるだけで、データ項目は更新されません。

q_customer = "新しい値";  // ← データ項目は更新されない!(よくある間違い)

データ項目を更新したい場合は、必ず後述の engine.setDataByVarName() などを使ってください。

データ項目を「更新」するには

engine.setDataByVarName() を使います。第1引数にフィールド名、第2引数に設定する値を指定します。

engine.setDataByVarName("フィールド名", 値);

同様に、データ項目名や定義番号でも指定できます。

engine.setDataByName("データ項目名", 値);
engine.setDataByNumber(3, 値);

データ型によって扱い方が変わる

第2引数に渡す「値」の形式は、データ項目のデータ型によって異なります。単純な文字列が使える型もあれば、特定の Java クラスのオブジェクトが必要な型もあります。

文字型(よく使うので覚えておこう)

取得値の型:java.lang.String
設定値の型:java.lang.String

// 参照
const text = engine.findDataByVarName("q_summary");

// 更新
engine.setDataByVarName("q_summary", "新しい内容");
engine.setDataByVarName("q_memo", "1行目\n2行目");  // 複数行は \n で改行

数値型

取得値の型:java.math.BigDecimal
設定値の型:java.math.BigDecimal

// 参照
const amount = engine.findDataByVarName("q_amount");  // BigDecimal で取得される

// 更新
engine.setDataByVarName("q_amount", new java.math.BigDecimal(1000));
engine.setDataByVarName("q_price", new java.math.BigDecimal("9.99"));  // 小数はString指定が安全

選択型(チェックボックス・セレクト)

取得値の型:com.questetra.bpms.core.event.scripttask.ItemView の java.util.List
設定値の型:選択肢の値(String)の java.util.List

// 参照
const items = engine.findDataByVarName("q_category");
for (let i = 0; i < items.size(); i++) {
    const item = items.get(i);
    // item.getValue()   → 選択肢の値(例:"JP")
    // item.getDisplay() → 選択肢の表示ラベル(例:"日本")
}

// 更新(複数選択の場合)
const selected = new java.util.ArrayList();
selected.add("JP");
selected.add("US");
engine.setDataByVarName("q_category", selected);

// 更新(単一選択の場合も ArrayList で)
const single = new java.util.ArrayList();
single.add("JP");
engine.setDataByVarName("q_country", single);

他のデータ型(日付型・日時型・ファイル型・ユーザ型・組織型・テーブル型など)のサンプルは R2301 を参照してください。

件名はアクセス方法が異なる

ケースの 件名 は特別なデータ項目であり、他のデータ項目のように engine.findDataByVarName() や engine.setDataByVarName() ではアクセスできません。件名の参照・更新には、processInstance オブジェクトの専用メソッドを使います。

// 参照
const title = processInstance.getProcessInstanceTitle();

// 更新
processInstance.setProcessInstanceTitle("新しい件名");

更新できないケース属性・データ型がある

件名を除き、他のケース属性(ケースID・ケース連番・開始日時など)は参照のみ可能で、スクリプトから更新することはできません。

また、次のデータ型はスクリプトからアクセスできません(参照・更新とも不可)。

  • 掲示板型
  • ガイドパネル型

実践例:複数のデータ項目を組み合わせて使う

品名(文字型)・単価(数値型)・数量(数値型)を読み取り、合計金額を計算して備考欄(文字型)に書き込む例です。

// 各データ項目を取得
const itemName  = engine.findDataByVarName("q_item_name");   // 文字型
const unitPrice = engine.findDataByVarName("q_unit_price");  // 数値型
const quantity  = engine.findDataByVarName("q_quantity");    // 数値型

// 必須でないデータ項目は型に関わらず未入力の場合 null になる
if (itemName === null || unitPrice === null || quantity === null) {
    throw new Error("品名・単価・数量のいずれかが未入力です");
}

// 合計金額を計算(BigDecimal の multiply を使う)
const total = unitPrice.multiply(quantity);

// 数値を桁区切り付きの文字列に整形(例:1,000.00)
const formatter = new java.text.DecimalFormat("#,##0.00");
const totalText = formatter.format(total);

// 結果を文字型の備考欄に書き込む
const summary = itemName + ":" + totalText + " 円";
>engine.setDataByVarName("q_memo", summary);

ポイントをまとめると、文字型はそのまま文字列として扱えますが、数値型は java.math.BigDecimal オブジェクトとして取得されるため、文字列に変換する際は java.text.DecimalFormat を使うのが便利です。桁区切りや小数桁数を制御でき、丸め処理も内部で行われます。また、必須でないデータ項目はデータ型に関わらず未入力の場合 null になるため、値を使う前に null チェックを入れるのが安全です。

シンプルに変換するだけなら
桁区切りなどの整形が不要なら、BigDecimal#toPlainString() で素の文字列(例:1000 や 9.99)に変換することもできます。

関連リファレンス

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む