Sie sind auf Seite 1von 20

GlideRecord Query Cheat Sheet

23 February 2010

Mark Stanger

doubt if theres a single concept in Service-now that is more valuable to understand than how to use GlideRecord methods to query, insert, update, and delete records in
your system. These methods have a wide variety of uses and are found at the heart of many of the business rules, UI actions, and scheduled job scripts that are essential to
tie together your organizations processes in your Service-now instance.

While the content of this post isnt new information (additional examples can be found on the Service-now wiki), my aim is to provide a single page of information containing
some common examples of these methods as a reference. This is an excellent page to keep bookmarked!
Note: These methods are designed for use in server-side JavaScript (everything EXCEPT client scripts and UI policies). In some rare cases, it may be necessary to perform a
query from a client-side javascript (client script or UI policy). The few methods below that can be used in client-side JavaScript have been noted below.

Query
Can also be used in Client scripts and UI policies
A standard GlideRecord query follows this format.
var gr = new GlideRecord('incident'); //Indicate the table to query from
//The 'addQuery' line allows you to restrict the query to the field/value pairs specified (optional)
//gr.addQuery('active', true);
gr.query(); //Execute the query
while (gr.next()) { //While the recordset contains records, iterate through them
//Do something with the records returned
if
if(gr.category == 'software'){
gs.log('Category is ' + gr.category);
}
}

UPDATE: This same function applies to client-side GlideRecord queries! If at all possible, you should use an asynchronous query from the client as

shown below. See this post for details.


var gr = new GlideRecord('sys_user');
gr.addQuery('name', 'Joe Employee');
gr.query(myCallbackFunction); //Execute the query with callback function

//After the server returns the query recordset, continue here


function myCallbackFunction(gr){
while (gr.next()) { //While the recordset contains records, iterate through them
alert(gr.user_name);
}
}

Get Query Shortcut (used to get a single GlideRecord)


Can also be used in Client scripts and UI policies IF YOU ARE GETTING A RECORD BY SYS_ID.
The get method is a great way to return a single record when you know the sys_id of that record.
var gr = new GlideRecord('incident');
gr.get(sys_id_of_record_here);
//Do something with the record returned
if
if(gr.category == 'software'){
gs.log('Category is ' + gr.category);
}

You can also query for a specific field/value pair. The get method returns the first record in the result set.
//Find the first active incident record
var gr = new GlideRecord('incident');
if
if(gr.get('active', true
true)){
//Do something with the record returned
gs.log('Category is ' + gr.category);
}

getRefRecord Query Shortcut (used to get a single GlideRecord referenced in a reference field)
The getRefRecord method can be used as a shortcut to query a record populated in a reference field on a record.
var caller = current.caller_id.getRefRecord(); //Returns the GlideRecord for the value populated in the 'caller_id' field
caller.email = 'test@test.com';
caller.update();

OR Query
The standard addQuery parameter acts like an and condition in your query. This example shows how you can add or conditions to your query.
//Find all incidents with a priority of 1 or 2
var gr = new GlideRecord('incident');
var grOR = gr.addQuery('priority', 1);
grOR.addOrCondition('priority', 2);
gr.query();
while (gr.next()) {
//Do something with the records returned
if
if(gr.category == 'software'){
gs.log('Category is ' + gr.category);
}
}

Note that you can also chain your OR condition as well, which is usually simpler
//Find all incidents with a priority of 1 or 2
var gr = new GlideRecord('incident');
gr.addQuery('priority', 1).addOrCondition('priority', 2);
gr.query();

Insert
Inserts are performed in the same way as queries except you need to replace the query() line with an initialize() line as shown here.
//Create a new Incident record and populate the fields with the values below
var gr = new GlideRecord('incident');
gr.initialize();
gr.short_description = 'Network problem';
gr.category = 'software';
gr.caller_id.setDisplayValue('Joe Employee');
gr.insert();

Update
You can perform updates on one or many records simply by querying the records, setting the appropriate values on those records, and calling update() for each record.
//Find all active incident records and make them inactive
var gr = new GlideRecord('incident');
gr.addQuery('active',true
true);
gr.query();
while (gr.next()) {
gr.active = false
false;
gr.update();
}

