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.

Client Script works on "try it" but not on Service Portal

Jake Golden
Tera Expert

Hello,

 

I have a client script that is querying the kb_knowledge table and works properly while using the "try it" feature when editing the catalog item. But once I go to the self-portal, the script is not retrieving values from the kb_knowledge table. 

 

function onChange(control, oldValue, newValue, isLoading) {
 if (!isLoading && newValue) {
        var category = g_form.getValue('category');
        var subcategory = g_form.getValue('subcategory');

  var kbArticle = new GlideRecord('kb_knowledge');
  kbArticle.addQuery('u_knowledge_base', "General");
  kbArticle.addQuery('category', category);
  kbArticle.addQuery('u_subcategory', subcategory);
  kbArticle.addQuery('u_issue', newValue);
        kbArticle.query();
        if (kbArticle.next()) { 
   g_form.setValue('u_knowledge_article', kbArticle.sys_id); 
  } else {
            g_form.setValue('u_knowledge_article', '');

        }
        return;

 }
}

 

The Script above is pulling 2 values from the form (onChange is my 3rd value), bouncing those 3 values off of the kb table and returning the queried kb article. 

 

Again, this script works while in the maintain catalog "try it" feature. But not in the self-portal. I have checked and my script's UI type is set to All. 

 

 

1 ACCEPTED SOLUTION

AnveshKumar M
Tera Sage
Tera Sage

Hi @Jake Golden ,

It is recommended to use GlideAjax and call a script include. Move the GlideRecord part to Client Callable Script Include (Server Side) and call that in client side using GlideAjax, check the following for your reference.

 

Client Script:

function onChange(control, oldValue, newValue, isLoading) {
    if (!isLoading && newValue) {
        var category = g_form.getValue('category');
        var subcategory = g_form.getValue('subcategory');

        var kbGa = new GlideAjax('KB_Data_Utils');
        kbGa.addParam('sysparm_name', 'getKBID');
        kbGa.addParam('sysparm_cat', category);
        kbGa.addParam('sysparm_sub_cat', subcategory);
        kbGa.addParam('sysparm_issue', newValue);
        kbGa.getXMLAnswer(populateKBID);
    }

    function populateKBID(answer) {
        if (answer) {
            g_form.setValue('u_knowledge_article', answer);
        } else {
            g_form.setValue('u_knowledge_article', '');
        }
    }
}

 

AnveshKumarM_1-1681101921320.png

 

 

Client Callable Script Include:

 

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

    getKBID: function() {
		var category = this.getParameter('sysparm_cat');
		var subcategory = this.getParameter('sysparm_sub_cat');
		var issue = this.getParameter('sysparm_issue');
		
        var kbArticle = new GlideRecord('kb_knowledge');
        kbArticle.addQuery('u_knowledge_base', "General");
        kbArticle.addQuery('category', category);
        kbArticle.addQuery('u_subcategory', subcategory);
        kbArticle.addQuery('u_issue', issue);
        kbArticle.query();
        if (kbArticle.next()) {
            return kbArticle.sys_id + '';
        }
        return '';
    },

    type: 'KB_Data_Utils'
});

 

AnveshKumarM_0-1681101882163.png

 

Thanks,

Anvesh

 

 

Thanks,
Anvesh

View solution in original post

3 REPLIES 3

Sagar Pagar
Tera Patron

Hi @Jake Golden,

It is not re-commanded to use GlideRecord in Client scripts. Convert it to Client callable Script Include and call using GlideAjax.

 

For reference: GlideAjax Example Cheat Sheet (UPDATED)  

 

Also, Client scripts type should be selected as All.

 

Thanks,
Sagar Pagar

The world works with ServiceNow

AnveshKumar M
Tera Sage
Tera Sage

Hi @Jake Golden ,

It is recommended to use GlideAjax and call a script include. Move the GlideRecord part to Client Callable Script Include (Server Side) and call that in client side using GlideAjax, check the following for your reference.

 

Client Script:

function onChange(control, oldValue, newValue, isLoading) {
    if (!isLoading && newValue) {
        var category = g_form.getValue('category');
        var subcategory = g_form.getValue('subcategory');

        var kbGa = new GlideAjax('KB_Data_Utils');
        kbGa.addParam('sysparm_name', 'getKBID');
        kbGa.addParam('sysparm_cat', category);
        kbGa.addParam('sysparm_sub_cat', subcategory);
        kbGa.addParam('sysparm_issue', newValue);
        kbGa.getXMLAnswer(populateKBID);
    }

    function populateKBID(answer) {
        if (answer) {
            g_form.setValue('u_knowledge_article', answer);
        } else {
            g_form.setValue('u_knowledge_article', '');
        }
    }
}

 

AnveshKumarM_1-1681101921320.png

 

 

Client Callable Script Include:

 

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

    getKBID: function() {
		var category = this.getParameter('sysparm_cat');
		var subcategory = this.getParameter('sysparm_sub_cat');
		var issue = this.getParameter('sysparm_issue');
		
        var kbArticle = new GlideRecord('kb_knowledge');
        kbArticle.addQuery('u_knowledge_base', "General");
        kbArticle.addQuery('category', category);
        kbArticle.addQuery('u_subcategory', subcategory);
        kbArticle.addQuery('u_issue', issue);
        kbArticle.query();
        if (kbArticle.next()) {
            return kbArticle.sys_id + '';
        }
        return '';
    },

    type: 'KB_Data_Utils'
});

 

AnveshKumarM_0-1681101882163.png

 

Thanks,

Anvesh

 

 

Thanks,
Anvesh

Worked perfectly, thank you!