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

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

maddalahemanth
Tera Contributor

Hii @mregragui_ext ,

I think your script is correct but try with modifying these lines it will not push duplicate sys id to the company list

var company = new GlideRecord("core_company");
company.addEncodedQuery("u_idIN" + hrLegalCompany);
company.query();
while (company.next()) {
    if (!legalCompany.includes(company.sys_id.toString()))
    {
            legalCompany.push(company.sys_id.toString());
    }
}

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'));

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

Vishal Jaswal
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!