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.

on submit client script

tushar_ghadage
Tera Contributor

Hi All, 

if some tries to resolve (using an Ui action) the problem record and if there are open problem task records, I want to restrict that and keep the state in fix in progress state only.

 

I am trying this using on submit client script and not business rule because when I try to resolve it state will temporarily move to resolve state but when I refresh it, it will move back to fix in progress. and I don't want that. nor did the client. 

 

so here is the script below -

client script - on submit 

function onSubmit() {
    // Check if state is changing to "Resolved"
    var state = g_form.getValue('state');
    if (state == '106') {
        var problemSysId = g_form.getUniqueValue();

        var ga = new GlideAjax('CheckOpenProblemTasks');
        ga.addParam('sysparm_name', 'hasOpenTasks');
        ga.addParam('sysparm_problem_sys_id', problemSysId);

        ga.getXMLAnswer(function(response) {
            if (response === 'true') {
                g_form.addErrorMessage('There are active Problem Tasks. These need to be closed before resolving the Problem');
                return false;
            } else {
                return true;
            }
        });

        //return false; // Stop default submit until GlideAjax completes
    }

    return true; // Allow submit if not resolving
}
 
script include - 
var CheckOpenProblemTasks = Class.create();
CheckOpenProblemTasks.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    hasOpenTasks: function() {
        var problemSysId = this.getParameter('sysparm_problem_sys_id');
        var gr = new GlideRecord('problem_task');
        gr.addQuery('problem',current.getUniqueValue());
        gr.addActiveQuery(true);
        gr.query();

        if (gr.hasNext()) {
            return 'true';
        }
        return 'false';
    }
}); 
 
but here something seems to be missing as when I try to resolve the problem even when there are active p Task it will get resolved and state will move ahead.
 
please do correct ..
 
thanks 
14 REPLIES 14

GlideFather
Tera Patron

Hi @tushar_ghadage,

 

have you heard of State flows?

 

You can create a state flow on problem table and apply the conditions to restrict the state change if child records are still open.

 

GlideFather_0-1763549492075.png

 

 

If you encountered the situation when State was changed to Resolved and then after reload it was moved back to In Progress, it seems that your BR was after (the code happened after the update was written to the database), perhaps if you re-test it again with before BR that could do the trick...

———
/* If my response wasn’t a total disaster ↙️ drop a Kudos or Accept as Solution ↘️ Cheers! */


actually, it was before update Br and also, I tried with changing the ordering of Br but did not seem to work.

 

Sarthak Kashyap
Mega Sage

Hi @tushar_ghadage ,

 

I don't think you can use GlideAjax on OnSubmit Client script, because it will cause issue when sending back the data to client script

 

Instead of that you can use Before BR on problem table 

 

var gr = new GlideRecord('problem_task');
gr.addQuery('problem', current.sys_id);
gr.addActiveQuery();
gr.query();

if (gr.hasNext()) {
        gs.addErrorMessage('Cannot resolve Problem. There are active Problem Tasks that must be closed first.');
        current.setAbortAction(true); 
}

 

Please mark my answer correct and helpful if this works for you

Thanks and Regards,

Sarthak

 

 

Result

 

When trying to close problem but having open problem task

 

SarthakKashyap_0-1763549956697.png

Please mark my answer correct and helpful if this works for you

Thanks and Regards,

Sarthak