The Zurich release has arrived! Interested in new features and functionalities? Click here for more

Unable to update field using After Insert Business Rule

Vijay Kumar4
Mega Guru
(function executeRule(current, previous /*null when async*/ ) {
        var cardOrderSysId = '00078ubc95uc10sf7bd4bcbed';

        gs.addInfoMessage('Catalog Item: ' + current.cat_item.toString());
        if (current.cat_item.toString() !== cardOrderSysId) {
            return;
        }

        var tinNumber = current.variables.u_tin;
        var memberNumber = current.variables.u_member_number;

        if (!tinNumber && !memberNumber) {
            return;
        }

        var existingReqItem = new GlideRecord('sc_req_item');
        existingReqItem.addQuery('cat_item', cardOrderSysId);
        existingReqItem.addQuery('sys_id', '!=', current.sys_id);
        if (tinNumber) {
            existingReqItem.addQuery('u_tin', tinNumber);
        }
        if (memberNumber) {
            existingReqItem.addQuery('u_member_number', memberNumber);
        }
        existingReqItem.query();

        if (existingReqItem.next()) {
            gs.addInfoMessage('Duplicate Request Found: ' + existingReqItem.request.number);

            var requestId = current.getValue('request');
            gs.addInfoMessage('Request ID: ' + requestId);

           
            var req = new GlideRecord('sc_request');
            req.addQuery('sys_id', requestId);


            req.query();
			gs.addInfoMessage('req.query(): ' + req.query());
            while (req.next())

            {
                gs.addInfoMessage('Request Record Found: ' + req.number);

                req.u_isduplicate = true;
                req.u_reference_ticket_number = existingReqItem.request.number;
                req.special_instructions = 'Duplicate detected';

                req.update();

            }
		}
        })(current, previous);

VijayKumar4_0-1742797462386.png

Above is my After Insert Business Rule, designed to update a checkbox and a text field. The script checks if a new request contains a Member Number or TIN that already exists in a previous request. If a match is found, the existing request number is fetched, updated in the new request, and a flag is set. I have added logs to debug the issue, and the values and sys_ids are retrieved correctly, but the fields are not updating. I have also tried the before insert.
Iam getting the currect sysid in:

 gs.addInfoMessage('Request ID: ' + requestId);
But "
gs.addInfoMessage('req.query(): ' + req.query());" in this log Iam getting undefined and it does not going to 
while (req.next())


Could you please provide a solution?




1 ACCEPTED SOLUTION

@Vijay Kumar4 

so it means it's not able to query sc_Request table with that sysId

Did you check that sysId is correct REQ sysId?

Any query business rule on sc_request is blocking?

Why are you querying sc_request? you can simply get the GlideRecord object using this line

var req = current.request.getRefRecord();

update as this and check

(function executeRule(current, previous /*null when async*/ ) {
        var cardOrderSysId = '00078ubc95uc10sf7bd4bcbed';

        gs.addInfoMessage('Catalog Item: ' + current.cat_item.toString());
        if (current.cat_item.toString() !== cardOrderSysId) {
            return;
        }

        var tinNumber = current.variables.u_tin;
        var memberNumber = current.variables.u_member_number;

        if (!tinNumber && !memberNumber) {
            return;
        }

        var existingReqItem = new GlideRecord('sc_req_item');
        existingReqItem.addQuery('cat_item', cardOrderSysId);
        existingReqItem.addQuery('sys_id', '!=', current.sys_id);
        if (tinNumber) {
            existingReqItem.addQuery('u_tin', tinNumber);
        }
        if (memberNumber) {
            existingReqItem.addQuery('u_member_number', memberNumber);
        }
        existingReqItem.query();

        if (existingReqItem.next()) {
            gs.addInfoMessage('Duplicate Request Found: ' + existingReqItem.request.number);

            var requestId = current.getValue('request');
            gs.addInfoMessage('Request ID: ' + requestId);

            var req = current.request.getRefRecord();
            gs.addInfoMessage('Request Record Found: ' + req.number);

            req.u_isduplicate = true;
            req.u_reference_ticket_number = existingReqItem.request.number;
            req.special_instructions = 'Duplicate detected';

            req.update();
        } else {
            gs.addInfoMessage('No matching request record found.');
        }
    }
})(current, previous);

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

View solution in original post

5 REPLIES 5

Nilesh Pol
Tera Guru

@Vijay Kumar4 

Try below updated script:

