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.

Error in Business rule displaying the same sys_id

mregragui_ext
Tera Contributor
This is my BR when displaying the array of compnay i am having expected result here is the log 
array of company  FRPA88,C023
but when trying to get the sys_id like in the code i am getting diplicated sys_id of the first company 
Company to display : cd0a95371b1ef07206ea0ce54bcb58,cd0a95371b1ef07206ea0ce54bcb58
 
 
(function executeRule(current, previous /*null when async*/ ) {

 

    // Add your code here
    var hrScopeManagementService = [];
    var departmentService = [];
    var hrLegalCompany = [];
    var legalCompany = [];

 

    var hrScopeManagement = new GlideRecord("u_hr_scope_mgmt");
    hrScopeManagement.addEncodedQuery("u_user=" + gs.getUserID());
    hrScopeManagement.query();
    while (hrScopeManagement.next()) {
        hrScopeManagementService.push(hrScopeManagement.u_services.toString());
        hrLegalCompany.push(hrScopeManagement.u_legal_entities.toString());
    }
    gs.info('array of departement' + hrScopeManagementService.toString() );
    gs.info('array of company' + hrLegalCompany.toString() );

 

    //Department or service
    var department = new GlideRecord("cmn_department");
    department.addEncodedQuery("idIN" + hrScopeManagementService);
    department.query();
    while (department.next()) {
        departmentService.push(department.sys_id);
    }
    //Company or legal entity
    var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany);
    company.query();
    while (company.next()) {
        legalCompany.push(company.sys_id);
    }
    // Now filter HR Profiles
    current.addEncodedQuery("user.department.sys_idIN"+departmentService.join(",")+'^ORu_etablissement_juridique.sys_idIN'+legalCompany.join(",")); // Apply
    // Log result
    gs.info("department to display : "+ departmentService.join(","));
    gs.info("Company to display : "+ legalCompany.join(","));

 

})(current, previous);
 
This is my BR when displaying the array of compnay i am having expected result here is the log 
array of company  FRPA88,C023
but when trying to get the sys_id like in the code i am getting diplicated sys_id of the first company 
 
3 ACCEPTED SOLUTIONS

Brad Bowman
Kilo Patron
Kilo Patron

Any time you use a sys_id in a GlideRecord, you need to force it .toString() or use getValue so that you don't retrieve the position in memory, which will result in an array of the same sys_id in this case:

departmentService.push(department.getValue('sys_id'));

View solution in original post

Ankur Bawiskar
Tera Patron
Tera Patron

@mregragui_ext 

try this

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

    // Add your code here
    var hrScopeManagementService = [];
    var departmentService = [];
    var hrLegalCompany = [];
    var legalCompany = [];

    var hrScopeManagement = new GlideRecord("u_hr_scope_mgmt");
    hrScopeManagement.addEncodedQuery("u_user=" + gs.getUserID());
    hrScopeManagement.query();
    while (hrScopeManagement.next()) {
        hrScopeManagementService.push(hrScopeManagement.u_services.toString());
        hrLegalCompany.push(hrScopeManagement.u_legal_entities.toString());
    }
    gs.info('array of department: ' + hrScopeManagementService.toString());
    gs.info('array of company: ' + hrLegalCompany.toString());

    // Department or service
    var department = new GlideRecord("cmn_department");
    department.addEncodedQuery("idIN" + hrScopeManagementService.join(','));
    department.query();
    while (department.next()) {
        departmentService.push(department.sys_id.toString());
    }

    // Company or legal entity
    var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany.join(','));
    company.query();
    while (company.next()) {
        legalCompany.push(company.sys_id.toString());
    }

    // Now filter HR Profiles
    current.addEncodedQuery("user.department.sys_idIN" + departmentService.join(",") + '^ORu_etablissement_juridique.sys_idIN' + legalCompany.join(","));
    
    // Log result
    gs.info("department to display: " + departmentService.join(","));
    gs.info("Company to display: " + legalCompany.join(","));

})(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

Vishal Jaswal
Giga Sage
Giga Sage

Hello @mregragui_ext 

Here is the correction to be made:

   var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany.join(","));
    company.query();
    while (company.next()) {
        var sysId = company.sys_id.toString();
        if (legalCompany.indexOf(sysId) === -1) { // Prevent duplicates
            legalCompany.push(sysId);
        }
    }



