Glide 서버 API
ServiceNow 는 Glide 서버용 API를 제공합니다.
GlideAggregate
GlideAggregate 클래스는 GlideRecord의 확장으로, 데이터베이스 집계(COUNT, SUM, MIN, MAX, AVG) 쿼리를 수행할 수 있습니다. 이는 사용자 지정 보고서를 만들거나 계산된 필드를 계산할 때 유용할 수 있습니다.
자세한 내용은 GlideAggregate API를 참조하십시오.
GlideAggregate 예시
GlideAggregate 는 GlideRecord 의 확장이며 그 사용법은 일련의 예를 통해 가장 잘 알 수 있습니다.
다음은 테이블의 기록 수를 간단히 계산하는 예입니다.
var count = new GlideAggregate('incident');
count.addAggregate('COUNT');
count.query();
var incidents = 0;
if(count.next())
incidents = count.getAggregate('COUNT');앞의 예제와 관련된 쿼리가 없습니다. 오픈 상태였던 인시던트의 카운트를 확인하려면 GlideRecord에서와 마찬가지로 쿼리를 추가하기만 하면 됩니다. 다음은 활성 인시던트 수를 가져오는 예입니다.
var count = new GlideAggregate('incident');
count.addQuery('active','true');
count.addAggregate('COUNT');
count.query();
var incidents = 0;
if(count.next())
incidents = count.getAggregate('COUNT');모든 미해결 인시던트의 카운트를 범주별로 가져오려면 코드는 다음과 같습니다.
var count = new GlideAggregate('incident');
count.addQuery('active','true');
count.addAggregate('COUNT','category');
count.query();
while(count.next()){
var category = count.category;
var categoryCount = count.getAggregate('COUNT','category');
gs.log("The are currently "+ categoryCount +" incidents with a category of "+ category);}출력은 다음과 같습니다.
*** Script: The are currently 1.0 incidents with a category of Data
*** Script: The are currently 11.0 incidents with a category of Enhancement
*** Script: The are currently 1.0 incidents with a category of Implementation
*** Script: The are currently 197.0 incidents with a category of inquiry
*** Script: The are currently 13.0 incidents with a category of Issue
*** Script: The are currently 1.0 incidents with a category of
*** Script: The are currently 47.0 incidents with a category of request다음은 여러 집계를 통해 MIN,MAX 및 AVG 값을 사용하여 기록이 수정된 횟수를 확인하는 예입니다.
var count = new GlideAggregate('incident');
count.addAggregate('MIN','sys_mod_count');
count.addAggregate('MAX','sys_mod_count');
count.addAggregate('AVG','sys_mod_count');
count.groupBy('category');
count.query();
while(count.next()){
var min = count.getAggregate('MIN','sys_mod_count');
var max = count.getAggregate('MAX','sys_mod_count');
var avg = count.getAggregate('AVG','sys_mod_count');
var category = count.category.getDisplayValue();
gs.log(category +" Update counts: MIN = "+ min +" MAX = "+ max +" AVG = "+ avg);}출력은 다음과 같습니다.
*** Script: Data Import Update counts: MIN = 4.0 MAX = 21.0 AVG = 9.3333
*** Script: Enhancement Update counts: MIN = 1.0 MAX = 44.0 AVG = 9.6711
*** Script: Implementation Update counts: MIN = 4.0 MAX = 8.0 AVG = 6.0
*** Script: inquiry Update counts: MIN = 0.0 MAX = 60.0 AVG = 5.9715
*** Script: Inquiry / Help Update counts: MIN = 1.0 MAX = 3.0 AVG = 2.0
*** Script: Issue Update counts: MIN = 0.0 MAX = 63.0 AVG = 14.9459
*** Script: Monitor Update counts: MIN = 0.0 MAX = 63.0 AVG = 3.6561
*** Script: request Update counts: MIN = 0.0 MAX = 53.0 AVG = 5.0987다음은 한 달과 다음 달의 활동을 비교하는 방법을 보여 주는 보다 복잡한 예입니다.
var agg = new GlideAggregate('incident');
agg.addAggregate('count','category');
agg.orderByAggregate('count','category');
agg.orderBy('category');
agg.addQuery('opened_at','>=','javascript:gs.monthsAgoStart(2)');
agg.addQuery('opened_at','<=','javascript:gs.monthsAgoEnd(2)');
agg.query();
while(agg.next()){
var category = agg.category;
var count = agg.getAggregate('count','category');
var query = agg.getQuery();
var agg2 = new GlideAggregate('incident');
agg2.addAggregate('count','category');
agg2.orderByAggregate('count','category');
agg2.orderBy('category');
agg2.addQuery('opened_at','>=','javascript:gs.monthsAgoStart(3)');
agg2.addQuery('opened_at','<=','javascript:gs.monthsAgoEnd(3)');
agg2.addEncodedQuery(query);
agg2.query();
var last ="";
while(agg2.next()){
last = agg2.getAggregate('count','category');}
gs.log(category +": Last month:"+ count +" Previous Month:"+ last);
}출력은 다음과 같습니다.
*** Script: Monitor: Last month:6866.0 Previous Month:4468.0
*** Script: inquiry: Last month:142.0 Previous Month:177.0
*** Script: request: Last month:105.0 Previous Month:26.0
*** Script: Issue: Last month:8.0 Previous Month:7.0
*** Script: Enhancement: Last month:5.0 Previous Month:5.0
*** Script: Implementation: Last month:1.0 Previous Month:0다음은 그룹 쿼리에서 필드의 고유 수를 가져오는 예입니다.
var agg = new GlideAggregate('incident');
agg.addAggregate('count');
agg.addAggregate('count(distinct','category');
agg.addQuery('opened_at', '>=', 'javascript:gs.monthsAgoStart(2)');
agg.addQuery('opened_at', '<=', 'javascript:gs.monthsAgoEnd(2)');
//
agg.groupBy('priority');
agg.query();
while (agg.next()) {
// Expected count of incidents and count of categories within each priority value (group)
gs.info('Incidents in priority ' + agg.priority + ' = ' + agg.getAggregate('count') +
' (' + agg.getAggregate('count(distinct','category') + ' categories)');
}출력은 다음과 같습니다.
*** Script: Incidents in priority 1 = 13 (3 categories)
*** Script: Incidents in priority 2 = 10 (5 categories)
*** Script: Incidents in priority 3 = 5 (3 categories)
*** Script: Incidents in priority 4 = 22 (6 categories)- total_cost가 $12인 레코드 3개
- total_cost가 10달러인 4개의 음반
- total_cost가 5달러인 5개의 음반
다음 코드에서는 groupBy() 메서드를 사용하지 않고 SUM 집계를 구현하는 방법을 보여 줍니다.
var totalCostSum = new GlideAggregate('fixed_asset');
totalCostSum.addAggregate('SUM', 'total_cost');
totalCostSum.query();
while (totalCostSum.next()) {
var allTotalCost = 0;
allTotalCost = totalCostSum.getAggregate('SUM', 'total_cost');
aTotalCost = totalCostSum.getValue('total_cost');
gs.print('Unique field value: ' + aTotalCost + ', SUM = ' + allTotalCost + ', ' + allTotalCost/aTotalCost + ' records');
}이 예제의 출력은 다음과 같습니다.
*** Script: Unique field value: 12, SUM = 36, 3 records
*** Script: Unique field value: 10, SUM = 40, 4 records
*** Script: Unique field value: 5, SUM = 25, 5 records이전 예와 동일한 데이터 요소를 사용하여 groupBy() 메서드를 사용하는 경우 SUM 집계는 지정된 필드에 대한 모든 값의 합계를 반환합니다.
다음 예에서는 groupBy() 메서드를 사용하여 SUM 집계를 구현하는 방법을 보여 줍니다.
var totalCostSum = new GlideAggregate('fixed_asset');
totalCostSum.addAggregate('SUM', 'total_cost');
totalCostSum.groupBy('total_cost');
totalCostSum.query();
if(totalCostSum.next()){ // in case there is no result
var allTotalCost = 0;
allTotalCost = totalCostSum.getAggregate('SUM', 'total_cost');
gs.print('SUM of total_cost: = ' + allTotalCost);
}이 예제의 출력은 다음과 같습니다.
*** Script: SUM of total_cost: 101GlideRecord
GlideRecord 는 JavaScript에서 네이티브 JavaScript 클래스처럼 사용할 수 있는 특수 Java 클래스(GlideRecord.java)입니다.
- 는 SQL 쿼리를 작성하는 대신 데이터베이스 작업에 사용됩니다.
- 는 한 테이블에서 0개 이상의 기록을 포함하는 객체입니다. 이것을 말하는 또 다른 방법은 GlideRecord가 정렬된 목록이라는 것입니다.
GlideRecord에는 기록(행)과 필드(열)가 모두 포함됩니다. 필드 이름은 기본 데이터베이스 열 이름과 동일합니다. 자세한 내용은 GlideRecord - 범위 지정을 참조하십시오.
gs.sql()) 스크립팅 구문의 사용은 에서 Geneva중단되었습니다. 해당 위치에 표준 GlideRecord 구문을 사용합니다.GlideRecordSecure 사용
GlideRecordSecure 는 GlideRecord 에서 상속된 클래스로, GlideRecord와 동일한 기능을 수행하고 ACL도 적용합니다.
쓸 수 없는 필드
GlideRecordSecure를 사용할 때 데이터베이스에 쓰려고 하면 쓸 수 없는 필드가 NULL로 설정됩니다. 기본적으로 열의 canCreate( )는 열의 canWrite() 로 바뀝니다. false를 반환하면 열 값이 NULL로 설정됩니다.
NULL 값 확인 중
if ( !grs.canRead() ) continue;var count = 0;
var now_GR = new GlideRecord('mytable');
now_GR. query();
while (now_GR. next()) {
if (!now_GR. canRead()) continue;
if (!now_GR. canWrite()) continue;
if (!now_GR. val. canRead() || !now_GR. val. canWrite())
now_GR. val = null;
else
now_GR. val = "val-" + now_GR. id;
if (now_GR. update())
count ++;
}
var count = 0;
var grs = new GlideRecordSecure('mytable');
grs. query();
while (grs. next()) {
grs. val = "val-" + grs. id;
if (grs. update())
count ++;
}예제
다음은 GlideRecordSecure를 사용하는 두 가지 간단한 예입니다.
var att = new GlideRecordSecure ('sys_attachment');
att. get('$[sys_attachment.sys_id]');
var sm = GlideSecurityManager.get();
var checkMe = 'record/sys_attachment/delete';
var canDelete = sm.hasRightsTo(checkMe,att);
gs. log('canDelete: ' + canDelete);
canDelete;
var grs = new GlideRecordSecure('task_ci');
grs.addQuery();
grs.query();
var count = grs. getRowCount();
if (count > 0 ) {
var allocation = parseInt(10000/count) / 100;
while (grs.next()) {
grs.u_allocation = allocation;
grs.update();
}
}
GlideSystem
GlideSystem API는 정보를 검색하기 위한 메서드를 제공합니다.
GlideSystem(비즈니스 규칙에서 변수 이름 'gs'로 참조됨)은 시스템, 현재 로그인한 사용자 등에 대한 정보를 얻을 수 있는 여러 가지 편리한 방법을 제공합니다. 예를 들어, addInfoMessage() 메서드는 사용자와의 통신을 허용합니다.
gs.addInfoMessage('Email address added for notification');
대부분의 GlideSystem 메서드를 사용하면 쿼리 범위에 날짜를 쉽게 포함할 수 있으며 필터 및 보고에 가장 자주 사용됩니다.
자세한 내용은 GlideSystem 문서를 참조하십시오.
Glide날짜/시간
GlideDateTime 클래스는 GlideDateTime 객체 인스턴스화 또는 glide_date_time 필드 작업과 같은 GlideDateTime 객체에 대한 작업을 수행하기 위한 메서드를 제공합니다.
아래에 설명된 인스턴스화 방법 외에도 getGlideObject() 메서드(예: var gdt = gr.my_datetime_field.getGlideObject();)를 사용하여 glide_date_time 필드에서 GlideDateTime 객체를 인스턴스화할 수 있습니다.
일부 메서드는 날짜 및 시간 값을 검색하거나 수정할 때 JVM(Java Virtual Machine) 시간대를 사용합니다. 이러한 메서드를 사용하면 예기치 않은 동작이 발생할 수 있습니다. 가능하면 동일한 현지 시간 및 UTC 방법을 사용합니다.
GlideDate 및 GlideDateTime 예시
GlideDate 및 GlideDateTime API는 날짜 및 시간 값을 조작하는 데 사용됩니다.
자세한 내용은 GlideDate API 및 GlideDateTime API를 참조하십시오.
var gDate = new GlideDate();
gDate.setValue('2015-01-01');
gs.info(gDate);
var gDT = new GlideDateTime(gDate);
gs.info(gDT); 출력: 2015-01-01
2015-01-01 00:00:00GlideDateTime 필드 값 수정 또한 참조하십시오.
스크립트에서 기간 필드 값 설정
기간 필드의 값을 설정하는 데 사용할 수 있는 JavaScript 예시입니다.
GlideDateTime.subtract() 메서드 사용
var duration = GlideDateTime.subtract(start, end);var time = GlideDateTime.subtract(start,end).getNumericValue();
<duration_field> = GlideDateTime.subtract(new GlideDateTime(<start_time>.getValue()),gs.nowDateTime());GlideDateTime.subtract에 표시되는 시간 값은 사용자의 표준 시간대와 사용자 형식이어야 합니다.
기간 필드의 기본값 설정
기간 필드의 기본값을 설정하는 방법은 이전 항목에서 사용한 방법과 비슷합니다.
클라이언트 스크립트에서 기간 필드 값 설정
g_form.setValue('<duration_field>','11 01:02:03');클라이언트 스크립트를 사용하여 기간 계산 및 설정
다음은 값을 반환하고 클라이언트 스크립트를 사용하여 채우는 방법의 예입니다.
onChange 클라이언트 스크립트를 생성합니다. onLoad 스크립트 또는 다른 방법으로 계산을 수행해야 하는 경우 이 스크립트를 수정할 수 있습니다.function onChange(control, oldValue, newValue, isLoading){
var strt = g_form.getValue('<start_field>');
var end = g_form.getValue('<end_field>');
var ajax = new GlideAjax('AjaxDurCalc');
ajax.addParam('sysparm_name','durCalc');
ajax.addParam('sysparm_strt',strt);
ajax.addParam('sysparm_end',end);
ajax.getXMLWait();
var answer = ajax.getAnswer();
g_form.setValue('<duration_field>', answer);}var AjaxDurCalc = Class.create();
AjaxDurCalc.prototype = Object.extendsObject(AbstractAjaxProcessor,{
durCalc:function(){return GlideDuration.subtract(this.getParameter('sysparm_strt'),this.getParameter('sysparm_end'));}});기간 필드 값 변경
var timems = current.duration.dateNumericValue();
timems = timems + 11*1000;
current.duration.setDateNumericValue(timems);해결 시간 서식 지정
format=glide_duration필드의 딕셔너리 항목을 수정하고 속성을 추가합니다. 기존 속성이 있는 경우 여러 속성을 쉼표로 구분합니다.
최대 측정 단위 설정
max_unit=분인 경우 3시간 5분 15초의 기간은 185분 15초로 표시됩니다. 최대 기간 측정 단위를 설정하려면 다음 딕셔너리 속성을 기간 필드에 추가합니다.max_unit=<unit>날짜 및 시간 형식 지침
특정 날짜 및 시간 패턴 문자열의 시퀀스로 날짜 형식을 지정할 수 있습니다. 패턴 문자열은 A에서 Z까지 하나 이상의 대문자와 소문자로 구성됩니다. 따옴표 안에 있는 텍스트는 모두 무시되고 대신 날짜 출력에 복사됩니다.
| 문자열 | 설명 | 출력 형식 | 예 |
|---|---|---|---|
| G | 시대 지정자 | 텍스트 | AD |
| y | 년 | 년 | 2019; 19 |
| Y | 주/연도 | 연도 | 2019; 19 |
| M | 월/연도(날짜 이내) | 월 | 7월; 7월; 07 |
| L | 월/연도(독립 실행형 값) | 월 | 7월; 7월; 07 |
| W | 주/연도 | 번호 | 52 |
| W | 주/월 | 번호 | 1 |
| 아래로 | 일/연도 | 번호 | 365 |
| d | 일/월 | 번호 | 2 |
| F | 요일(월 중) | 번호 | 3 |
| E | 일/주 이름 | 텍스트 | 수요일; 수 |
| u | 일(주의) | 번호 | 3 |
| a | 오전 또는 오후 | 텍스트 | 오후 |
| H | 0에서 23까지의 시간(일) | 번호 | 0 |
| k | 1시에서 24시까지의 시간(일) | 번호 | 24 |
| 천 | 오전 또는 오후 0시부터 11시까지의 시간 | 번호 | 0 |
| h | 오전 1시부터 오후 1시까지 | 번호 | 12 |
| m | 분/시 | 번호 | 59 |
| s | 초/분 | 번호 | 1 |
| S | 밀리초 | 번호 | 500 |
| z | 기본 형식의 시간대 | 기본 형식의 시간대 | 태평양 표준시; PST |
| Z | RFC 822 형식의 시간대 | RFC 822 형식의 시간대 | -0800 |
| X | ISO 8601 형식의 시간대 | ISO 8601 형식의 시간대 | -08; -0800; -08:00 |