Delete
Delete records by performing a glideRecord query and then using the deleteRecord method.
//Find all inactive incident records and delete them one-by-one
var gr = new GlideRecord('incident');
gr.addQuery('active',false
false);

gr.query();
while (gr.next()) {
//Delete each record in the query result set
gr.deleteRecord();
}

deleteMultiple Shortcut
If you are deleting multiple records then the deleteMultiple method can be used as a shortcut
//Find all inactive incidents and delete them all at once
var gr = new GlideRecord('incident');
gr.addQuery('active', false
false);
gr.deleteMultiple(); //Deletes all records in the record set

addEncodedQuery
CANNOT be used in Client scripts and UI policies! Use addQuery(YOURENCODEDQUERYHERE) instead.
An alternative to a standard query is to use an encoded query to create your query string instead of using addQuery and addOrCondition statements. An easy way to
identify the encoded query string to use is to create a filter or a module with the query parameters you want to use, and then hover over the link or breadcrumb and look
at the URL. The part of the URL after sysparm_query= is the encoded query for that link.
So if I had a URL that looked like this
https://demo.service-now.com/incident_list.do?sysparm_query=active=true^category=software^ORcategory=hardware
My encoded query string would be this
active=true^category=software^ORcategory=hardware
I could build that encoded query string and use it in a query like this
//Find all active incidents where the category is software or hardware
var gr = new GlideRecord('incident');

var strQuery = 'active=true';


strQuery = strQuery + '^category=software';
strQuery = strQuery + '^ORcategory=hardware';
gr.addEncodedQuery(strQuery);
gr.query();

GlideAggregate
GlideAggregate is actually an extension of the GlideRecord object. It allows you to perform the following aggregations on query recordsets
-COUNT
-SUM
-MIN
-MAX
-AVG
//Find all active incidents and log a count of records to the system log
var gr = new GlideAggregate('incident');
gr.addQuery('active', true
true);
gr.addAggregate('COUNT');
gr.query();
var incidents = 0;
if (gr.next()){
incidents = gr.getAggregate('COUNT');
gs.log('Active incident count: ' + incidents);
}

orderBy/orderByDesc
You can order the results of your recordset by using orderBy and/or orderByDesc as shown below.
//Find all active incidents and order the results ascending by category then descending by created date
var gr = new GlideRecord('incident');

gr.addQuery('active', true
true);
gr.orderBy('category');
gr.orderByDesc('sys_created_on');
gr.query();

addNullQuery/addNotNullQuery
addNullQuery and addNotNullQuery can be used to search for empty (or not empty) values
//Find all incidents where the Short Description is empty
var gr = new GlideRecord('incident');
gr.addNullQuery('short_description');
gr.query();
//Find all incidents where the Short Description is not empty
var gr = new GlideRecord('incident');
gr.addNotNullQuery('short_description');
gr.query();

getRowCount
getRowCount is used to get the number of results returned
//Log the number of records returned by the query
var gr = new GlideRecord('incident');
gr.addQuery('category', 'software');
gr.query();
gs.log('Incident count: ' + gr.getRowCount());

Although getRowCount isnt available client-side, you can return the number of results in a client-side GlideRecord query by using rows.length as shown here
//Log the number of records returned by the query
var gr = new GlideRecord('incident');

gr.addQuery('category', 'software');
gr.query();
alert('Incident count: ' + gr.rows.length);

setLimit
setLimit can be used to limit the number of results returned
//Find the last 10 incidents created
var gr = new GlideRecord('incident');
gr.orderByDesc('sys_created_on');
gr.setLimit(10);
gr.query();

chooseWindow
The chooseWindow(first,last) method lets you set the first and last row number that you want to retrieve and is typical for chunking-type operations. The rows for any
given query result are numbered 0..(n-1), where there are n rows. The first parameter is the row number of the first result youll get. The second parameter is the number
of the row after the last row to be returned. In the example below, the parameters (10, 20) will cause 10 rows to be returned: rows 10..19, inclusive.
//Find the last 10 incidents created
var gr = new GlideRecord('incident');
gr.orderByDesc('sys_created_on');
gr.chooseWindow(10, 20);
gr.query();

