My query returns rows , but while(gr.next()) does not loop through them ... why?

IanGlencross
Kilo Expert
var yearAgo = gs.daysAgo(365);

gr = new GlideRecord("sys_template");
gr.addQuery('u_pre_approved', true);
gr.addQuery("u_approving_rfc.cab_date", "<", yearAgo);
gr.query();

gs.print('** DEBUG ** ROWCOUNT :'+gr.getRowCount());

while(gr.next()) {
   gs.print('** DEACTIVATING ** '+gr.name);
   gr.active=false;
   gr.update();
}

 

The above code is the basis of a Scheduled job I want to run to deactivate PreApproved templates if they expire.

When run as Scripts - Background this is the result :find_real_file.png

My query works fine, as the DEBUG gives the correct row count, however the while loop does not seem to run, and the test template remains active.

 

Moreover :  even if I simply the script to

gr = new GlideRecord('sys_template');
gr.addQuery('u_pre_approved', true);
gr.query();

gs.print('ROWCOUNT :'+gr.getRowCount());

while(gr.next()) {
  gs.print('** DEACTIVATING ** '+gr.name);
}

I get a similar result, the correct rowcount but no looping over the query results  :

find_real_file.png

Does anyone have any ideas why my glideRecord does not want to loop?

1 ACCEPTED SOLUTION

Nick Pike
ServiceNow Employee
ServiceNow Employee

Hi Ian,

The template table has a 'next' column, so you'll need to use the _next() method instead.

while (gr._next())

Regards,
Nick Pike
Senior Technical Consultant, Platform Services
ServiceNow
(AU) O: +61 3 8626 8608
(AU) M: +61 401 554 962
www.servicenow.com

View solution in original post

12 REPLIES 12

Ankur Bawiskar
Tera Patron
Tera Patron

Hi,

Can you try below script in background: check whether read is allowed or not?

If row count is 1 then it should go inside the if or while loop

var yearAgo = gs.daysAgo(365);

gr = new GlideRecord("sys_template");
gr.addQuery('u_pre_approved', true);
gr.addQuery("u_approving_rfc.cab_date", "<", yearAgo);
gr.query();

gs.print('** DEBUG ** ROWCOUNT :'+gr.getRowCount());
gs.print('Can Read: ' + gr.canRead());

if(gr.next()) {
gs.print('** DEACTIVATING ** '+gr.name);
gr.active=false;
gr.update();
}

Mark Correct if this solves your issue and also mark Helpful if you find my response worthy based on the impact.
Thanks
Ankur

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

Output from above script  :

find_real_file.png

and the test template was not deactivated.

 

Hi,

I found something interesting. Even I was unable to change the active field in my case. I debugged there is 1 query business rule that might be causing the issue so I used setWorkflow(false) before query and it updated the flag

update your code as below and try once:

var yearAgo = gs.daysAgo(365);

var gr = new GlideRecord("sys_template");
gr.addQuery('u_pre_approved', true);
gr.addQuery("u_approving_rfc.cab_date", "<", yearAgo);

gr.setWorkflow(false);

gr.query();

gs.print('** DEBUG ** ROWCOUNT :'+gr.getRowCount());

while(gr.next()) {
gs.print('** DEACTIVATING ** '+gr.name);
gr.active=false;
gr.update();
}

Mark Correct if this solves your issue and also mark Helpful if you find my response worthy based on the impact.
Thanks
Ankur

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

IanGlencross
Kilo Expert

UPdate

 

it's something about the sys_template table  as this code :

var tempgr = new GlideRecord('core_company');
tempgr.addActiveQuery();
tempgr.query();

gs.print('NEXT :'+tempgr.hasNext());

while(tempgr.next()) {
    gs.print('** DEACTIVATING ** '+tempgr.name);
}


runs exactly as expected : 

find_real_file.png

Hi,

Can you check any acl on that table which blocks updating the record?

var yearAgo = gs.daysAgo(365);

gr = new GlideRecord("sys_template");
gr.addQuery('u_pre_approved', true);
gr.addQuery("u_approving_rfc.cab_date", "<", yearAgo);
gr.query();

gs.print('** DEBUG ** ROWCOUNT :'+gr.getRowCount());
gs.print('Can Read: ' + gr.canRead());

if(gr.next()) {
gs.print('** DEACTIVATING ** '+gr.name);

gs.print('Can Write: ' + gr.canWrite());

gr.active=false;

gr.setWorkflow(false);

gr.update();
}

Mark Correct if this solves your issue and also mark Helpful if you find my response worthy based on the impact.
Thanks
Ankur

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