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.

How to get the record count in the while loop?

Rick54
Tera Expert

Hello,

I am trying to get the count of all record that matches the query condition. When I use the below script, the count is always being '1' even though there are 1+ records that matches the condition. I am I missing anything? Please suggest.

var count = 0;
var gr= new GlideAggregate('cmdb_ci_db_mssql_instance');
gr.addAggregate('COUNT');
gr.addQuery('sys_id', 'IN', instances);//This variable holds 1 or more record sys ids
gr.addQuery('install_status',7);
gr.query();
while(gr.next()){
	instanceCount = gr.getAggregate('COUNT');
	gs.print(instanceCount);
	
}

This time I have 2 records that matched the condition
Output:
*** Script: 0
*** Script: 1
*** Script: 1
*** Script: 0

Expected Ouput: 2

My expectation is that these records are queried one after one that's the reason I am getting individual record's count. Is there any way to count all looped records and combine and output as 2? Thanks

1 ACCEPTED SOLUTION

Harsh Vardhan
Giga Patron

here we go

 

var count=0;
var rcount;
var gr = new GlideRecord('cmdb_rel_ci');
gr.addQuery('child.sys_id','d53a14fddbd8330080e0a08a48961902');
gr.query();
if(gr.next())
{
gs.print(gr.parent.getDisplayValue());
var gr2 = new GlideRecord('cmdb_rel_ci');
gr2.addQuery('parent.sys_id',gr.parent);

gr2.query();
rcount=gr2.getRowCount();
while(gr2.next())
{
if(gr2.child.install_status== 7){
count++;
//gs.print(gr2.child.install_status);
}
}

}

if(rcount == count)
{

gs.print('hey harsh please update the database');

}
else
{
gs.print('no need to update the database');
}



View solution in original post

35 REPLIES 35

It gave me the correct count now. But don't know why it is failing when I use the variable.

Hi Rick,

I think it's because what I mentioned above.

 

If you are using in a loop assignment like this:

while(rel2.next()){
	var instances = rel2.child;

it will not give you the correct results because you are saving only "pointer" to the variable. 

You should always use rather:

var instances = rel2.getValue('child');

or

var instances = rel2.child + '';

so you will not store pointer but the variable value (as a string)

Peter, I tried your approach but it still gives me individual record counts.

 

var db = "981bba741b4437889ed265b82d4bcbba";
var rel2 = new GlideRecord('cmdb_rel_ci');
rel2.addEncodedQuery("type=55c95bf6c0a8010e0118ec7056ebc54d^child.sys_class_name=cmdb_ci_db_mssql_instance^parent.sys_class_name=cmdb_ci_database^parent.sys_id="+db+"");//db variable holds one database record 
rel2.query();
while(rel2.next()){
	instances = rel2.child+"";
	var inst = new GlideRecord('cmdb_ci_db_mssql_instance');
	inst.addQuery('sys_id', 'IN', instances);
	inst.addQuery('install_status', '7');
	inst.query();
	while(inst.next()){
		var instanceCount = inst.getRowCount();//always gives me 1 as count 
		gs.print(instanceCount);
		
	}
}

 

Output:
*** Script: 1
*** Script: 1

reginabautista
Kilo Sage

Hi

 

I think you need to move your getRowCount on top of the while loop

var rel2 = new GlideRecord('cmdb_rel_ci');
rel2.addEncodedQuery("type=55c95bf6c0a8010e0118ec7056ebc54d^child.sys_class_name=cmdb_ci_db_mssql_instance^parent.sys_class_name=cmdb_ci_database^parent.sys_id="+db+"");//db variable holds one database record
rel2.query();
while(rel2.next()){
var instances = rel2.child;
var instCount = rel2.getRowCount();//this is giving me the correct count in this case 3 count
var inst = new GlideRecord('cmdb_ci_db_mssql_instance');
inst.addQuery('sys_id', 'IN', instances);
inst.addQuery('install_status', '7');
inst.query();

var instanceCount = inst.getRowCount();//always gives me 1 as count
while(inst.next()){

if(instCount == instanceCount){

//do something in this loop
}

}
}

 

Thanks for the reply Regina. I am ok with the rel2.getRowCount()  because it gives me the right count but I am worried about inst.getRowCount() which always gives me individual record count. Please see my updated question.