setWorkflow
setWorkflow is used to enable/disable the running of any business rules that may be triggered by a particular update.

//Change the category of all 'software' incidents to 'hardware' without triggering business rules on updated records
var gr = new GlideRecord('incident');
gr.addQuery('category', 'software');
gr.query();
while
while(gr.next()){
gr.category = 'hardware';
gr.setWorkflow(false
false);
gr.update();
}

autoSysFields
autoSysFields is used to disable the update of sys fields (Updated, Created, etc.) for a particular update. This really is only used in special situations. The primary
example is when you need to perform a mass update of records to true up some of the data but want to retain the original update timestamps, etc.
//Change the category of all 'software' incidents to 'hardware' without updating sys fields
var gr = new GlideRecord('incident');
gr.addQuery('category', 'software');
gr.query();
while
while(gr.next()){
gr.category = 'hardware';
gr.autoSysFields(false
false);
gr.update();
}

setForceUpdate
setForceUpdate is used to update records without having to change a value on that record to get the update to execute. setForceUpdate is particularly useful in
situations where you need to force the recalculation of a calculated field for all records in a table or when you need to run business rules against all records in a table but
dont want to have to change a value on the records.
This method is often used with setWorkflow and autoSysFields as shown below.

//Force an update to all User records without changing field values


var gr = new GlideRecord('sys_user');
gr.query();
while (gr.next()) {
gr.setWorkflow(false
false); //Do not run business rules
gr.autoSysFields(false
false); //Do not update system fields
gr.setForceUpdate(true
true); //Force the update
gr.update();
}

JavaScript Operators
The following operators can be used in addition to the standard field/value query searching shown above
=

Field value must be equal to the value supplied.

addQuery('priority', '=', 3);

>

Field must be greater than the value supplied.

addQuery('priority', '>', 3);

<

Field must be less than the value supplied.

addQuery('priority', '<', 3);

>=

Field must be equal to or greater than the value supplied.

addQuery('priority', '>=', 3);

<=

Field must be equal to or less than the value supplied.

addQuery('priority', '<=', 3);

!=

Field must not equal the value supplied.

addQuery('priority', '!=', 3);

STARTSWITH

Field must start with the value supplied. The example shown on the right will get

addQuery('short_description', 'STARTSWITH', 'Error');

all records where the short_description field starts with the text 'Error'.
ENDSWITH

Field must end with the value supplied. The example shown on the right will get

addQuery('short_description', 'ENDSWITH', 'Error');

all records where the short_description field ends with text 'Error'.
CONTAINS

Field must contain the value supplied anywhere in the field. The example shown
on the right will get all records where the short_description field contains the text
'Error' anywhere in the field.

addQuery('short_description', 'CONTAINS', 'Error');

DOES NOT

Field must not contain the value supplied anywhere in the field. The example

CONTAIN

shown on the right will get all records where the short_description field does not

addQuery('short_description', 'DOES NOT CONTAIN', 'Error');

contain the text 'Error' anywhere in the field.


IN

Field must contain the value supplied anywhere in the string provided.

addQuery('sys_id', 'IN',
'0331ddb40a0a3c0e40c83e9f7520f860,032ebb5a0a0a3c0e2e2204a495526dce');

INSTANCEOF

Retrieves only records of a specified class for tables which are extended. For
example, to search for configuration items (cmdb_ci table) you many want to
retrieve all configuration items that are have are classified as computers. The
code uses the INSTANCEOF operator to query for those records.

Todd

23-02-2010, 04:05

Excellent Cheat Sheet! More more..


Reply

Cesar

23-02-2010, 15:43

Thanks Mark! this is helpful.


Reply

Ivan Martez

15-04-2010, 13:54

Great Cheat Sheet and an excellent website!!


Reply

Chris

09-09-2010, 00:22

addQuery('sys_class_name', 'INSTANCEOF', 'cmdb_ci_computer');

