【ServiceNow】GlideRecordの注意点

ServiceNow
DIチーム

こんにちは、ServiceNow担当のおしゃべりSSです。

今日はServiceNowの実装をしていく上で注意すべき点について
紹介していきたいと思います。
ServiceNow初心者の方はもちろん、ベテランの方も意外と新しい発見が
あるかもしれません。
是非目を通していってください。

ServiceNowにはスクリプトを使用してテーブルを操作する機能として
Glideクラスが存在しています。
Glideクラスは便利であると同時にパフォーマンスに影響を及ぼす可能性のある機能です。
正しく、賢く使って快適なServiceNowスクリプトライフを目指しましょう。

 

Glideクラスの概要

SeviceNowのGlideクラスはJavaScriptのAPIを使用しており、
スクリプトを使用してテーブルを便利に操作することができます。
Glideクラスにもサーバサイドとクライアントサイドがあり、
様々な種類のクラスが用意されています。

 

GlideRecord.getメソッドは必ずifで
存在チェック

GlideRecord.getメソッドでは、レコードが存在しないことを想定し、
レコードが存在したかをチェックすることを意識づけしてください。
GlideRecord.getメソッドは、レコードが取得できればtrueを返すため、
if文により判定することが可能です。

<GlideRecord-get()とは>

getメソッドは、1~2つのパラメータを受け入れます。
パラメータが1つの場合、メソッドは目的のレコードのsys_idであると判断されます。
パラメータが2つの場合、1つ目がGlideRecordの列名、2つ目が検索する値です。

例:

 

<存在チェックをしなかった場合>

下記スクリプトのように1つ目のGlideRecordで検索された結果をもとに
別テーブルの検索をする場合、存在チェックをしていないと問題が発生します。
今回の場合どのような問題が発生するでしょうか?

発生した問題:アサイン先が空のタスクがクローズされる。

今回の例は2つ目のGlideRecordもgetで取得しているので影響を及ぼすレコードが1件で
済みましたが、これをquery()してwhile()で処理していた場合、
アサイン先が空のレコードを全てクローズにしてしまうことになります。

この問題の解決策はif文による存在確認です。
下記スクリプトのようにgetを実施するたびに存在を確認することを意識づけしましょう。

今回の例題はif文を入れるだけで対応可能なものでした。

このひと手間を怠ってしまうと、想定外のレコードに更新を発生させる可能性が出てきます。
悲しい事件が起きないよう、本記事を頭の片隅にでもおいていただければ幸いです。

※筆者の実体験です。

 

GlideRecordのgetRowCountメソッドは使用しない

GlideRecordの検索結果を取得する時に、getRowCountメソッドは使用せず、
GlideAggregate.getAggregateメソッドを積極的に使用しましょう。
GlideRecord.getRowCountメソッドを実行すると、取得可能なレコードの全件数を取得することから、処理速度の劣化につながります。

例:

※件数/最大値/最小値/平均値/合計/標準偏差/値一覧も取得可能

 

<なぜGlideAggregateがいいのか?>

GlideAggregateはデータベース集計を目的としたメソッドです。
GlideRecordが特定レコードのすべての情報を取得するのに対し、
GlideAggregateは特定レコードのクエリに必要な情報のみを取得します。
そのため、大規模なデータベース集計を行う上で性能に差が出てくるのです。

まとめ

今回は2つの例をご紹介させていただきました。
冒頭で説明した通り、Glideクラスにはまだまだたくさんのクラスが存在しています。
それぞれのクラスに特徴があり、さらに深い仕様が潜む可能性もあります。
今回の記事はそんな学習のきっかけにでもなれば幸いです。

お問い合わせはこちら

記事を書いた人

DIチーム

主にServiceNowに関するお役立ち情報をお届けします!

関連記事

TOP