gliderecord-patterns

GlideRecord Best Practices for ServiceNow

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "gliderecord-patterns" with this command: npx skills add groeimetai/snow-flow/groeimetai-snow-flow-gliderecord-patterns

GlideRecord Best Practices for ServiceNow

GlideRecord is the primary API for database operations in ServiceNow. Following these patterns ensures efficient and secure queries.

Basic Query Patterns

Get Single Record by sys_id

var gr = new GlideRecord("incident") if (gr.get("sys_id_here")) { gs.info("Found: " + gr.getValue("number")) }

Get Single Record by Field

var gr = new GlideRecord("sys_user") if (gr.get("user_name", "admin")) { gs.info("Found user: " + gr.getValue("name")) }

Query Multiple Records

var gr = new GlideRecord("incident") gr.addQuery("active", true) gr.addQuery("priority", "1") gr.orderByDesc("sys_created_on") gr.setLimit(100) gr.query()

while (gr.next()) { gs.info(gr.getValue("number")) }

Encoded Queries (Faster)

Use encoded queries for complex conditions - they're more efficient than multiple addQuery calls:

var gr = new GlideRecord("incident") // Encoded query from list view URL or Query Builder gr.addEncodedQuery("active=true^priority=1^assigned_toISEMPTY") gr.query()

while (gr.next()) { // Process records }

Performance Tips

  1. Always Use setLimit()

// When you only need X records var gr = new GlideRecord("incident") gr.addQuery("active", true) gr.setLimit(10) // Don't fetch more than needed gr.query()

  1. Use getValue() for Strings

// CORRECT - Returns string value var number = gr.getValue("number")

// ALSO WORKS but returns GlideElement var element = gr.number var numberStr = gr.number.toString()

  1. Use getDisplayValue() for References

// Get the display value of a reference field var assignedToName = gr.getDisplayValue("assigned_to")

// Get the sys_id of a reference field var assignedToId = gr.getValue("assigned_to")

  1. Avoid Queries in Loops

// BAD - Query inside loop for (var i = 0; i < userIds.length; i++) { var gr = new GlideRecord("sys_user") gr.get(userIds[i]) // N queries! }

// GOOD - Single query with IN clause var gr = new GlideRecord("sys_user") gr.addQuery("sys_id", "IN", userIds.join(",")) gr.query() while (gr.next()) { // Process all users at once }

  1. Use GlideAggregate for Counts

// BAD - Counting with GlideRecord var count = 0 var gr = new GlideRecord("incident") gr.addQuery("active", true) gr.query() while (gr.next()) { count++ }

// GOOD - Use GlideAggregate var ga = new GlideAggregate("incident") ga.addQuery("active", true) ga.addAggregate("COUNT") ga.query() if (ga.next()) { var count = ga.getAggregate("COUNT") }

CRUD Operations

Insert

var gr = new GlideRecord("incident") gr.initialize() gr.setValue("short_description", "New incident") gr.setValue("caller_id", gs.getUserID()) gr.setValue("priority", "3") var sysId = gr.insert()

Update

var gr = new GlideRecord("incident") if (gr.get("sys_id_here")) { gr.setValue("state", "6") // Resolved gr.setValue("close_notes", "Issue fixed") gr.update() }

Delete (Use with Caution!)

var gr = new GlideRecord("incident") if (gr.get("sys_id_here")) { gr.deleteRecord() }

Bulk Update

var gr = new GlideRecord("incident") gr.addQuery("state", "6") // Resolved gr.addQuery("resolved_at", "<", gs.daysAgoStart(30)) gr.query()

while (gr.next()) { gr.setValue("state", "7") // Closed gr.update() }

Query Operators

Operator Example Description

=

addQuery('active', true)

Equals

!=

addQuery('active', '!=', true)

Not equals

, <

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

Greater/Less than

= , <=

addQuery('sys_created_on', '>=', gs.daysAgoStart(7))

Greater/Less or equal

CONTAINS

addQuery('short_description', 'CONTAINS', 'error')

Contains string

STARTSWITH

addQuery('number', 'STARTSWITH', 'INC')

Starts with

ENDSWITH

addQuery('email', 'ENDSWITH', '@company.com')

Ends with

IN

addQuery('state', 'IN', '1,2,3')

In list

NOT IN

addQuery('state', 'NOT IN', '6,7')

Not in list

ISEMPTY

addQuery('assigned_to', 'ISEMPTY', '')

Field is empty

ISNOTEMPTY

addQuery('assigned_to', 'ISNOTEMPTY', '')

Field is not empty

Security Considerations

  • setWorkflow(false) - Skip business rules for bulk operations

  • setLimit() - Prevent runaway queries

  • Check canRead()/canWrite() - Verify ACL permissions

  • Never trust user input - Validate before using in queries

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

General

predictive-intelligence

No summary provided by upstream source.

Repository SourceNeeds Review
General

scheduled-jobs

No summary provided by upstream source.

Repository SourceNeeds Review
General

document-management

No summary provided by upstream source.

Repository SourceNeeds Review
General

reporting-dashboards

No summary provided by upstream source.

Repository SourceNeeds Review