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.

Most efficient glide query to get change requests affecting a specific ci

Tim D Scott
Giga Guru

Hi All,

 

I need to create a glidequery that takes a CI as a parameter and returns an array of change requests where the CI is specified in the impacted and/or affected tabs (so ci_item & task_cmdb_ci_service tables).

 

I haven't done much in the change request area, has anyone got any advice on the best (and most performant) method to do this?

 

Thanks,

Tim.

 

1 ACCEPTED SOLUTION

Sandeep Rajput
Tera Patron
Tera Patron

@Tim D Scott Please see if the following script help.

 

function getChangeRequestsForCI(ciSysId) {
    var changeRequests = [];

    // Query change_request table for direct CI impact (ci_item)
    var grChangeRequest = new GlideRecord('change_request');
    grChangeRequest.addQuery('ci_item', ciSysId);
    grChangeRequest.query();
    while (grChangeRequest.next()) {
        changeRequests.push(grChangeRequest.sys_id.toString());
    }

    // Query task_cmdb_ci_service table for affected CIs linked to tasks
    var grTaskCmdbCiService = new GlideRecord('task_cmdb_ci_service');
    grTaskCmdbCiService.addQuery('ci_item', ciSysId);
    grTaskCmdbCiService.query();
    while (grTaskCmdbCiService.next()) {
        var taskSysId = grTaskCmdbCiService.task.sys_id.toString();

        // Check if the task is a change request
        var grTask = new GlideRecord('task');
        if (grTask.get(taskSysId) && grTask.sys_class_name == 'change_request') {
            if (!changeRequests.includes(taskSysId)) {
                changeRequests.push(taskSysId);
            }
        }
    }

    return changeRequests;
}

// Example usage
var ciSysId = 'your_ci_sys_id_here';
var changeRequests = getChangeRequestsForCI(ciSysId);
gs.info('Change Requests: ' + changeRequests);

View solution in original post

2 REPLIES 2

Sandeep Rajput
Tera Patron
Tera Patron

@Tim D Scott Please see if the following script help.

 

function getChangeRequestsForCI(ciSysId) {
    var changeRequests = [];

    // Query change_request table for direct CI impact (ci_item)
    var grChangeRequest = new GlideRecord('change_request');
    grChangeRequest.addQuery('ci_item', ciSysId);
    grChangeRequest.query();
    while (grChangeRequest.next()) {
        changeRequests.push(grChangeRequest.sys_id.toString());
    }

    // Query task_cmdb_ci_service table for affected CIs linked to tasks
    var grTaskCmdbCiService = new GlideRecord('task_cmdb_ci_service');
    grTaskCmdbCiService.addQuery('ci_item', ciSysId);
    grTaskCmdbCiService.query();
    while (grTaskCmdbCiService.next()) {
        var taskSysId = grTaskCmdbCiService.task.sys_id.toString();

        // Check if the task is a change request
        var grTask = new GlideRecord('task');
        if (grTask.get(taskSysId) && grTask.sys_class_name == 'change_request') {
            if (!changeRequests.includes(taskSysId)) {
                changeRequests.push(taskSysId);
            }
        }
    }

    return changeRequests;
}

// Example usage
var ciSysId = 'your_ci_sys_id_here';
var changeRequests = getChangeRequestsForCI(ciSysId);
gs.info('Change Requests: ' + changeRequests);

Hi Sandeep,

 

Thanks for this, I got it working, but ci_item seems to be the wrong field for the queries. I changed the first reference to cmdb_ci and the second to cmdb_ci_service. I also added some queries on the state fields, which was an additional requirement.

 

Thanks for getting me started!

function getChangeRequestsForCI(ciSysId) {
    var changeRequests = [];

    // Query change_request table for direct CI impact (ci_item)
    var grChangeRequest = new GlideRecord('change_request');
    grChangeRequest.addQuery('cmdb_ci', ciSysId);
	grChangeRequest.addQuery('state',-1).addOrCondition('state',0);
    grChangeRequest.query();
    while (grChangeRequest.next()) {
        changeRequests.push(grChangeRequest.sys_id.toString());
    }

    // Query task_cmdb_ci_service table for affected CIs linked to tasks
    var grTaskCmdbCiService = new GlideRecord('task_cmdb_ci_service');
    grTaskCmdbCiService.addQuery('cmdb_ci_service', ciSysId);
    grTaskCmdbCiService.query();
    while (grTaskCmdbCiService.next()) {
        var taskSysId = grTaskCmdbCiService.task.sys_id.toString();
        // Check if the task is a change request
        var grTask = new GlideRecord('task');
        if (grTask.get(taskSysId) && grTask.sys_class_name == 'change_request' && (grTask.state == -1 || grTask.state == 0)) {
            if (!changeRequests.includes(taskSysId)) {
                changeRequests.push(taskSysId);
            }
        }
    }

    return changeRequests;
}