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.

Choice Fields are not set on Form while calling GlideAjax from Catalog Client Script

jayapradade
Tera Contributor

Hi , 

 

I have Choice Fields in a catalog item in the service portal. Via changes of other fields( On change Catalog client script ) ,  Glide ajax call is made to fetch the values.

I have made some logging statements in both Glide Ajax and Client Script. In the Backend, values are generated. From the Client side, Values are being Set( I see the Client logs) ,

 

But Those choice values are not being appearing on the fields.

Is there any way that we get these choice type variables values set?

 

Requirement :

On change of a Variable on Catalog Form ,  Set the field value to the value if it exists, otherwise set the label.

 

* the below code works for field types: "list" but not for "choice "

 

here is my catalog client Script :

 

 

function onChange(control, oldValue, newValue, isLoading) {
    var preLoadId = getParameterValue('system_id');


    // If it is loading and a system_id (sys_id of it system inventory entry), load the values
    if (isLoading && preLoadId) {
        g_form.setValue('it_system_inventory_entry', preLoadId);
        loadEntrysById(preLoadId);


    }

    // If the new value is empty, clear values
    if (newValue == '') {
        var fieldNames = JSON.stringify(g_form.getFieldNames());
        for (var i in fieldNames) {
            g_form.clearValue(fieldNames[i]);
            //  g_form.addInfoMessage("New value is empty ");
        }
    }
    // If the new value differentiates from the old value and the new value is not empty, load the values
    else if (newValue != oldValue && newValue != '') {
        loadEntrysById(newValue);
        g_form.addInfoMessage("calling function loadEntrysById");

    }
}

function loadEntrysById(sysId) {
    var ga = new GlideAjax('clientHelper');
    ga.addParam('sysparm_name', 'loadSystemInvetoryEntryGr');
    ga.addParam('system_inventory_sys_id', sysId);
    ga.addParam('fields', JSON.stringify(g_form.getFieldNames()));
    ga.getXML(ajaxResponse);

    function ajaxResponse(response) {
        var answer = JSON.parse(response.responseXML.documentElement.getAttribute('answer'));

        for (var i in answer) {


            // Skip the field if it's 'it_system_inventory_entry'
            if (answer[i].key != 'it_system_inventory_entry') {

                // g_form.setValue(answer[i].key, answer[i].value);

               // Get the value from the response
             var fieldValue = answer[i].value;
             g_form.addInfoMessage("fieldValue  is  " + fieldValue);
                var fieldLabel = g_form.getLabelOf(answer[i].key);
                g_form.addInfoMessage("fieldLabel  is  " + fieldLabel);

           // Set the field value to the value if it exists, otherwise set the label
          if (fieldValue) {
                   g_form.setValue(answer[i].key, fieldValue);
                    g_form.addInfoMessage("field Value Set" + fieldValue);
                   
                   
             } else if (!fieldValue) {
                 g_form.setValue(answer[i].key, fieldLabel);
                     g_form.addInfoMessage("field Label Set" + fieldLabel);
            }


            }
        }
    }
}
/**
 * Retrieves the url parameter by name
 *
 * @Param {String} name - The name of the url parameter
 * @returns {String} The value of the url parameter
 */
function getParameterValue(name) {
    var ret = '';
    var url = top.location.href;
    ret = new URLSearchParams(url).get(name);

    return ret;
}

 

 

My Glide Ajax Function :

 

 

 * @returns {Array} - Array of key (field name) and values (field values)
     */
    loadSystemInvetoryEntryGr: function() {
        var debugMessage = 'The function loadSystemInvetoryEntryGr has been called';
        var ret = [];
        debugMessage += '\n' + this.getParameter('system_inventory_sys_id') + '\n' + this.getParameter('fields');

        try {
            var systemInvetoryEntry = this.getParameter('system_inventory_sys_id');
            var fields = JSON.parse(this.getParameter('fields'));

            var gr = new GlideRecord('cmdb_ci_business_app');
            if (gr.get(systemInvetoryEntry)) {

                for (var i in fields) {
                    // Create an empty object to store the field's information
                    var temp = {};
                    // Assign the field name to the 'key' property of the object
                    temp.key = fields[i];

                    //temp.value = gr.getValue(fields[i]);
                   
                    // Get the field element object from the GlideRecord

                    var fieldElement = gr.getElement(fields[i]);
                    // Check if the field element exists (i.e., the field name is valid)
                    if (fieldElement) {
                        var rawValue = fieldElement.getValue();
                        gs.info('Field: ' + rawValue + ' is the field value in the  record.');
                        var displayValue = fieldElement.getDisplayValue();

                        if (rawValue) {

                            // temp.value = displayValue ? displayValue : rawValue;
                            temp.value = fieldElement.getDisplayValue();
                            gs.info('Field: ' + fields[i] + ', Raw Value: ' + rawValue + ', Display Value: ' + displayValue);
                        }

                    }

                    // Add the 'temp' object to the 'ret' array, which collects results
                    ret.push(temp);
                }
            }
        } catch (ex) {
            this._log.logErr(debugMessage + '\nError: ' + ex);
        }

        debugMessage += '\nReturn: ' + JSON.stringify(ret);
        gs.info(debugMessage);

        return JSON.stringify(ret);
    },

 

 

