- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-20-2017 03:58 PM
I have requirement to look for and ensure ALL grc_remediation items have been approved using a custom field (u_state). The value of the u_state needs to be '2' in order for the grc_observation workflow to move to the next part of the workflow.
Here is the Wait for Condition in the workflow that does not appear to be working:
<NO CONDITIONS>
<script>
//Query for all grc_remediation items to check if all are approved.
var rec = new GlideRecord('grc_remediation');
rec.addQuery('source', current.sys_id);
rec.addQuery('u_state', '2');
rec.query();
if(rec.hasNext()){//if all grc_remediation items match the query
//Continue on since all MAPs are approved.
answer = true;
//current.approval = 'approved';
//For troubleshooting purposes
var latestState = rec.u_state.getGlideObject();
gs.addInfoMessage("This is the true state: " + latestState);
}
else{
//Continue waiting since all MAPs are not approved.
answer = false;
//For troubleshooting purposes
var latestState = rec.u_state.getGlideObject();
gs.addInfoMessage("This is the false state: " + latestState);
}
What am I doing wrong?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
04-02-2017 08:00 AM
Finally figured it out and tested it many, many times. Here is what I was missing: What to do when there are no records found, at first. So, I had to create another Wait for Condition before the one you solved for me:
FIRST Wait for Condition Name: Create at Least One Record
//First, navigate to the MAP table
var gr_tsk = new GlideRecord("grc_remediation");
//Lookup only those MAPs associated with this issue
gr_tsk.addQuery('source', current.sys_id);
//Query the MAP table
gr_tsk.query();
//Iterate through the records...
if (gr_tsk.next()) {
//If there is at least one record found, then proceed forward to the next Wait for activity...
answer = true;
} else {
//If there are no records found then exit the wait for activity...
answer = false;
}
Then, here is the next Wait for Condition, based on what you (Ajit) and Joe spoke into. I realized there was one other state I need to search for, which was #4, our Closed state.
SECOND Wait for Condition Name: Remaining Record Submissions and Approvals
//First, navigate to the MAP table
var gr_tsk = new GlideRecord("grc_remediation");
//Lookup only those MAPs associated with this issue
gr_tsk.addQuery('source', current.sys_id);
//Next, look for all states that are not 2 or 4
gr_tsk.addQuery('u_state', '!=', 2);
gr_tsk.addQuery('u_state', '!=', 4);
//Query the MAP table
gr_tsk.query();
//Iterate through the records...
if (gr_tsk.next()) {
//If there is at least one record found with a state that is not 2 or 4, continue waiting...
answer = false;
} else {
//If there's no records found then exit the wait for activity...
answer = true;
}
Then, I created Joe McCarty's provided Business Rule in grc_remediation table that is performed AFTER with Update checked:
CONDITION: current.wf_activity.isNil() && current.active.changesTo(false)
Script:
function onAfter(current, previous) {
forceReqItemUpdate();
function forceReqItemUpdate() {
var wf = new Workflow();
var ri = new GlideRecord("grc_remediation");
if (ri.get(current.number)) {
wf.runFlows(ri, 'update');
}
}
}
All is now right in the world (or at least mine).
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-21-2017 06:15 PM
I tried this and the workflow skips right on by the Wait for Condition, each time. The while loop, while not ideal, is working.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-22-2017 11:20 AM
Rhett,
did u try with multiple grc_remediation items? it may fail for multiple items. are u trying this on your personal instance? can u share the url?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-23-2017 08:55 AM
I apologize, you are correct, part of my requirement that I did not clearly state at the start is that there can be multiple items in the grc_remediation table that are tied to one item in the grc_observation table. This is what ended up working for me and if there is a better way, please let me know:
//Query for all MAPs to check if all are approved.
var gr = new GlideRecord('grc_remediation');
gr.addQuery('source', current.sys_id);
gr.query();//For troubleshooting purposes
//gs.addInfoMessage("Query Response: " + gr.u_state);
while (gr.next()) {
if (gr.u_state != '2') {
answer = false;
} else {
answer = true;
}
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-23-2017 11:46 AM
Rhett,
again, i think the above code may fail for multiple items. if you are doing this on your personal instance share the url, i will check.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
03-23-2017 02:10 PM
I am not doing this in a personal instance, but I will set one up and let you know the URL.