Show an error message when exist a "Conflict" in Change Request.

crhistopherjuar
Kilo Expert

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

1 ACCEPTED SOLUTION

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);


View solution in original post

23 REPLIES 23

Pradeep Sharma
ServiceNow Employee
ServiceNow Employee

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


GlideRecord - ServiceNow Wiki


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')



http://wiki.servicenow.com/index.php?title=Coding_Best_Practices#Use_getDisplayValue.28.29_Effective...


I agree with you, Chuck. Modified the code


Thank you.


Actually I modified the code and still not working.



find_real_file.png


find_real_file.png


Condition should be gs.hasRole("itil") and not gs.hasRole()("itil"). Please modify this and check once.