How can I have this business rule execute for each item that has been added to the list or removed from the list?

Jonathan Demeul
Kilo Guru

Hi,

We have a requirement to add multiple CI's to an incident. As is often the case sometimes we have an incident affected for example 5 computers so we want to be able to add 5 CIs to the incident instead of having to add 1 on the form and the rest in the affected CI.

Therefore I have created a reference list on the incident form which simply allows my agents to add multiple CIs in one go. I wanted to utilize the existing business rule that was configured for the OOB one-to-one field for CIs: 
(https://yourinstance.service-now.com/nav_to.do?uri=sys_script.do?sys_id=6f8daf204a3623120146c79f308310df)

However this only works if I add the CIs one at a time and save the form each time, how can I change the script so it executes for each item in the list? This is the current code:

if (!previous.cmdb_ci.nil())
   removePreviousCI();

if (!current.cmdb_ci.nil())
   addCurrentCI();

function removePreviousCI() {
   // Delete Affected CI records for this task and previous CI
   var rec = new GlideRecord('task_ci');
   rec.addQuery('task', current.sys_id);
   rec.addQuery('ci_item', previous.cmdb_ci);
   rec.query();
   while (rec.next())
      rec.deleteRecord();
}

function addCurrentCI() {
   //Create Affected CI record for this task and current CI
   var rec = new GlideRecord('task_ci');
   rec.addQuery('task', current.sys_id);
   rec.addQuery('ci_item', current.cmdb_ci);
   rec.query();
   if (rec.next())
      return;

   rec.initialize();
   rec.task = current.sys_id;
   rec.ci_item = current.cmdb_ci;
   rec.insert();
}
1 ACCEPTED SOLUTION

Assuming you have field replaced in last function. Replace last function with below

function addCurrentCI() {
   //Create Affected CI record for this task and current CI

var cmdbciis=current.u_configuration_items_list.toString().split(',');

for(var i=0;i<cmdbciis.length;i++)
{
 var rec = new GlideRecord('task_ci');
   rec.addQuery('task', current.sys_id);
   rec.addQuery('ci_item', cmdbciis[i]);
   rec.query();
   if (rec.next())
      return;

   rec.initialize();
   rec.task = current.sys_id;
   rec.ci_item = cmdbciis[i];
   rec.insert();
}
}

View solution in original post

12 REPLIES 12

Aman Kumar S
Kilo Patron

Hey @Jonathan Demeulemeester,

So what happens here is when you are adding in the list, the addCurrentCI would run only once, since it doesn't know if its a multiple CIs you are planning to add.

What you need to do here is to have a for loop in place, which will fetch the value of your list and then one by one you it will iterate through your list of CIs and create your Affected CIs records.

 

Feel free to mark correct, If I answered your query.

Will be helpful for future visitors looking for similar questions 🙂

Best Regards
Aman Kumar

Hi Aman,

I supposed so; can you point me in the right direction/documentation/example how to do it? I have limited programming experience.

For sure, your structure would remain the same;

all you want to do is, is update addCurrentCI.

function addCurrentCI() {
   //Create Affected CI record for this task and current CI
   var listCIs = current.getValue("your_ci_list_field_name");// update the name of field
   var arrofCI = listCIs.split(",");
   for(var x in arrofCI){
   var rec = new GlideRecord('task_ci');
   rec.addQuery('task', current.sys_id);
   rec.addQuery('ci_item', arrofCI[x]);
   rec.query();
   if (rec.next())
      return;

   rec.initialize();
   rec.task = current.sys_id;
   rec.ci_item = current.cmdb_ci;
   rec.insert();
}
}

 

Feel free to mark correct, If I answered your query.

Will be helpful for future visitors looking for similar questions 🙂

Best Regards
Aman Kumar

Hi,

I tested your solution with 3 CIs but this is the result:

1) 3 CIs added then saved

find_real_file.png

2) Result in the affected CI list

find_real_file.png