- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-01-2018 11:10 AM
So, I've tried to piece together scripts that I've used before for this but could really use some help.
On a Change [change_request], there is a field [u_business_service_ci] that references one or many CMDB Business Services [cmdb_ci_service]. A Business Service is then related to one or more Servers [cmdb_ci_server] through the CI Relationship table [cmdb_rel_ci] (Parent is [cmdb_ci_service], Type is [Owns::Owned by], Child is [cmdb_ci_server]). On the referenced Servers, there is a True/False field called SOX Report Related [u_sox_report_related]. When a Change is submitted, on the workflow I need an If activity script that checks through all of the Change --> Business Services --> Servers to see if that checkbox is present for at least one and return true.
This is what I've came up with but to no surprise it isn't working. Any ideas?
answer = ifScript();
function ifScript() {
var result = false;
var list = current.u_business_service_ci.toString();
var listArr = list.split(',');
for (var key in listArr) {
var bsci = new GlideRecord('cmdb_ci_service');
if (bsci.get(listArr[key])) {
var rel = new GlideRecord('cmdb_rel_ci');
rel.addQuery('parent', bsci.getUniqueValue());
rel.addQuery('type.name', "Owns::Owned by");
rel.addQuery('parent.sys_class_name', "cmdb_ci_service");
rel.query();
var ciIds = [];
if (rel.get(listArr[ciIds])) {
var srv = new GlideRecord('cmdb_ci_server');
if (srv.u_sox_report_related) {
return true;
}
}
return result;
}
}
}
Solved! Go to Solution.
- Labels:
-
Scripting and Coding

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-02-2018 03:41 PM
I think, I got this, we are returning the result within for loop that's why, i believe return will break the for loop, can we put the return result outside of for loop and try.
answer = ifScript();
function ifScript() {
var result = false;
var list = current.u_business_service_ci.toString();
gs.log('****** Business Services List **** : ' + list);
var listArr = list.split(',');
for (var key=0; key < listArr.length; key++) {
var bsci = new GlideRecord('cmdb_ci_service');
if (bsci.get(listArr[key])) {
var rel = new GlideRecord('cmdb_rel_ci');
rel.addQuery('parent', bsci.getUniqueValue());
rel.addQuery('type.name', "Owns::Owned by");
rel.query();
while(rel.next()){
var srv = new GlideRecord('cmdb_ci_win_server');
if(srv.get('sys_id', rel.child)){
if (srv.u_sox_report_related)
return true;
}
}
}
}
return result;
}

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-02-2018 03:41 PM
I think, I got this, we are returning the result within for loop that's why, i believe return will break the for loop, can we put the return result outside of for loop and try.
answer = ifScript();
function ifScript() {
var result = false;
var list = current.u_business_service_ci.toString();
gs.log('****** Business Services List **** : ' + list);
var listArr = list.split(',');
for (var key=0; key < listArr.length; key++) {
var bsci = new GlideRecord('cmdb_ci_service');
if (bsci.get(listArr[key])) {
var rel = new GlideRecord('cmdb_rel_ci');
rel.addQuery('parent', bsci.getUniqueValue());
rel.addQuery('type.name', "Owns::Owned by");
rel.query();
while(rel.next()){
var srv = new GlideRecord('cmdb_ci_win_server');
if(srv.get('sys_id', rel.child)){
if (srv.u_sox_report_related)
return true;
}
}
}
}
return result;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-02-2018 03:51 PM
That was it! Awesome. So the last piece... any idea on the Server - cmdb_ci_win_server vs cmdb_ci_server?

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-02-2018 04:56 PM
I was trying to get the relation between cmdb_ci_win_server and cmdb_ci_server server, I can see cmdb_ci_win_server extends from cmdb_ci_server table. We can do dotwalking to parent table (cmdb_ci_server) from child table (cmdb_ci_win_server) using dr_backup field to access the parent table fields but doesn't seems it it's possible visa-versa. So, i believe we need to have a GlideRecord query on cmdb_ci_win_server table.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-05-2018 06:27 AM
Hi Jon,
Please mark the answer correct if it answered your query. Let us know in case of further help.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
‎02-01-2018 01:39 PM
Can you make
line 19 to
result = true; instead of return true;
and line 18 to if (srv.u_sox_report_related == 'true')
Thanks
Anil