Any Changes to code here ?

Please help.

 

Regards,

tia 

3 REPLIES 3

Sid_Takali
Kilo Patron

Hi @jayapradade Try below code and modify accordingly

Script Include:

loadSystemInvetoryEntryGr: function() {
    var debugMessage = 'The function loadSystemInvetoryEntryGr has been called';
    var ret = [];
    debugMessage += '\n' + this.getParameter('system_inventory_sys_id') + '\n' + this.getParameter('fields');

    try {
        var systemInvetoryEntry = this.getParameter('system_inventory_sys_id');
        var fields = JSON.parse(this.getParameter('fields'));

        var gr = new GlideRecord('cmdb_ci_business_app');
        if (gr.get(systemInvetoryEntry)) {

            for (var i in fields) {
                var temp = {};
                temp.key = fields[i];

                var fieldElement = gr.getElement(fields[i]);
                if (fieldElement) {
                    var rawValue = fieldElement.getValue();
                    var displayValue = fieldElement.getDisplayValue();
                    if (fieldElement.getED() && fieldElement.getED().getTableName() == 'sys_choice') {
                        temp.value = rawValue; // Use the raw value
                    } else {
                        temp.value = displayValue || rawValue; 
                    }
                    gs.info('Field: ' + fields[i] + ', Raw Value: ' + rawValue + ', Display Value: ' + displayValue);
                }
                ret.push(temp);
            }
        }
    } catch (ex) {
        this._log.logErr(debugMessage + '\nError: ' + ex);
    }
    debugMessage += '\nReturn: ' + JSON.stringify(ret);
    gs.info(debugMessage);
    return JSON.stringify(ret);
}

 

Client Script :

function onChange(control, oldValue, newValue, isLoading) {
    var preLoadId = getParameterValue('system_id');

    if (isLoading && preLoadId) {
        g_form.setValue('it_system_inventory_entry', preLoadId);
        loadEntrysById(preLoadId);
    }

    if (newValue == '') {
        var fieldNames = JSON.stringify(g_form.getFieldNames());
        for (var i in fieldNames) {
            g_form.clearValue(fieldNames[i]);
        }
    } else if (newValue != oldValue && newValue != '') {
        loadEntrysById(newValue);
    }
}

function loadEntrysById(sysId) {
    var ga = new GlideAjax('clientHelper');
    ga.addParam('sysparm_name', 'loadSystemInvetoryEntryGr');
    ga.addParam('system_inventory_sys_id', sysId);
    ga.addParam('fields', JSON.stringify(g_form.getFieldNames()));
    ga.getXML(ajaxResponse);

    function ajaxResponse(response) {
        var answer = JSON.parse(response.responseXML.documentElement.getAttribute('answer'));

        for (var i in answer) {
            if (answer[i].key != 'it_system_inventory_entry') {
                var fieldValue = answer[i].value;
                g_form.addInfoMessage("fieldValue is " + fieldValue);
                if (g_form.getControl(answer[i].key).type === 'select') {
                    var choices = g_form.getControl(answer[i].key).options;
                    var isChoiceValid = choices.some(option => option.value == fieldValue);
                    
                    if (isChoiceValid) {
                        g_form.setValue(answer[i].key, fieldValue);
                        g_form.addInfoMessage("field Value Set to " + fieldValue);
                    } else {
                        g_form.addInfoMessage("Invalid choice value: " + fieldValue);
                    }
                } else {
                    g_form.setValue(answer[i].key, fieldValue);
                    g_form.addInfoMessage("field Value Set to " + fieldValue);
                }
            }
        }
    }
}

 

Hi @Sid_Takali ,

I am getting below error in client script .

 

jayapradade_0-1725444203325.png

 

@Sid_Takali 

 

Added the Screenshot for your reference . The field business criticality is choice, And when i test in logs , that value is set. but it is not appearing on the form while the form loads.
all Choice fields on this form has same issue.