Error Message query

Joshuu
Kilo Sage

Hi All,

 

We are populating an error message on the change form through a business rule. And if we open the same change form from report or if we reload the form the error message is not getting displayed.

 

How to display the error message to as soon as the form loads?

 

Please assist.

 

 

12 REPLIES 12

Once you get this onLoad script working you can copy it twice to trigger onChange of the date fields.  You can change the name of the Script Include, function, and parameters.

function onLoad() {
    g_form.clearMessages();
    var state = g_form.getValue('state');
    if (state < 3) { //Change is not Closed/Cancelled
        var chgAjax = new GlideAjax('ChangeMgmtUtils');
        chgAjax.addParam('sysparm_name', 'checkSched');
        chgAjax.addParam('sysparm_start_date', g_form.getValue('start_date'));
		chgAjax.addParam('sysparm_end_date', g_form.getValue('end_date'));
        chgAjax.getXML(parseResponse);
    }

    function parseResponse(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
		//alert(answer);
        if (answer != 'false') {
			var message = JSON.parse(answer);
			var messageallnew = '<b><font size="3">"The defined Change Request window overlaps Maintenance Window,"</font></b>' +
            '<b><font size="4">' + message.schedule_name + '</font></b>' +
            '<b><font size="3">"Coordinate with the Technical Manager"</font></b><br>' +
            '<font size="3"><b>Primary Contact - ' + message.u_pri_contact + '</b></font><br>' +
            '<font size="3"><b>Secondary Contact - ' + message.u_ec_contact + '</b></font>';
			g_form.addErrorMessage(messageallnew);
			var link = '<a href="https://instance_name.service-now.com/now/nav/ui/classic/params/target/cmn_schedule_span_list.do%3Fsysparm_query%3Dschedule.nameLIKEMaintenance%2520Window%26sysparm_first_row%3D1%26sysparm_view%3D%26sysparm_choice_query_raw%3D%26sysparm_list_header_search%3Dtrue">Maintenance Window</a>';
			g_form.addInfoMessage(link);
        }
    }
}

Create a Script Include with the same name used in the Glide Ajax call.  Ensure the Client callable box is checked.  I've used your script adapted for use with a client script.

var ChangeMgmtUtils = Class.create();
ChangeMgmtUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	checkSched: function(){
		var answer = 'false';
		var startdate = this.getParameter('sysparm_start_date');
		var endate = this.getParameter('sysparm_end_date');
		//gs.info('RK | SI: startdate ' + startdate);
		//gs.info('RK | SI: endate ' + endate);
		var gdt = new GlideDateTime(startdate);
		var endgdt = new GlideDateTime(endate);
    	var dow = gdt.getDayOfWeek();
		var crend = endgdt.getTime();
    	var crstart = gdt.getTime();
		//gs.info('RK | SI: crend ' + crend);
		//gs.info('RK | SI: crstart ' + crstart);
        var crstarttime = crstart.split(" ");
    	var onlycrstarttime = crstarttime[1];
        var crendtime = crend.split(" ");
    	var onlycrendtime = crendtime[1];
    	var arr = [];
    	var uniqueSchedules = {}; // Object to track unique schedule names

    	//current.setValue('u_maintainence_window', '');

    	var gr = new GlideRecord("cmn_schedule_span");
    	gr.addEncodedQuery('schedule.nameINAvailability ESB Maintenance Window,B2B Maintenance Window,B2C Web Maintenance Window,Concerto Maintenance Window,Network/Infrastructure Maintenance Window,Network Maintenance Window,Network Firewall Maintenance,Loyalty Maintenance Window - PM,Loyalty Maintenance Window - AM,IRIS Weekly Maintenance Window,RES ESB Maintenance Window');
    	gr.addEncodedQuery('days_of_weekCONTAINS' + dow);
    	gr.query();
    	while (gr.next()) {
            var startmaint = gr.getDisplayValue('start_date_time');
        	var startdatetime = new GlideDateTime(startmaint);
            var endmaint = gr.getDisplayValue('end_date_time');
        	var startonlymaint = startmaint.split(" ");
        	var endtimemaint = endmaint.split(" ");
        	var starttimeonlymaint = startonlymaint[1];
        	var endtimeonlymaint = endtimemaint[1];
            var rec = [];
        	rec.push(gr.schedule.u_contacts);
        	var a = rec.join(',');
        
        	if ((onlycrstarttime < starttimeonlymaint && starttimeonlymaint < onlycrendtime) ||
            (onlycrstarttime < endtimeonlymaint && endtimeonlymaint < onlycrendtime) || (starttimeonlymaint < onlycrstarttime && onlycrstarttime < endtimeonlymaint) ||
            (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {
            	var scheduleName = gr.schedule.name.toString(); // Ensure schedule name is treated as string
            	if (!uniqueSchedules.hasOwnProperty(scheduleName)) {
                	uniqueSchedules[scheduleName] = true; // Mark schedule name as seen
                	arr.push(scheduleName); // Push unique schedule name into the array
                	//gs.log("RK | SI Inside if: " + scheduleName);
            	}

            	//current.u_maintainence_window = arr.join(',');
				answer = {
                "schedule_name" : gr.schedule.name,
				"u_pri_contact" : gr.schedule.u_pri_contact.getDisplayValue(),
				"u_ec_contact" : gr.schedule.u_ec_contact.getDisplayValue()
				};
            
            	//gs.log("RK | Schedule Message: " + gr.schedule.name);
            	gs.eventQueue("noifyownerofchngemaint", current, gr.schedule.name, rec);
        	}
    	}

		return JSON.stringify(answer);
	},
});

