Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

関連リストに紐づいているレコードから数値を取得して計算してフィールドを埋める方法

Toshikazu
Tera Contributor

皆様

お世話になります。
どのように実装すればよいかわからないため、お知恵をいただけますでしょうか。

 

案件管理的なことをServiceNowで実装しようとしています。

 

案件には売上及び支払いがあります。

案件は案件テーブルで管理し、売上は売上テーブルで管理しているとします。

 

案件テーブルのフォーム上に、関連リストで売上テーブルの情報を表示させます。

1案件に対して、複数の売上があるため、関連リストに複数のレコードが紐づいています。

 

このとき、案件テーブルの1案件のレコード上のフィールドである「売上合計」に

関連リストに紐づいているレコードの売上の合計値を表示させたいです。

 

例)

〇〇案件

売上合計:7,000 万円(←計算させて自動入力させたい)

 

<関連リスト>

売上A 1,000万円

売上B 2,000万円

売上C 4,000万円

 

この設計方法について、

① ServiceNow上のどの仕組みを使って実装するのが適切か

② Scriptが必要な場合、サンプルコード

 

以上をご教示いただけますでしょうか。(②はなくてもOKです)

 

どうぞよろしくお願いいたします。

1 件の受理された解決策

Shota Nakamura
Tera Guru

>① ServiceNow上のどの仕組みを使って実装するのが適切か
Business Ruleがよいかと思います


>② Scriptが必要な場合、サンプルコード
作ってみましたので下記ご参考まで

・Business Ruleの設定
 →When:After
 →Insert,Update,DeleteがTrue
 →売上テーブルへのBusiness Rule
 →条件:売上フィールドの変更

 

スクリプト(合計を算出する処理は2つ考えてみました)

(function executeRule(current, previous /*null when async*/ ) {

var sum = 0;

// 売上明細の売り上げを1件ずつ拾って加算
var grChild = new GlideRecord('u_revenue');
grChild.addQuery('u_parent', current.u_parent);
grChild.query();
while (grChild.next()) {
sum = sum + grChild.u_revenue;
}

// // 売上明細の売り上げを集計して合計を算出
// var revenueGA = new GlideAggregate('u_revenue');
// revenueGA.groupBy('u_parent');
// revenueGA.addAggregate('SUM', 'u_revenue');
// revenueGA.addQuery('u_parent', current.u_parent);
// revenueGA.query();
// revenueGA.next();
// sum = revenueGA.getAggregate('SUM', 'u_revenue');

// 合計を案件のほうに反映して更新
var grParent = new GlideRecord('u_custom_project');
grParent.get(current.u_parent);
grParent.u_sum_revenue = sum;
grParent.update();

})(current, previous);

 
※前提条件

  • 案件テーブル:u_custom_project
    • 売上合計フィールド:u_sum_revenue
  • 売上テーブル:u_revenue
    • 売上金額フィールド:u_revenue 
    • 案件テーブルへの参照フィールド:u_parent

元の投稿で解決策を見る

2件の返信2

Shota Nakamura
Tera Guru

>① ServiceNow上のどの仕組みを使って実装するのが適切か
Business Ruleがよいかと思います


>② Scriptが必要な場合、サンプルコード
作ってみましたので下記ご参考まで

・Business Ruleの設定
 →When:After
 →Insert,Update,DeleteがTrue
 →売上テーブルへのBusiness Rule
 →条件:売上フィールドの変更

 

スクリプト(合計を算出する処理は2つ考えてみました)

(function executeRule(current, previous /*null when async*/ ) {

var sum = 0;

// 売上明細の売り上げを1件ずつ拾って加算
var grChild = new GlideRecord('u_revenue');
grChild.addQuery('u_parent', current.u_parent);
grChild.query();
while (grChild.next()) {
sum = sum + grChild.u_revenue;
}

// // 売上明細の売り上げを集計して合計を算出
// var revenueGA = new GlideAggregate('u_revenue');
// revenueGA.groupBy('u_parent');
// revenueGA.addAggregate('SUM', 'u_revenue');
// revenueGA.addQuery('u_parent', current.u_parent);
// revenueGA.query();
// revenueGA.next();
// sum = revenueGA.getAggregate('SUM', 'u_revenue');

// 合計を案件のほうに反映して更新
var grParent = new GlideRecord('u_custom_project');
grParent.get(current.u_parent);
grParent.u_sum_revenue = sum;
grParent.update();

})(current, previous);

 
※前提条件

  • 案件テーブル:u_custom_project
    • 売上合計フィールド:u_sum_revenue
  • 売上テーブル:u_revenue
    • 売上金額フィールド:u_revenue 
    • 案件テーブルへの参照フィールド:u_parent

ありがとうございました!!!
いただいたScrriptを参考にビジネスルールを作ったところ、想定どおりの動作をしました。
大変助かりました。お返事が遅くなってしまいすいません。