この記事は ServiceNow アドベントカレンダー 2024 の12月16日分(シリーズ2)の記事として執筆しています
ServiceNow Advent Calendar 2024
おはこんばんにちは、にぼしです。
データのスナップショット、ログの退避をしなきゃならーん!という状況に直面したことはありますでしょうか。たくさんのデータを分割取得するために必要なページネーション処理を入れるときのセルフ備忘録です。
chooseWindow()
chooseWindow() メソッドは後続のクエリによって返される行の範囲を設定してくれます。
使い方: chooseWindow(Number firstRow, Number lastRow, Boolean forceCount)
参考:https://www.servicenow.com/docs/bundle/xanadu-api-reference/page/app-store/dev_portal/API_reference/glideRecordScoped/concept/c_GlideRecordScopedAPI.html
Chuckによるわかりやすーい動画:https://www.youtube.com/watch?v=6A4H9lhju4s
var now_GR = new GlideRecord('incident');
now_GR.orderBy('number');
now_GR.chooseWindow(2, 4);
now_GR.query();
while (now_GR.next()) {
gs.info(now_GR.getValue('number') + ' is within window');
}
↑の結果が↓です。
*** Script: INC0000003 is within window
*** Script: INC0000004 is within window
わ、わかんねえ~~~!
なんで2行目で始まって4行目で終わるのに取得されているのがINC0000003とINC0000004の2つだけなわけ?となりました。ServiceNowでは1行目は0個目(インデックス0)、さらにlastRowは数えないのです。
つまり、chooseWindow(2, 4)の場合、2個目から4個目まで範囲指定するけど4個目は数えないので、2個目と3個目を返します。
1行目 INC0000001 0個目
2行目 INC0000002 1個目
3行目 INC0000003 2個目
4行目 INC0000004 3個目
5行目 INC0000005 4個目
chooseWindowは chooseWindow(<取得したい最初の行数-1>,<”ガチで”取得したい最後の行数>) で使うことができます。
setLimit()
GlideRecord クエリによって取得されるレコード数の制限を設定します。
使い方:GlideRecord - setLimit(数値 maxNumRecords)
特に難しいこともないと思うので割愛
つまづいたこと
大規模なエクスポートの分割にもあるように、大量のデータ処理を行う場合はsysid順でソートの上で、エクスポート上限の10000件を超えないようにsysid指定を行って最初の10000件を取得したら次の10000件…というように取得していくのがよいと思います。sysauto_scriptで何度かスクリプトを試すうちに、最初と最後のsysid指定はあっているけれど、レコード数が取得したい件数と合わない…途中でレコードが抜け落ちるという事象に遭遇しました。
sysauto_scriptでの設定だけではなく、インスタンスのタイムゾーン設定(システムプロパティ「glide.sys.default.tz」)の見直しで改善したので、同事象に遭遇している方はチェックしてみるとよいかもです。
MIDサーバー使えない!LES使えない!という制約下で試行錯誤されている方のTipsあったら是非教えてください