Populate MRVS onChange

Dash2
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

@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

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

@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

 

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

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?