Skip to main content

ServiceNow check duplicates on 2 columns using GlideAggregate

var sQuery = 'sys_created_onONThis month@javascript:gs.beginningOfThisMonth()@javascript:gs.endOfThisMonth()';

checkDupl('question_answer', 'question', 'table_sys_id', sQuery);

//checkDupl('question_answer', 'question', 'table_name', sQuery);




function checkDupl(table, fieldParam1, fieldParam2, customQuery) {

  var ga = new GlideAggregate(table);

  ga.addAggregate('COUNT', fieldParam1);

  if (customQuery) {

    ga.addQuery(customQuery);

  }

  ga.groupBy(fieldParam1);

  ga.addHaving('COUNT', '>', 1);

  ga.query();

  var dupls = [];

  


  while (ga.next()) {


    if (!gs.nil(ga.getDisplayValue(fieldParam1))) {

      //dupls.push('checking question:::: ' + ga.getDisplayValue(fieldParam1));


      var ga2 = new GlideAggregate(table);

      ga2.addAggregate('COUNT', fieldParam2);

      if (customQuery) {

        ga2.addQuery(customQuery);

      }

      ga2.addQuery('question', ga.getValue(fieldParam1));

      ga2.groupBy(fieldParam2);

      ga2.addHaving('COUNT', '>', 1);

      ga2.query();

      while (ga2.next()) {

        dupls.push("The following records are duplicate on " + fieldParam2);


        var DuplLine2 = ga2.getValue(fieldParam2) + " " + ga2.getAggregate('COUNT', fieldParam2) + " => " + ga.getDisplayValue(fieldParam1);

        dupls.push(DuplLine2);

      }

    }

    //gs.log(dupls,'duplWidget_arr');

  }

  return dupls;


}

Comments

  1. The example demonstrates a practical way to identify duplicate records in ServiceNow by combining GlideAggregate, COUNT, groupBy, and addHaving. The additional filtering with a date-based encoded query makes the duplicate check more targeted instead of processing the entire table.

    The nested aggregate query is particularly useful because the first query identifies repeated values, while the second checks another field within those matching records. This kind of server-side scripting also shows how JavaScript can be used to build reusable data-validation logic, making a Javascript Online Course relevant for understanding the syntax and query patterns involved.

    ReplyDelete
  2. Another useful aspect is the reusable checkDupl() function, where the table, fields, and custom query are passed as parameters rather than hard-coded throughout the script. Developers working with ServiceNow can apply similar JavaScript techniques through Javascript Online Training when creating scripts for duplicate detection and other administrative data checks.

    ReplyDelete

Post a Comment

Popular posts from this blog

URL link in addInfoMessage

var ga=new GlideAjax('gld_HR_ajax'); ga.addParam('sysparm_name', 'checkEmployeeNumber_hrProfile'); ga.addParam('sysparm_hrprofilenumber', g_form.getValue('number')); ga.addParam('sysparm_employeenumber', newValue); ga.getXMLAnswer(function(answer) { if (answer!='undefined' && answer!=''){ var navURL="<a style='text-decoration:underline;color:blue' href=hr_profile.do?sysparm_query=number=" + answer + ">" + answer + "</a><img width='3' src='images/s.gif'/>"; var sMsg='The employee number entered already exists on another HR Profile ' + navURL; //alert(sMsg); g_form.showErrorBox('employee_number', 'error - please check'); g_form.addInfoMessage(sMsg); } });

ServiceNow check for null or nil or empty (or not)

Haven't tested these all recently within global/local scopes, so feel free to have a play! option 1 use an encoded query embedded in the GlideRecord , e.g.  var grProf = new GlideRecord ( 'x_cls_clear_skye_i_profile' ); grProf . addQuery ( 'status=1^ owner=NULL ' ); grProf . query (); even better use the glideRecord  addNotNullQuery or addNullQuery option 2 JSUtil.nil / notNil (this might be the most powerful. See this link ) example: if ( current . operation () == 'insert' && JSUtil . notNil ( current . parent ) && ! current . work_effort . nil ())  option 3 there might be times when you need to get inside the GlideRecord and perform the check there, for example if the code goes down 2 optional routes depending on null / not null can use gs.nil : var grAppr = new GlideRecord ( 'sysapproval_approver' ); var grUser = new GlideRecord ( 'sys_user' ); if ( grUser . get ( 'sys_id' , current . approver )){...