Populate String Variable Dynamically Based on Requested For in Custom Table

vikasverma1
Tera Contributor

Hi All,

I have a catalog item where, when a user raises a request, I need to check if the “Requested for” user exists in a custom table.
If they do, I want to populate the requester’s name into a string variable on the catalog item.

 

Requirement

  • On catalog item load (or when “Requested for” changes), check the custom table.
  • If the Requested for user exists for the specific catalog item, populate a string variable (e.g., u_requester_name) with the requester’s display name.
  • Otherwise, leave it blank (or show a message)

 

What I tried

Script Include: - 
 

var ServiceCopilotAjaxUtils = Class.create();
ServiceCopilotAjaxUtils.prototype = Object.extendsObject(AbstractAjaxProcessor, {
  getRequest: function(requester){
    var gr = new GlideRecord('u_envalior_request_mapping');
    gr.addEncodedQuery('u_catalog_item=Request Trial Copilot License^u_requestor='+requester);
    gr.query();
    if(gr.next()){
      return true;
    }
    return false;
  },
  type: 'ServiceCopilotAjaxUtils'
});
 
  • Default value of the string variable:-  javascript: new global.ServiceCopilotAjaxUtils().getRequest(gs.getUserID());

Issue faced

  • The requester name is not populating in the string variable.

 

Any suggestions or examples would be highly appreciated.

 

Thanks in advance!

1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron

@vikasverma1 

Just want to confirm

-> u_envalior_request_mapping table field u_requestor is reference to sys_user

-> you should use onChange catalog client script + GlideAjax to populate the string variable whenever that earlier variable changes

onChange Catalog Client Script: Requestor variable

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

    if (newValue == '')
        g_form.clearValue('stringVariable'); // give here string variable name

    if (oldValue != newValue) {
        var ga = new GlideAjax('ServiceCopilotAjaxUtils');
        ga.addParam('sysparm_name', "getRequest");
        ga.addParam('sysparm_userID', newValue);
        ga.getXMLAnswer(function(answer) {
            if (answer != '') {
                g_form.setValue('stringVariable', answer); // give here string variable name
            }
        });
    }
    //Type appropriate comment here, and begin script below

}

Enhanced Script Include: the function will work when called from server side (default value) + also from GlideAjax

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

    getRequest: function(user) {
        var requester = this.getParameter('sysparm_userID') || user;
        var gr = new GlideRecord('u_envalior_request_mapping');
        gr.addEncodedQuery('u_catalog_item=Request Trial Copilot License^u_requestor=' + requester);
        gr.query();
        if (gr.next()) {
            return gr.u_requestor.getDisplayValue();
        }
        return '';
    },
    type: 'ServiceCopilotAjaxUtils'
});

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

View solution in original post

6 REPLIES 6

boddushiris
Tera Contributor

Hi @vikasverma1,

The Script Include returns true or false.
Use an onChange Catalog Client Script. Remove isLoading from it so it works on load as well as on change of the catalog item form.

Matthew_13
Mega Sage

@vikasverma1 - Ok thanks

MJG