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