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!