Trying to populate multiple values in two different fields of catalog item using for loop

Community Alums
Not applicable

Hi All,

There are three fields on the form, based on one field I am trying to populate data in two other fields

On Process table we have two reference fields ABC Process Owner and XYZ Process Owner 

1) "Impacted Process" (Field 1 - List collector - can select two or more values) - Multiple options present in the list collector

2) Based on selection in Impacted Process "ABC Process owner"(Field 2 - Multiline text - read only) data should populate line by line (If one Impacted Process is selected then that Process' owner should be populated. If two selections, respectively owner should get populated here line by line)

3) Based on selection in Impacted Process "XYZ Process Owner"(Field 2 - Multiline text - read only) data should populate line by line (If one Impacted Process is selected then that Process' owner should be populated. If two selections, owner should get populated here line by line)

PFB form design

find_real_file.png

Script Include

populateImpactServices: function() {

        var sysid = this.getParameter('sysparm_user_name');
        var obj = {};

        var rec = new GlideRecord('cmdb_ci_business_process');
        rec.addQuery('name', sysid);
        rec.query();
        while (rec.next()) {
            obj.owned_by = rec.getDisplayValue('owned_by').toString();
            obj.managed_by = rec.getDisplayValue('managed_by').toString();
        }
        var data = JSON.stringify(obj);

        return data;

 

Client Script

var arr = {};
    var caller = g_form.getDisplayValue('impacted_process');

  var glide = new GlideAjax('populateImpactServices');
  glide.addParam('sysparm_name', 'populateImpactServices');
  glide.addParam('sysparm_user_name', caller);
  glide.getXMLAnswer(Hello);
  

    function Hello(response) {
        arr = JSON.parse(response);
        var owner = '';
        var manage = '';
        for (var i = 0; i < arr.length; i++) {
            var value = 'Process' + (i + 1) + ': ';
            var value1 ='Process' + (i + 1) + ': ';
            value += arr[i].owned_by;
            value1 += arr[i].managed_by;
            owner += value + '\n';
            manage += value1 + '\n';
        }
        g_form.setValue('abc_process_owner', owner);
        g_form.setValue('xyz_process_owner',manage);

    }

}

Please let me know where I am lagging.

1 ACCEPTED SOLUTION

Please use the below code block in your script include

populateImpactServices : function() {
    var sysid = this.getParameter('sysparm_user_name');
    var obj = {};
    var owned_by_arr = [];
    var managed_by_arr = [];

    var rec = new GlideRecord('cmdb_ci_business_process');
    rec.addQuery('name', "IN", sysid);
    rec.query();
    while (rec.next()) {
	var process_name = rec.name;
        owned_by_arr.push(process_name+":"+rec.getDisplayValue('owned_by').toString());
        managed_by_arr.push(process_name+":"+rec.getDisplayValue('managed_by').toString());
    }

    obj.owned_by = owned_by_arr.join("\n");
    obj.managed_by = managed_by_arr.join("\n");

    return JSON.stringify(obj);
}

Thanks & Regards,
Vasanth

View solution in original post

18 REPLIES 18

MrMuhammad
Giga Sage

Hi @Tejas

getDisplayValue returns string so you don't need to explicitly conversions here. Also, you need to store obj Object into an array and then send it back to client script as a JSON.

Please try below

Script Include:

populateImpactServices: function() {

        var name = this.getParameter('sysparm_user_name');
        var obj = {};
        var arrayOfObj = [] 

        var rec = new GlideRecord('cmdb_ci_business_process');
        rec.addQuery('name', name);
        rec.query();
        while (rec.next()) {
            obj.owned_by = rec.owned_by.getDisplayValue();
            obj.managed_by = rec.managed_by.getDisplayValue();
            arrayOfObj.push(obj);
        }
        var data = JSON.stringify(arrayOfObj);

        return data;

 }

Client Script:


    var caller = g_form.getDisplayValue('impacted_process');

  var glide = new GlideAjax('populateImpactServices');
  glide.addParam('sysparm_name', 'populateImpactServices');
  glide.addParam('sysparm_user_name', caller);
  glide.getXMLAnswer(Hello);
  

    function Hello(response) {
        var arr = JSON.parse(response);
        var owner = 'Process: ';
        var manage = 'Process: ';
        for (var i = 0; i < arr.length; i++) {
            owner += arr[i].owned_by + '\n';
            manage += arr[i].managed_by + '\n';
        }
        g_form.setValue('abc_process_owner', owner);
        g_form.setValue('xyz_process_owner',manage);

    }

}

