SE(しがないエンジニア)のブログ

IT技術ネタ(Azure他MS製品・セキュリティ周り)が中心です!他雑記(お馬さん 他いろいろ)もあり。

プリザンターでサイトのデータ更新後に別サイトのデータも更新したい場合

ちょっとした Tips です

以前よりプリザンターに関する記事を数記事上げておりますが、最近はどっぷりとプリザンターに触れることがあるため少しずつ Tips を上げていこうと思います。

 サイト更新後に別サイトも更新したい場合の Tips

早速サンプルスクリプトですが下記を参照下さい。処理内容に関しては一通りコメントに記載しております。

$p.events.after_send_Update = function (args) {
    // 対象となるサイトのID
    var hogeId = "(siteId)";

    // 対象となるレコードを全て取得し update する
    var getJson =
    {
        'id' : hogeId,
        'data' : {
            // 対象のテーブルに対して更新する権限を持つ APIKEY を利用する
            "ApiKey": "(APIKEY)",
            "View": {
                "ColumnFilterHash": {
                        // 「$p.id()」は現状更新しているレコードの ID を指す
                        // (レコードの ID はキーとなるものを指す)
                        "ClassY": $p.id(),
                    }
                }
            },
        'done' : function(data) {
            if (data.StatusCode == 200 && data.Response.Data.length > 0) {
                for(var i in data.Response.Data) {
                    // ColumnFilterHash 対策(部分一致のみな為)
                    if($p.id() == data.Response.Data[i].ClassY) {
                        var updateJson =
                        {
                            'id' : data.Response.Data[i].ResultId,
                            'data' : {
                                    "ClassS": $("#Results_ClassA").val(),   // 更新したいデータ1(一例)
                                    "ClassT": $("#Results_Title").val(),    // 更新したいデータ2(一例)
                            },
                            'done' : function(data){
                                if (data.StatusCode == 200){
                                    // 処理なし
                                }
                            },
                            'fail' : function(){
                                alert("API Failed : hogehoge(update)");
                            }
                        }
                        $p.apiUpdate(updateJson);
                    }
                }
            }
        },
        'fail' : function(){
            $("body").css({ visibility: "visible" });
            alert("API Failed : hogehoge(select)");
        }
    }
    $p.apiGet(getJson);
}

スクリプト内での注意点は以下の通りです。

・「更新」ボタンを押下した後の後処理として「$p.events.after_send_Update」を利用します

Pleasanter ユーザーマニュアル - 開発者向け機能:スクリプト機能:$p.events.after_send

・現状のプリザンターの仕様では API 経由の一括データ更新ができないため、(単一または)複数の取得したレコードを1件1件更新する形となります。

API 実行のオーバーヘッドは詳しく分からないですが早く一括更新に対応してほしいところ。。

・「ColumnFilterHash」に関しては現状の仕様で部分一致のみの為、SQL の where にあたるキーが完全に一意でない場合、取得した値はスクリプト側(JavaScript)にて完全に一致しているもののみ処理対象としております。

➡早く完全一致に対応してほしい。。(デフォルトが完全一致でオプションで部分一致にするとか)

追記(Appendix)

2020/02/05

「ColumnFilterHash」に関しては解釈の違いがありました、スミマセン。対象の項目が数値の場合は完全一致になるようなのでID系のように定めているフィールドに対しての検索は問題ないようです。