MIDサーバースクリプトインクルードでのGlideRecordインスタンスについて

Koichiro Hiray1
Tera Contributor

毎度お世話になります。

 

掲題の件、クライアントのUI アクションからMIDサーバースクリプトを実行させる処理を行っております。

MIDサーバー側処理は、取得してきたある情報を関連するレコードにセットしてアップデートを行うというシンプルな処理です。(本件に不要な処理や中間ディスパッチャクラス等は省略させていただいております)

var Class1 = Class.create();

Class1.prototype = {
    initialize: function(table_name, sys_id) {
        sys_id = (sys_id === undefined) ? null : sys_id;
        try{
            this.targetTable = new GlideRecord(table_name);
        }catch(e){
            throw new Error(e);
        }
        if (sys_id)
            this.targetRecordId = sys_id;
    },

    update: function(json) {
        try{
            this.targetTable.addActiveQuery();
            this.targetTable.query();
            var ret = this.targetTable.get(this.targetRecordId);

            //各カラムの値を設定
            for (var key in json) {
                this.targetTable.setValue(key, json[key]);
            }

            //target tableの更新処理
            var sys_id = this.targetTable.update();

            //デバッグ様に書き換え
            throw new Error('GlideRecord.update() was failed. return sys_id: ' + sys_id + ', getTableName: ' + this.targetTable.getTableName() + ', get: ' + JSON.stringify(ret));
            }catch(ex){
                throw new Error(ex);
            }

            return true;
    },
}

このupdate内にあるtargetTable.update()はGlideRecordのupdateなはずなのですが、このデバッグ結果を見ると、以下の様にtrueが返ってきてしまいます。

find_real_file.png

 

前置きが長くなりましたが、以下有識者の方教えていただけないでしょうか。

  1. MIDサーバー側のGlideRecordはServiceNow本体のGlideRecord(Reference)と同一のものなのでしょうか?
  2. GlideRecord.update処理に係る詳細デバッグ方法をご存知でしたらご教示いただけないでしょうか
  3. 同様のケースがございましたらご教示いただけないでしょうか。

よろしくお願いいたします。

1 ACCEPTED SOLUTION

iwai
Giga Sage

MIDServer Script include 内の GlideRecord 変数をScriptで解析してみました。結果として下記の定義となっていました。ServiceNow InstanceのGlideRecordと比べて圧倒的にfunctionの数が少なく、Fieldの参照(例:current.name)もありませんでした。そのため中身の処理は別物であると考えて良さそうです。

GlideRecord.update処理のデバッグは、この処理の中身を確認する事はできないので、ServiceNow側でBusinessRuleにログを入れたり、通信ログを確認するぐらいになるかと思います。

GlideRecord.update で True False を返すということなら、それに従って処理を作るしかないと思います。sys_idの取得ならgetValue('sys_id')。RestAPIでテーブルを参照や更新するのも場合によっては良いかもしれません。

ーーーーーー解析結果ーーーーーーー

[prot].addEncodedQuery=[object Function]
[prot].addQuery=[object Function]
[prot].addQueryString=[object Function]
[prot].constructor=[object Function]
[prot].delete=[object Function]
[prot].get=[object Function]
[prot].getBooleanValue=[object Function][function result (false)]
[prot].getDisplayValue=[object Function][function result (null)]
[prot].getIntValue=[object Function][function result (-1)]
[prot].getLastErrorMessage=[object Function][function result (null)]
[prot].getRowCount=[object Function][function result (0)]
[prot].getValue=[object Function][function result (null)]
[prot].hasNext=[object Function][function result (false)]
[prot].initialize=[object Function]
[prot].insert=[object Function]
[prot].isValid=[object Function][function result (true)]
[prot].isValidRecord=[object Function][function result (false)]
[prot].next=[object Function]
[prot].orderBy=[object Function]
[prot].query=[object Function]
[prot].setLimit=[object Function]
[prot].setValue=[object Function]
[prot].update=[object Function]"]

 

View solution in original post

4 REPLIES 4

iwai
Giga Sage

MIDServer Script include 内の GlideRecord 変数をScriptで解析してみました。結果として下記の定義となっていました。ServiceNow InstanceのGlideRecordと比べて圧倒的にfunctionの数が少なく、Fieldの参照(例:current.name)もありませんでした。そのため中身の処理は別物であると考えて良さそうです。

GlideRecord.update処理のデバッグは、この処理の中身を確認する事はできないので、ServiceNow側でBusinessRuleにログを入れたり、通信ログを確認するぐらいになるかと思います。

GlideRecord.update で True False を返すということなら、それに従って処理を作るしかないと思います。sys_idの取得ならgetValue('sys_id')。RestAPIでテーブルを参照や更新するのも場合によっては良いかもしれません。

ーーーーーー解析結果ーーーーーーー

[prot].addEncodedQuery=[object Function]
[prot].addQuery=[object Function]
[prot].addQueryString=[object Function]
[prot].constructor=[object Function]
[prot].delete=[object Function]
[prot].get=[object Function]
[prot].getBooleanValue=[object Function][function result (false)]
[prot].getDisplayValue=[object Function][function result (null)]
[prot].getIntValue=[object Function][function result (-1)]
[prot].getLastErrorMessage=[object Function][function result (null)]
[prot].getRowCount=[object Function][function result (0)]
[prot].getValue=[object Function][function result (null)]
[prot].hasNext=[object Function][function result (false)]
[prot].initialize=[object Function]
[prot].insert=[object Function]
[prot].isValid=[object Function][function result (true)]
[prot].isValidRecord=[object Function][function result (false)]
[prot].next=[object Function]
[prot].orderBy=[object Function]
[prot].query=[object Function]
[prot].setLimit=[object Function]
[prot].setValue=[object Function]
[prot].update=[object Function]"]

 

Koichiro Hiray1
Tera Contributor

iwai様

 

いつも迅速かつ的確なご回答いただきましてありがとうございます!

オブジェクト解析までいただきまして大変感激いたしております!

差し支えなければで結構なのですが、この解析手順を展開いただく事は可能でしょうか?


また、その後色々と検証を重ねた結果、お恥ずかしながら更新出来ていないのはテーブル列が読み取り専用になっていることが原因でした。。。これを外すとMIDサーバー側のGlideRecord.updateでも更新出来ました。読み取り専用でもインサートによるフィールドセットが出来ていたため更新も問題無いものと誤認しており、大変お騒がせ致しました。。。

ただ、実行成否に関わらずtrueを返してくる様で、運用に耐えうるか疑問も感じているため、ご提案いただいたTable APIの利用も検討しております。

 

本件につきましてご協力いただいたこと、重ねて御礼申し上げます。

解析Scriptは長年育てた冗長なScriptになります。
技術的には
typeof obj
Object.prototype.toString.call(obj)
obj.constructor.name
の様な判定処理を大量に入れています。
try catch で できるできない関係なく判定を総当たりで判定します。
オブジェクトの持っている変数列挙もJavaScriptの手法です。
for (var p in obj) {
    parameter.push('' + p);
}
parameter_prot = Object.getOwnPropertyNames(obj.__proto__);
このような処理で変数を列挙して、型や値の判定を大量に入れています。

iwai様

解析につきましても詳解誠にありがとうございます!
いただいた情報をベースに当方でも解析出来る様にしようと思います!

重ねて御礼申し上げます。