ServiceNowで「数字」をGlideRecordでソート取得したいときのメモ
Servicenowで数値型(Integer)で定義すべきカラムを文字列型(String)で作成すると
GlideRecordでは文字列型カラムの数字は期待通りにソートして取得することができません。
例えばこのようなテーブル定義をして、両カラムに1,5,10,20を登録します。
両カラムをそれぞれ昇順ソートでGlideRecordしてみても
Numberは期待通りに取得できていますが、StrNumberはできていません。
サンプルコード①
sample.js
/*
* 検証用のScript①
*/
var grSortMst = new GlideRecord('sample_strnumsort');
gs.info('数値型カラムのソート');
grSortMst.orderBy('number');
grSortMst.query();
while(grSortMst.next()){
gs.info(grSortMst.number);
}
gs.info('-------------------------------');
gs.info('文字列型カラムのソート');
grSortMst.initialize();
grSortMst.orderBy('strnumber');
grSortMst.query();
while(grSortMst.next()){
gs.info(grSortMst.strnumber);
}
この問題を解決するためには普通はカラムを再定義すればよいと思いますが
そういうことができないときのためにGlideDBFunctionBuilder.lengthを使用してみます。
サンプルコード②
sample2.js
/*
* 検証用のScript②
*/
// GlideDBFunctionBuilderをインスタンス化
var fbSort = new GlideDBFunctionBuilder();
var fbLen = fbSort.length();
fbLen = fbSort.field('strnumber'); // 文字列カラムの文字数を取得する定義
fbLen = fbSort.build();
var grSortMst = new GlideRecord('sample_strnumsort');
gs.info('数値型カラムのソート');
grSortMst.orderBy('number');
grSortMst.query();
while(grSortMst.next()){
gs.info(grSortMst.number);
}
gs.info('-------------------------------');
gs.info('文字列型カラムのソート');
grSortMst.initialize();
grSortMst.addFunction(fbLen);
grSortMst.orderBy(fbLen); // 第1ソートキーに文字列カラムの文字数を定義
grSortMst.orderBy('strnumber');
grSortMst.query();
while(grSortMst.next()){
gs.info(grSortMst.strnumber);
}
GlideDBFunctionBuilder.lengthを使用することで、対象カラムの文字数を取得できます。
GlideRecord.orderByに上記インスタンスを渡すことで
文字数の範囲で昇順ソートができるため数値と同じようなソートが可能になりました。