Delete record in Multi Row variable set when unchecking the checkbox

Sarah Austria
Giga Guru

Hi Guys,

I have a Requested For variable (itsm_requested_by), a checkbox (include_me_in_the_access) and a mrvs (users_who_need_access). When I checked the checkbox it will add the Requested For to the mrvs, then when deselecting the checkbox it should be remove from the mvrs.

find_real_file.png

 

I came across from one of the question  and was able to add the details in my mrvs by creating script include + client script (onChange)

Script Include:

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

listcollector: function() {

var listValuename = [];
var userInfo = this.getParameter('sysparm_user_info');
var query = 'sys_idIN' + userInfo;
if(userInfo)
{
var gr = new GlideRecord('sys_user');
gr.addEncodedQuery(query);
gr.query();
if(gr.next()){

listValuename.push({
"name": gr.getUniqueValue('name'),
"ntid": gr.getValue('u_network_id')
});
}
}
gs.info('ARB JSON'+JSON.stringify(listValuename));
return JSON.stringify(listValuename);
},

type: 'populateEmailfromList '
});

 

 

OnChange Client Script:

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

if(newValue == ''){
g_form.clearValue('users_who_need_access'); // give name of MRVS variable set here
}

if(oldValue != newValue){
var ga = new GlideAjax('populateEmailfromList');
ga.addParam('sysparm_name', 'listcollector');
ga.addParam('sysparm_user_info', g_form.getValue('itsm_requested_by')); // give here the requestor variable name
ga.getXML(listcolleValues);
}
function listcolleValues(response) {
var val = response.responseXML.documentElement.getAttribute("answer");

if (g_form.getValue('include_me_in_the_access') == 'true') {
g_form.setValue('users_who_need_access', val); // give name of MRVS variable set here
}
else if (g_form.getValue('include_me_in_the_access') == 'false'){

var toRemove = g_form.getDisplayValue('itsm_requested_by').value;
var finalArr = [];
var parser = JSON.parse(val);
for(var i=0;i<parser.length;i++){
var obj1 = parser[i];
var newParser = JSON.parse(JSON.stringify(obj1));
if(newParser.name != toRemove){
finalArr.push(obj1);
}
}
alert('new JSON' + JSON.stringify(finalArr));
g_form.setValue('users_who_need_access',JSON.stringify(finalArr));
}


}

}

 

Unfortunately, the "else if (g_form.getValue('include_me_in_the_access') == 'false'){" in my client script is not working for me. Please help me with my script. 

 

Appreciate for any assistance. 

 

thanks,

Sarah

1 ACCEPTED SOLUTION

Hi,

you need to again perform GlideAjax when it is checked so that you get the user details and add it to existing json string

Regards
Ankur

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

View solution in original post

16 REPLIES 16

This is the client script I have created in the checkbox.

 

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

//Type appropriate comment here, and begin script below

var ga = new GlideAjax('populateEmailfromList');
ga.addParam('sysparm_name', 'listcollector');
ga.addParam('sysparm_user_info', g_form.getValue('itsm_requested_by')); // give here the requestor variable name
ga.getXML(listcolleValues);

function listcolleValues(response) {

var val = response.responseXML.documentElement.getAttribute("answer");
if (g_form.getValue('include_me_in_the_access').toString() == 'true') {
g_form.setValue('users_who_need_access', val);
} else if (g_form.getValue('include_me_in_the_access').toString() == 'false'){

var toRemove = g_form.getDisplayValue('itsm_requested_by').value;
var finalArr = [];
var parser = JSON.parse(val);
for(var i=0;i<parser.length;i++){
if(parser[i].name != toRemove){
finalArr.push(parser[i]);
}
}
alert('new JSON' + JSON.stringify(finalArr));
g_form.setValue('users_who_need_access',JSON.stringify(finalArr));


}
}
}

Hi,

name variable within MRVS is reference type or string?

if it is reference then do this

var toRemove = g_form.getValue('itsm_requested_by');

if it is string then do this for getting display value in portal

var toRemove = g_form.getDisplayValue('itsm_requested_by');

Regards
Ankur

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

Hi Ankur, 

itsm_requested_by is a reference field. I have changed it to 

var toRemove = g_form.getValue('itsm_requested_by');

but now it removes all the details in the mrvs. Where did I do wrong here?

else if (g_form.getValue('include_me_in_the_access').toString() == 'false') {

var toRemove = g_form.getValue('itsm_requested_by');
var finalArr = [];
var parser = JSON.parse(val);
for (var i = 0; i < parser.length; i++) {
if (parser[i].name != toRemove) {
finalArr.push(parser[i]);
}
}
alert('new JSON' + JSON.stringify(finalArr));
g_form.setValue('users_who_need_access',JSON.stringify(finalArr));
}
}

try to add alert and debug

else if (g_form.getValue('include_me_in_the_access').toString() == 'false') {

    var toRemove = g_form.getValue('itsm_requested_by');
    var finalArr = [];
    var parser = JSON.parse(val);
    for (var i = 0; i < parser.length; i++) {
        alert('Name is' + parser[i].name);
        if (parser[i].name != toRemove) {
            alert('Pushing when value is not matched');
            finalArr.push(parser[i]);
        }
    }
    alert('new JSON' + JSON.stringify(finalArr));
    g_form.setValue('users_who_need_access',JSON.stringify(finalArr));
}
}

Regards
Ankur

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

this alert  alert('Name is' + parser[i].name);  is showing the right value like 

Name is76eab4031bfa678099d60dc8cd4bcb84

However, this part

if (parser[i].name != toRemove) {
alert('Pushing when value is not matched');
finalArr.push(parser[i]);
}

 

it is not executing.