Change Client Script calling a Script Include

Dead Blade
Kilo Guru

Hello Developers,

I am trying to call a script include from an onchange client script and populate a u_Field. The script include returns a group.  The client script needs to supply the cmdb_ci and the group type.

I've been attempting to use something similar to: https://community.servicenow.com/community?id=community_question&sys_id=a77707a1dbc023c09d612926ca961925&view_source=searchResult

with little luck. 

Here is the script include:

var Group_and_CI = Class.create();
Group_and_CI.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    
    getallValues : function() {
        var output;
        var grp = this.getParameter("sysparm_grp");
        var cmdb = this.getParameter("sysparm_ci");
        var gr = new GlideRecord('u_m2m_groups_configuratio');
        gr.addQuery('u_group', grp);
        gr.addQuery('u_configuration_item', cmdb);
        gr.query();
        if(gr.next()) {
            output += gr.sys_id+"\n";    
        }
        return output ;
    },
    
    type: 'Group_and_CI'
});

 

Can someone help me with the Change client script?

 

1 ACCEPTED SOLUTION

David, this is what works now:

Script Include:

var Group_and_CI_1 = Class.create();
Group_and_CI_1.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    
    getallValues : function() {
        var output;
        var grp = this.getParameter("sysparm_grp");
        var cmdb = this.getParameter("sysparm_ci");
        
        gs.log('TESTING: grp is = ' + grp);   //Added by Will
        gs.log('TESTING: cmdb is = ' + cmdb);  //Added by Will
        
        var gr = new GlideRecord('u_m2m_groups_configuratio');
        gr.addQuery('u_group.type', grp);
        gr.addQuery('u_configuration_item', cmdb);
        gr.query();
        
        gs.log('TESTING: Result before IF is = ' + gr.output);  //Added by Will
        gs.log('TESTING Row Count is '+ gr.getRowCount());  //Added by Will
        
        if(gr.next()) {
            //output = gr.sys_id +" \n";
            output = gr.u_group +" \n";
            gs.log('TESTING: Result after IF is = ' + output);  //Added by Will
        }
        gs.log('TESTING Result Before Output is '+ output);  // Added by Will
        return output ;
    },
    
    type: 'Group_and_CI_1'
});

 

 Client:

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


    var ga = new GlideAjax('Group_and_CI_1');
    ga.addParam('sysparm_name', 'getallValues');    
    ga.addParam('sysparm_ci', g_form.getValue('cmdb_ci'));   
    ga.addParam('sysparm_grp', '1512159ddbc5a300b6e69b3c8a96195d');   
    ga.getXML(callback);
	

    function callback(response) {

    var answer = response.responseXML.documentElement.getAttribute("answer");
		
		

	alert(answer);
		
    
	g_form.setValue('u_glide_list_areas_impacted', answer);

    
}

}

 

Client Script passed the cmdb_ci and the group type.

Results in the Group being added to the Change Request u_field.

 

Do you want full credit, you led me to the final, or just helpful.  I'm cool either way.

View solution in original post

31 REPLIES 31

I made both changes.  And the [object HMTLCollection] does not populate to the u_Field, but also nothing does.  I added an alert and it returns blank.

find_real_file.png

Script Include:

var Group_and_CI = Class.create();
Group_and_CI.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    
    getallValues : function() {
        //var output;
        var output = '';
        var grp = this.getParameter("sysparm_grp");
        var cmdb = this.getParameter("sysparm_ci");
        var gr = new GlideRecord('u_m2m_groups_configuratio');
        gr.addQuery('u_group', grp);
        gr.addQuery('u_configuration_item', cmdb);
        gr.query();
        
        gs.log('Row Count is'+ gr.getRowCount());  //Added by Will
        if(gr.next()) {
            //output += gr.sys_id+"\n";    
            output=gr.getUniqueValue();
        }
        gs.log('Result is'+ output);  // Added by Will
        return output ;
    },
    
    type: 'Group_and_CI'
});

 

 

Client:

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


    var ga = new GlideAjax('Group_and_CI');
    ga.addParam('sysparm_name', 'getallValues');    
    ga.addParam('sysparm_ci', g_form.getValue('cmdb_ci'));
    ga.addParam('sysparm_grp', '75da0d45dbcc7380b825abc5ca96196e');  // Release Coordinator  '75da0d45dbcc7380b825abc5ca96196e' sys_id
    ga.getXML(callback);

    function callback(response) {

    var answer = response.responseXML.documentElement.getAttribute("answer");

    alert(answer);
        
    g_form.setValue('u_glide_list_areas_impacted', result);

    
}

}

The AJAX callback also needs this line updated (result var changed to answer):

 g_form.setValue('u_glide_list_areas_impacted', answer);

 

In your script include log are you getting a value being logged for output variable? Is the u_group field on u_m2m_groups_configuratio table a reference or a string? If its a string then your client script AJAX call should have this line updated:

ga.addParam('sysparm_grp', 'Release Coordinator');  // Release Coordinator  '75da0d45dbcc7380b825abc5ca96196e' sys_id

 

If your alert() pop up is blank then your script include isnt returning any sys_id.

I made the change to the client:

g_form.setValue('u_glide_list_areas_impacted', answer)

The u_m2m_groups_configuratio table is a reference

 

So still returning the same blank alert.  So if the script include is not returning the sys_id what is next to look at?  Where is the log for the script include?

Next you will need to check that the script query is actually returning a value. It might help to add log statements to capture the parameters being passed to the script from the client script. (grp & cmdb). Then you can find the logs under system logs. For trouble shooting I generally add some text to the beginning of the log statement so it's easier to find in system. For example if I put gs.log('Testing: Result is-' + output); Then in the logs you can search for Message starts with 'Testing:'

Add logs to Script Include:

 

var Group_and_CI = Class.create();
Group_and_CI.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    
    getallValues : function() {
        //var output;
        var output = '';
        var grp = this.getParameter("sysparm_grp");
        var cmdb = this.getParameter("sysparm_ci");
        var gr = new GlideRecord('u_m2m_groups_configuratio');
        gr.addQuery('u_group', grp);
        gr.addQuery('u_configuration_item', cmdb);
        gr.query();
        
        gs.log('TESTING: Result 1 is = ' + output);
        gs.log('TESTING Row Count is'+ gr.getRowCount());  //Added by Will
        if(gr.next()) {
            //output += gr.sys_id+"\n";    
            output=gr.getUniqueValue();
            gs.log('TESTING: Result 2 is = ' + output);
        }
        gs.log('TESTING Result 3 is'+ output);  // Added by Will
        return output ;
    },
    
    type: 'Group_and_CI'
});

 

Logs:

find_real_file.png

On Change record:

find_real_file.png

find_real_file.png