- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 08:38 AM
Hi Experts,
I have a requirement to show an error message when a ITIL user try to schedule a Change request, when exist a specific "Conflict" in Change Request.
I tried to resolve this with an onBefore Business Rule when the confict status is "Conflict" and the user have the ITIL role.
Here the Business Rule:
Condition: g_user.hasRole('itil')
var change = new GlideRecord('change_request');
change.addQuery('sys_id', current.change);
change.query();
var conflict = new GlideRecord('conflict');
conflict.addQuery('change',current.change);
conflict.query();
while (g.next()){
if (conflict.schedule == 'Fiscal Freeze'){
current.setAbortAction(true);
gs.addInfoMessage('No change allowed in fiscal freeze. Please alter the schedule.');
}
}
My Business Rule doesn't work and I don't know what I am missing.
I hope that you can help me.
Regards
Solved! Go to Solution.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 01:10 PM
The key to business rules is understanding that they are triggered by database operations. If nothing has updated that conflict record, then running the business rule there isn't going to do any good.
Here's a thought... rather than an if, incorporate that in to the query. Your business rule should actually look like this (inside a function)
Name: Check for conflict
When: Before
Insert: true
Update: true
Condition: Conflict status | is | Conflict
(function executeRule(current, previous /*null when async*/) {
var conflict = new GlideRecord('conflict');
conflict.addQuery('change', current.sys_id);
conflict.addQuery('schedule.name', 'Fiscal Freeze 2017');
conflict.query();
if (conflict.next()) {
gs.addErrorMessage('No change allowed in fiscal freeze. Please alter the schedule');
current.setAbortAction(true);
}
})(current, previous);

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 08:55 AM
Hello Crhistopher,
Here is the complete modified code.
Condition : gs.hasRole("itil)
Script :
var change = new GlideRecord('change_request');
change.addQuery('sys_id', current.change);
change.query();
var conflict = new GlideRecord('conflict');
conflict.addQuery('change',current.change);
conflict.query();
while (conflict.next()){
if (conflict.schedule.getDisplayValue() == 'Fiscal Freeze'){
current.setAbortAction(true);
gs.addInfoMessage('No change allowed in fiscal freeze. Please alter the schedule.');
}
}
Reference:
http://wiki.servicenow.com/index.php?title=GlideSystem#gsc.tab=0

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 08:57 AM
Hi Pradeep,
Best practice recommends using getDisplayValue() instead of dot-walking to the name field.
E.g. line 11 would be
if (conflict.schedule.getDisplayValue() == 'Fiscal Freeze')

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 09:01 AM
I agree with you, Chuck. Modified the code
Thank you.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 09:17 AM

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎03-02-2017 09:20 AM
Condition should be gs.hasRole("itil") and not gs.hasRole()("itil"). Please modify this and check once.