Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Onchange client script with script include

karthik65
Tera Guru
I want to pass two values from onchange client script and get their company values from the script include. what is the best approach.
 
Client script:
 
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }
var cmdb={};
   cmdb.var1 = g_form.getValue('business_service');
cmdb.var2 = newValue;
    var array = Object.toJSON(cmdb);
    var Value = new GlideAjax('global.Brazil_Script');
    Value.addParam('sysparm_name', 'GetService');
    Value.addParam('sysparm_service_name', array);
//     Value.addParam('sysparm_cmdb_name', newValue);
 
    Value.getXML(setVal);
//   alert(ser1);
//         alert(sysparm_cmdb_name);
 
 
    function setVal(response) {
        var answer = response.responseXML.documentElement.getAttribute("answer");
        var resultData = JSON.parse(answer);
        var ServiceCompany = resultData.var1;
        var ApplCompany = resultData.var2;
        alert(ServiceCompany);
        alert(ApplCompany);
 
        var OPCO;
        getMessage('BrazilsysID', function(msg) {
            OPCO = JSON.parse(msg);
 
 
 
            if (ServiceCompany == OPCO.Company1 || ServiceCompany == OPCO.Company2) {
                var sername = ser.name;
                var cat = 'BR_' + sername; //concat
                g_form.setValue('category', cat);
                g_form.setReadOnly('category', true);
            }
 
 
            if (ApplCompany == OPCO.Company3 || ApplCompany == OPCO.Company1) {
                var ciname = ci.name;
                var subcat = 'BR_' + ciname; //concat
                var setTimer = '';
                setTimer = setTimeout(setTimerDelay, 2000); //To set the timer for 2 sec
                function setTimerDelay() {
                    g_form.setValue('subcategory', subcat);
                    g_form.setReadOnly('subcategory', true);
                }
 
            }
        });
    }
}
 
Script include:
 
var Brazil_Script = Class.create();
Brazil_Script.prototype = {
    GetService: function() {
 
        var value = {};
var str = this.getParameter('sysparm_service_name');
 
 
var arr = new JSON().decode(str);
        var serviceName = this.getParameter("sysparm_service_name");
        var Service = new GlideRecord('cmdb_ci_service');
        Service.addQuery("name", serviceName);
        Service.query();
        while (Service.next()) {
            value.var1 = Service.company;
        }
        var cmdbName = this.getParameter("sysparm_cmdb_name");
gs.log("Karthik"+cmdbName);
        var cmdb = new GlideRecord('cmdb_ci_appl');
        cmdb.addQuery("name", cmdbName);
        cmdb.query();
        while (cmdb.next()) {
            value.var2 = cmdb.company;
        }
        return JSON.stringify(Value);
        //         var data = json.encode(Value); //JSON formatted string                       
        //         return data;
    },
    type: 'Brazil_Script'
 
};
6 REPLIES 6

Vishal Birajdar
Giga Sage

Hi @karthik65 

 

Please try like below :

 

Script Include :

 

var Brazil_Script = Class.create();
Brazil_Script.prototype = {
    /*Start of GetService Function  */
    GetService: function() {
        /* Declare variable to return value */ 
        var result = {
            'serviceCompany':'',
            'cmdbCompany' : '',
        };

        /* Get values from client script */
        var serviceName = this.getParameter('sysparm_service_name');
        var cmdbName = this.getParameter('sysparm_cmdb_name');
    
         /*Glide record on cmdb_ci_service  */
        var grService = new GlideRecord('cmdb_ci_service');
        grService.addQuery("name", serviceName);
        grService.query();
        if (grService.next()) {
            result.serviceCompany = grService.company;
        }
    
        /*Glide record on cmdb_ci_appl  */
        var grCmdb = new GlideRecord('cmdb_ci_appl');
        grCmdb.addQuery("name", cmdbName);
        grCmdb.query();
        if (grCmdb.next()) {
            result.cmdbCompany = grCmdb.company;
        }
       
        /* return the result */

        return JSON.stringify(result);

    },
    type: 'Brazil_Script'
 
};

 

Client script  :

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading || newValue === '') {
        return;
    }
   var service = g_form.getValue('business_service');

    
    var Value = new GlideAjax('global.Brazil_Script');
    Value.addParam('sysparm_name', 'GetService');
    Value.addParam('sysparm_service_name', service);
    Value.addParam('sysparm_cmdb_name', newValue);
 
    Value.getXMLAnswer(setVal);
 
    function setVal(answer) {
        var result = JSON.parse(answer);
       
        var ServiceCompany = result.serviceCompany;
        var ApplCompany = result.cmdbCompany;
        alert(ServiceCompany);
        alert(ApplCompany);
 
        var OPCO;
        getMessage('BrazilsysID', function(msg) {
            OPCO = JSON.parse(msg);
 

            if (ServiceCompany == OPCO.Company1 || ServiceCompany == OPCO.Company2) {
                var sername = ser.name;
                var cat = 'BR_' + sername; //concat
                g_form.setValue('category', cat);
                g_form.setReadOnly('category', true);
            }
 
 
            if (ApplCompany == OPCO.Company3 || ApplCompany == OPCO.Company1) {
                var ciname = ci.name;
                var subcat = 'BR_' + ciname; //concat
                var setTimer = '';
                setTimer = setTimeout(setTimerDelay, 2000); //To set the timer for 2 sec
                function setTimerDelay() {
                    g_form.setValue('subcategory', subcat);
                    g_form.setReadOnly('subcategory', true);
                }
 
            }
        });
    }
}

 

 

 

 

Vishal Birajdar
ServiceNow Developer

I know one thing, and that is that I know nothing.
- Socrates

Tai Vu
Kilo Patron
Kilo Patron

Hi @karthik65 

It should be 2 separated Client Scripts as you're triggering on 2 different variables Business service and Application to autofill Category and Subcategory.

Sample below for Business Service. (You can do the same with Application)

#Client Script OnChange Business Service (Reference variable)

function onChange(control, oldValue, newValue, isLoading, isTemplate) {
    if (isLoading) {
        return;
    }

    if (newValue === '') {
        g_form.clearValue('category');
        g_form.setReadOnly('category', false);
        return;
    }

    var ga = new GlideAjax('global.Brazil_Script');
    ga.addParam('sysparm_name', 'getService');
    //Business Service is a Reference variable, which store the record's sys_id
    ga.addParam('sysparm_business_service_id', newValue); 
    ga.getXMLAnswer(setVal);

    function setVal(response) {
        var objService = JSON.parse(response);
        if (objService.sys_id == "<your_company_value>" || objService.sys_id == "<your_company_value>") {
            var category = 'BR_' + objService.name;
            g_form.setValue('category', category);
            g_form.setReadOnly('category', true);
            return;
        }
        g_form.clearValue('category');
        g_form.setReadOnly('category', false);
    }
}

 

#Script Include

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

    getService: function() {
		var result = {};
        var serviceID = this.getParameter('sysparm_business_service_id');
        var grService = new GlideRecord('cmdb_ci_service');
		if(grService.get(serviceID)){
			result.sys_id = grService.getUniqueValue();
			result.name = grService.getValue('name');
		}
		return JSON.stringify(result);
    },

    type: 'Brazil_Script'
});

 

I can see your Script Include is not Client Callable one. Make sure you create it correctly.

TaiVu_0-1699427898273.png

 

Cheers,

Tai Vu