Skip to main content

IMPROVED Sys Admin useful Service Portal widget to check for duplicates in tables

> improved from an earlier post...

(see https://getbootstrap.com/docs/3.4 )

Widget defined in global scope; note can set cross scope privileges for access to scoped tables
[- should generate entries in sys_restricted_caller_access which can then be set to permitted]

HTML:

<div> <h1>Check ServiceNow Table for duplicates <title>Check ServiceNow Table for duplicates</title> </h1> <div class='container'> <form class="form-horizontal"> <div class="form-group"> <label class="col-sm-2 control-label">Enter table name here</label> <div class="col-sm-10"> <input class="form-control" value ='sys_user' id='tbl_name'> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Enter field name here</label> <div class="col-sm-10"> <input class="form-control" value='email' id='dupl_field'> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">Custom query string</label> <div class="col-sm-10"> <input class="form-control" value='active=true' id='custom_query'> </div> </div> <div class="form-group"> <button ng-click="runtheoperation()" class="btn btn-info">Click to check dupl</button> </div> </form> <h2>Results:</h2> <div class="well"> <textarea id='results_q' rows="10" style="width:100%;">{{c.duplrecordsList}}</textarea> </div> <h2>Total duplicates rows: {{c.duplrecordsSize}}</h2> </div> </div>

CSS:

.control-label { text-align: left; }

  


CLIENT:

function($scope) { /* widget controller */ var c = this; c.duplrecordsSize=0; c.duplrecordsList=''; $scope.runtheoperation = function() { //console.log("message", 'run the op'); c.server.get({ action: "get_dupls", msg : "Running glideaggregate to check for duplicates...", sn_table : angular.element($('#tbl_name')).val(), duplfield : angular.element($('#dupl_field')).val(), customQuery : angular.element($('#custom_query')).val() }).then(function(r){ c.duplrecordsSize=r.data.duplrecordsSize-1; var duplData=r.data.duplrecordsList; c.duplrecordsList=duplData.join('\n'); }); }; }






















SERVER:

(function() { /* populate the 'data' object */ /* e.g., data.table = $sp.getValue('table'); */ data.duplrecordsList=[]; data.duplrecordsSize=0; if (input && input.action === "get_dupls"){ data.duplrecordsList=(checkDuplUsers(input.customQuery, input.duplfield,input.sn_table)); data.duplrecordsSize=data.duplrecordsList.length; } function checkDuplUsers(customQuery, fieldParam, table){ var ga= new GlideAggregate(table); ga.addAggregate('COUNT', fieldParam); if (customQuery){ ga.addQuery(customQuery); } ga.addHaving('COUNT', '>', 1); ga.query(); var dupls=[]; dupls.push("The following " + ga.getRowCount() + " records are duplicate on " + fieldParam); while (ga.next()) { var DuplLine=ga.getAggregate('COUNT', fieldParam) + " => " + ga.getElement(fieldParam); dupls.push(DuplLine); } //gs.log(dupls,'duplWidget_arr'); return dupls; } })();

Comments

Popular posts from this blog

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 )){...

Code a pause/wait - gs.sleep or gs.wait alternative, pause script for specified seconds (timer)

Code a pause/wait - gs.sleep / gs.wait alternative, pause script for specified seconds (timer)  e.g. 10 seconds: do_sleep ( 10000 ); function do_sleep ( milliseconds ) { var start = new Date (). getTime (); for ( var i = 0 ; i < 1e7 ; i ++) { if (( new Date (). getTime () - start ) > milliseconds ){ gs . print ( 'waking up!' ); break ; } } }