一覧表示画面で用意した「一括更新」処理の本体をスクリプトで記述します。

「一括更新」ボタン押下時の処理をスクリプトコードとして記述することができます。

図1 スクリプト記述欄

Designerでスクリプトを修正すると、開発機上のアプリケーションへ即座に反映されます。ビルド処理なしで修正を確認することができます。

スクリプト内では、モデル名に対応した「オブジェクト」を利用できます。

一覧表示画面でチェックされたすべての customer モデルの radio_flag 項目に "1" をセットします。

customer.radioFlag = 1;/*選択された複数のcustomerに適用される。*/

チェックボックス型である keyperson 項目をトグルスイッチとして扱うものです。チェックされていた値は解除され、解除されていた値はチェックされます。チェックボックスであるため、配列として扱います。

var flag = customer.keyperson;/*チェックボックスによるON/OFF項目*/
if (flag == null || flag[0] == 0) {
    customer.keyperson = 1; /* OFF から ON へ */
} else if (flag != null && flag[0] == 1) {
    customer.keyperson = 0; /* ON から OFF へ */
}

複数の一括更新ボタンを用意した場合、スクリプト中では p.action の値で判定してください。 具体的なコード例を示します。

if (p.action == "UpdateAll") {
    /* ボタン1 の処理 */
} else if (p.action == "UpdateAll2") {
    /* ボタン2 の処理 */
} else ...

最初のボタンは UpdateAll で判別します。二個目以降のボタンは UpdateAll2, UpdateAll3,... となります。

一括更新スクリプトは、これが呼び出される前に、そのモデルに対する自動計算処理および参照連動の解決処理は行われています。ただし、更新した値を使った再計算や、参照連動は行なわれません。

一括更新スクリプトで修正された値を使って再び計算処理を呼び出す場合は、次のように記述します。

return "calc";

これは一括更新スクリプトだけのルールです。ここで参照連動項目が含まれる場合、参照連動の解決後に計算が行われます。

計算結果を用いてさらに参照連動処理を行う場合は、次のように記述します。

return "calc,resolv";

コンマ区切りで calc,resolv と記述すると、自動計算後、参照連動の解決処理を行ってからデータベースに値を保存します。

自動計算の結果を使って参照連動の解決を行ったあと、さらにその値を使った自動計算を行い、その結果を用いて再び参照連動を行う...という複雑なモデル構成の場合は、次のように記述することもできます。return "calc,resolv,calc,resolv";

一括更新処理後に遷移する画面を指定できます。例えばメインメニューに遷移させるためには「コントローラ > 一覧 > 画面遷移」のタイミングで次のようなスクリプトを記述します。

図2 画面遷移を制御する
if (p.action == "UpdateAll") {
  return "forward:/mainMenu.do";
}
どのボタンが押されたときかを、p.action の値で判別させています。この条件は必ず付与してください。

通常、一括更新処理は終了後に「xx 件の yy データの更新を行いました。」というメッセージが表示されます。これをカスタマイズし、条件によって実際に更新されたデータ件数のみを表示するようにします。ここでは、画面遷移のスクリプトを応用します。

図3 標準のメッセージ

カウント処理

「ヘルパ > 一括更新」スクリプトに、処理数をカウントする変数を用意します。

...(更新処理)...

var counter = p.request.getAttribute("myapp.counter");
if (counter == null) {
    counter = 1;
    p.request.setAttribute("myapp.counter", counter);
} else {
    counter = counter + 1;
}

p.request は、この一括更新処理中に維持したい変数を保持することができる入れ物として利用できる特別なオブジェクトです。この例では名前を myapp.counter としています。任意の名前を利用できますが、Wagbyが利用する他の名前と重複しない、かつ管理しやすい名前を使うようにしてください。(上の例のように、アプリケーションを意味する接頭語を付与するなどの工夫を行なってください。)

上のコードでは、初回は 1 をセットします。2回目以降は counter 変数を増加させています。開発者は、例えば条件によって値を更新しなかった場合は counter を増加しない、といったルールをスクリプトで実現することができます。

メッセージの表示

「コントローラ > 一覧 > 画面遷移」で、メッセージの表示処理を行います。

if (p.action == "UpdateAll") {
  var counter = p.request.getAttribute("myapp.counter");
  if (counter != null) {
    var info = new Jfcinfo();
    info.content="更新は"+counter+"件です。";
    p.errors.clearJfcinfo();/* 標準のメッセージを削除する */
    p.errors.addJfcinfo(info);
  }
}

p.request は、この一括更新処理が終わるまで myapp.counter の値を保持しています。(一括更新処理が終了すると、この値は自動的に p.request から削除されます。)

Jfcinfo は成功時に表示されるメッセージです。詳細は「エラーメッセージ > INFO」をお読みください。

p.errors.clearJfcinfo() を呼び出すことで、標準のメッセージを削除することができます。これによってメッセージを強制的に置き換えて表示させています。

ワークフローとの併用

ワークフローを定義したモデルでは一括更新ボタンが表示されません。

ワークフロー利用時は、フローを保留させている人(処理保留者)のみがデータを更新できるという仕様となっています。 一括更新ボタンの表示には、一覧に表示されているデータのうち保留データが含まれているかの判断が必要となりますが、現在はこの制御を行っておらず、非表示となっています。

代替案として、ワークフローの設定を無効化したサブモデルを作成し、サブモデル側で一括更新処理を行うという方法があります。 ただし、この方法は「処理保留者のみがデータを更新できる」というルールを無視した形でデータの更新処理を行うことにご注意ください。そのため、承認/決裁の判断に利用される重要項目の更新は控えることや、決裁済みのデータは更新しないといった配慮を行うようにしてください。