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

Yuki21
Tera Expert

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

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

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

16件の返信16

iwai
Giga Sage

雑なやりかたにはなりますが、かんたんな方法としては、要求テーブル(sc_request)のレコードコピーを使ってコピーした後、要求テーブルのレコード(sc_request)を消して、要求アイテム(sc_req_item)を処理するのはどうでしょうか。

var request = new GlideappScriptHelper().copyRequest(current);

難しくても良いのであれば、GlideappCalculationHelper を使うことでRequest ItemをScriptから作成できます。Variablesのコピーは個別にScriptを作成する必要があります。Scriptには様々な考慮すべき要件があるので状況に合わせて作る必要があります。

GlideappCalculationHelper - Global (servicenow.com)

var catItemId = "04b7e94b4f7b4200086eeed18110c7fd";
var requestId = "6eed229047801200e0ef563dbb9a71c2";
var helper = new GlideappCalculationHelper();
helper.addItemToExistingRequest(requestId, catItemId, "1");

iwai様

ご返信ありがとうございます。
一つの要求(sc_request)に対して、複数の要求アイテム(sc_req_item)が紐づいている場合に、
複数の要求アイテムがコピーされてしまうことを避けたいということから1つの要求アイテムのみ
をコピーする方法はないか検討しています。

となると後者のGlideappCalculationHelperを使った方法をとるのが良いと考えています。

iwai様

言葉足らずで申し訳ありません。
今回やりたいことは要求アイテムのコピーのみのため、既存の要求に要求アイテムを追加する
ではありません。要求に紐づかない要求アイテムのみ作成できないか検討しております。

<コピー前>
要求A
  ┗要求アイテム① ← コピー対象
  ┗要求アイテム②
  ┗要求アイテム③
  
<コピー後>
なし
  ┗要求アイテム④ ※要求アイテム①のコピー

連投で申し訳ありません。

以下の2パターンの実装方式を検討しました。

【実現方法①】
要求アイテム(sc_req_item)独自のコピーUIアクションを作成する

<スクリプトの内容>
 ・「GlideappCalculationHelper」で既存の要求に要求アイテムを追加

<コピー前>
要求A
  ┗要求アイテム① ← コピー対象
  ┗要求アイテム②
  ┗要求アイテム③
  
<コピー後>
要求A
  ┗要求アイテム① ← コピー対象
  ┗要求アイテム②
  ┗要求アイテム③
  ┗要求アイテム④ ※要求アイテム①のコピー

================================================================
【実現方法②】
要求(sc_request)のコピーUIアクションを活用する

<スクリプトの内容>
 ・「GlideappScriptHelper」で要求と要求アイテムをコピー
 ・コピーして作成された要求アイテムの中で不要なものを削除

<コピー前>
要求A
  ┗要求アイテム① ← コピー対象
  ┗要求アイテム②
  ┗要求アイテム③
  
<コピー後>
要求B
  ┗要求アイテム④ ※要求アイテム①のコピー
  ┗要求アイテム⑤ ←削除
  ┗要求アイテム⑥ ←削除

実現方法①の方がデメリットが少ないと判断し、動作確認しましたがコピーされない状況です。
システムログにもエラーメッセージがでておらず、どこが悪いかお分かりでしたらご教示いただけますと幸いです。

var catItemId = current.sys_id;
var requestId = current.request;
var helper = new GlideappCalculationHelper();

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());
	}
}