Here is the updated background script (always recommended to test code in Background script first and then later in Business Rule)

var hrScopeManagementService = [];
var hrLegalCompany = [];
var departmentService = [];
var legalCompany = [];
// Query u_hr_scope_mgmt table to get u_services and lu_legal_entities for the logged in user

var hrScopeManagement = new GlideRecord("u_hr_scope_mgmt");
hrScopeManagement.addEncodedQuery("u_user=" + gs.getUserID());
hrScopeManagement.query();
while (hrScopeManagement.next()) {
    hrScopeManagementService.push(hrScopeManagement.u_services.toString());
    hrLegalCompany.push(hrScopeManagement.u_legal_entities.toString());
}

// Log retrieved values for debugging
gs.info('Array of department services: ' + hrScopeManagementService.join(","));
gs.info('Array of company IDs: ' + hrLegalCompany.join(","));

// Ensure the array is correctly formatted for the encoded query
if (hrLegalCompany.length > 0) {
    var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany.join(",")); // Query based on IDs
    company.query();
    while (company.next()) {
        var sysId = company.sys_id.toString();
        if (legalCompany.indexOf(sysId) === -1) { // Prevent duplicates
            legalCompany.push(sysId);
        }
    }
}

// Ensure the array is correctly formatted for the encoded query
if (hrScopeManagementService.length > 0) {
    var department = new GlideRecord("cmn_department");
    department.addEncodedQuery("idIN" + hrScopeManagementService.join(","));
    department.query();
    while (department.next()) {
        var sysId = department.sys_id.toString();
        if (departmentService.indexOf(sysId) === -1) { // Prevent duplicates
            departmentService.push(sysId);
        }
    }
}

// Log results

gs.info("Unique Department Sys IDs: " + departmentService.join(","));
gs.info("Unique Company Sys IDs: " + legalCompany.join(",")); 

 
Results:

VishalJaswal_0-1742490342186.png


Here is the correct version of your Business Rule:

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


    // Add your code here
    var hrScopeManagementService = [];
    var departmentService = [];
    var hrLegalCompany = [];
    var legalCompany = [];


    var hrScopeManagement = new GlideRecord("u_hr_scope_mgmt");
    hrScopeManagement.addEncodedQuery("u_user=" + gs.getUserID());
    hrScopeManagement.query();
    while (hrScopeManagement.next()) {
        hrScopeManagementService.push(hrScopeManagement.u_services.toString());
        hrLegalCompany.push(hrScopeManagement.u_legal_entities.toString());
    }
    gs.info('array of departement' + hrScopeManagementService.toString());
    gs.info('array of company' + hrLegalCompany.toString());


    //Department or service
    var department = new GlideRecord("cmn_department");
    department.addEncodedQuery("idIN" + hrScopeManagementService);
    department.query();
    while (department.next()) {
        departmentService.push(department.sys_id);
    }

    /////////New Updated Code Starts here/////////

    var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany.join(","));
    company.query();
    while (company.next()) {
        var sysId = company.sys_id.toString();
        if (legalCompany.indexOf(sysId) === -1) { // Prevent duplicates
            legalCompany.push(sysId);
        }
    }


    /////////New Updated Code Ends here/////////
   
    //Company or legal entity - Bad Code
   /* var company = new GlideRecord("core_company");
    company.addEncodedQuery("u_idIN" + hrLegalCompany);
    company.query();
    while (company.next()) {
        legalCompany.push(company.sys_id);
    } */

    // Now filter HR Profiles
    current.addEncodedQuery("user.department.sys_idIN" + departmentService.join(",") + '^ORu_etablissement_juridique.sys_idIN' + legalCompany.join(",")); // Apply
    // Log result
    gs.info("department to display : " + departmentService.join(","));
    gs.info("Company to display : " + legalCompany.join(","));


})(current, previous);

 


Hope that helps!

View solution in original post

6 REPLIES 6

mregragui_ext
Tera Contributor

Exactly what i want Thanks to all of you !

terrillc
Tera Contributor

did you find the solution