サンプルコード最終更新日: 2020年4月28日
R8 | R9

繰り返しコンテナ項目の日付を使って、新規データを生成する

要件

モデル model1 に、繰り返しコンテナ cont があります。

model1 には「予定日 (yoteibi)」「タイトル (title)」項目があります。 また、model1 の繰り返しコンテナ cont には「次回予定日 (jikaiyoteibi)」と「タイトル (ctitle)」があります。

項目名 項目ID
予定日 yoteibi 日付
タイトル title 文字列
議事録 cont 繰り返しコンテナ
No cont/cid 繰り返しコンテナID
次回予定日 cont/jikaiyoteibi 日付
次回タイトル cont/ctitle 文字列
「タイトル」と「次回タイトル」は型が同じ、とします。上では文字列としていますが、モデル参照方式にすることもできます。(タイトルマスタというモデルがあり、選択式とする、など。)

繰り返しコンテナ項目内の「次回予定日」に日付が入っていた場合に、予定日およびタイトルに繰り返しコンテナ内の値を設定した *新規オブジェクト* を登録します。

(つまり、model1 データを1件登録したときに、繰り返しコンテナが1件あれば、同時にもう1件のデータも登録されるというものです。)

スクリプトの記述箇所

model1 の新規登録処理が成功したあと、とします。具体的には「コントローラ > 登録(画面) > 登録の実行(タイミング)」に記述します。

var Model1Class = Java.type("jp.jasminesoft.wagby.model.model1.Model1");
var service = p.appctx.getBean("Model1EntityService");
var helper = p.appctx.getBean("Model1Helper");
var cont = model1.cont;
if (cont != null) {
    for (var i=0; i<cont.length; i++) {
        if (cont[i].jikaiyoteibi != null) {
            var n_model1 = new Model1Class();/*オブジェクト作成*/
            helper.initialize(n_model1, p);/*オブジェクト初期化*/
            n_model1.yoteibi = cont[i].jikaiyoteibi;
            n_model1.title = cont[i].ctitle;
            /*print(n_model1);*/
            service.insert(n_model1);
        }
    }
}
  • 1,2,3行目はそれぞれストアモデル Model1、(Model1の)サービスクラス、(Model1の)ヘルパクラスを利用するためのコードです。
  • 7行目で、繰り返しコンテナ項目内の「次回予定日」に日付が入っているかどうかの判断を行っています。
  • 8行目で新規オブジェクトを生成しています。
  • 9行目でオブジェクトの初期化処理を行っています。詳細...
  • 10,11行目で繰り返しコンテナの値をセットしています。
  • 13行目で新規オブジェクトをデータベースに登録しています。この例では主キーは順序を利用しています。(自動採番となるため、service.insert メソッド内で主キーが割り当てられます。)

繰り返しコンテナで、ある値が空のコンテナ行を削除する

要件

アドオンギャラリーで用意した「日報」モデル JSHDAILYREPORT に、繰り返しコンテナ DRCOMMENT があります。[詳細...]

この DRCOMMENT の CMEMO 項目が空の場合、当該行を削除します。

ヘルパの登録ならびに更新処理にスクリプトを設定します。

var DRCOMMENT = JSHDAILYREPORT.DRCOMMENT;
if (DRCOMMENT !== null) {
    var removeList = new java.util.ArrayList();
    for (var i=0; i<DRCOMMENT.length; i++) {
        if (ExcelFunction.ISBLANK(DRCOMMENT[i].CMEMO)) {
            removeList.add(i);//CMEMOが空の行の位置を記録する。
        }
    }
    if (removeList.size() > 0) {
        for (var i=removeList.size(); i>0; --i) {
            var idx = removeList.get(i-1);
            JSHDAILYREPORT.removeDRCOMMENT(idx);// うしろから削除していく。
        }
        DRCOMMENT = JSHDAILYREPORT.DRCOMMENT;
        for (var i=0;i<DRCOMMENT.length; i++) {
            // 繰り返しコンテナID (CID) および内部インデックス (DRCOMMENTjshid) を
            // 改めて採番する。これらは飛び番号が認められていないため。
            DRCOMMENT[i].CID = i;
            DRCOMMENT[i].DRCOMMENTjshid = i;
        }
    }
}

参照連動処理を呼び出す

Wagbyの参照連動は、連動元の項目が計算式のとき、計算を行った結果の値を使って参照連動を行います。しかし開発者が直接、計算タイミングのスクリプトで値を算出した場合は、参照連動処理とは連動しません。この場合、開発者は手動で参照連動処理の呼び出しを行うようにしてください。

例を示します。スクリプトの「ヘルパ > 計算」のタイミングで model1 モデルの item1 項目に値をセットしたとします。この item1 が参照連動の連動元項目の場合、次のコードで参照連動処理を呼び出すことができます。

//(item1に値をセットする)
p.appctx.getBean("Model1Helper").resolvRelatedItem(model1, p);

外部コマンドを実行する

ExcelFunction.EXEC を使って外部コマンドを実行することができます。

var ret = ExcelFunction.EXEC("../..", "cmd", "/C", "dir");
print(ret);

オリジナルボタンから外部コマンドを実行する例を用意しています。

EXEC関数の詳細は"関数 > その他 > EXEC"をお読みください。