サポート > リポジトリ > 画面機能 > 一覧表示からの選択(独自ボタン利用)スクリプト

一覧表示画面で複数行を選択し、独自の一括処理をスクリプトで記述します。8.1.2

一覧表示画面で選択したデータの主キーを、スクリプトで受け取ることができます。開発者はこれらの(複数の)データに対して何らかの処理を行ってください。

この機能は一括更新に似ていますが、次の点が異なります。

  • 一括更新スクリプトはデータ1件ごとに呼び出されます。スクリプトではデータ(正確にはストアモデル)の値を変更する処理のみを記述します。対して本機能は独自ボタン押下時に一回だけ呼び出されます。更新はもとより、それ以外のさまざまな業務処理を行うことができます。(例えば、選択された主キーをパラメータにして非同期処理を呼び出す、など。)
  • 一括更新スクリプトは、更新処理自体は Wagby が行います。対して本機能で更新処理を行う場合、開発者がすべてを作成する必要があります。

ボタンを用意する

画面 > その他 タブのJavaソースコードの設定欄の画面名の選択肢から "一覧表示画面(一括)" を指定します。

図1 独自ボタン
  • ボタン名は任意です。
  • イベント名は、末尾に "All" を含めてください。後述するスクリプトのファイル名に含まれます。またWagbyが標準で提供するスクリプトファイル名と重複しないようにしてください。上の例にあるように、接頭語 "Original" を付与するといった工夫を行うとよいでしょう。
  • アクション名は空白とします。自画面に戻すためです。
  • 追加パラメータも通常は指定する必要はありません。

一括指定のためのチェックボックスを有効にする

Wagbyが標準で提供する、何らかの一括処理を有効にします。ここでは「一括削除」を有効にしておきます。

図2 いずれかの一括処理を有効にする
一つ以上の一括処理を有効にしてください。これによって一覧表示画面の各行の左端に、データを選択するためのチェックボックスが用意されます。

ビルドしたアプリケーションの画面を確認します。独自ボタン(ここでは「オリジナル一括処理」という名前のボタン)が用意されています。データを選択していない状態では、ボタンを押下することはできません。

図3 「オリジナル一括処理」ボタン

データを選択すると、ボタンを押下できるようになります。

図4 ボタン押下が可能になった

スクリプト

「オリジナル一括処理」ボタンのスクリプトを用意することができます。

このスクリプトファイルは Wagby Designer では作成できません。開発者は直接、WEB-INF/script/<モデルID> フォルダ内にスクリプトファイルを用意してください。

例えばモデルIDが customer で、開発者が用意したボタンのイベントが OriginalUpdateAll のとき、スクリプトファイル ShowListCustomer_OriginalUpdateAll.js が呼び出されます。

スクリプトでは、選択されたデータの主キーの集合を取得することができます。

function process() {
  var DbShowListSelectableBaseController =
    Java.type("jp.jasminesoft.jfc.controller.DbShowListSelectableBaseController");
  var ids = p.request.getAttribute(DbShowListSelectableBaseController.SelectIdSetRequestName);
  print(ids);
}

上の変数 ids の実体は java.util.Set です。1つ以上の値(主キー)を文字列型で保持しています。

開発者は得られた主キーを用いて、EntityService から値を取得したり、更新するといった業務ロジックを記述することができます。 例を示します。

function process() {
  var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
  var entityService = p.appctx.getBean("CustomerEntityService");

  var DbShowListSelectableBaseController =
    Java.type("jp.jasminesoft.jfc.controller.DbShowListSelectableBaseController");
  var ids = p.request.getAttribute(DbShowListSelectableBaseController.SelectIdSetRequestName);
  var it = ids.iterator(); /* ids は java.util.Set なので java.util.Iterator を利用できる */
  while (it.hasNext()) {
    var id = it.next(); /* it.nextの戻り値は常に文字列型 */
    try {
      var obj = entityService.findById(ExcelFunction.TOINT(id));/* 主キーが整数型の場合の例 */
      print(obj);
    } catch (e) {
      print("error:"+e);
    }
  }
}

選択方式を "全データを一括処理の対象とする" とした場合、扱いが変わります。

この場合は"全てを選択・解除チェックボックス" の状態によって選択肢の意味が変わります。この状態を selectMode として内部で管理しています。

チェックボックスが ON のとき、selectMode は "__UNSELECT" になります。これは初期状態ですべてのデータが選択された状態です。スクリプトでは、選択を解除した主キーを取得することができます。

チェックボックスが OFF のとき、selectMode は "__SELECT" になります。これは初期状態ですべてのデータが未選択の状態です。スクリプトでは、選択した主キーを取得することができます。