If it's not working, uncomment the log lines and add some more to see what's going on.

 

Hi @Brad Bowman  ,

 

Actually, I have removed the display BR conditions, and it is working now. Below is the script.

 

Another query is,

 

On the change request form, there is a custom field called Maintenance Window. And through below script we are populating schedule entries in the same field and also the error message/the banner. And this is list type field.

 

And there is another field as business service, and we are checking T1 priority business services.

 

Now we should also add a validation that the business Service should not trigger its own defined window alert. 

 

For example, below is a scenario.

user selected Business service contains 'Loyalty' on the change form.

Scheduled entries in the maintenance window field should not populate 'Loyalty' named choice.

 

Below are the business services and scheduled entries which we have. How to add this validation in this script? Please assist.

 

Business Services:

B2B

B2C

RES ESB

IRIS

Loyalty

Availability ESB

Concerto

Network 

 

priyarao_0-1727454438893.png

 

 

 

(function executeRule(current, previous /*null when async*/ ) {

    var startdate = current.start_date;
    var crend = current.getDisplayValue('end_date');
    var crstart = current.getDisplayValue('start_date');
    var gdt = new GlideDateTime(startdate);
    var dow = gdt.getDayOfWeek();
    var endate = current.end_date;
    var crstarttime = crstart.split(" ");
    var onlycrstarttime = crstarttime[1];
    var endgdt = new GlideDateTime(endate);
    var crendtime = crend.split(" ");
    var onlycrendtime = crendtime[1];
    var arr = [];
    var uniqueSchedules = {}; // Object to track unique schedule names

    current.setValue('u_maintainence_window', '');

    if (current.u_business_service.u_priority == 'T1') {

        var gr = new GlideRecord("cmn_schedule_span");
        gr.addEncodedQuery('schedule.nameINAvailability ESB Maintenance Window,B2B Maintenance Window,B2C Web Maintenance Window,Concerto Maintenance Window,Network/Infrastructure Maintenance Window,Network Maintenance Window,Network Firewall Maintenance,Loyalty Maintenance Window - PM,Loyalty Maintenance Window - AM,IRIS Weekly Maintenance Window,RES ESB Maintenance Window');
       
        gr.addEncodedQuery('days_of_weekCONTAINS' + dow);
        gr.query();
        while (gr.next()) {
           

            var startmaint = gr.getDisplayValue('start_date_time');
            var startdatetime = new GlideDateTime(startmaint);
          
            var endmaint = gr.getDisplayValue('end_date_time');
            var startonlymaint = startmaint.split(" ");
            var endtimemaint = endmaint.split(" ");
            var starttimeonlymaint = startonlymaint[1];
            var endtimeonlymaint = endtimemaint[1];
           

            var rec = [];
            rec.push(gr.schedule.u_contacts);
            var a = rec.join(',');
           
            if ((onlycrstarttime < starttimeonlymaint && starttimeonlymaint < onlycrendtime) ||
                (onlycrstarttime < endtimeonlymaint && endtimeonlymaint < onlycrendtime) || (starttimeonlymaint < onlycrstarttime && onlycrstarttime < endtimeonlymaint) ||
                (starttimeonlymaint < onlycrendtime && onlycrendtime < endtimeonlymaint)) {
                var scheduleName = gr.schedule.name.toString(); // Ensure schedule name is treated as string
                if (!uniqueSchedules.hasOwnProperty(scheduleName)) {
                    uniqueSchedules[scheduleName] = true; // Mark schedule name as seen
                    arr.push(scheduleName); // Push unique schedule name into the array
                    gs.log("RK | BR Inside if: " + scheduleName);
                }

                current.u_maintainence_window = arr.join(',');
                var messageallnew = '<b><font size="3">"The defined Change Request window overlaps Maintenance Window,"</font></b>' +
                    '<b><font size="4">' + gr.schedule.name + '</font></b>' +
                    '<b><font size="3">"Coordinate with the Technical Manager"</font></b><br>' +
                    '<font size="3"><b>Primary Contact - ' + gr.schedule.u_pri_contact.getDisplayValue() + '</b></font><br>' +
                    '<font size="3"><b>Secondary Contact - ' + gr.schedule.u_ec_contact.getDisplayValue() + '</b></font>';
                gs.addErrorMessage(messageallnew);
                var link = '<a href="https://ihguat.service-now.com/now/nav/ui/classic/params/target/cmn_schedule_span_list.do%3Fsysparm_query%3Dschedule.nameLIKEMaintenance%2520Window%26sysparm_first_row%3D1%26sysparm_view%3D%26sysparm_choice_query_raw%3D%26sysparm_list_header_search%3Dtrue">Maintenance Window</a>';
                gs.addInfoMessage(link);
                gs.log("RK | Schedule Message: " + gr.schedule.name);
                gs.eventQueue("noifyownerofchngemaint", current, gr.schedule.name, rec);
            }
        }
    }

})(current, previous);

 

 

 

Best Regards.

Bert_c1
Kilo Patron

use 'current.' in place of 'gr.'