Is there a way to query for a date ? Such as current.addQuery(opened_at, <=', new Date()-7); Although this does not work is there a way to do
something like this to query for a given date range ?
Reply

Mark Stanger

09-09-2010, 00:24

There is. I usually use the addEncocdedQuery method when dealing with date queries. You can build the query you want in a module or filter
definition to see what the encoded query should look like.
Reply

Benny

04-11-2010, 16:22

Thanks Mark!
Ive scoured the SN wiki and this is a better summary of their glide record pages. Im a newbie to SN and I must admit Ive found the learning curve a bit
steep for customising SN, having come from other SaaS systems as Salesforce & Rightnow.
These systems let you use GUIs to do most things and for more advanced customisation there is a scripting option. SN seems to be all scripting from the
get go with limited use of GUIs for configuration. It would be nice if their wiki included a clearer explanation on how Client Scripts, UI Policies, UI Actions,
Business Rules & Access Control all fits together
Reply

Mark Stanger

04-11-2010, 16:33

Thanks for the comment. I think as you become more familiar with Service-now youll see that the majority of configurations are GUI-based or
require some pretty light scripting. Im not that familiar with Salesforce & Rightnow so I couldnt say how Service-now compares. Hopefully some
of the content here helps you to get going a little bit faster. I know that the SNC documentation team is really focusing right now on scripting
documentation so what you see on the wiki should be getting better by the day.
You might check out these forum links for some more information about SNC scripting basics. It gives some information from presentations Ive
given in the past about how some of this stuff connects. http://community.service-now.com/forum/3480 http://community.servicenow.com/forum/3613
Reply

Gabe

11-02-2011, 15:10

Heres one for MultipleDelete, should be a good addition to this post.


//Find all non-active incident records and delete them
var md = new Packages.com.glide.db.MultipleDelete('incident');
md.addQuery('active', false
false);
md.setAllowCascadeDelete(); // optional: Allow cascading to records in other tables related to records being deleted
md.execute();

Reply

bdr529

31-03-2011, 08:56

*Fantastic* posting, Mark! Great to have all of these listed together thanks!
Reply

priscilla.yuen

05-08-2011, 01:02

In reference to the Or query is there any documentation about what a QueryCondition object is, and what its other functions are?
Reply

Mark Stanger

05-08-2011, 06:35

@priscilla, there isnt any other documentation about QueryCondition, but theres really not much more to it either. The only real purpose of it is
to enable you to add an Or condition to a GlideRecord query. There are a couple more examples that I could probably share though. Ill see if I
can get something out next week.
Reply

Jim Coyne

10-09-2011, 13:33

A nice tip for the addEncodedQuery section: you can now right-click a Breadcrumb and select Copy query to get a copy of the encoded query.

Reply

Mike

10-10-2011, 14:15

Is there a way to get the display value from a SYS ID returned in a query?
example: I would like the below code to result in the display name for the requested_by and not the sys_id used to reference the user table.
var Req;
var gr = new GlideRecord("change_request");
gr.addQuery('number', current.sysapproval);
gr.query();
while
while(gr.next()) {
Req = gr.requested_by;
}

Reply

Mark Stanger

10-10-2011, 16:52

Since youre dealing with a reference field you should be able to do something like this inside your while loop
Req = gr.requested_by.getDisplayValue();

You can also just dot-walk to the field that contains the display value
Req = gr.requested_by.name;

Reply

Mike

11-10-2011, 09:39

Thanks for the suggestions,

Ive tried both and have listed the results of each below.
Req = gr.requested_by.name;

Returned the value undefined


Req = gr.requested_by.getDisplayValue();

Resulted in a script error Object doesnt support this property or method


Reply

Mark Stanger

12-10-2011, 09:18

Youve got another problem in your code


gr.addQuery('number', current.sysapproval);
should be...
gr.addQuery('sys_id', current.sysapproval);

Reply

Mike

12-10-2011, 09:45

Ah, you are correct. I have corrected the query. Still, very odd when I use the following:
Req = gr.requested_by;

I get the sys_id that is in that reference field


When using
Req = gr.requested_by.name;

I still get undefined.


I will keep working at it. Thanks for your time and help.

Andreas

28-06-2012, 08:44

Another nice addition to this list would be applyEncodedQuery


see: http://community.servicenow.com/forum/5356
Reply

Michele

03-08-2012, 09:16

I find the encodedquery to be extremely helpful especially when my query includes things like created this week or created before a specific date. Then I
know for sure I have the right query string.
Question: If I run a GlideRecord query and then want to add another condition to the query and rerun it, is that possible?
Not that I would do the following but just as an example. The real code Im doing has quite a few query conditions and Im rebuilding the same query
multiple times just to add one more condition and it just seems inefficient.
EX:
var newArray = new Array();
var newArray2 = new Array();
var gr = new GlideRecord(incident);
gr.addQuery(active, true);
gr.query();
while(gr.next()){
if (gr.severity = 1){
newArray.push(gr.number);
}
//I want to add to the above query that incident state = 6
gr.addQuery(incident_state, 6);
gr.query();

while (gr.next()){
newArray2.push(gr.number);
}
Reply

Amado Sierra

21-09-2012, 07:31

One thing to note about updating a reference field to null is that it has to be done as described here:
Example 1
var gr1 = new GlideRecord(incident);
gr1.query();
while(gr1.next()) {
gr1.priority = NULL;
gr1.update();
}
Source: http://wiki.servicenow.com/index.php?title=Setting_a_GlideRecord_Variable_to_Null
Reply

Kari Sweeney

28-11-2012, 08:55

Thanks so much for posting this info -it is really helpful!. We are struggling with using AddQuery and AddORCondition to create an advanced query. Here
is an example of what we wre trying to accomplish..
(Where Priority is 1
AND IncidentState =6)
OR
(Where Priority = 2
AND Category = Software)
Is there a way to accomplish this?

thanks,
Kari
Reply

Mark Stanger

28-11-2012, 16:09

I struggle with AddOrCondition sometimes too. Ive found it helpful to use AddEncodedQuery to manage those types of complex queries more
easily. By using that method, you can simply build the query filter in a standard list so that you can see exactly what you want, then right-click the
breadcrumb and select Copy query. Then you can just add that as an encoded query and not have to worry about the correct AddOrCondition
setup.
Reply

Mika

08-05-2014, 11:56

Im also interested in doing nested AND conditions. Did you ever determine a way to do it. Id prefer using an encoded query if possible. The only
other way I can think of doing it is to create two separate queries and then combine the results (not very pretty but easy enough I suppose).
Reply

Martin Robinson

07-10-2013, 06:45

Nice one Mark, thanks for sharing. Much appreciated.


Reply

Joe

24-10-2014, 06:44

Im having trouble with setWorkflow. Ive used it successfully before, but now it seems to be cancelling the update that it precedes. in a script action
(parm2 = sys_id of an inc and parm1 = display value of an assignment group), I have:
var outage = new GlideRecord(incident);
outage.get(event.parm2);
outage.work_notes = Outage originally assigned to + event.parm1;

outage.setWorkflow(false);
outage.update();
If I comment out outage.setWorkflow(false), I will see the update to the work notes. However, if i leave the line as is, i wont see the update. I definitely
do not want to trigger other business rules after this update, so im not sure whats happening here. Anyone have any thoughts?
Reply

Jef De Coster

20-03-2015, 05:01

Hi Joe,
Dont know if its still relevant, but I had the same issue.
Apparantly this is normal behaviour when using setWorkflow(false), the work_notes wont be updated.
Ive found a nice script include and a way to set the work notes alltogether even if setWorkflow(false) is applied.
I found it on the SNBlog, the author is Stefan Bohncke.
You can find it using this url:
http://www.snc-blog.com/2012/10/22/temporarily-circumventing-business-rules-to-update-work-notes/
Hopefully this is helping you out?
It worked for me !
KR,
Jef
Reply

JMO

15-07-2015, 09:09

I use this page quite a bit and just recently found out ServiceNow also offers a NOT IN operator, which has saved me several times.
Reply

Rajan Murkute

03-11-2015, 21:41

This cheat sheet covers the most frequently used GlideRecord operations. All explanations and examples are easy to follow. It saved me huge amount of
time which I may have spent looking through the Service-Now Wiki pages.
Reply

CodeHacker

22-03-2016, 06:51

Thanks.. Very helpfull


Reply