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.

Populate MRVS onChange

Dash2
ServiceNow Employee
ServiceNow Employee

Hello community,

 

I have a request to auto populate an MRVS with a list of asset records based on the selected location.

 

Below is the script include and the catalog client script I'm having issues with:

Variables:

  • name: a reference variable (alm_asset)
  • serial_number: a single-line text

    Script Include:
var MyAssetScriptInclude = Class.create();
MyAssetScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getAssetsForLocation: function(locationID) {
        var assets = [];
        var grAsset = new GlideRecord('alm_asset');
        grAsset.addQuery('location', locationID);
        grAsset.query();
        while (grAsset.next()) {
            var asset = {
                'name': grAsset.getDisplayValue.toString(),
                'serial_number': grAsset.serial_number.toString(),
                
            };
            assets.push(asset);
        }
        return assets;
    },

    type: 'MyAssetScriptInclude'
});

 

And my onChange catalog client script:

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

    var ga = new GlideAjax('MyAssetScriptInclude');
    ga.addParam('sysparm_name', 'getAssetsForLocation');
    ga.addParam('sysparm_location_id', newValue);
    ga.getXMLAnswer(populateMRVS);
}

function populateMRVS(response) {
    var answer = response;
    var mrvs = g_form.getControl('mdf_set');

    try {
        var assets = JSON.parse(answer);

        // Clear existing rows
        g_form.clearOptions('mdf_set');

        // Populate MRVS with assets
        for (var i = 0; i < assets.length; i++) {
            var asset = assets[i];
            g_form.addRow('mdf_set');
            g_form.setValue('mdf_set', 'name', asset.name, i);
            g_form.setValue('mdf_set', 'serial_number', asset.serial_number, i);
          
        }
    } catch (e) {
        // Handle error
        console.error('Error populating MRVS:', e);
    }
}

  I appreciate your assistance on this.

 

@Ankur Bawiskar 

@Brad Bowman  

1 ACCEPTED SOLUTION

Ankur Bawiskar
Tera Patron
Tera Patron

@Dash2 

please make these changes

var MyAssetScriptInclude = Class.create();
MyAssetScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	getAssetsForLocation: function() {
		var locationID = this.getParameter('sysparm_location_id');
		var assets = [];
		var grAsset = new GlideRecord('alm_asset');
		grAsset.addQuery('location', locationID);
		grAsset.query();
		while (grAsset.next()) {
			var asset = {
				'name': grAsset.getUniqueValue(), 
				'serial_number': grAsset.serial_number.toString()
			};
			assets.push(asset);
		}
		return JSON.stringify(assets);
	},

	type: 'MyAssetScriptInclude'
});

Client script

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

	var loc = g_form.getValue('room');

	if(oldValue != newValue){
		var ga = new GlideAjax('MyAssetScriptInclude');
		ga.addParam('sysparm_name', 'getAssetsForLocation');
		ga.addParam('sysparm_location_id', loc);
		ga.getXMLAnswer(populateMRVS);
	}
}

function populateMRVS(response) {
	try{
		var answer = response;
		g_form.setValue('mdf_set', answer);
	} catch (e) {
		// Handle error
		console.error('Error populating MRVS:', e);
	}
}

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

View solution in original post

9 REPLIES 9

Dash2
ServiceNow Employee
ServiceNow Employee

Thank you Brad. Based on your feedback, the updated SI and client script is below. I still can't get it to work.


 

//script include

var MyAssetScriptInclude = Class.create();
MyAssetScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getAssetsForLocation: function() {
        var locationID = this.getParameter('sysparm_location_id');
        var assets = [];
        var grAsset = new GlideRecord('alm_asset');
        grAsset.addQuery('location', locationID);
        grAsset.query();
        while (grAsset.next()) {
            var asset = {
                'name': grAsset.display_value.toString(), 
                'serial_number': grAsset.serial_number.toString()
            };
            assets.push(asset);
        }
        return assets;
    },

    type: 'MyAssetScriptInclude'
});


//client script

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue === '') {
        return;
    }
	var loc = g_form.getValue('room');

    var ga = new GlideAjax('MyAssetScriptInclude');
    ga.addParam('sysparm_name', 'getAssetsForLocation');
    ga.addParam('sysparm_location_id', loc);
    ga.getXMLAnswer(populateMRVS);
}

function populateMRVS(response) {
    var answer = response;
    var mrvs = g_form.getControl('mdf_set');

    try {
        var assets = JSON.parse(answer);

        // Clear existing rows
        g_form.clearValue('mdf_set');

        // Populate MRVS with assets
        for (var i = 0; i < assets.length; i++) {
            var asset = assets[i];
            g_form.addRow('mdf_set');
            g_form.setValue('mdf_set', 'name', asset.name, i);
            g_form.setValue('mdf_set', 'serial_number', asset.serial_number, i);
          
        }
    } catch (e) {
        // Handle error
        console.error('Error populating MRVS:', e);
    }
}

 

Ankur Bawiskar
Tera Patron
Tera Patron

@Dash2 

please make these changes

var MyAssetScriptInclude = Class.create();
MyAssetScriptInclude.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	getAssetsForLocation: function() {
		var locationID = this.getParameter('sysparm_location_id');
		var assets = [];
		var grAsset = new GlideRecord('alm_asset');
		grAsset.addQuery('location', locationID);
		grAsset.query();
		while (grAsset.next()) {
			var asset = {
				'name': grAsset.getUniqueValue(), 
				'serial_number': grAsset.serial_number.toString()
			};
			assets.push(asset);
		}
		return JSON.stringify(assets);
	},

	type: 'MyAssetScriptInclude'
});

Client script

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

	var loc = g_form.getValue('room');

	if(oldValue != newValue){
		var ga = new GlideAjax('MyAssetScriptInclude');
		ga.addParam('sysparm_name', 'getAssetsForLocation');
		ga.addParam('sysparm_location_id', loc);
		ga.getXMLAnswer(populateMRVS);
	}
}

function populateMRVS(response) {
	try{
		var answer = response;
		g_form.setValue('mdf_set', answer);
	} catch (e) {
		// Handle error
		console.error('Error populating MRVS:', e);
	}
}

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

Dash2
ServiceNow Employee
ServiceNow Employee

 

Thank you, @Ankur Bawiskar , when I tested it, I'm getting this blank view

Screenshot 2024-03-20 at 8.50.01 AM.png

@Dash2 

did you check if script include is getting called?

did you check what came in alert for that json?

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

Dash2
ServiceNow Employee
ServiceNow Employee

It worked. Thank you

 

I do have one more question, @Ankur Bawiskar , I'm calling the MRVS in a record producer here:

 

var multiModelVar = JSON.parse(producer.mdf_sets);
if (multiModelVar.length > 0) {
    for (var i = 0; i < multiModelVar.length; i++) {
        var ast = new GlideRecord('alm_asset');
        ast.addQuery('serial_number', multiModelVar[i].serial_number);
        ast.query();
        while (ast.next()) {
            ast.install_status = 1;
            ast.comments = "TESTING THIS RECORD PRODUCER";
            ast.update();
        }
    }
}

 

Is there any reason why my record producer script isn't responding?