End date should not be more than 6 months from start date

Lakshman12
Tera Expert

I am working on functionality as below

 I have two fields on catalog item includes – start date and end date. We do not want users to select end date not more than 6 months from start date.

For example: start date = 07/22/2020

 If End date =  1/22/2021 (technically difference is more than 180 days because of few months has 31 days ).

 Let us say if end user selects 1/23/2021 as end date, then I should alert them saying not to select as it is more than 6 months calendar days.

I would really appreciate your help. @Pradeep Sharma @Ankur Bawiskar @Chuck Tomasi 

Thanks

Lakshman

 

1 ACCEPTED SOLUTION

@Lakshman 

Below worked for me:

1) If start date is 22nd July then adding 6months to that is 22nd Jan

2) Now it depends on how 6 months you consider since some months are having 30 and 31 days.

3) I would request to check with business for exact days and that would be better.

a) So if user gives 23rd Jan then it gives alert and clears as it is not valid

b) If user gives 22nd Jan then it is ok

Client Script:

Note: Ensure you give valid variable names for start and end dates

function onChange(control, oldValue, newValue, isLoading) {
	if (isLoading || newValue == '') {
		return;
	}

	var ga = new GlideAjax('DateTimeAjax');
	ga.addParam('sysparm_name', "compareDates");
	ga.addParam('sysparm_start', g_form.getValue('start_date')); // start variable
	ga.addParam('sysparm_end', g_form.getValue('end_date')); // end variable
	ga.getXMLAnswer(function(answer){
		if(answer != ''){
                        alert('End date should be within 6 months from start date');
			g_form.clearValue('end');	
		}
	});
	//Type appropriate comment here, and begin script below

}

Script Include: It should be client callable

var DateTimeAjax = Class.create();
DateTimeAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	compareDates: function(){

		var start = new GlideDateTime(this.getParameter('sysparm_start'));
		var end = new GlideDateTime(this.getParameter('sysparm_end'));
		start.addMonthsUTC(6);

		if(end.getNumericValue() > start.getNumericValue()){
			return 'End Date should be withing 6 months from start';
		}
		return '';
	},

	type: 'DateTimeAjax'
});

Output:

find_real_file.png

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

View solution in original post

31 REPLIES 31

Hi Dhananjay,

 

Yes, I have tried exactly what you suggested and still is not working.

find_real_file.png

 

Thanks

 

@Lakshman 

Below worked for me:

1) If start date is 22nd July then adding 6months to that is 22nd Jan

2) Now it depends on how 6 months you consider since some months are having 30 and 31 days.

3) I would request to check with business for exact days and that would be better.

a) So if user gives 23rd Jan then it gives alert and clears as it is not valid

b) If user gives 22nd Jan then it is ok

Client Script:

Note: Ensure you give valid variable names for start and end dates

function onChange(control, oldValue, newValue, isLoading) {
	if (isLoading || newValue == '') {
		return;
	}

	var ga = new GlideAjax('DateTimeAjax');
	ga.addParam('sysparm_name', "compareDates");
	ga.addParam('sysparm_start', g_form.getValue('start_date')); // start variable
	ga.addParam('sysparm_end', g_form.getValue('end_date')); // end variable
	ga.getXMLAnswer(function(answer){
		if(answer != ''){
                        alert('End date should be within 6 months from start date');
			g_form.clearValue('end');	
		}
	});
	//Type appropriate comment here, and begin script below

}

Script Include: It should be client callable

var DateTimeAjax = Class.create();
DateTimeAjax.prototype = Object.extendsObject(AbstractAjaxProcessor, {

	compareDates: function(){

		var start = new GlideDateTime(this.getParameter('sysparm_start'));
		var end = new GlideDateTime(this.getParameter('sysparm_end'));
		start.addMonthsUTC(6);

		if(end.getNumericValue() > start.getNumericValue()){
			return 'End Date should be withing 6 months from start';
		}
		return '';
	},

	type: 'DateTimeAjax'
});

Output:

find_real_file.png

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Ankur,

Thanks for sharing script. This script is working however I am not able to display error message below field.

please see below script I have added.

if (answer != '') {
g_form.showFieldMsg('end_date', 'End Date should not be more than 6 months from start date', 'error');
g_form.clearValue('end_date');
} else {
g_form.hideFieldMsg('end_date');
}

 

Hi Lakshman,

this should work well

if (answer != '') {
g_form.showFieldMsg(control, 'End Date should not be more than 6 months from start date', 'error');
control.value = '';
}

Output:

find_real_file.png

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

@Lakshman 

Did you mistakenly mark other answer as correct?

As I could see the script shared by me worked well as per your previous comment.

Would you mind marking my response as helpful/correct if I was able to resolve your query?

Regards
Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader