Trying to create an aging report

Conan_Lloyd
Mega Expert

Bear with me, I'm pretty new to SN and very new to scripting. I'm pretty good at reverse engineering things but not as great at creating from scratch. After searching the forums I noticed that there didn't seem to be a way to get an aging report for incidents. (How many open are 0-2 days old, 3-7 days old, etc.)

Below is what I have tried and it's not quite working yet, anyone wanna point out where I screwed up?

I created a new field called Aging Category (u_aging_category) on the incident table.

I wrote the following script as a scheduled job:

//************************ Set Aging Category **************************************

var optime = current.opened_at.getGlideObject().getNumericValue();
var nowtime = gs.nowDateTime().getGlideObject().getNumericValue();
var totalTime = nowtime - optime ;
var calculation = totalTime/1000/60/60/24;

if (calculation <= 2){
current.u_aging_category = '0-2 Days';
}
if (calculation <= 7 && calculation > 2){
current.u_aging_category = '3-7 Days';
}
if (calculation <= 14 && calculation > 7){
current.u_aging_category = '8-14 Days';
}
if (calculation <= 21 && calculation > 14){
current.u_aging_category = '15-21 Days';
}
if (calculation <= 28 && calculation > 21){
current.u_aging_category = '22-28 Days';
}
if (calculation > 28){
current.u_aging_category = '> 28 Days';
}


In theory this should update the Aging Category field when I run the job and then I can report on it using a Pivot table. Unfortunately, the field is not updating. Any quick thoughts?

1 ACCEPTED SOLUTION

Jim Coyne
Kilo Patron

I believe the problem is you are not actually querying any records, nor updating them. This is what I have done.

I have a Scheduled Job...
find_real_file.png

...that calls a function in a Script Include:


function u_updateAgingCategoryField() {
var elapsedTime = 0;
var aging = '';
var currentTimeNow = gs.nowDateTime();
var gr = new GlideRecord('incident');
gr.addEncodedQuery('u_aging_category!=>28^ORu_aging_category=');
gr.query();
while(gr.next()) {
elapsedTime = (gs.dateDiff(gr.opened_at, currentTimeNow, true)) /60/60/24;

//check to see when the item was created
if (elapsedTime <= 2) aging = '0_2';
if (elapsedTime > 2) aging = '3_7';
if (elapsedTime > 7) aging = '8_14';
if (elapsedTime > 14) aging = '15_21';
if (elapsedTime > 21) aging = '22_28';
if (elapsedTime > 28) aging = '>28';

gr.setWorkflow(false); //skip any Business Rules
gr.autoSysFields(false); //do not update system fields
gr.u_aging_category = aging;
gr.update();
}
}


Notice in the function that I am excluding incidents >28 days because we do not want to keep updating them with ">28 Days" all the time.

Now for the trick so that the Pivot Table orders the columns properly - on the Aging Category dictionary record, set the Default value to be "0_2" and the Choice field to "Dropdown without -- None --" and create some Choice entries:

find_real_file.png

Otherwise the report will sort the columns alphabetically. And so you should end up with the following report:

find_real_file.png

It is setup in https://demo23.service-now.com/ at the moment. I've also attached an update set that will re-create it for you if you do not get a change to look at demo23 today.


View solution in original post

62 REPLIES 62

Yes. Thanks for your help.


randrews
Tera Guru

Just out of curiosity,... could you have used a calculated field... and set the calculation script to set the values.. and avoided a br?


To quote a friend, Capa JC, Calculated Fields are evil!!!



Calculated fields are calculated every time a row is read, whereas the BR will only run when needed.


gyedwab
Mega Guru

Since this is a pretty problem common, I decided to demonstrate the codeless way of doing this with Explore Analytics. No code or custom fields required:


Screenshot 2014-08-21 12.57.21.png


You can see the interactive version of the published report here: Incident Aging Report



Rather than creating coded queries to calculate the categories, and loading it into a custom field, in Explore Analytics this just uses


Screenshot 2014-08-21 12.55.28.png




The other advantage is that with Explore Analytics' multi-level pivot, I could further slice and dice this (again, no code:


Screenshot 2014-08-21 12.59.15.png


mlmurphy
Kilo Contributor

Does anyone know if doing this same thing on a custom table that extends to the Task table should work? I tried it and just changed "incident" to my custom table but it doesn't see to be working, nothing gets updated.



//function u_updateAgingCategoryField() {  
  var elapsedTime = 0;  
  var aging = '';  
  var currentTimeNow = gs.nowDateTime();  
  var gr = new GlideRecord('u_online_service_request');  
  gr.addEncodedQuery('u_aging_category!=>180');
  gr.query();  
  while(gr.next()) {  
      elapsedTime = (gs.dateDiff(gr.opened_at, currentTimeNow, true)) /60/60/24;  
      //check to see when the item was created  
      if (elapsedTime <= 30) aging = '0_30';  
      if (elapsedTime > 30)   aging = '31_60';  
      if (elapsedTime > 60)   aging = '61_90';  
      if (elapsedTime > 90) aging = '91_180';  
      if (elapsedTime > 180) aging = '>180';  
       
      gr.setWorkflow(false);//skip any Business Rules  
      gr.autoSysFields(false);   //do not update system fields  
      gr.u_aging_category = aging;  
      gr.update();  
  }