title: jqGrid - Unique ID for new row
body: <p>I am trying to asign a unique ID to the new rows i add to my jqGrid. I use free jqGrid 4.11.0, a java rest service for the server side and MS SQL for databases.</p>
  
  <pre><code>inlineEditing: {
  
      ajaxSaveOptions: { contentType: "application/json" },
      serializeSaveData: function (postData) {
  
          var idArray = grid.getCol('id');
          var count = 0;
          var k = 1;
  
              while(postData.id.search('jqg') != '-1'){
  
                  for(var i =0 ; i&lt;idArray.length;i++){
  
                      if(k == idArray[i]){
                          count++;
                      }
                      if(count == 0){
  
                          postData.id = k  ;
                          break;                              
                      }
                  }                       
                  k++;
              }               
          return JSON.stringify(postData);
      }
  }
  </code></pre>
  
  <p>I noticed the default ID given by jqGrid is jqg + a number. Any suggestions on how i could make a unique ID thats not currently in use on any of the database records? Should i do this from the server side or it can be made in the jqGrid code?</p>
  
  <p>At some point in the evening, this code was kind of working and kept on giving id 7 to all new rows [even though it should have kept on increasing]. After some changes[cant remember what changes], every time i click save to submit the new row to the server, the page freezes and chrome suggest i should kill the process. </p>
  
  <p>Please let me know what and if i should add more information.</p>
  
  <p>Edit1 : </p>
  
  <pre><code>$(function () {
  
  var grid = $('#grid'),
      checkboxEditOptionEvents = [
  
          {type : 'click', data: {'Yes': 'Yes'}, fn: function (e, id) {
              var checkboxCol = grid.getCol('sefDepartament'),
                  ids = grid.jqGrid('getDataIDs'),
                  numberOfCheckedBoxes = [],
                  k;
  
              for (k = 0; k &lt; ids.length; k++) {
                      if(checkboxCol[k] == 'Yes'){
                          numberOfCheckedBoxes.push(checkboxCol[k]);
                          if (numberOfCheckedBoxes.length == 1){
                              alert('Please deselect the other checked box first');
                              $(this).prop("checked",false);
                              numberOfCheckedBoxes = 0;
                          }
                      }
          }
      }}];
  
  var experienceFunction = function(cellvalue, options ,rowObject){
  
              var joinYearVar =  rowObject.joinYear,
               YY = joinYearVar.slice(0,4),
               MM = joinYearVar.slice(5,7),
               DD= joinYearVar.slice(8,11);
  
              return moment("\"" +YY+MM+DD+"\"" , "YYYYMMDD").fromNow();
  
  };
  
  var checkboxFormatFunc = function(cellvalue, options ,rowObject){
      if(cellvalue == 'Yes'){
          return 'Yes';
      }
      return 'No';
  };
  
  var  afterSaveFunction =   function(id){
  
              var prenumeVar = grid.getCell(id, 'prenume').trim(),
                  numeVar = grid.getCell(id,'nume').trim(),
                  usernameVar =  numeVar +'.'+ prenumeVar,
                  emailVar = usernameVar + '@test.com';
              usernameVar =usernameVar.replace(/\s/g , '').trim();
              emailVar = emailVar.replace(/\s/g , '');
  
              grid.setCell(id, 'username', usernameVar);
              grid.setCell(id, 'email', emailVar);
  
  };
  
  var colModelSettings = [
  
      {name:'id', label:'id',key: true,hidden: true, width:10,sorttype:'number',editable: false},     
      {name:'nume',label:'Nume',width:90, align: 'center',editable:true,searchoptions: {sopt: ['eq','bw','ew','cn']}, editrules:{required:true}, editoptions: {defaultValue: ' '},formatter: 'text'},
      {name:'prenume',label:'Prenume',width:100,editable:true,searchoptions: {sopt: ['eq','bw','ew','cn']},align: 'center',editrules:{required:true},editoptions: {defaultValue: ' '},formatter: 'text'},
      {name:'username',label:'Username',searchoptions: {sopt: ['eq','bw','ew','cn']},width:125,align: 'center'  },
      {name:'email',label:'Email',width:135,searchoptions: {sopt: ['eq','bw','ew','cn']},align: 'center'},
      {name:'sefDepartament',label:'Sef Departament',width:90,editable:true,align: 'center', stype:"select", searchoptions:{sopt: ['eq','ne'],value: "Yes:Yes;No:No"},formatter: checkboxFormatFunc,edittype:'checkbox',editoptions: { dataEvents: checkboxEditOptionEvents,value:'Yes:No', defaultValue: 'No' }},
      {name:'position',label:'Position',editable:true,stype: 'select',formatter: 'select',searchoptions: {sopt: ['eq','ne'],value: ' : ;position 1:position 1;position 2:position 2;position 3:position 3;position 4:position 4;position 5:position 5'},
      align: 'center',edittype:'select',editoptions:{defaultvalue: 'P0: ',value: ' : ;position 1:position 1;position 2:position 2;position 3:position 3;position 4:position 4;position 5:position 5'},width: 75},
  
      {name:'joinYear',label:'Join Year',formatter:'date', formatoptions: {newformat:'d-m-Y'}, datefmt: 'dd-mm-yyyy', editable:true,searchtype: 'datepicker',align: 'center',width: 70,
      searchoptions:{dateFormat:'dd-mm-yy',dataInit: function (elem){
          $(elem).datepicker({ showButtonPanel: true, dateFormat: 'yy-mm-dd'});},sopt: ['eq','ne']},
  
      editoptions:{size:20,defaultValue: ' ',dataInit: function (elem) {
  
          $(elem).datepicker({ showButtonPanel: true, dateFormat: 'dd-mm-yy'});
      }}},
  
      {name:'experience', label:'Experience', formatter: experienceFunction, searchoptions:{sopt: ['eq','bw','ew','cn']}, editable:'hidden', editoptions:{defaultValue: ' '},align: 'center',width: 60},
      {name:'actiuni',label: 'Actiuni',formatter: 'actions', formatoptions: {afterSave:afterSaveFunction},editable: false,sortable: false,search: false,width: 20 }
      ];
  
  grid.jqGrid({
  
      pager: '#pager', 
      url: "/RestWithDatabaseConnection/rest/fetchData",
      editurl:'/RestWithDatabaseConnection/rest/update',
      datatype: "json",
      height: 250,    
      viewrecords: true,
      scrollOffset:0,
      sortorder: 'asc', 
      caption:'Employee List' ,
      autowidth: true,
      colModel: colModelSettings,
      beforeSelectRow : function(id){ 
  
                          var idsArray = grid.jqGrid('getDataIDs');
                          var i;
                          for(i=0;i&lt;idsArray.length;i++){
                              if($('#'+idsArray[i]).is('[editable="1"]') ){
                              grid.editRow(idsArray[i],true);
                              return false;
                              }
                          }   
                          return true;
                      },
  
      inlineEditing: {
  
          ajaxSaveOptions: { contentType: "application/json" },
          serializeSaveData: function (postData) {
  
              var idArray = grid.getCol('id');
              var count = 0;
              var k = 1;
  
                  while(postData.id.search('jqg') != '-1'){
  
                      for(var i =0 ; i&lt;idArray.length;i++){
  
                          if(k == idArray[i]){
  
                              count++;
                          }
                          if(count == 0){
  
                              postData.id = k  ;
                              break;
                          }
                      }
                      k++;
                  }
  
              return JSON.stringify(postData);
          }
      }
  });
  
  
  grid.jqGrid('navGrid', '#pager', {edit:false, add:false, delete:true, save:false, cancel:false, search:true, searchtext: 'Search', refresh:true},
  
          {},{},{     
                  url: '/RestWithDatabaseConnection/rest/delete',
                  mtype: 'DELETE',
                  reloadAfterSubmit: true,
                  ajaxDelOptions: {
                      contentType: "application/json",
                  },
                  serializeDelData: function(postdata) {
  
                      return JSON.stringify(postdata);
  
              }},{},{},{},{} );
  
  grid.jqGrid('inlineNav','#pager',
  {
      edit:true,
      edittext: 'Edit',
      save:true,
      savetext: 'Save',
      add:true,
      cancel: true,
      canceltext: 'Cancel',
      cancelicon: 'ui-icon-cancel',
      addicon:'ui-icon-plus',
      addtext: 'Add',
      addedrow: 'last',
      addParams: {
  
          position: 'last',
          addRowParams: { 
  
              aftersavefunc : afterSaveFunction,
              keys: true,
          }
              },
      editParams:{
  
          url: '/RestWithDatabaseConnection/rest/update',
          mtype : "POST",
          keys: true,
          aftersavefunc : afterSaveFunction,
      }
  })})
  </code></pre>
  
  <p>Edit2 - Server Responce to fetchData : </p>
  
  <pre><code>[{"id":"3","nume":"Aladin","prenume":"Zoro","username":"Aladin.Zoro","email":"Aladin.Zoro@test.com","sefDepartament":"Yes","position":"position 4","joinYear":"2015-11-08","experience":"2 months"},
  
  {"id":"2","nume":"Harap","prenume":"Alb","username":"Harap.Alb","email":"Harap.Alb@test.com","sefDepartament":"No","position":"position 1","joinYear":"2016-01-03","experience":"9 days  "},
  
  {"id":"4","nume":"Don","prenume":"Homa","username":"Don.Homa","email":"Don.Homa@test.com","sefDepartament":"No","position":"position 4","joinYear":"2015-09-06","experience":"4 months"},
  
  {"id":"5","nume":"Dorel","prenume":"Gigel","username":"Dorel.Gigel","email":"Dorel.Gigel@test.com","sefDepartament":"No","position":"position 4","joinYear":"2016-01-10","experience":"2 days"},
  
  {"id":"1","nume":"Ivan","prenume":"Stefan","username":"Ivan.Stefan","email":"Ivan.Stefan@test.com","sefDepartament":"No","position":"position 2","joinYear":"2016-01-10","experience":"2 days"}]
  </code></pre>