- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
10-11-2023 11:18 PM
こんにちは
UIポリシーを使用し、
テーブル2のフォームでテーブル1を参照した際に
テーブル1のレコードに含まれるリストの値をテーブル2のリストにコピーしたいです。
テーブル2で指定したテーブル1のレコード名からQueryを行い、
テーブル1のリストの値をテーブル2のリストに追加したいと考えていますが、
以下のスクリプトが動作しません
解決策をできればスクリプトを添えて教えてください。
お願い致します。
構成とスクリプト
Tabale1
フィールド名:table1_list_name タイプ:string
フィールド名:table1_list タイプ:list 参照:sys_user
Table2
フィールド名:table1_list_name2 タイプ:string
フィールド名:table2_list タイプ:list 参照:sys_user
UIPoricy
条件
tabale1_list_name2 は空ではない
True
function onCondition() {
var userList = new GlideRecord('table1');
var user_array = [];
userList.addQuery('table1_list_name','=',current.table1_list_name2);
userList.query();
user_array.push(userList.table1_list.toSting());
current.table2list = user_array;
}
False
function onCondition() {
var user_array = [];
current.tabele2_list = user_array;
}
解決済! 解決策の投稿を見る。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
10-16-2023 09:59 AM - 編集済み 10-17-2023 10:08 AM
@ryo200 様
こちらで同様の投稿をされているようですが、問題は解決されましたでしょうか?
- 上記URLに返信があるとおり、UI Policy などのクライアント側スクリプトで GlideRecord を呼び出すのは処理速度の観点でおすすめしません。GlideRecord の処理は Script Include に実装して、GlideAjax で呼び出すのが一般的です。
- UI Policy で current オブジェクトは使用できません。代わりに g_form などでフォーム上の値を取得する必要があります。
- List型のフィールドからは Array 型オブジェクトではなく、参照先レコードの sys_id をカンマ区切りにした文字列が返されます。
以上の点を踏まえて、Incident から Problem へ値をコピーするスクリプトの例を提示します。テーブル名やカラム名は適宜読み替えてください。
Script Include "UserListAJAX" を新規作成
- Client callable : true(チェックを入れる)
- Script :
var UserListAJAX = Class.create();
UserListAJAX.prototype = Object.extendsObject(AbstractAjaxProcessor, {
copyUserList: function() {
var table1_list_name2 = this.getParameter('sysparm_table1_list_name2');
var table1_list = "";
var table1 = 'incident';
var userList = new GlideRecord(table1);
userList.addQuery('u_table1_list_name', table1_list_name2);
userList.query();
if(userList.next()) {
table1_list = userList.u_table1_list;
}
return table1_list;
},
type: 'UserListAJAX'
});
UI Policy "Copy User List" を新規作成
- Table : Problem [problem]
- Conditions : Table1 List Name2 | is not empty
- Run scripts : true(チェックを入れる)
- Execute if true :
function onCondition() {
var ga = new GlideAjax('UserListAJAX');
ga.addParam('sysparm_name','copyUserList');
ga.addParam('sysparm_table1_list_name2', g_form.getValue('u_table1_list_name2'));
ga.getXML(callback);
// Script Include から受け取った値を処理するコールバック関数
function callback(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
g_form.setValue("u_table2_list", answer);
}
}
- Execute if false :
function onCondition() {
g_form.setValue("u_table2_list", "");
}
ユースケースが不明なので一概には言えませんが、UI Policy と Script Include の2箇所を管理するのは煩雑になりそうなので、私なら Business Rule で(チケットを保存する直前に値をコピーする)実装を提案すると思います。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
10-16-2023 09:59 AM - 編集済み 10-17-2023 10:08 AM
@ryo200 様
こちらで同様の投稿をされているようですが、問題は解決されましたでしょうか?
- 上記URLに返信があるとおり、UI Policy などのクライアント側スクリプトで GlideRecord を呼び出すのは処理速度の観点でおすすめしません。GlideRecord の処理は Script Include に実装して、GlideAjax で呼び出すのが一般的です。
- UI Policy で current オブジェクトは使用できません。代わりに g_form などでフォーム上の値を取得する必要があります。
- List型のフィールドからは Array 型オブジェクトではなく、参照先レコードの sys_id をカンマ区切りにした文字列が返されます。
以上の点を踏まえて、Incident から Problem へ値をコピーするスクリプトの例を提示します。テーブル名やカラム名は適宜読み替えてください。
Script Include "UserListAJAX" を新規作成
- Client callable : true(チェックを入れる)
- Script :
var UserListAJAX = Class.create();
UserListAJAX.prototype = Object.extendsObject(AbstractAjaxProcessor, {
copyUserList: function() {
var table1_list_name2 = this.getParameter('sysparm_table1_list_name2');
var table1_list = "";
var table1 = 'incident';
var userList = new GlideRecord(table1);
userList.addQuery('u_table1_list_name', table1_list_name2);
userList.query();
if(userList.next()) {
table1_list = userList.u_table1_list;
}
return table1_list;
},
type: 'UserListAJAX'
});
UI Policy "Copy User List" を新規作成
- Table : Problem [problem]
- Conditions : Table1 List Name2 | is not empty
- Run scripts : true(チェックを入れる)
- Execute if true :
function onCondition() {
var ga = new GlideAjax('UserListAJAX');
ga.addParam('sysparm_name','copyUserList');
ga.addParam('sysparm_table1_list_name2', g_form.getValue('u_table1_list_name2'));
ga.getXML(callback);
// Script Include から受け取った値を処理するコールバック関数
function callback(response) {
var answer = response.responseXML.documentElement.getAttribute("answer");
g_form.setValue("u_table2_list", answer);
}
}
- Execute if false :
function onCondition() {
g_form.setValue("u_table2_list", "");
}
ユースケースが不明なので一概には言えませんが、UI Policy と Script Include の2箇所を管理するのは煩雑になりそうなので、私なら Business Rule で(チケットを保存する直前に値をコピーする)実装を提案すると思います。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
11-01-2023 07:32 PM
@Community Alums 様
ご回答、有難う御座います。
当方、回避策として
1.Flow Designer
2.Client Script でのフィールドタイプ:参照と関連フィールドによる値のコピー の2つでの動作を確認出来ました。
ご回答頂いたのにも関わらず、ご活用出来ず、申し訳ございません。
1つの知見として蓄積させて頂きます。
この度は有難う御座いました。