Glide-Server-APIs
ServiceNow Stellt APIs für den Glide-Server bereit.
GlideAggregat
Die GlideAggregat Klasse ist eine Erweiterung von GlideRecord Und ermöglicht die Durchführung von Abfragen zur Datenbankzusammenfassung (ANZAHL, SUMME, MIN, MAX, Durchschnitt). Dies kann beim Erstellen anwenderdefinierter Berichte oder bei 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 ist ein Beispiel, das einfach die Anzahl der Datensätze in einer Tabelle abruft:
var count = new GlideAggregate('incident');
count.addAggregate('COUNT');
count.query();
var incidents = 0;
if(count.next())
incidents = count.getAggregate('COUNT');Dem vorherigen Beispiel ist keine Abfrage zugeordnet. Wenn Sie eine Anzahl der offenen Incidents abrufen möchten, fügen Sie einfach wie mit eine Abfrage hinzu GlideRecord . Hier ist ein Beispiel, um eine Anzahl der aktiven Incidents abzurufen.
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 die Anzahl aller offenen Incidents nach Kategorie abzurufen, 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 ist:
*** 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 verwendet mehrere Zusammenfassungen, um zu sehen, wie oft Datensätze mit geändert wurden MIN , MAX , Und DURCHSCHN Werte.
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 ist:
*** 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 die Aktivität von einem Monat zum nächsten verglichen wird.
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 ist:
*** 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:0Im Folgenden finden Sie ein Beispiel zum Abrufen einer eindeutigen Anzahl eines Felds 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 ist:
*** 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 einem total_Cost von 12 USD
- Vier Datensätze mit einem total_Cost von 10 USD
- Fünf Datensätze mit einem total_Cost von 5 USD
Der folgende Code veranschaulicht die Implementierung des SUMMENAGGREGATS ohne Verwendung von Groupby() Methode:
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 recordsVerwenden Sie dieselben Datenpunkte wie das vorherige Beispiel, wenn Sie verwenden Groupby() Methode: Das SUMMENAGGREGAT gibt die Summe aller Werte für das angegebene Feld zurück.
Das folgende Beispiel veranschaulicht die Implementierung des SUMMENAGGREGATS mit Groupby() Methode:
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 genau so 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. Eine andere Möglichkeit, dies zu sagen, besteht darin, dass ein GlideRecord eine geordnete Liste ist.
Ein GlideRecord enthält sowohl Datensätze (Zeilen) als auch Felder (Spalten). Die Feldnamen sind mit den Namen der zugrunde liegenden Datenbankspalte identisch. Weitere Informationen finden Sie unter GlideRecord: Bereichsbezogen .
gs.sql()) Skripting-Syntax wurde in eingestellt Geneva. Standard verwenden GlideRecord Syntax an ihrer Stelle.Mit GlideRecordSecure
GlideRecordSecure Ist eine von geerbte Klasse GlideRecord Das die gleichen Funktionen wie ausführt GlideRecord , Und erzwingt auch ACLs.
Standardmäßig GlideRecordSecure Erzwingt keine Abfrage-ACLs. Während standardmäßige Lese-/Schreib-ACLs automatisch erzwungen werden, erfordern Abfrage-ACLs eine explizite Aktivierung durch Entwickler. Weitere Informationen finden Sie unter Abfrage-ACLs werden erzwungen.
Nicht beschreibbare Felder
Bei Verwendung GlideRecordSecure , Nicht beschreibbare Felder werden auf Null festgelegt, wenn versucht wird, in die Datenbank zu schreiben. Standardmäßig ist CanCreate() Die Methode in der Spalte wird durch ersetzt CanWrite() In der Spalte. Wenn CanWrite() Methode gibt „falsch“ zurück, der Spaltenwert ist auf Null festgelegt.
Objekttyp wird abgerufen
Sie können überprüfen, ob ein Objekttyp ScopedGlideRecordSecure ist, indem Sie aufrufen ToString() Methode.
- Der zurückgegebene reale GlideRecord-Typ wird überprüft
-
Das aktuelle Objekt kann als übergeben werden BereichsGlideRecordSecure . In den meisten Fällen können Sie anrufen Aktuell.toZeichenfolge() Um den aktuellen Objekttyp zurückzugeben.
Die folgende Zeile wird zurückgegeben [Object ScopedGlideRecordSecure] Für ein BereichsGlideRecordSecure Objekt:
gs.info(current.toString()); - Wenn der zurückgegebene Objekttyp sich von dem erwarteten unterscheidet
-
Aufruf einer bereichsbezogenen Funktion, die zurückgibt GlideRecord Objekt als Typ gibt je nach Umfang, aus dem es aufgerufen wird, unterschiedliche Ergebnisse zurück.
- Das Aufrufen der bereichsbezogenen Funktion innerhalb des Anwendungsbereichs gibt den erwarteten Objekttyp zurück
GlideRecordOderGlideRecordSecure. - Das Aufrufen der bereichsbezogenen Funktion innerhalb des globalen Bereichs gibt den Objekttyp zurück
BereichsGlideRecordOderBereichsGlideRecordSecure.
- Das Aufrufen der bereichsbezogenen Funktion innerhalb des Anwendungsbereichs gibt den erwarteten Objekttyp zurück
Auf Null-Werte wird geprüft
Wenn Eine Anweisung wie die folgende ist erforderlich, um zu überprüfen, ob der Datensatz gelesen werden kann:if (!now_GRScanRead())
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 now_GRS = new GlideRecordSecure('mytable');
now_GRS.query();
while (now_GRS.next()) {
now_GRS.val = "val-" + now_GRS.id;
if (now_GRS.update())
count ++;
}Abfrage-ACLs werden erzwungen
Standardmäßig GlideRecordSecure Erzwingt keine Abfrage-ACLs. Die Durchsetzung der Abfrage-ACL erfordert eine explizite Aktivierung.
Das Erzwingen von Abfrage-ACLs ist ein Sicherheitsansatz, der sicherstellt, dass Anwender nur Felder und Datensätze abfragen können, für die sie berechtigt sind. Diese Strategie bietet Tiefenverteidigung, indem Zugriffssteuerungen auf Abfrageebene angewendet werden, nicht nur auf Datenabrufebene. Die explizite Abfrage-ACL-Durchsetzung stellt ein sichereres Designmuster für Anwendungen dar, die Anwendereingaben verarbeiten.
Um das Durchsetzungsverhalten der Abfrage-ACL explizit anzugeben, verwenden Sie GlideRecordSecure.addEncodedQuery() . Aktualisieren Sie die Basis AddEncodedQuery(query) Verwendung ohne explizite ACL-Spezifikation. Verwenden Sie eine der folgenden sicheren Optionen.
- Option 1: Convenience-Methoden (empfohlen)
- Verwenden Sie AddUserEncodedQuery() Methode für die folgenden Anwendungsfälle:
- Abfragen, die aus Anwendereingaben erstellt wurden, für die Abfrage-ACLs gelten
- Erstellen Sie dynamische Filter basierend auf der Anwenderauswahl
- Verarbeiten Sie nicht vertrauenswürdige Daten
Verwenden Sie AddSystemEncodedQuery() Methode für die folgenden Anwendungsfälle:- Hartcodierte Abfragebedingungen
- Back-End- oder nur-System-Logik ohne Anwendereingabe
- Sichere, vordefinierte Abfragebedingungen
Mischen Sie beide Methoden nach Bedarf. Verschiedene Teile Ihrer Abfrage können je nach Quelle verschiedene Durchsetzungsebenen verwenden.
// Queries built from user input nowGRS_ACL.addUserEncodedQuery(userInput); // Hard-coded system queries nowGRS.addSystemEncodedQuery("active=true"); - Option 2: Boolescher Parameter
-
Das folgende Beispiel zeigt, wie verwendet wird AddEncodedQuery() Methode für ACL-Durchsetzung.
// Explicitly enforce query ACLs var now_GRS_true = new GlideRecordSecure(<table_name>); nowGRS_true.addEncodedQuery(query, true); // Explicitly skip query ACL enforcement (use cautiously) var nowGRS_false = new GlideRecordSecure(<table_name>); nowGRS_false.addEncodedQuery(query, false);
Beispiele
Dies sind zwei einfache Beispiele für 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 now_GRS = new GlideRecordSecure('task_ci');
now_GRS.addSystemQuery();
now_GRS.query();
var count = now_GRS.getRowCount();
if (count > 0 ) {
var allocation = parseInt(10000/count) / 100;
while (now_GRS.next()) {
now_GRS.u_allocation = allocation;
now_GRS.update();
}
}
GlideSystem
Die GlideSystem API stellt Methoden zum Abrufen von Informationen bereit.
Die GlideSystem (Referenziert durch Variablenname „ gs „ In Business-Regeln“ bietet eine Reihe praktischer Methoden, um Informationen über das System, den aktuell angemeldeten Anwender usw. zu erhalten Beispiel: Die Methode AddInfoMessage() Ermöglicht die Kommunikation mit dem Anwender.
gs.addInfoMessage('Email address added for notification');
Viele von GlideSystem Methoden erleichtern die einfache Aufnahme von Daten 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 unten beschriebenen Instanziierungsmethoden kann ein GlideDateTime-Objekt aus instanziiert werden Glide_date_time Feld mit GetGlideObject() Methode (z. B. VAR gdt = gr.my_datetime_field.getGlideObject(); ).
Einige Methoden verwenden beim Abrufen oder Ändern eines Datums- und Uhrzeitwerts die Zeitzone der Java Virtual Machine. Die Verwendung dieser Methoden kann zu unerwartetem Verhalten führen. Verwenden Sie nach Möglichkeit entsprechende lokale Zeit- 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.
Mit der Methode „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());Die Zeitwerte, die angezeigt werden GlideDateTime.Abziehen Wird erwartet, dass sie sich in der Zeitzone des Anwenders und im Format des Anwenders befinden.
Festlegen eines Standardwerts für ein Feld „Dauer“
Das Festlegen des Standardwerts für ein Feld „Dauer“ ähnelt der im vorherigen Thema verwendeten Methode.
Festlegen des Felds „Dauer“ in einem Client-Skript
g_form.setValue('<duration_field>','11 01:02:03');Berechnen und Festlegen einer Dauer mithilfe eines Client-Skripts
Hier ist ein Beispiel dafür, wie ein Wert zurückgegeben und mit einem Clientskript ausgefüllt wird.
OnChange Client-Skript, das den folgenden Code enthält. Sie können dieses Skript ändern, wenn die Berechnung in einer erfolgen soll ONLOAD Skript oder auf andere Weise.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'));}});Ändern des Felds „Dauer“
var timems = current.duration.dateNumericValue();
timems = timems + 11*1000;
current.duration.setDateNumericValue(timems);Formatieren der Lösungszeit
format=glide_durationÄndern Sie den Wörterbucheintrag für das Feld, und fügen Sie das Attribut hinzu. Wenn ein Attribut vorhanden ist, trennen Sie mehrere Attribute durch Kommas.
Einstellung der maximalen Maßeinheit
max_unit=Minuten , Wird eine Dauer von 3 Stunden 5 Minuten 15 Sekunden als 185 Minuten 15 Sekunden angezeigt. Um die maximale Maßeinheit für die Dauer festzulegen, fügen Sie dem das folgende Wörterbuchattribut hinzu Dauer Feld: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 |
| M | 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 | Wochentagsnummer | Nummer | 3 |
| a | Morgens oder p.m. | Text | Nachmittags |
| 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 abends von 0 bis 11 | Nummer | 0 |
| S | Stunde in morgens oder nachmittags 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 |