I
had a request from a client recently to generate a random list of records from a given table (specifically the Configuration Item table). These items would be used as a pool of records for a random audit of the records in that table. I don’t think this will be used all that often but I figured I’d throw it out here so that people could use it if they needed it. Here’s the code…
Return Random Records Script
This script is set up to return an array containing the names of 5 randomly-selected records from the ‘cmdb_ci’ table. You can set the ‘tbl’ and ‘returnNum’ variables to customize the number of records and the table to query from. You may also choose to modify the GlideRecord query to limit the scope of the query.
This script is set up to return an array containing the names of 5 randomly-selected records from the ‘cmdb_ci’ table. You can set the ‘tbl’ and ‘returnNum’ variables to customize the number of records and the table to query from. You may also choose to modify the GlideRecord query to limit the scope of the query.
var tbl = 'cmdb_ci'; //Query from this table
var returnNum = 5; //Return this number of records in the array
var answer = new Array();
//Set up the GlideRecord query
var rec = new GlideRecord(tbl);
rec.query();
if(rec.hasNext()){
//Get the number of records queried
var numRecs = rec.getRowCount();
//Ensure number of records is not less than number to return
if(numRecs < returnNum){
returnNum = numRecs;
}
//Return 'returnNum' number of random records in an array
for(i=0; i < returnNum; i++){
//Get a random number between 0 and 'numRecs'
var randomNumber = Math.floor(Math.random()*numRecs);
//Set the row number to 'randomNumber'
rec.setLocation(randomNumber);
//Add the random record to the array
answer.push(rec.getDisplayValue().toString());
}
}
gs.log(answer.join()); //Log the output
return answer; //Return the array
var returnNum = 5; //Return this number of records in the array
var answer = new Array();
//Set up the GlideRecord query
var rec = new GlideRecord(tbl);
rec.query();
if(rec.hasNext()){
//Get the number of records queried
var numRecs = rec.getRowCount();
//Ensure number of records is not less than number to return
if(numRecs < returnNum){
returnNum = numRecs;
}
//Return 'returnNum' number of random records in an array
for(i=0; i < returnNum; i++){
//Get a random number between 0 and 'numRecs'
var randomNumber = Math.floor(Math.random()*numRecs);
//Set the row number to 'randomNumber'
rec.setLocation(randomNumber);
//Add the random record to the array
answer.push(rec.getDisplayValue().toString());
}
}
gs.log(answer.join()); //Log the output
return answer; //Return the array
Where would I put this script? I created a business rule on the cmdb_ci table but it doesn’t seem to do anything. I appreciate your help.
That depends entirely on what you want to do with the output of the script. As a general rule, you would want to store the script in the place where you trigger the action for the script to execute. A business rule probably isn’t the right place for most use cases I can think of because that runs when a particular record is inserted or updated to the database. A scheduled job or something similar probably makes more sense but it really depends on what you are trying to accomplish.
I am running this script in a scoped application and receiving the following: Function setLocation is not allowed in scope. Any Suggestions?
Hi Tyrone,
There are several Glide methods that are not supported in Scoped Applications. You can learn more about APIs for scoped apps by going to https://developer.servicenow.com and clicking the API menu.
Dear Jim
Can you be a bit more specific on that?
I am having the problem that some script include that I call from a dynamic filter that used to run on Helsinki no longer runs on Istanbul.
(It runs just fine in a background script). I have a feeling, we have exactly this problem (that we call a function that is not allowed from a scoped application and somehow dynamic filters are now treated like a scoped application).
Service Now could not figure it out yet…
Best
Daniel
Dear Mark,
this is cool code, thanks!
One small thing tough: I think you haven an off-by-1 isssue in the code.
You will have records from 0 to numRecs-1 and not to numRecs.
The problem is unlikely to occur (when the Random Number Generator returns 1), but I think you should account for it.
Best
Daniel