ServiceNowにおいて、スクリプトからデータベースにアクセスするための仕組みであるGlideRecord、GlideElementについて解説します。
GlideRecordとは?
まず大前提として、GlideRecordはServiceNowのAPI=クラスです。API=クラスの基本についてはこちらで書いていますので、必要に応じてご参照ください。
GlideRecordはスクリプトからデータベースを操作するための仕組み
GlideRecordは、(主にサーバーサイド)スクリプトからデータベースを操作するための仕組みです。他のプログラミング言語でデータベースを扱ったことがある方は、「DBアクセスのためのラッパークラス」や「カーソル(Cursor)」という方がわかりやすいかもしれません。
クライアントサイド版もあるがあまり使わない
GlideRecordはクライアントサイドからも利用できますが、次の制約があることから、あまり使いません。そのため、原則サーバーサイドスクリプトから使う機能だと考えてよいです。
- Global scopeでしか使えない
- トランザクションを実行したユーザ権限で実行される
クライアントサイドスクリプトからサーバー側のレコード情報を取得したい場合はGlideForm.getReference()や、GlideAjaxを経由したScriptInclude呼び出しを行うのが一般的です。これらの機能については下記の記事で解説しています。
GlideRecordのイメージ: 表 + 矢印
GlideRecordはデータベース上のテーブルの一部もしくは全てを抽出してきた表と、現在表の中でどの行を指しているのかを表す矢印のイメージで理解しましょう。このイメージについて、GlideRecordを用いた典型的な処理からなる次の例を用いて説明します。
例: ユーザテーブルからロックアウトされたユーザを探し非アクティブ化する
// 例: ユーザテーブルからロックアウトされたユーザを探し非アクティブ化する
var gr = new GlideRecord('sys_user'); // GlideRecordオブジェクトの作成
gr.addQuery('locked_out', true); // クエリの指定
gr.query(); // レコードの抽出
while (gr.next()) { // レコードを1件ずつ処理
var name = gr.getValue('name'); // ユーザ名を取得
gr.setValue('active', false); // ユーザを非アクティブに
gr.update(); // 変更をDBに反映
gs.info(name + " is inactivated"); // 非アクティブにしたことをログに出力
}
1. var gr = new GlideRecord(‘sys_user’);
… 矢印と空の表を作る & データベース上のテーブルを選択する
まずは、テーブル名を引数にしてGlideRecordのインスタンスを生成します。これは、矢印と空の表を作り、データベース上のテーブルを選択するイメージです。
2. gr.addQuery(‘locked_out’, true);
… テーブルからある範囲を指定する
次に、addQuery()メソッドでテーブルに対するクエリ条件を設定します。これは、テーブル上で処理対象となるレコードの条件を指定するイメージです。
3. gr.query();
… 条件を満たすレコードをコピーする
次に、query()メソッドでクエリを実行します。これは、データベース上のテーブルから指定した条件を満たすレコードを抽出・コピーするイメージです。なお、この時点では矢印は初期状態 = レコードを指していない状態です。
4. gr.next();
… 矢印を一つ移動する
次に、gr.next()メソッドで次のレコードを参照します。これは、矢印を一つ移動させるイメージです。
next()メソッドは次のレコードが見つかればtrueを、見つからなければfalseを返すため、while文の条件の中で呼び出すことで、コピーした表を一行ずつ処理することができます。
while (gr.next()) { // レコードを1件ずつ処理
// 処理
}
5. var name = gr.getValue(‘name’);
… 矢印が指すレコードの項目値を取得する
次に、getValue()メソッドで項目値を取得します。これは、矢印が指すレコードにおける特定の項目の値を取り出すイメージです。
6. gr.setValue(‘active’, false);
… 矢印が指すレコードの項目値を設定する
次に、getValue()メソッドで項目値を設定します。これは、矢印が指すレコードにおける特定の項目の値を設定するイメージです。なお、この時点ではあくまでコピーされた表が更新されただけで、データベース上のテーブルは変更されていません。
7. gr.update();
… 矢印が指すレコードの状態をデータベース上のテーブルに反映
最後に、gr.update()を用いて変更をDBに反映します。これは、矢印が指すレコードの状態をデータベース上のテーブルに反映するイメージです。
(発展)GlideElementのイメージ: 表の中の各セル(データ)
GlideRecordはデータベース上のテーブルの一部もしくは全てを抽出してきた表と現在のレコードを指す矢印とするなら、GlideElementは表の中の各セル(データ)を表します。
簡単なコードと対応させてイメージを理解しておきましょう。
// 例: インシデントレコードのState項目の表示値とデータベース内の内部値をセットで表示する
var gr = new GlideRecord('incident');
gr.query();
while (gr.next()) {
var state_element = gr.state; // gr.getElement('state') でもOK
gs.info(gr.getValue('number') + ": "
+ state_element.getDisplayValue()
+ "(" + state_element.getValue() + ")");
}
多くの場合、GlideElementを意識しなくても問題なく開発ができますが、一部のデータベース操作において、GlideElementを理解していないと理屈がわからないものがあるため、発展としつつも紹介しました。このコードを見て、gr.getValue(‘state’)とgr.state.getValue()って何が違うの?と思われた方もいるかもしれませんが、これらは後述します。
GlideRecordの使い方
ここからは、GlideRecordが持つ多数のメソッドの中から、よく使うものを紹介します。なお、サンプルコードでは簡単のため変数宣言は var gr で行いますが、実際にスクリプトを書く際には、適切なスコーピングや命名を行ってください。
レコードの取得(Read)
基本はaddQuery() ⇒ query() ⇒ next()
最も基本的で、かつ汎用性の高いレコードの取得方法はaddQuery()、query()、next()メソッドを用いた方法です。
var gr = new GlideRecord('sys_user');
gr.addQuery('user_name', 'CONTAINS', 'system');
gr.query();
gs.info('row_count:' + gr.getRowCount());
while (gr.next()) {
gs.info(gr.getValue('user_name'));
}
処理のイメージは下図の通りです。
addQuery()メソッドにはフィールド名、演算子(オペレータ)、被演算子(オペランド)を指定します。第二引数の演算子が省略されると、’=’が指定されたことになります。
演算子はフィールドのタイプに応じて様々なものが存在します。下表に主な演算子を示します。詳細はServiceNow DeveloperサイトのAPI Referenceを参照ください。
フィールドのタイプ | 主な演算子 |
---|---|
数値 | =, !=, <, <=, >, >= |
文字列 | =, !=, CONTAINS, DOEST NOT CONTAINS, STARTSWITH |
また、アクティブ or 非アクティブ、Null or 非Nullといった特に利用頻度の高い条件については、addQuery()の代わりとなる簡易版のメソッドが存在します。
addQuery() | 簡易版メソッド |
---|---|
gr.addQuery(‘active’, true) | gr.addActiveQuery() |
gr.addQuery(‘active’, false) | gr.addInActiveQuery() |
gr.addQuery(‘last_name’, ”) gr.addQuery(‘last_name’, null) | gr.addNullQuery(‘last_name’) |
gr.addQuery(‘last_name’, ‘!=’, ”) gr.addQuery(‘last_name’, ‘!=’, null) | gr.addNotNullQuery(‘last_name’) |
単一フィールドかつ’=’による取得はget()
SysIDやユニークキーを用いて特定のレコードを取得したいという場合にはget()メソッドを利用します。get()メソッドは上述のaddQuery(), query(), next()と同じ働きをたった1行で行ってくれます。
var gr = new GlideRecord('sys_user');
if (gr.get('user_name', 'admin')) {
// 処理 例: gs.info(gr.getValue('user_name'));
}
get()メソッドはレコードが取得できればtrueを、できなければfalseを返すため、サンプルコードのようにif文の中に入れて使い、エラー処理も同時に行うことが多いです。
また、第一引数のフィールド名が省略された場合は、SysID ⇒ Display value(対象テーブルのDictionaryにおいてDisplay項目がtrueとなっている項目)の順に探します。
つまり、SysIDを用いてレコードを取得する場合は、次のようにget(<レコードのSysID>)とするだけで取得できます。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1'; // SysIDを何らかの方法で知っている前提
var gr = new GlideRecord('sys_user');
if (gr.get('sys_id', sys_id)) {
// 処理 例: gs.info(gr.getValue('user_name'));
}
なお、get()によって複数件のレコードが抽出された場合、next()で順に処理していくことができます。しかし、get()を呼び出した時点で1つ目のレコードが選択された状態になるため、次のように1レコード目と2レコード目以降の処理をまとめて書くことができず処理しづらいため、get()はユニークキーを用いて単一のレコードを取得する用途のみで使うとよいです。
// ダメな例
var gr = new GlideRecord('sys_user');
gr.get('active', true); // レコードが複数件見つかるようなget()
// 1レコード目の処理 例: gs.info(gr.getValue('user_name'));
while (gr.next()) {
// 2レコード目以降の処理 例: gs.info(gr.getValue('user_name'));
}
複雑なクエリの指定方法
ANDやORを含む複雑なクエリを指定する場合は2つの方法があります。「アクティブかつユーザーIDに”admin”または”system”を含むユーザ」を抽出する場合を例に説明します。
(推奨) addEncodedQuery()
addEncodedQuery()メソッドを用いることで、ANDやORを含む複雑なクエリ条件をencoded queryと呼ばれる形式で表した文字列で指定することができます。「アクティブかつユーザーIDに”admin”または”system”を含むユーザ」は”active=true^user_nameLIKEsystem^ORuser_nameLIKEadmin“というencoded queryで表現できるため、次のようなコードでレコードを抽出できます。
var gr = new GlideRecord('sys_user');
gr.addEncodedQuery("active=true^user_nameLIKEsystem^ORuser_nameLIKEadmin");
gr.query();
while (gr.next()) {
// 処理 例: gs.info(gr.getValue('user_name'));
}
encoded queryは、リスト画面上でフィルタをかけた状態でパンくずリスト上で右クリック⇒Copy queryを押下することで取得できます。そのため、リスト画面上で試行錯誤しつつフィルタ=クエリ条件を作り、そこからencoded queryを取得しaddEncodedQuery()の引数とすることで、比較的簡単に複雑な条件を用いたレコードの抽出が可能です。
なお、上記の方法では取得できませんが、”ORDERBY<フィールド名>”を使うことで、encoded queryでソートを指定することも可能です。
addCondtion(), addOrContion()
addQuery()は戻り値に適用したクエリ条件を表すGlideQueryConditionというオブジェクトを返します。このオブジェクトに対してaddCondition()やaddOrCondition()メソッドでANDやOR条件を加えていくことができます。
var gr = new GlideRecord('sys_user');
gr.addActiveQuery()
.addCondition('user_name', 'CONTAINS', 'admin')
.addOrCondition('user_name', 'CONTAINS', 'system');
gr.query();
ソートは.orderBy(), .orderByDesc()
query()時にレコードをソートしたい場合、昇順ソートはorderBy、降順ソートはorderByDesc()を使います。
var gr = new GlideRecord('sys_user');
gr.orderBy('user_name'); // ユーザIDをキーにして昇順ソート
// gr.orderByDesc('user_name'); // ユーザIDをキーにして降順ソート
gr.query();
レコードの存在チェック、件数チェック、集計
レコードの存在チェックは query() ⇒ if (gr.next())もしくはget()
クエリ条件を満たすレコードが少なくとも1つ存在することをチェックするときは、if (gr.next()) を使います。
var gr = new GlideRecord('sys_user');
// クエリ条件指定
gr.query();
if (gr.next()) {
// クエリ条件を満たすレコードが少なくとも1つ存在する場合の処理
} else {
// クエリ条件を満たすレコードが1つ存在しない場合の処理
}
単一フィールドに関する’='(等価演算子)のクエリ条件であれば、get()を存在チェックとして利用できますが、get()を利用する状況ではレコードが存在していることはわかっていることが多いので、あまり使わないでしょう。
レコードの件数チェックは query() ⇒ getRowCount()
レコードの件数のチェックはquery()を行ってからgetRowCount()です。
var gr = new GlideRecord('sys_user');
gr.query();
gs.info('user count: ' + gr.getRowCount());
getRowCount()はデータベースのテーブル上ではなく、その時点でquery()等によって抽出・コピーされている表の行数を返します。query()をしていない段階では抽出がされていないため件数は0になることに注意です。逆に言うと毎回データベースに問合せに行くわけではないので、何度呼んでもDBアクセスのオーバーヘッドはないです。
レコードの集計はGlideAgligateを使う
条件を満たすレコードを集計する際に、次のようにGlideRecordを用いて集計しているコードをたまに見かけます。
// ダメな例 GlideRecordを用いて特定のナレッジベースにあるナレッジ記事の閲覧件数の集計
var kb = new GlideRecord('kb_knowledge_base'); // まずはナレッジベースを探す
kb.query();
while (kb.next()) { // 各ナレッジベースに対する処理
var view_count = 0;
var article = new GlideRecord('kb_knowledge');
article.addQuery('kb_knowledge_base', kb.sys_id); // そのナレッジベースに含まれる記事を検索
article.query();
while (article.next()) {
view_count += article.sys_view_count; // ナレッジ記事1件ずつのView Countを足し算
}
gs.info(kb.title + ": " + view_count); // 結果を出力
}
GlideRecordを用いた集計はパフォーマンスが悪いため、代わりにGlideAggregateを使います。大抵の場合コードもすっきりして可読性が上がります。
// よい例 GlideAggregateを用いて特定のナレッジベースにあるナレッジ記事の閲覧件数の集計
var kb_aggregate = new GlideAggregate('kb_knowledge');
kb_aggregate.groupBy('kb_knowledge_base'); // 集計する単位を指定
kb_aggregate.addAggregate('SUM', 'sys_view_count'); // 集計を追加 : View Countの合計
kb_aggregate.query(); // 集計
while (kb_aggregate.next()) { // 集計単位ごとに処理
gs.info(kb_aggregate.kb_knowledge_base.title + ": " + kb_aggregate.getAggregate('SUM', 'sys_view_count')); // 集計結果を出力
}
レコードの更新(Update)
1レコードずつの更新はsetValue() ⇒ update()
レコードを1件ずつ更新する場合は、setValue()メソッドで値を設定した上でupdate()メソッドで変更をデータベース上のテーブルに反映します。
// 例: 最後のログインから1年経ったユーザを非アクティブにする
var gr = new GlideRecord('sys_user');
gr.addQuery('last_login', '<', gs.daysAgoEnd(365));
gr.query();
while (gr.next()) {
gr.setValue('active', false);
gr.update();
}
一括更新はsetValue() ⇒ updateMultiple()
updateMultiple()メソッドを用いることで、setValue()で指定した値を、クエリ条件を満たす全レコードに反映できます。クエリ条件がない場合はテーブル上の全レコードが更新されるので注意です。
// 例: 最後のログインから1年経ったユーザを非アクティブにする
var gr = new GlideRecord('sys_user');
gr.addQuery('last_login', '<', gs.daysAgoEnd(365));
gr.setValue('active', false);
gr.updateMultiple();
誤って更新してしまった場合はロールバック
update()やupdateMultiple()を試していると、大量のデータを誤って更新してしまうことがあります。開発環境とはいえ、戻したいことがあると思うので、その場合は下記の記事で解説しているのロールバック機能を使います。
レコードの新規作成(Insert)
initialize() ⇒ insert()
initialize()メソッドで空のレコードを作成、必要に応じてsetValue()メソッドで値を設定した上でinsert()メソッドを呼び出すことで、新規レコードを作成できます。setValue()と同様に、initialize()を呼び出した時点ではまだデータベース上に反映されていないことに注意です。
var gr = new GlideRecord('sys_user');
gr.initialize();
gr.setValue('user_name', 'initialize_test');
gr.insert();
デフォルト値を設定してレコードを作成したい場合はnewRecord() ⇒ insert()
initialize()の代わりにnewRecord()を用いると、デフォルト値が設定された状態のレコードが作成できます。名前的に勘違いしそうになりますが、newRecord()を呼び出した時点ではまだデータベース上に反映されていないことに注意です。
var gr = new GlideRecord('sys_user');
gr.newRecord();
gr.setValue('user_name', 'initialize_test');
gr.insert();
ちなみに、initialize()を用いた場合でもinsert()呼び出し時に初期値が設定されるため、initialize()とnewRecord()はほとんど違いがありません。
レコードの削除(Delete)
1レコードずつの削除はレコードを指定⇒deleteRecord()
レコードを1件ずつ削除する場合は、get()やquery()+next()でレコードを指定した状態でdeleteRecord()メソッドを呼び出します。
var sys_id = '146ba45347e1611011d1fa37536d4319';
var gr = new GlideRecord('incident');
if (gr.get(sys_id)) {
gr.deleteRecord();
}
一括削除はdeleteMultiple()
deleteMultiple()メソッドを用いることで、クエリ条件を満たす全レコードを削除できます。クエリ条件がない場合はテーブル上の全レコードが削除されるので注意です。
// 例: ユーザIDに'test'を含むユーザを一括削除する
var gr = new GlideRecord('sys_user');
gr.addQuery('user_name', 'CONTAINS', 'test');
gr.deleteMultiple();
誤って削除してしまった場合はロールバック
deleteRecord()やdeleteMultiple()を試していると、大量のデータを誤って更新してしまうことがあります。開発環境とはいえ、戻したいことがあると思うので、その場合は下記の記事で解説しているのロールバック機能を使います。
SQLのトランザクションには対応していない
たまに質問を受けるのですが、GlideRecordはSQLにおけるトランザクションやコミット、ロールバックに対応していません。そのため、例えばレコードを連続で更新する処理があったとき、1つでも失敗した場合に、それまで成功したものも含め処理をなかったことにする(ロールバックする)ことはできません。そのような場合は、スクリプトの中で逆操作を行う処理を入れる必要があります。
エラー・例外処理
各CRUDメソッドのエラー判定
上述した各CRUDメソッドのエラー判定方法を下表に整理します。ポイントは次の通りです
- query()は戻り値を返さないためnext()やgetRowCount()でエラー判定を行う
- get(), insert(), update(), delete()は成否をtrue/falseで返すため戻り値でエラー判定を行う
- updateMultiple()やdeleteMultiple()は戻り値を返さず簡単なエラー判定方法がないため、必要に応じてquery()等を用いてエラー判定を行う
CRUD | メソッド | 戻り値 | エラー判定方法 | 典型的なエラー判定コード (メソッドの引数は省略) |
---|---|---|---|---|
Read | query() | 無し | next()の戻り値(true/false)で判定またはgetRowCount()の戻り値(レコード件数)で判定 | ・while (gr.next()) ・if (gr.next()) ・if (gr.getRowCount() > 0) |
Read | get() | 成功時: true 失敗時: false | 戻り値で判定 | if (gr.get()) |
Create | insert() | 成功時: SysID 失敗時: null | 戻り値で判定 | var sys_id = insert(); if (sys_id) |
Update | update() | 成功時: true 失敗時: false | 戻り値で判定 | if (update()) |
Update | updateMultiple() | 無し | 無し(必要に応じてquery()等でチェック) | – |
Delete | deleteRecord() | 成功時: true 失敗時: false | 戻り値で判定 | if (deleteRecord()) |
Delete | deleteMultiple() | 無し | 無し(必要に応じてquery()等でチェック) | – |
テーブル・フィールドの検証
動的にテーブル名やフィールド名を指定する場合で、それらが有効かどうかが事前に確定していない場合は、isValid()メソッドやisValidField()メソッドで検証ができます。
var user = new GlideRecord('sys_user');
gs.info(user.isValid()); // テーブルが有効かを判定
gs.info(user.isValidField('user_name')); // テーブルが有効かを判定
“とりあえずtry catch”は危険
エラー・例外処理の検討を避けたり安心感を得るために全ての処理をtry catchで囲うコードを見かけることがありますが、これは危険です。
例えば、addQuery()はテーブルに存在しないフィールドを指定した場合、例外を投げず、ただその命令を無視します。(この件についての素晴らしい記事がCommunityにあるので紹介しておきます)
ServiceNow Community: Extension to GlideRecord: addQuery2, Throws an exception if you pass a bad column name or bad operator
そのため、少なくとも2023年執筆時点では、各関数の挙動をきちんと理解した上で、上述の各CRUDメソッドのエラー判定や、テーブル・フィールドの検証メソッドを用いてハンドリングをするしかありません。
(発展)GlideElementの使い方
GlideElementオブジェクトの取得
GlideElementは、dot-walkと呼ばれるGlideRecordの属性として取得する方法と、getElement()メソッドを用いて取得する方法があります。
// 例: インシデントレコードのState項目の表示値とデータベース内の内部値をセットで表示する
var gr = new GlideRecord('incident');
gr.query();
while (gr.next()) {
var state_element = gr.state; // dot-walkでGlideElementオブジェクトを取得
var state_element = gr.getElement('state'); // getElement()でGlideElementオブジェクトを取得
}
結果はどちらも同じですが、getElement()の場合はフィールド名を文字列で指定できます。そのため、フィールド名が静的に決まる(コードを書いた時点で決まっている)場合はよりシンプルなdot-walkで、フィールド名が動的に決まる(コードの実行時に決まる)場合はgetElement()を使うとよいです。
gr.<フィールド名>(dot-walk)とgr.getValue(<フィールド名>)の違い
レコードのフィールド値を取得する際、ServiceNowの標準機能のコードも含め、様々な書き方が散見されます。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1';
var gr = new GlideRecord('sys_user');
gr.get(sys_id); // エラー処理は省略
// 様々な値の取得方法
var name = '';
name = gr.name; // × GlideElementを取得
gs.info(name);
name = gr.getValue('name'); // ○ 文字列を取得(推奨)
gs.info(name);
name = gr.name.getValue(); // ○ 文字列を取得
gs.info(name);
name = gr.name.toString(); // ○ 文字列を取得
gs.info(name);
正しくフィールド値が取得できるのはgr.getValue(<フィールド名>), gr.<フィールド名>.getValue(), gr.<フィールド名>.toString()の3通りの方法です。gr.<フィールド名>はGlideElementオブジェクトであり、フィールド値ではないので注意してください。多くの場合はこの取得方法でも問題なく動きますが、次のコードのように、gr.<フィールド名>を文字列だと勘違いしてlengthプロパティを参照しようとすると失敗します。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1';
var gr = new GlideRecord('sys_user');
gr.get(sys_id); // エラー処理は省略
name = gr.name; // GlideElementを取得
gs.info('length of name:' + name.length); // 名前の長さを取得 ※エラーになる
フィールド名の動的な指定にも対応ができるため、フィールド値の取得は常にgr.getValue(<フィールド名>)を使うことを推奨します。
また、この方法も含めGlideRecordを用いてフィールド値を取得する正しい方法はどれもオブジェクトではなく文字列としてフィールド値を取得することも抑えておくとよいです。
gr.<フィールド名> = valueとgr.setValue(<フィールド名>, value)の違い
フィールドに値を設定するときも同様に、dot-walkでフィールドにアクセスして設定するのではなく、常にsetValue()を使うようにしましょう。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1';
var gr = new GlideRecord('sys_user');
gr.get(sys_id); // エラー処理は省略
gr.active = false; // × dot-walkでアクセスして設定しない
gr.setValue('active', false); // ○ setValue()で設定する
実務的にほとんど違いはありませんが、フィールド名の動的な指定に対応できること、updateMultile()メソッドのAPI ReferenceにおいてsetValue()を使うよう記載されていることなどから、常にsetValue()を使う方がよいでしょう。
参照(Reference)先のGlideRecordオブジェクトの取得
GlideElementのgetRefRecord()メソッドを利用することで、参照(Reference)先のGlideRecordオブジェクトを取得できます。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1';
var gr = new GlideRecord('sys_user');
gr.get(sys_id); // エラー処理は省略
// GlideElementのgetRefRecord()メソッドで参照先のGlideRecordオブジェクトを取得
var department = gr.department.getRefRecord();
gs.info(department.sys_id);
// GlideElementを使わない場合
var department = new GlideRecord('cmn_department');
department.get(gr.getValue('department'));
gs.info(department.sys_id);
フィールドのnull判定
GlideElementのnil()メソッドを利用することで、フィールドのnull判定ができます。
var sys_id = '62826bf03710200044e0bfc8bcbe5df1';
var gr = new GlideRecord('sys_user');
gr.get(sys_id); // エラー処理は省略
if (gr.department.nil()) {
// departmentフィールドがnull(空)の場合の処理
}
特定の機能でよく使われるメソッド
上記で説明した基本的な処理を行うメソッド以外にも、GlideRecordには他にも様々なメソッドが存在します。その中でも、特定の機能でよく使われるメソッドを紹介します。
Business Ruleでよく使われるメソッド
setActionAbort(): レコードに対する操作を中止する
before Business RuleにおいてsetAbortAction()メソッドを呼び出すことでデータベースへの操作を中止できます。
current.setAbortAction(true); // before
operation(): Insert or Update or Deleteを判定する
Business Ruleにおいて現在行われている操作がInsert(挿入)なのか、Update(更新)なのか、Delete(削除)なのかはoperation()メソッドで取得できます。
current.operation(); // returns 'insert' or 'update' or 'delete'
UI ActionやACLでよく使われるメソッド
canCreate()など: ACLにおいてCRUD可能かを判定
UI Actionのcondition内や、ACLのスクリプトにおいて、canCreate(), canRead(), canWrite(), canDelete()メソッドを呼び出すことで、現在のセッションユーザが対象のレコードに対するCRUD権限を持つかを判定できます。
if (current.canRead())
GlideElementのcanCreate(), canRead(), canWrite()を用いることで、フィールド単位のCRUD権限の判定もできます。
if (current.assigned_to.canWrite())
以上です。
コメント