if文の条件式

a_129
Mega Guru

現在、ロールによってエラー文を出すスクリプトを以下のように作成しております。

スクリプトインクルードのelse ifのAND条件が上手く反映されず、エラー文が表示されない状況です。
また、スクリプトバックグラウンドでは、else ifの条件をきちんと満たしており、result.number = 2;という値が取得できていることを確認しました。

javascriptは初心者であるため、解決方法がございましたらご教授いただけると幸いです。


【カタログクライアントスクリプト】

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.addParam('sysparm_user',g_form.getValue('assigned_to'));
	

	ajax.getXMLAnswer(function(answer) {
		//戻り値のJSON形式をobject形式に変換
		var returnObject = JSON.parse(answer);
			
		//再帰呼び出しを防止する
		if (newValue > returnObject.curDate) { 
        return;
		}
			
		//日付が今日より前
		if(returnObject.number == '1'){
			alert('【エラー】現在時刻より前の日時は予約できません。');   
			g_form.setValue('work_start',returnObject.curDate);
			g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
		
		//予約が1か月以上先かつ、管理者権限を持っていない	
		}else if(returnObject.number == '2'){ 
			alert('【エラー】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 user = this.getParameter('sysparm_user');
		
		//管理者権限のロールを持っているか
		var gr = new GlideRecord('sys_user_has_role');
		gr.addQuery('user.sys_id',user);
		gr.addQuery('role.name','reservation_manager');
		gr.query();
		var count = gr.getRowCount();
		
		var gdt = new GlideDateTime();
		var currentDate = gdt.getDisplayValue();
		gdt.addMonthsLocalTime(1);//1か月後
		var maxDate = gdt.getDate();
		var result = {};
		result.user = user;
		
		
		//開始日が現在時刻より前の場合
		if(work_start < gdt){
			result.number = 1;
			result.curDate = currentDate;
			
		//開始日が1か月以上先の場合かつ、管理者権限を持っていない場合
		}else if(work_start > maxDate && count == 0){
			result.number = 2;
			result.curDate = currentDate;	
			
		}		
		return  JSON.stringify(result);
	},

    type: 'CalculationDateTime'
});
1 件の受理された解決策

Allen Andreas
Administrator
Administrator
こんにちは、
スクリプトインクルードにログインして、JSONを文字列化してクライアントに送り返すときに、JSONがどのように表示されるかを確認してください。次に、クライアントスクリプトで、ログ(アラート)を使用してオブジェクトの値を確認してください。彼らはひもですか?それとも整数ですか(1と2の場合)?適切な値を使用すると、正しく機能するはずです。

該当する場合は、返信に「役に立った/正しい」のマークを付けてください。ありがとう!
Kon'nichiwa, sukuriputoinkurūdo ni roguin shite, jeison o mojiretsu-ka shite kuraianto ni okurikaesu toki ni, jeison ga dono yō ni hyōji sa reru ka o kakuninshitekudasai. Tsugini, kuraiantosukuriputo de, rogu (arāto) o shiyō shite obujekutono-chi o kakuninshitekudasai. Karera wa himodesu ka? Soretomo seisūdesu ka (1 to 2 no baai)? Tekisetsuna-chi o shiyō suru to, tadashiku kinō suru hazudesu. Gaitō suru baai wa, henshin ni `yakunitatta/ tadashī' no māku o tsukete kudasai. Arigatō!

Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!

元の投稿で解決策を見る

4件の返信4

Allen Andreas
Administrator
Administrator
こんにちは、
スクリプトインクルードにログインして、JSONを文字列化してクライアントに送り返すときに、JSONがどのように表示されるかを確認してください。次に、クライアントスクリプトで、ログ(アラート)を使用してオブジェクトの値を確認してください。彼らはひもですか?それとも整数ですか(1と2の場合)?適切な値を使用すると、正しく機能するはずです。

該当する場合は、返信に「役に立った/正しい」のマークを付けてください。ありがとう!
Kon'nichiwa, sukuriputoinkurūdo ni roguin shite, jeison o mojiretsu-ka shite kuraianto ni okurikaesu toki ni, jeison ga dono yō ni hyōji sa reru ka o kakuninshitekudasai. Tsugini, kuraiantosukuriputo de, rogu (arāto) o shiyō shite obujekutono-chi o kakuninshitekudasai. Karera wa himodesu ka? Soretomo seisūdesu ka (1 to 2 no baai)? Tekisetsuna-chi o shiyō suru to, tadashiku kinō suru hazudesu. Gaitō suru baai wa, henshin ni `yakunitatta/ tadashī' no māku o tsukete kudasai. Arigatō!

Please consider marking my reply as Helpful and/or Accept Solution, if applicable. Thanks!

ご回答ありがとうございます。

どこが原因かを探る上で、参考になりました。

Zengame
Kilo Guru

お世話になります。

スクリプト中の
----
if(returnObject.number == '1'){
  alert('【エラー】現在時刻より前の日時は予約できません。'); 
  g_form.setValue('work_start',returnObject.curDate);
  g_form.showFieldMsg('work_start','現在時刻より前の日時は予約できません。','error');
}else if(returnObject.number == '2'){
  alert('【エラー】1か月以上先の日時は予約できません。'); 
  g_form.setValue('work_start',returnObject.curDate);
  g_form.showFieldMsg('work_start','1か月以上先の日時は予約できません。','error');
}
----
について、 returnObject.numberは2が入っているのに、else ifの評価がうまくいかず、そのなかのメッセージが出ない、と理解しました。(違っていたらご指摘ください)

1.returnObject.number == '1'側が正しく動作しているとすると良くわからないのですが、
  returnObject.number == 1 または returnObject.number == 2での評価でどうか?
2.条件が二種類しかないのであれば、else ifではなく elseでやってみる(これは今後の拡張性のためには避けたいです)
3.'==='厳密等価演算子を使って、形違いのエラーとなるかどうかやってみる(少しデバッグすることになりますが)

参考になれば幸いです。

ご回答ありがとうございます。

今回の場合、下記が原因でした。

Javascriptにあまり詳しくないため、ご回答内容は参考になりました。

ありがとうございます。

//再帰呼び出しを防止する
if (newValue > returnObject.curDate) {
  return;
}