The CreatorCon Call for Content is officially open! Get started here.

client scriptで別テーブルから値を取得し、反映する方法  How to get the value from another table with client script and reflect it

Kazuki Maekawa
Mega Explorer

こんにちは。

現在、「1」で設定した値を基に「member」テーブルを参照し、1と一致するレコードの「原価」「利益」の値を取得し、「稼働時間」に入力された数字をかけた値を、それぞれ「shien_kanri」テーブルの「原価」、「利益」フィールドに反映させるという処理を実行したいです。

下記ページを参考にコードを書いているのですが、初学者のためうまくいかず、
どのように書き直せば上記の処理を実現できますでしょうか。
https://community.servicenow.com/community?id=community_question&sys_id=c74a21961b407450a17c62c4bd4bcb31

Hi.

Currently, refer to the "member" table based on the value set in "1", get the "原価" and "利益" values ​​of the records that match 1, and multiply by the number entered in "稼働時間". I want to execute the process of reflecting the value in the "原価" and "利益" fields of the "shien_kanri" table, respectively.

I wrote the code referring to the following page, but it didn't work,
How can I rewrite it to achieve the above process?

Thank you.
 

 

 

10 REPLIES 10

ご返信ありがとうございます。

>U_reference_1とはこのsys_idのことでしょうか?

→u_reference_1はフィールド名になります。
 イメージとしては、u_reference_1で選択したレコードのsys_idを取得し、memberテーブルからそれと一致するレコードの原価フィールドと利益フィールドの値を反映するという形になるのですが、別途何か設定が必要でしょうか。

 また、2つのテーブルは、同じアプリケーション内で作成している形になります。

>shien_kanriレコードとmemberレコードは1:1の関係なのでしょうか?それとも1:nの関係でしょうか?

→1つのshien_kanriレコードに対しmemberレコードの選択肢が複数あるという意味でしょうか。

 その意味でしたら、1:nの関係になります。

 

>どのように実行されるかの説明も必要です。

→実行タイミングは、u_reference_1フィールドで選択した時点で行いたいです。

 

回答になっているかわからず申し訳ございませんが、お力添えの程よろしくお願いいたします。

 

 

ビジネスルールかスケジュールジョブから次ぎのようなスクリプトインクルード関数を呼び出すことになると思います。

var test = Class.create();
test.prototype = {
    initialize: function() {},
    updateCostProfit: function(key_value) { // key_valueはmemberテーブルから取得するu_reference_1の値
        var gr_member = new GlideRecord('member'); // memberテーブルを検索
        gr_member.addQuery(u_reference_1, vakey_valuelue); // 検索条件
        gr_member.query(); // 実行
        var total_cost = 0; // 原価後継 
        var total_profit = 0; // 利益ごプ系
        while (gr_member.next()) { // 該当レコードをループして処理
            var cost = gr_member.cost; // 原価
            var profit = gr_member.profit; // 利益
            var hours = gr_member.hours; // 稼働時間
            total_cost += cost * hours;
            total_profit += profit * hours;
        }
        gr_shien.cost = total_cost;
        gr_shein.profit = total_profit;
        gr_shein.update(); // 更新する
    },
    type: 'test'
};

 

何度も申し訳ありません。
script includeで取得した値(memberテーブルの原価、利益)を、
client scriptもしくはbusiness rule側で、shien_kanriテーブルの稼働時間とかけて反映するという処理は可能でしょうか。
質問参考画像の下にもう一つ同じ処理を行うフィールドを作成したいと考えており、
script includeは同じ物を呼び出し、client script側で反映先を変更したいと考えております。

お手隙の際で問題ございませんので、ご教授いただけますと大変助かります。

済みません。クライアントスクリプトは入力フォームがフォーム上の値を変更するためのスクリプトです。

クライアントスクリプトはテーブルを参照しますが、テーブルの変更は申請が送信されたときにビジネス

ルールで行います。

フォーム画面上に表示する値を変更したいのでしょうか?それともデータベーステーブルを変更したいのでしょうか?

フォーム画面の表示を変更したい場合はフォーム画面のレイアウトをお願いします。

クライアントスクリプトには3種類あります。フォームが開けれる時に実行するonLoad、フォーム内のフィールド毎の値が変更された時に実行されるonChange、フォームが送信された時に実行されるonSubmit。

テーブルではなく、入力フォームのフィールドとフィールドに値が設定された時の動作のみの仕様が必要です。

例えば、フィールド1にxxxを入力したら、xxxに該当するmemberテーブルの価格とフィールド2に設定して、原価をフィール3に設定する。

説明がわかりづらく申し訳ありません。

行いたい処理はフォーム画面上に表示する値の変更です。

①shien_kanriフォーム上のフィールド「1」の値が選択されたら、その情報を基にmemberテーブル上で一致するレコードを探す。

②一致したレコードの「原価」「利益」の値を取得する。

③その数字に、shien_kanriフォームの「稼働時間」に入力された数字をかける。

④③で計算した数字をshien_kanriフォームの「原価」、「利益」フィールドに反映する

という処理になります。

find_real_file.png