How do I avoid using current.update() in a business rule script by using setWorkflow() method with the false parameter
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
07-24-2018 12:22 PM
This script was developed to add users to the watchlist for every case if a Watchlist = True check box is active in their user profile. However this business rule is causing some recursive issues. Based on the feedback from SN I need to stop using current.update and start using the setWorkflow(false) method. Can someone help me modify the code below appropriately.
This is the feedback from ServiceNow
First and foremost, Its not recommended to use current.update() in "After" Business rule.
Because it will lead to recursive call. It is documented here :
-https://docs.servicenow.com/bundle/kingston-application-development/page/script/business-rules/reference/r_HowBusinessRulesWork.html#d746702e265
"Avoid using current.update() in a business rule script. The update() method triggers business rules to run on the same table for insert and update operations, leading to a business rule calling itself over and over. Changes made in before business rules are automatically saved when all before business rules are complete, and after business rules are best used for updating related, not current, objects. When a recursive business rule is detected, the system stops it and logs the error in the system log. However, current.update() causes system performance issues and is never necessary.
You can prevent recursive business rules by using the setWorkflow() method with the false parameter. The combination of the update() and setWorkflow() methods is only recommended in special circumstances where the normal before and after guidelines mentioned above do not meet your requirements."
In this business rule "Set watch_list acc to addtocasewatchlist" I see you are doing current.update() as many times as that of people in the watchlist.
This is causing the case record to get updated as many times at the same time frame.
When to Run: When = After , and Insert = True
Advanced
(function executeRule(current, previous /*null when async*/) {
// Add your code here
// var watchlist = [];
// watchlist = current.watch_list.split(',');
var str1 = current.watch_list;
var gr = new GlideRecord("sys_user");
gr.addQuery("company",current.account);
gr.addQuery("u_add_to_case_watchlist",true);
gr.query();
while (gr.next()) {
var str2 = gr.sys_id;
if(!current.watch_list)
{
current.watch_list = gr.sys_id;
}
else if(str1.indexOf(str2) == -1)
{
current.watch_list = current.watch_list +','+ gr.sys_id;
}
current.update();
}
})(current, previous);
- Labels:
-
Customer Service Management

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-21-2019 11:28 AM
got it!! in the above case issue is not caused by current.update() . while loop caused the issue.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-21-2019 11:34 AM
So, how do we feel about an INSERT only business rule using current.update()? To give some context, I've tried using a before business rule without current.update(), but I am trying to inherit a value from the parent record which is null at the time the before business rule runs.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-21-2019 11:43 AM
there comes the situation where we need to use curremt.update + set workflow false.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
05-24-2019 06:14 AM
Hi guys
we hired a contractor to recode this here is the code. thanks for your support hope it helps all of you
(function executeRule(current, previous /*null when async*/) {
// Add your code here
// var watchlist = [];
// watchlist = current.watch_list.split(',');
var str1 = current.watch_list;
var array = current.watch_list.split(',');
var gr = new GlideRecord("sys_user");
gr.addQuery("company",current.account);
gr.addQuery("u_add_to_case_watchlist",true);
gr.query();
while (gr.next()) {
var str2 = gr.sys_id.toString();
if (array.indexOf(str2) > -1)
continue;
array.push(str2);
}
current.watch_list = array.join(',');
})(current, previous);