- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 05:57 AM
Hi,
I created a script in the Client Script but I have multiple conditions that I need to create and it is not working.
function onChange(control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
g_form.clearValue('milestone');
return;
}
var addDays;
if (g_form.getValue('priority') == "A") {
//add days
addDays = "56";
}
//get kickoff date value
var startDate = new Date(g_form.getValue('kickoff_date'));
var addDaysToSartDate = "";
//get kickoff date
var getDateFromStartDate = startDate.getDate();
//subtract 56 days from the kickoff selected date
var totalDays = parseInt(getDateFromStartDate) - parseInt(addDays);
startDate.setDate(totalDays);
//g_user_date_format representing the user's date preferred date format which is yyyy-MM-dd
addDaysToSartDate = formatDate(startDate, g_user_date_format);
//Retrieves a field value from the form NOT the database
g_form.setValue('milestone', addDaysToSartDate);
}
Result
How can I revise the code and add multiple ifs condition
If Priority == A then adddays -56
else if Priority == B then adddays -6
else if Priority == C then adddays -2
else if Priority == D then adddays -10
Output should be in date format and should be populate in the milestone field.
Thanks for your help
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 12:02 PM
I followed your scripts
Actually you didn't and made a couple of fundamental mistakes because of which the GlideAjax handler Script Include will not work 😀:
- you added an initialize method to the Script Include - should not be done (it can ba done, but that's a topic for another day) and the Script Include provided does not contain one:
var communityDates = Class.create();
communityDates.prototype = {
// this method must not exist
initialize: function () {},
...
- the class does not extend AbstractAjaxProcessor; proposed code:
var communityDates = Class.create();
communityDates.prototype = Object.extendsObject(AbstractAjaxProcessor, {
...
your code:
var communityDates = Class.create();
communityDates.prototype = {
...
But given that your are working in scope, the proposed code is also not OK; it should be:
var communityDates = Class.create();
communityDates.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
...
notice the extra global. scope name in front of AbstractAjaxProcessor.
Now this is not an error, but in the Client Script one can forego
var answer = trigger.responseXML.documentElement.getAttribute('answer');
in
function getDatedata (trigger) {
var answer = trigger.responseXML.documentElement.getAttribute('answer');
...
if, when calling the GlideAjax handler, instead of
gar.getXML(getDatedata);
one writes
gar.getXMLAnswer(getDatedata);
in that case the parameter of function getDatedata alreade is "answer":
function getDatedata (answer) {
...
Than another big problem is trying to crate a GlideDateTime directly from the date value arriving from the client side through parameters. GlideDateTime can only correctly decode format YYYY-MM-DD HH:mm:ss - which is the internal Date/time format. It also expects that value to be in UTC TZ, which for +95% of user on the planet will not be the case. In other cases the system will try to guess the format used, but half the time a date where the day is 12 or less than that - e.g. 3/2/2023 - will not be correctly decoded.
The solution to correctly getting the value of a Date or Date/time field client side is to use a function provided by ServiceNow (getDateFromFormat) and one of two variables also provided by ServiceNow (g_user_date_format and g_user_date_time_format). In your case:
var kickoffDateValue = getDateFromFormat(g_form.getValue('kickoff_date'), g_user_date_format);
This will place the date value as a Unix epoch millisecond into variable kickoffDateValue. This can be used both to correctly initialize a Date object client side or a GlideDate or a GlideDateTime server side.
So in the onChange client script you could write:
var kickoffDateValue = new Date(getDateFromFormat(g_form.getValue('kickoff_date'), g_user_date_format));
Thus you don't need a GlideAjax call or Script Include; the client side code could be something like:
function onChange (control, oldValue, newValue, isLoading, isTemplate) {
if (isLoading || newValue === '') {
return;
}
var priorityOffsetDB = {
'A': -56,
'B': -6,
'C': -2,
'D': -10,
};
var kickoffDate = new Date(getDateFromFormat(g_form.getValue('kickoff_date'), g_user_date_format));
var priority = g_form.getValue('priority');
if (typeof priorityOffsetDB[priority] != 'undefined') {
kickoffDate.setDate(kickoffDate.getDate() + priorityOffsetDB[priority]);
g_form.setValue('milestone', formatDate(kickoffDate, g_user_date_time_format));
}
}

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 06:03 AM
What is the data type which you've set for milestone?
Please mark correct if my response has solved your query.
Cheers,
Mohammed Basheer Ahmed.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 06:04 AM
KickoffDate = date field
Milestone = date field

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 06:10 AM
var totalDays = gdt.addDays(-addDays); //instead of parseInt(getDateFromStartDate) - parseInt(addDays);
Please mark correct if my response has solved your query.
Cheers,
Mohammed Basheer Ahmed.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
01-11-2023 06:13 AM
var add;
if (g_form.getValue('priority') == "A") {
//add days
add = "56";
}
//get kickoff date value
var startDate = new GlideDateTime(g_form.getValue('kickoff_date'));
var addDaysToSartDate = "";
//get kickoff date
var getDateFromStartDate = startDate.getDate();
//subtract 56 days from the kickoff selected date
var totalDays = getDateFromStartDate.addDays(-add);
startDate.setDate(totalDays);
//g_user_date_format representing the user's date preferred date format which is yyyy-MM-dd
addDaysToSartDate = formatDate(startDate, g_user_date_format);
//Retrieves a field value from the form NOT the database
g_form.setValue('milestone', addDaysToSartDate);
Try changing as above
Please mark correct if my response has solved your query.
Cheers,
Mohammed Basheer Ahmed.