(function executeRule(current, previous /*null when async*/) {
var cardOrderSysId = '00078ubc95uc10sf7bd4bcbed';

// Log the catalog item to verify
gs.addInfoMessage('Catalog Item: ' + current.cat_item.toString());

// If the catalog item does not match the cardOrderSysId, exit the rule
if (current.cat_item.toString() !== cardOrderSysId) {
return;
}

var tinNumber = current.variables.u_tin;
var memberNumber = current.variables.u_member_number;

// If neither TIN nor Member Number is present, exit the rule
if (!tinNumber && !memberNumber) {
return;
}

// Query the sc_req_item table to find existing items with the same catalog item, TIN, or Member Number
var existingReqItem = new GlideRecord('sc_req_item');
existingReqItem.addQuery('cat_item', cardOrderSysId);
existingReqItem.addQuery('sys_id', '!=', current.sys_id); // Avoid matching the current request item
if (tinNumber) {
existingReqItem.addQuery('u_tin', tinNumber);
}
if (memberNumber) {
existingReqItem.addQuery('u_member_number', memberNumber);
}
existingReqItem.query();

// If an existing request item is found, process it
if (existingReqItem.next()) {
gs.addInfoMessage('Duplicate Request Found: ' + existingReqItem.request.number);

// Get the request ID from the current record
var requestId = current.getValue('request');
gs.addInfoMessage('Request ID: ' + requestId);

// Ensure the requestId is not empty or invalid
if (!requestId) {
gs.error('Request ID is empty or invalid.');
return;
}

// Query the sc_request table to find the request record based on sys_id
var req = new GlideRecord('sc_request');
req.addQuery('sys_id', requestId); // Make sure this matches the correct sys_id of the request
req.query();

// Check if a record is returned from the query
if (req.next()) {
gs.addInfoMessage('Request Record Found: ' + req.number);

// Update the request record with the duplicate information
req.u_isduplicate = true;
req.u_reference_ticket_number = existingReqItem.request.number;
req.special_instructions = 'Duplicate detected';

// Save the updated record
req.update();
gs.addInfoMessage('Request Record Updated: ' + req.number);
} else {
gs.addInfoMessage('No matching request found for sys_id: ' + requestId);
}
}
})(current, previous);

Ankur Bawiskar
Tera Patron
Tera Patron

@Vijay Kumar4 

try this and share what came in logs?

I assume field "u_member_number" on RITM table and variable "u_member_number" are of same type?

are you sure variable name "u_member_number" is correct? what's the type of variable? share screenshots

If it's not a variable then update this line, I haven't updated that in my below script.

    var memberNumber = current.u_member_number;
(function executeRule(current, previous /*null when async*/) {
    var cardOrderSysId = '00078ubc95uc10sf7bd4bcbed';

    gs.addInfoMessage('Catalog Item: ' + current.cat_item.toString());
    if (current.cat_item.toString() !== cardOrderSysId) {
        return;
    }

    var tinNumber = current.variables.u_tin;
    var memberNumber = current.variables.u_member_number;

    if (!tinNumber && !memberNumber) {
        return;
    }

    var existingReqItem = new GlideRecord('sc_req_item');
    existingReqItem.addQuery('cat_item', cardOrderSysId);
    existingReqItem.addQuery('sys_id', '!=', current.sys_id);
    if (tinNumber) {
        existingReqItem.addQuery('u_tin', tinNumber);
    }
    if (memberNumber) {
        existingReqItem.addQuery('u_member_number', memberNumber);
    }
    existingReqItem.query();

    if (existingReqItem.next()) {
        gs.addInfoMessage('Duplicate Request Found: ' + existingReqItem.request.number);

        var requestId = current.getValue('request');
        gs.addInfoMessage('Request ID: ' + requestId);

        var req = new GlideRecord('sc_request');
        req.addQuery('sys_id', requestId);
        req.query();

        if (req.next()) {
            gs.addInfoMessage('Request Record Found: ' + req.number);

            req.u_isduplicate = true;
            req.u_reference_ticket_number = existingReqItem.request.number;
            req.special_instructions = 'Duplicate detected';

            req.update();
        } else {
            gs.addInfoMessage('No matching request record found.');
        }
    }
})(current, previous);

If my response helped please mark it correct and close the thread so that it benefits future readers.

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

@Ankur Bawiskar 
VijayKumar4_0-1742798512554.png

Please check the log values.

u_member_number and u_tin tin are in RITM table and that those are encrypted fields:

VijayKumar4_1-1742798891260.png

 

 

@Vijay Kumar4 

so it means it's not able to query sc_Request table with that sysId

Did you check that sysId is correct REQ sysId?

Any query business rule on sc_request is blocking?

Why are you querying sc_request? you can simply get the GlideRecord object using this line

var req = current.request.getRefRecord();

update as this and check

(function executeRule(current, previous /*null when async*/ ) {
        var cardOrderSysId = '00078ubc95uc10sf7bd4bcbed';

        gs.addInfoMessage('Catalog Item: ' + current.cat_item.toString());
        if (current.cat_item.toString() !== cardOrderSysId) {
            return;
        }

        var tinNumber = current.variables.u_tin;
        var memberNumber = current.variables.u_member_number;

        if (!tinNumber && !memberNumber) {
            return;
        }

        var existingReqItem = new GlideRecord('sc_req_item');
        existingReqItem.addQuery('cat_item', cardOrderSysId);
        existingReqItem.addQuery('sys_id', '!=', current.sys_id);
        if (tinNumber) {
            existingReqItem.addQuery('u_tin', tinNumber);
        }
        if (memberNumber) {
            existingReqItem.addQuery('u_member_number', memberNumber);
        }
        existingReqItem.query();

        if (existingReqItem.next()) {
            gs.addInfoMessage('Duplicate Request Found: ' + existingReqItem.request.number);

            var requestId = current.getValue('request');
            gs.addInfoMessage('Request ID: ' + requestId);

            var req = current.request.getRefRecord();
            gs.addInfoMessage('Request Record Found: ' + req.number);

            req.u_isduplicate = true;
            req.u_reference_ticket_number = existingReqItem.request.number;
            req.special_instructions = 'Duplicate detected';

            req.update();
        } else {
            gs.addInfoMessage('No matching request record found.');
        }
    }
})(current, previous);

If my response helped please mark it correct and close the thread so that it benefits future readers.

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