要求アイテムをコピーするUIアクション

Yuki21
Tera Expert

お世話になっております。
以下要件を満たすことはUIアクションで実現可能でしょうか。

<要件>
①要求アイテム(sc_req_item)の入力画面にコピーボタンを作り、今開いている要求アイテムレコードをコピーする
②要求テーブル(sc_request)のレコードはコピーしない
③要求アイテム(sc_req_item)には変数(variables)のカラムを設定しており、その内容もコピーする

要求テーブル(sc_request)には要求と要求アイテムをコピーするOOTBのUIアクションがあるのは知っていますが、
それを使わずに、要求アイテムのみをコピーしたいです。
要求と要求アイテムを紐づけない考え方がそもそも間違っている可能性もあると思い、質問させていただいております。

16件の返信16

Scriptは catItemID や requestId を 修正して、 後は、値のコピーの処理を追記してみました。値のコピーの詳細コードを記載するとなると、行数も時間もかかるので省略しています。

//var catItemId = current.sys_id;
var catItemId = current.getValue('cat_item');
//var requestId = current.request;
var requestId = current.getValue('request');
var helper = new GlideappCalculationHelper();

var items = [];
//既存のItemを記録
var grReqItem = new GlideRecord('sc_req_item');
grReqItem.addQuery('request', current.request);
grReqItem.query();
while (grReqItem.next()) {
    items.push('' + grReqItem.sys_id);
}


try {
    helper.addItemToExistingRequest(requestId, catItemId, "1");
	gs.addInfoMessage(gs.getMessage('Request copied successfully'));
} catch (e) {
	var catalogExceptionUtils = new CatalogExceptionUtils();
	if(catalogExceptionUtils.isCartException(e)) {
		gs.addErrorMessage(e.getMessage());
	}
}

grReqItem = new GlideRecord('sc_req_item');
grReqItem.addQuery('request', current.request);
grReqItem.addQuery('sys_id', 'NOT IN', items.join(','));
grReqItem.query();
while (grReqItem.next()) {
    //値のコピー
}

@iwai さん、度々すみません、もう1点確認させていただきます。。

GlideappCalculationHelper を使うことでRequest ItemをScriptから作成できます。Variablesのコピーは個別にScriptを作成する必要があります。このVariablesのコピーのスクリプトはどうのように作成すればいいでしょうか。下記サンプルをみつかりましたが、動かないです。

songchunpu_0-1679046796124.png

 

一通りこちらで動くスクリプトを作成しました。こういう問題は、自分の手に負えないScriptは、実装しない方が良いです。良くわからないサンプルScriptを使うのも危険です。それは、このScriptに危険性があったりバグがあるかもしれませんし、追加の修正を行いたいときすべて誰かに調べてもらって修正してもらわないといけなくなるからです。

var catItemId = current.getValue('cat_item');
var requestId = current.getValue('request');
var helper = new GlideappCalculationHelper();

var itemsAll = [];
//要求に紐づく全てのItemを取得
var grReqItemAll = new GlideRecord('sc_req_item');
grReqItemAll.addQuery('request', current.request);
grReqItemAll.query();
while (grReqItemAll.next()) {
    itemsAll.push('' + grReqItemAll.sys_id);
}

try {
    helper.addItemToExistingRequest(requestId, catItemId, "1");
    helper.rebalanceRequest(requestId);
    gs.addInfoMessage(gs.getMessage("Request copied successfully"));
} catch (e) {
    var catalogExceptionUtils = new CatalogExceptionUtils();
    if (catalogExceptionUtils.isCartException(e)) {
        gs.addErrorMessage(e.getMessage());
    }
}

//コピー先のItemを取得
var itemsNew = [];
var grReqItemNew = new GlideRecord('sc_req_item');
grReqItemNew.addQuery('request', current.request);
grReqItemNew.addQuery('sys_id', 'NOT IN', itemsAll.join(','));
grReqItemNew.query();
while (grReqItemNew.next()) {
    var currentVariables = current.variables.getElements(false); // with Multi Row Variables true false
    for (var i = 0; i < currentVariables.length; i++) {
        var name = currentVariables[i].getName();
        grReqItemNew.variables[name].setValue(currentVariables[i].getValue());
    }
    grReqItemNew.update();
}

 

@iwai さん、承知しました。ありがとうございます。やってみます。

@iwai さん、お疲れ様です。度々すみません、MRVSの場合、Trueを設定して、下記通りロジックどおり、39行目ところにログから見ると、空を取得しました、うまく進めてないです。何か違いがありませんか。ご連絡いただければ幸いです。

songchunpu_0-1679274780009.png