Please mark this helpful/correct, if applicable.

Regards,

Muhammad

 

Regards,
Muhammad

Community Alums
Not applicable

Hi Muhammad,

 

Thanks for sharing !

I tried what you have suggested, for first Impacted Process it is working but when I add more than one it is greying out previous values and printing only "Process:". I am looking for output like

ABC's Process Owner

Process 1 (i.e. Process : Incident Management (INC)) : .........................

Process 2 (i.e. Process : Hardware Asset Managemnt (HAM)) : .......................

Process 3 (.......................) : .......................

 

XYZ's Process Owner

Process 1 (i.e. Process : Incident Management (INC)) : .........................

Process 2 (i.e. Process : Hardware Asset Managemnt (HAM)) : .......................

Process 3 (.......................) : .......................

 

find_real_file.png

Community Alums
Not applicable

Hi Muhammad,

 

With following script include and client script

Script Include

populateImpactServices: function() {

        var name = this.getParameter('sysparm_user_name');
        var obj = {};
        var arrayOfObj = [];
        var impacted_processIds = name.split(",");
        var count = impacted_processIds.length;
        gs.log("Line 11:"   +count);

        for (var i = 0; i < count; i++) {
            var rec = new GlideRecord('cmdb_ci_business_process');
            rec.addQuery('sys_id', impacted_processIds[i]);
            rec.query();
            while (rec.next()) {
                obj.owned_by = rec.owned_by.getDisplayValue();
                obj.managed_by = rec.managed_by.getDisplayValue();
            }
            arrayOfObj.push(obj);
        }
        var data = JSON.stringify(arrayOfObj);
            return data;
    },

Client Script

var caller = g_form.getValue('impacted_process');
    
    var glide = new GlideAjax('populateImpactServices');
    glide.addParam('sysparm_name', 'populateImpactServices');
    glide.addParam('sysparm_user_name', caller);
    glide.getXMLAnswer(Hello);

    function Hello(response) {
        var arr = JSON.parse(response);

        var owner = [];
        var manage = [];
        for (var i = 0; i < arr.length; i++) {
            owner += arr[i].owned_by + '\n';
            manage += arr[i].managed_by + '\n';
        }
        g_form.setValue('abc_process_owner', owner);
        g_form.setValue('xyz_process_owner', manage);
    }

}

Output - It is repeating the values of newly added Process into the Impacted process field

find_real_file.png

Sagar Pagar
Tera Patron

Hi,

I would suggest to query with sys_id's instead of display values.

Client script:

// Client Script - 

var arr = {};
var impacted_processes = g_form.getValue('impacted_process');  // it can be single or multiple

alert("impacted_processes: " + impacted_processes);

var glide = new GlideAjax('populateImpactServices');
glide.addParam('sysparm_name', 'populateImpactServices');
glide.addParam('sysparm_impacted_process', impacted_processes);
glide.getXMLAnswer(Hello);

function Hello(response) {
arr = JSON.parse(response);
var owner = '';
var manage = '';
for (var i = 0; i < arr.length; i++) {
    var value = 'Process' + (i + 1) + ': ';
    var value1 ='Process' + (i + 1) + ': ';
    value += arr[i].owned_by;
    value1 += arr[i].managed_by;
    owner += value + '\n';
    manage += value1 + '\n';
}
g_form.setValue('abc_process_owner', owner);
g_form.setValue('xyz_process_owner',manage);

}

}

Script include:

// Script Include - 

populateImpactServices: function() {

var impacted_process = this.getParameter('sysparm_impacted_process');
gs.info("impacted_processIds: " + impacted_process);  // it should prints the selected process id's seprated by comma

var impacted_processIds = impacted_process.splint(",");

var obj = {};
var finalArray = [];

for(var i = 0; i< impacted_processIds.length; i++){

var rec = new GlideRecord('cmdb_ci_business_process');
rec.addQuery('sys_id', impacted_processIds[i]);
rec.query();
if (rec.next()) {
    obj.owned_by = rec.getDisplayValue('owned_by').toString();
    obj.managed_by = rec.getDisplayValue('managed_by').toString();
}
// finalArray.push(obj);

}
// gs.info("finalArray: " + finalArray);
var data = JSON.stringify(obj);

return data;

 

Thanks,

Sagar Pagar

 

The world works with ServiceNow