フィールドに表示されるエラー文について

a_129
Mega Guru

現在、フォームにエラー文を表示させるスクリプトを以下のように作成しています。

分岐により、エラーメッセージを変えておりますが、
else ifの条件のときに、エラー文が2つとも出てきてしまいます。※添付画像

解決方法がありましたらご教授いただければ幸いです。

【クライアントスクリプト】

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
  
    var ajax = new GlideAjax('CalculationDateTime');
	ajax.addParam('sysparm_name', 'getCorrectDateTime');
	ajax.addParam('sysparm_work_start', newValue);
	
	ajax.getXMLAnswer(function(answer) {
		var returnObject = JSON.parse(answer);
		if(returnObject.number == '1'){ //日付が今日より前
			g_form.setValue('work_start',returnObject.curDate);
			g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
			
		}else if(returnObject.number == '2'){ //日時が1か月以上先
			g_form.setValue('work_start',returnObject.curDate);
			g_form.showFieldMsg('work_start','1か月以上先の日時は予約できません。','error');
			
		}
		
	});
}

【スクリプトインクルード】

var CalculationDateTime = Class.create();
CalculationDateTime.prototype = Object.extendsObject(AbstractAjaxProcessor, {
	
	getCorrectDateTime:function(){
		var work_start = new GlideDateTime(this.getParameter('sysparm_work_start'));
		var gdt = new GlideDateTime();
		var currentDate = gdt.getDisplayValue();
		gdt.addMonthsLocalTime(1);
		var maxDate = gdt.getDate();
		var result = {};
		
		if(work_start < gdt){
			result.number = 1;
			result.curDate = currentDate;
			
		}else if(work_start > maxDate){
			result.number = 2;
			result.curDate = currentDate;
		}
		return  JSON.stringify(result);
	},

    type: 'CalculationDateTime'
});

find_real_file.png

1 件の受理された解決策

Hitoshi Ozawa
Giga Sage
Giga Sage

aさん、

動作確認はまだ行っていませんが、もしかしてフィールド「work_start」でonChange()を設定されていますでしょうか?もしその場合はonChangeで自分自身の値を変更しているので再帰的にonChangeが実行されます。

それを再帰呼び出しを防止するにはif文に「newValue==<今日の日付>」を追加して既に今日の日付に設定されている場合はonChangeを実行しないようにします。

元の投稿で解決策を見る

7件の返信7

Thank you for the advice!

Hitoshi Ozawa
Giga Sage
Giga Sage

aさん、

日付チェックをするだけならばクライアントスクリプトのみで行えます。

function onChange(control, oldValue, newValue, isLoading) {
    if (isLoading || newValue == '') {
        return;
    }
    var deviation = 5 * 1000;  // 5秒。許可する範囲
    var today = new Date();
    var nextMonth = new Date();
    var todayNum = today.valueOf();

    var workStartNum = getDateFromFormat(newValue, g_user_date_time_format);
    if (workStartNum > todayNum && workStartNum < (todayNum + deviation)) { // 5秒前後の日時が選択された場合はOKとする。再帰呼び出しを防止する
        return;
    }
    var now = formatDate(g_user_date_time_format, (new Date()));
    if (workStartNum < (todayNum - deviation)) {
        g_form.setValue('work_start', now);
        g_form.showFieldMsg('work_start', '現在時刻より前の日時は予約できません。', 'error');
    }
    nextMonth.setMonth(nextMonth.getMonth() + 1);
    var nextMonthNum = nextMonth.valueOf();
    if (workStartNum > nextMonthNum) {
        g_form.setValue('work_start', now);
        g_form.showFieldMsg('work_start', '1か月以上先の日時は予約できません。', 'error');
    }

    function formatDate(format, date) {
        var year = date.getFullYear();
        var month = pad(date.getMonth() + 1);
        var day = pad(date.getDate());
        var hours = pad(date.getHours());
        var min = pad(date.getMinutes());
        var sec = pad(date.getSeconds());
        format = format.replace('yyyy', year);
        format = format.replace('MM', month);
        format = format.replace('dd', day);
        format = format.replace('HH', hours);
        format = format.replace('mm', min);
        format = format.replace('ss', sec);
        return format;
    }

    function pad(str) {
        return ('00' + str).slice(-2);
    }
}

実行結果:

1.以前の日時が選択された場合

find_real_file.png

2.一か月より後の日時が選択された場合

find_real_file.png

3.一か月以内の日付が選択された場合

find_real_file.png

スクリプトのご提示もありがとうございます。

 

参考にさせていただきました。