function process() {
  var DbShowListSelectableAllBaseController =
    Java.type("jp.jasminesoft.jfc.controller.DbShowListSelectableAllBaseController");

  // "全てを選択・解除チェックボックス" の状態によって selectMode が変わる。
  // チェックONのとき、selectMode は "__UNSELECT" になる。
  // このときは選択されなかったものだけが ids に格納される。
  // チェックOFFのとき、selectMode は "__SELECT" になる。
  // このときは選択されたものが ids に格納される。
  var selectMode = p.appMap.get("showListModel1_selectMode");

  if (selectMode !== null && selectMode === "__SELECT") {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.selectIdSetAppmapName);
    ids.forEach(function(pkey){
       print("select:" + pkey);
    });
  } else {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.unselectIdSetAppmapName);
    ids.forEach(function(pkey){
       print("unselect:" + pkey);
    });
  }
}
  • DbShowListSelectableBaseControllerクラスではなく、DbShowListSelectableAllBaseControllerクラスの値 selectIdSetAppmapName もしくは unselectIdSetAppmapName をキーにします。
  • selectMode は p.appMap (実体は java.util.Map) の get メソッドを使って確認します。キー名は SCREENID 関数の戻り値 ("showList" + 画面名) に "_selectMode" が付与されたものになります。
  • 同じく p.appMap の get メソッドを使って、キーの集合を取得します。この場合の集合は selectMode によって意味が変わります。選択肢れた値(主キー)または選択を解除された値(主キー)が文字列型として格納されます。

これを踏まえ、選択された主キーの集合を取得するスクリプトのサンプルを示します。対象モデルを model1 とし、主キー項目名を pkey (型は整数)としています。

function process() {
  var DbShowListSelectableAllBaseController =
    Java.type("jp.jasminesoft.jfc.controller.DbShowListSelectableAllBaseController");

  // "全てを選択・解除チェックボックス" の状態によって selectMode が変わる。
  // チェックONのとき、selectMode は "__UNSELECT" になる。
  // このときは選択されなかったものだけが ids に格納される。
  // チェックOFFのとき、selectMode は "__SELECT" になる。
  // このときは選択されたものが ids に格納される。
  var selectMode = p.appMap.get("showListModel1_selectMode");

  if (selectMode !== null && selectMode === "__SELECT") {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.selectIdSetAppmapName);
    ids.forEach(function(pkey){
       print("select:" + pkey);
    });
  } else {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.unselectIdSetAppmapName);
    var Model1C = Java.type("jp.jasminesoft.wagby.model.model1_c.Model1C");
    var FinderContext = Java.type("jp.jasminesoft.jfc.dao.FinderContext");
 
    var finderContext = new FinderContext();
    finderContext.setPageSize(-1);//無制限
    finderContext.setCondition(new Model1C());//空の検索条件セットによる全件取得
    finderContext.setCriteriaConverter(p.appctx.getBean("Model1CriteriaConverter"));
    var entityService = p.appctx.getBean("Model1EntityService");
    var results = entityService.find(finderContext);
    for (i=0; i<results.size(); i++) {
      var entity = results.get(i);
      var pkey = java.lang.Integer.toString(entity.pkey);//文字列型として扱うこと
      if (ids != null && ids.contains(pkey)) {
        print("unselect:"+pkey);
      } else {
        print("  select:"+pkey);
      }
    }
  }
}

selectMode が "__UNSELECT" の場合の補足説明

  • モデル model1 の全件を取得するため、新しい FinderContext オブジェクトを用意します。空のコンディションモデル(検索条件なし)と、クライテリアコンバータをセットします。クリイテリアコンバータをセットすることで暗黙条件などが反映されるようになります。
  • エンティティサービスの find メソッドを呼び出します。引数に FinderContext オブジェクトを渡してください。全件を取得します。
  • 上述した "選択を解除された" 主キーを判定するようにします。

全件取得ではなく、検索条件で絞り込む

上のスクリプトは finderContext にセットした検索条件は空でしたので、全件取得となっていました。これを画面に用意された検索条件の値を使う場合は、次のようにします。

function process() {
  var DbShowListSelectableAllBaseController =
    Java.type("jp.jasminesoft.jfc.controller.DbShowListSelectableAllBaseController");

  var selectMode = p.appMap.get("showListModel1_selectMode");

  if (selectMode !== null && selectMode === "__SELECT") {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.selectIdSetAppmapName);
    ids.forEach(function(pkey){
       print("select:" + pkey);
    });
  } else {
    var ids = p.appMap.get(DbShowListSelectableAllBaseController.unselectIdSetAppmapName);
    var Model1C = Java.type("jp.jasminesoft.wagby.model.model1_c.Model1C");
    var FinderContext = Java.type("jp.jasminesoft.jfc.dao.FinderContext");
    var model1_c = p.appMap.get("model1_c_preserve");
 
    var finderContext = new FinderContext();
    finderContext.setPageSize(-1);
    finderContext.setCondition(model1_c);
    finderContext.setCriteriaConverter(p.appctx.getBean("Model1CriteriaConverter"));
    var entityService = p.appctx.getBean("Model1EntityService");
    var results = entityService.find(finderContext);
    for (i=0; i<results.size(); i++) {
      var entity = results.get(i);
      var pkey = java.lang.Integer.toString(entity.pkey);
      if (ids != null && ids.contains(pkey)) {
        print("unselect:"+pkey);
      } else {
        print("  select:"+pkey);
      }
    }
  }
}
  • p.appMap からキー<モデルID>_c_preserveを指定して、直前に用いた検索条件を取得します。これをfinderContextにセットします。