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

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を参考にビジネスルールを作ったところ、想定どおりの動作をしました。
大変助かりました。お返事が遅くなってしまいすいません。