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.

Need to run background script to find duplicate CI names using a unique name on another column

Looper23
Tera Contributor

I want to run a background script so I can find duplicate CI's using the name column but have unique value in another column (discovery_source). In this case I should return two results; Notifier and Scan. Can anyone help? 

find_real_file.png

13 REPLIES 13

palanikumar
Giga Sage
Giga Sage

You can use GlideAggregate in this case

var ga = new GlideAggregate('cmdb_ci');
ga.addQuery('active', '=','true');
// add proper filter condition so that the query does not take more time
ga.addAggregate('COUNT', 'name');
ga.query();  
while (ga.next()) {
   var name = ga.category;
   var count = ga.getAggregate('COUNT', 'name');
   gs.info("Name :  " + name + " count : " + count);
}
Thank you,
Palani

Mohith Devatte
Tera Sage
Tera Sage

Hello @Looper23 ,

you can try this script 

var duparr=[];
var gr = new GlideRecord('cmdb_ci');
gr.addQuery('<field_name>','<value>') // put your query if you want to filter unwanted records which will save the execution time
gr.query();
while(gr.next())
{
var dup= new GlideRecord('cmdb_ci');
dup.addQuery('name',gr.name);
dup.addQuery('sys_id','!=',gr.sys_id);
dup.query();
while(dup.next())
{
var obj ={};
obj.name = dup.name.toString();
obj.source = dup.discovery_source.getDisplayvalue();
duparr.push(obj);
}
}
var parsed = JSON.parse(duparr);
for(var i=0; i<parsed.length; i++)
{
gs.print("Name :"+parsed[i].name+" "+"Discovery Source :"+parsed[i].source);
}

PLEASE MARK MY ANSWER CORRECT IF IT HELPS YOU

Hi, i'm running your script and added the EncodedQuery but getting following error

 

Error

Evaluator: org.mozilla.javascript.EcmaError: Unexpected token: o
   Caused by error in script at line 155
Evaluator: org.mozilla.javascript.EcmaError: Unexpected token: o
   Caused by error in script at line 17

     14:         duparr.push(obj);
     15:     }
     16: }
==>  17: var parsed = JSON.parse(duparr);
     18: for (var i = 0; i < parsed.length; i++) {
     19:     gs.print("Name :" + parsed[i].name + " " + "Discovery Source :" + parsed[i].source);
     20: }

 

Script

var duparr = [];
var gr = new GlideRecord('cmdb_ci');
gr.addEncodedQuery('discovery_source=ServiceNow^ORdiscovery_source=OpenView^ORdiscovery_source=ServiceWatch')
gr.query();
while (gr.next()) {
    var dup = new GlideRecord('cmdb_ci');
    dup.addQuery('name', gr.name);
    dup.addQuery('sys_id', '!=', gr.sys_id);
    dup.query();
    while (dup.next()) {
        var obj = {};
        obj.name = dup.name.toString();
        obj.source = dup.discovery_source.getDisplayvalue();
        duparr.push(obj);
    }
}
var parsed = JSON.parse(duparr);
for (var i = 0; i < parsed.length; i++) {
    gs.print("Name :" + parsed[i].name + " " + "Discovery Source :" + parsed[i].source);
}

@Looper23 try this script please 

var duparr = [];
var gr = new GlideRecord('cmdb_ci');
gr.addEncodedQuery('discovery_source=ServiceNow^ORdiscovery_source=OpenView^ORdiscovery_source=ServiceWatch')
gr.query();
while (gr.next()) {
    var dup = new GlideRecord('cmdb_ci');
    dup.addQuery('name', gr.name);
    dup.addQuery('sys_id', '!=', gr.sys_id);
    dup.query();
    while (dup.next()) {
        var obj = {};
        obj.name = dup.name.toString();
        obj.source = dup.discovery_source.getDisplayvalue();
        duparr.push(obj);
    }
}
var str = JSON.stringify(duparr);
var parsed = JSON.parse(str);
for (var i = 0; i < parsed.length; i++) {
    gs.print("Name :" + parsed[i].name + " " + "Discovery Source :" + parsed[i].source);
}