How to calculate Date difference between two catalog fields?

rathikaramamurt
Giga Expert

Hi All,

I have a requirement to display a field in the catalog form, only when the difference between two Date type fields are calculated and the condition appears as if like below:

The 1st field (Launch Date) Date is less than 4 days away from the ticket creation date/time, ie., Created (date/time) field.

Here is my onchange client script:

*******************************************

function onChange(control, oldValue, newValue)

{

alert('you changed Launch Date from ' + oldValue + ' to ' + newValue);

if(newValue != '')

{

  var start = g_form.getValue('request_datetime').split(' ')[0];

  var end = g_form.getValue('launch_date');

  var ajax = new GlideAjax('AjaxDurCalc');

  ajax.addParam('sysparm_name','durCalc');

  ajax.addParam('sysparm_start',start);

  ajax.addParam('sysparm_end',end);

  ajax.getXML();

  var answer = ajax.getAnswer();

  alert(ajax.getAnswer());

if(ajax.getAnswer()<4)

  {

  alert("if");

  g_form.setDisplay('warning', true);

  }

  else

  {

  alert("else");

  g_form.setDisplay('warning', false);

  }

}

}

My script include is as below:

*******************************************

var AjaxDurCalc = Class.create();

AjaxDurCalc.prototype = Object.extendsObject(AbstractAjaxProcessor, {

durCalc: function() {

  //return gs.dateDiff(this.getParameter('sysparm_start').getDisplayValue(), this.getParameter('sysparm_end').getDisplayValue(), false);

  var sd = new GlideDate(this.getParameter('sysparm_start'));

  var ed = new GlideDate(this.getParameter('sysparm_end'));

  var diffSeconds = gs.subtract(sd,ed);

  var converttodays = diffSeconds/(60*60*24);

  return converttodays;

}

});

This script is not working properly. Null value is resulted for "ajax.getAnswer()"

Could any1 pls help?

1 ACCEPTED SOLUTION

Its straightforward. Date variables internally have milliseconds itself.   You can subtract them and convert into days. I put additional alert statements. Remove them, once you get the correct difference.



var one_day=1000*60*60*24;


var start = g_form.getValue('request_datetime').split(' ')[0];


var end = g_form.getValue('launch_date');


var date1_ms = new Date(start);


var date2_ms = new Date(end);


var difference_ms = date2_ms - date1_ms;


// Convert back to days and return


alert("Difference in days");


alert(Math.round(difference_ms/one_day));    


View solution in original post

10 REPLIES 10

Chuck Tomasi
Tera Patron

Hi Rathika,



If you use ajax.getXML(), you need to use a callback function.



See the example in section 2.1.1 here:



GlideAjax - ServiceNow Wiki


Here's an (UNTESTED) updated version of your client script:



function onChange(control, oldValue, newValue) {


  alert('you changed Launch Date from ' + oldValue + ' to ' + newValue);


  if(newValue != '') {


      var start = g_form.getValue('request_datetime').split(' ')[0];


      var end = g_form.getValue('launch_date');


      var ajax = new GlideAjax('AjaxDurCalc');


      ajax.addParam('sysparm_name','durCalc');


      ajax.addParam('sysparm_start',start);


      ajax.addParam('sysparm_end',end);


      ajax.getXML(dateCallBack);


  }


}



function dateCallBack(response) {


  var answer = response.responseXML.documentElement.getAttribute("answer");


  alert(ajax.getAnswer());


  if(ajax.getAnswer()<4) {


      alert("if");


      g_form.setDisplay('warning', true);


  } else {


      alert("else");


      g_form.setDisplay('warning', false);


  }


}


Hi Tomasi,



I tried with this script. It is not entering into the callback function.



Any help would be greatful...


I think your server side function has also issues. GlideDate() won't accept parameters in its constructor.



var sd = new GlideDate();


sd.setValue(this.getParameter('sysparm_start'));


var ed = new GlideDate();


ed.setValue(this.getParameter('sysparm_end));


var dur = new GlideDuration();


dur = GlideDateTime.subtract(sd, ed);


var gdt = new GlideDateTime(dur);


return gdt.getNumericValue()/(86400*1000));



In between, is there any reason you choosen to make a server call? This is something you can do in javascript itself.