Glide-Server-APIs
ServiceNow stellt APIs für den Glide Server bereit.
GlideAggregate
Die Klasse GlideAggregate ist eine Erweiterung von GlideRecord und ermöglicht die Durchführung von Abfragen von Datenbankzusammenfassungen (ANZAHL, SUMME, MIN, MAX, DURCHSCHNITT). Dies kann bei der Erstellung von angepassten Berichten oder Durchführung von Berechnungen für berechnete Felder hilfreich sein.
Weitere Informationen finden Sie unter GlideAggregat API.
GlideAggregate-Beispiele
GlideAggregate ist eine Erweiterung von GlideRecord und seine Verwendung wird wahrscheinlich am besten anhand einer Reihe von Beispielen gezeigt.
Hier ein Beispiel, bei dem einfach die Anzahl der Datensätze in einer Tabelle gezählt wird:
var count = new GlideAggregate('incident');
count.addAggregate('COUNT');
count.query();
var incidents = 0;
if(count.next())
incidents = count.getAggregate('COUNT');Dem vorhergehenden Beispiel ist keine Abfrage zugeordnet. Wenn Sie die Anzahl der offenen Incidents abrufen möchten, fügen Sie einfach eine Abfrage wie unter GlideRecord hinzu. Hier ein Beispiel, um die Anzahl der aktiven Incidents zu ermitteln.
var count = new GlideAggregate('incident');
count.addQuery('active','true');
count.addAggregate('COUNT');
count.query();
var incidents = 0;
if(count.next())
incidents = count.getAggregate('COUNT');Um alle offenen Incidents nach Kategorien zu zählen, lautet der Code:
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);}Die Ausgabe lautet:
*** 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 requestDas folgende Beispiel zeigt anhand mehrerer Zusammenfassungen, wie oft Datensätze mithilfe der Werte MIN, MAX und DURCHSCHNITT geändert wurden.
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);}Die Ausgabe lautet:
*** 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.0987Das folgende ist ein komplexeres Beispiel, das zeigt, wie Aktivitäten von Monat zu Monat verglichen werden.
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);
}Die Ausgabe lautet:
*** 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:0Das folgende Beispiel zeigt ein eindeutiges Zählen eines Feldes in einer Gruppenabfrage.
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)');
}Die Ausgabe lautet:
*** 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)- Drei Datensätze mit total_cost von $12
- Vier Datensätze mit total_cost von $10
- Fünf Datensätze mit total_cost von $5
Der folgende Code veranschaulicht die Implementierung der SUMME-Zusammenfassung ohne Verwendung der Methode groupBy():
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');
}Die Ausgabe für dieses Beispiel lautet:
*** 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 recordsMit denselben Datenpunkten wie im vorherigen Beispiel wirft bei Anwendung der Methode groupBy() die SUMME-Zusammenfassung die Summe aller Werte für das angegebene Feld aus.
Das folgende Beispiel veranschaulicht die Implementierung der SUMME-Zusammenfassung mithilfe der Methode groupBy():
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);
}Die Ausgabe für dieses Beispiel lautet:
*** Script: SUM of total_cost: 101GlideRecord
GlideRecord ist eine spezielle Java-Klasse (GlideRecord.java), die in JavaScript genauso verwendet werden kann, als wäre es eine native JavaScript-Klasse.
- Wird für Datenbankvorgänge verwendet, anstatt SQL-Abfragen zu schreiben.
- Ist ein Objekt, das null oder mehr Datensätze aus einer Tabelle enthält. Anders ausgedrückt kann man sagen, dass ein GlideRecord eine geordnete Liste ist.
Ein GlideRecord enthält sowohl Datensätze (Zeilen) als auch Felder (Spalten). Die Feldnamen entsprechen den zugrunde liegenden Datenbankspaltennamen. Weitere Informationen finden Sie unter GlideRecord: Bereichsbezogen .
gs.sql()) Skripting-Syntax wurde in eingestellt Geneva. Verwenden Sie Standard GlideRecord Syntax an ihrer Stelle.GlideRecordSecure verwenden
GlideRecordSecure ist eine von GlideRecord geerbte Klasse, die die gleichen Funktionen wie GlideRecord erfüllt und auch ACLs durchsetzt.
Nicht beschreibbare Felder
Beachten Sie, dass bei der Verwendung von GlideRecordSecure nicht beschreibbare Felder auf NULL gesetzt werden, wenn versucht wird, in die Datenbank zu schreiben. Standardmäßig wird canCreate() in der Spalte durch canWrite() in der Spalte ersetzt. Wenn dies den Wert „false“ zurückgibt, wird der Spaltenwert auf NULL gesetzt.
Überprüfung auf NULL-Werte
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 ++;
}Beispiele
Dies sind zwei einfache Beispiele mit 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
Das API GlideSystem bietet Methoden für den Abruf von Informationen.
Das GlideSystem (bezeichnet durch den Variablennamen „gs“ 'in Business Rules) bietet eine Reihe praktischer Methoden, um Informationen über das System, den aktuell angemeldeten Benutzer usw. abzurufen. Zum Beispiel ermöglicht die Methode addInfoMessage() die Kommunikation mit dem Benutzer.
gs.addInfoMessage('Email address added for notification');
Viele der GlideSystem-Methoden erleichtern den einfachen Einschluss von Datumsangaben in Abfragebereiche und werden am häufigsten in Filtern und Berichten verwendet.
Weitere Informationen finden Sie unter GlideSystem .
GlideDateTime
Die GlideDateTime Klasse stellt Methoden zum Ausführen von Vorgängen für bereit GlideDateTime Objekte, z. B. Instanziierung GlideDateTime Objekte oder Arbeiten mit Glide_date_time Felder.
Zusätzlich zu den nachfolgend beschriebenen Instanziierungsmethoden kann ein GlideDateTime-Objekt aus einem Feld glide_date_time mit der Methode getGlideObject() (z. B. var gdt = gr.my_datetime_field.getGlideObject (); instanziiert werden).
Einige Methoden verwenden die Zeitzone der Java Virtual Machine, wenn ein Datums- und Zeitwert abgerufen oder geändert wird. Die Verwendung dieser Methoden kann zu unerwartetem Verhalten führen. Verwenden Sie möglichst gleichwertige Ortszeit- und UTC-Methoden.
Beispiele für GlideDate und GlideDateTime
Die APIs GlideDate und GlideDateTime werden verwendet, um Datums- und Uhrzeitwerte zu ändern.
Weitere Informationen finden Sie unter GlideDate API und GlideDateTime API.
var gDate = new GlideDate();
gDate.setValue('2015-01-01');
gs.info(gDate);
var gDT = new GlideDateTime(gDate);
gs.info(gDT); Ausgabe: 2015-01-01
2015-01-01 00:00:00Siehe auch GlideDateTime-Feldwert ändern.
Legen Sie einen Wert für das Feld „Dauer“ im Skript fest
Nachfolgend finden Sie Beispiele für JavaScript-Code, mit dem der Wert von Feldern des Typs „Dauer“ festgelegt werden kann.
Methode „GlideDateTime.subtract()“ verwenden
var duration = GlideDateTime.subtract(start, end);var time = GlideDateTime.subtract(start,end).getNumericValue();
<duration_field> = GlideDateTime.subtract(new GlideDateTime(<start_time>.getValue()),gs.nowDateTime());Es wird erwartet, dass die an GlideDateTime.subtract übergebenen Zeitwerte der Zeitzone des Benutzers und dem Format des Benutzers entsprechen.
Standardwert für Felder des Typs „Dauer“ festlegen
Das Festlegen eines Standardwerts für Felder des Typs „Dauer“ funktioniert ähnlich wie die im vorherigen Thema beschriebene Methode.
Wert für Felder des Typs „Dauer“ in Client-Skripts festlegen
g_form.setValue('<duration_field>','11 01:02:03');Dauer per Client-Skript berechnen und festlegen
Das Beispiel unten illustriert, wie Sie mithilfe eines Client-Skripts Werte zurückgeben und festlegen können.
onChange mit dem nachfolgend aufgeführten Code. Sie können dieses Skript ändern, wenn die Berechnung in einem Skript des Typs onLoad oder auf andere Weise durchgeführt werden muss.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'));}});Wert von Feldern des Typs „Dauer“ ändern
var timems = current.duration.dateNumericValue();
timems = timems + 11*1000;
current.duration.setDateNumericValue(timems);Lösungszeitdauer formatieren
format=glide_durationÄndern Sie den Dictionary-Eintrag des Felds, und fügen Sie das Attribut hinzu. Ist bereits ein Attribut vorhanden, trennen Sie alle zusätzlichen Attribute jeweils mit Komma.
Maximale Maßeinheit festlegen
max_unit=minutes gesetzt, wird eine Dauer von 3 Stunden 5 Minuten 15 Sekunden als 185 Minuten 15 Sekunden angezeigt. Zum Festlegen der maximalen Maßeinheit für die Dauer müssen Sie dem Feld duration folgendes Wörterbuchattribut hinzufügen:max_unit=<unit>Richtlinien für Datums- und Uhrzeitformat
Sie können ein Datumsformat mit einer Sequenz bestimmter Datums- und Zeitmusterzeichenfolgen angeben. Eine Musterzeichenfolge besteht aus einem oder mehreren Groß- und Kleinbuchstaben von A bis Z. Jeder Text in Anführungszeichen wird ignoriert und stattdessen in die Datumsausgabe kopiert.
| Zeichenfolge | Beschreibung | Ausgabeformat | Beispiel |
|---|---|---|---|
| G | ERA-Bezeichner | Text | AD |
| J | Jahr | Jahr | 2019; 19 |
| Y | Woche im Jahr | Jahr | 2019; 19 |
| M | Monat im Jahr (innerhalb des Datums) | Monat | Juli; Juli; Juli; 07 |
| L | Monat im Jahr (eigenständiger Wert) | Monat | Juli; Juli; Juli; 07 |
| w | Woche im Jahr | Nummer | 52 |
| W | Woche im Monat | Nummer | 1 |
| D | Tag im Jahr | Nummer | 365 |
| D | Tag im Monat | Nummer | 2 |
| F | Wochentag im Monat | Nummer | 3 |
| E | Tagesname in Woche | Text | Mittwoch; Mi |
| u | Wochentage | Nummer | 3 |
| a | Morgens oder p.m. | Text | P.m. |
| H | Stunde in Tag von 0 bis 23 | Nummer | 0 |
| k | Stunde in Tag von 1 bis 24 | Nummer | 24 |
| Tsd. | Stunde in morgens oder p.m. von 0 bis 11 | Nummer | 0 |
| S | Stunde in morgens oder abends von 1 bis 12 | Nummer | 12 |
| m | Minute in Stunde | Nummer | 59 |
| s | Sekunde in Minute | Nummer | 1 |
| S | Millisekunde | Nummer | 500 |
| z | Zeitzone im Standardformat | Zeitzone im Standardformat | Pazifik-Normalzeit; PST |
| Z | Zeitzone im RFC 822-Format | Zeitzone im RFC 822-Format | -0800 |
| X | Zeitzone im ISO 8601-Format | Zeitzone im ISO 8601-Format | -08; -0800; -08:00 |