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