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.

Business rule current.field not working

Bob Bobberson
Kilo Contributor

For a business rule why does current.field = "any string" not actually update the field to that string even if a condition is met.

Here is my script, I have debugged it and it reaches current.u_empty = "false"; but it does not actually set the value to "false" it just leaves it at undefined.

(function executeRule(current, previous /*null when async*/) {
	
	var gr = new GlideRecord("cmdb_ci_business_app");
	
	gr.query();
	
	while(gr.next()) {
		
		var fields = gr.getFields();
		
		for(var i = 0; i < fields.size(); i++) {
			
			var ge = fields.get(i);
			
			if(ge.nil()) {

				current.u_empty = "true";
				break;

			} else {

				current.u_empty = "false";
			
			}
		}
	}
})(current, previous);
1 ACCEPTED SOLUTION

Hi,

for some field it must be going to if and hence keeping it true

can you try this and check once

(function executeRule(current, previous /*null when async*/) {

	var flag = false;
	var field;

	var gr = new GlideRecord("cmdb_ci_business_app");
	//no need for any specific filters here.
	gr.query();
	while(gr.next()) {

		var fields = gr.getFields();
		for(var i = 0; i < fields.size() - 1; i++) {
			var ge = fields.get(i);
			var descriptor = gr.getED();
			var fieldName = descriptor.getName();

			var fieldValue = gr[fieldName].getDisplayValue();
			if(!fieldName.startsWith('sys')){
				if(fieldValue.nil()) {
					flag = true;
					field = fieldName;
					break;

				} else {
					flag = false;
				}
			}
		}
	}

	if(flag){
		gs.info('Field ' + field);
		current.setValue('u_new', true);
	}
	else{
		current.setValue('u_new', false);
	}

})(current, previous);

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

View solution in original post

22 REPLIES 22

I tried your suggestion and it now changes to true when it detects an empty field, but it does not change back to false when I fill all the empty fields in. When I debugged again there was an undefined value that came up during the loop and I am unsure which field this is how can I check what this undefined field is?

Here is my code now: 

(function executeRule(current, previous /*null when async*/) {
	
	var gr = new GlideRecord("cmdb_ci_business_app");
	
	gr.query();
	
	while(gr.next()) {
		
		var fields = gr.getFields();
		
		for(var i = 0; i < fields.size() - 1; i++) {
			
			var ge = fields.get(i);
			
                        //check if field is empty
			if(ge.nil()) {
				current.setValue('u_empty', true);
				break;
			} else {
				current.setValue('u_empty', false);
			
			}
		}
		
	}
	
})(current, previous);

@Bob Bobberson 

Thank you for marking my response as helpful.

Did it work fine?

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

Yes, the BR sets empty to true once there is an empty field in a record, but after you fill out the fields it does not set it back to false. When I debugged it I found there was still a undefined field but I went through and filled everything so I am unsure what is undefined I think it might be the Tags fields, but I dont know how to get rid of that since it does not show up in the dictionary.

Here is my code as of now

(function executeRule(current, previous /*null when async*/) {
	
	var gr = new GlideRecord("cmdb_ci_business_app");
	
	//no need for any specific filters here.
	gr.query();
	
	while(gr.next()) {
		
		var fields = gr.getFields();
		
		for(var i = 0; i < fields.size() - 1; i++) {
			
				var ge = fields.get(i);
	
				}
				if(ge.nil()) {
					current.setValue('u_new', true);

					break;
				} else {
					current.setValue('u_new', false);
				}
			}
		}
	
})(current, previous);

Hi,

update as this; you can exclude whichever fields you wish to

(function executeRule(current, previous /*null when async*/) {

    var gr = new GlideRecord("cmdb_ci_business_app");
    //no need for any specific filters here.
    gr.query();
    while(gr.next()) {

        var fields = gr.getFields();
        for(var i = 0; i < fields.size() - 1; i++) {
            var ge = fields.get(i);
            var descriptor = gr.getED();
            var fieldName = descriptor.getName();
            if(fieldName!= 'sys_tags'){
                if(ge.nil()) {
                    current.setValue('u_new', true);
                    break;
                } else {
                    current.setValue('u_new', false);
                }
            }
        }
    }

})(current, previous);

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader

@Bob Bobberson 

If you wish to skip all system fields which starts with sys_ then you can do this

(function executeRule(current, previous /*null when async*/) {

    var gr = new GlideRecord("cmdb_ci_business_app");
    //no need for any specific filters here.
    gr.query();
    while(gr.next()) {

        var fields = gr.getFields();
        for(var i = 0; i < fields.size() - 1; i++) {
            var ge = fields.get(i);
            var descriptor = gr.getED();
            var fieldName = descriptor.getName();
            if(!fieldName.startsWith('sys')){
                if(ge.nil()) {
                    current.setValue('u_new', true);
                    break;
                } else {
                    current.setValue('u_new', false);
                }
            }
        }
    }

})(current, previous);

Regards
Ankur

Regards,
Ankur
✨ Certified Technical Architect  ||  ✨ 9x ServiceNow MVP  ||  ✨ ServiceNow Community Leader