Compare with table values /テーブルの値と比較

a_129
Mega Guru

スクリプトに関して質問です。

現在、サービスカタログで入力された日時とテーブルに入っている日時の比較をしたいと考えています。

具体的に行いたいこととしては、

  1. サービスカタログで入力された作業開始日時と作業終了日時が、
    貸与資産オーダーテーブルに入っている(既存の)作業開始日時と作業終了日時が被っているか判定。
    (それぞれの日時が一緒だけでなく、入力された作業開始日時・作業終了日時のどちらかが、
     既存で入っている作業開始日時と作業終了日時の間の場合も)
  2. 被っている場合は、エラーメッセージを表示し、送信できないようにする。

以下のクライアントスクリプトとスクリプトインクルードを書いてみましたが、
うまく動かないため、ご教授いただければ幸いです。

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

function onSubmit() {
	var work_start = g_form.getValue('work_start');
	var work_end = g_form.getValue('work_end');
	var model = g_form.getValue('model');
	
    var ajax = new GlideAjax('CheckDateTime');

    ajax.addParam('sysparm_name', 'getModelAndDateTime');
    ajax.addParam('sysparm_work_start',work_start); 
    ajax.addParam('sysparm_work_end', work_end); 
    ajax.addParam('sysparm_mode', model); 

    ajax.getXMLAnswer(function(answer) { 
        if (answer == false) { 
            g_form.addErrorMessage(getMessege('日時の重複等により、その期間は申請できません。違う期間で申請してください。')); 
			return false;
        }
    });
}

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

var CheckDateTime = Class.create();
CheckDateTime.prototype = Object.extendsObject(AbstractAjaxProcessor, {
    getModelAndDateTime: function() {
		
		var work_start = new GlideDateTime(this.getParameter('sysparm_work_start'));
		var work_end = new GlideDateTime(this.getParameter('sysparm_work_end'));
		var model =  this.getParameter('sysparm_model');
		//貸与資産オーダーテーブルを参照
		var gr = new GlideRecord('sn_hamp_loaner_asset_order');
		
		//モデルが存在するかつ、作業開始日時または作業終了日時のどちらのデータが存在する場合
		if (gr.get(model) && gr.get(work_start) || gr.get(work_end)) {
			return false;
        //モデルが存在するかつ、作業開始日時以降と作業終了日時以前(間)にデータが存在する場合
        }else if(gr.get(model) && gr.get('work_start') <= work_start &&  gr.get('work_end') >= work_end){
			return false;
         //モデルが存在するかつ、作業終了日時だけデータが被っている場合
        }else if(gr.get(model) && gr.get('work_start')  >= work_start  >= gr.get('work_end')){
			return false;
		}
		return true;
	},

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

次ぎが原因かも知れません。.get()はレコードを取得するので1レコードに対して1回しか使いません。

複数の条件がある場合は.addQuery()を使います。なお、get()の引数は1つの場合はsys_idになります。

if文の条件をaddQuery()に移しました。

		var gr = new GlideRecord('sn_hamp_loaner_asset_order');
		//モデルが存在するかつ、作業開始日時データも存在する場合
		gr.addQuery('model', model);  // 列名が「model」の場合
		gr.addQuery('work_start', work_start); // 列名が「work_start」の場合
		gr.query();
		if (gr.next()) {
			return false;
		}
		return true;

元の投稿で解決策を見る

5件の返信5

Hitoshi Ozawa
Giga Sage
Giga Sage

aさん、

GlideAjaxは非同期のためにonSubmitでは利用できません。スクリプトインクルードから返事が戻る前にonSubmit処理が次の処理を実行します。

チェックを行うのであればonChangeで行います。但し、onChangeでチェックしてエラーの場合でもonSubmitが実行できます。

一般ではフィールドは必須にしてonChangeでエラーの場合はフィールドをclearにします。必須にするフィールドはonChange対象のフィールドでなくても非表示フィールドにすることも可能です。

それともビジネスルールでチェックして問題がある場合はaddInfoMessage()でメッセージを表示して終了させる。


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

ご教授いただいた通りに修正しましたが、

Unhandled exception in GlideAjax」というブラウザコンソールエラーが発生してしまいました。

再度、ご返答いただければ幸いです。

 

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

function onChange(control, oldValue, newValue, isLoading) {
	if (isLoading || newValue == '') {
        return;
    }
	try{
				
		var ajax = new GlideAjax('CheckDateTime');
		
		ajax.addParam('sysparm_name', 'checkWorkStart');
		//カタログ変数をセットする
		ajax.addParam('sysparm_work_end', g_form.getValue('work_start')); 
		ajax.addParam('sysparm_mode', g_form.getValue('model')); 
	
		ajax.getXMLAnswer(function(answer) { 
		//falseかどうかの確認
        if (answer.equals(false) ) { 
            g_form.addErrorMessage('指定された時間ではすでに予約されています。違う時間を指定してください。');
			g_form.clearValue('work_start');
        }
		});
	}catch(e){
		alert("error:" + e.message);
	}
	
}

 

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

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

	checkWorkStart: function(){
		
		var work_start = new GlideDateTime(this.getParameter('sysparm_work_start'));
		var model =  this.getParameter('sysparm_model');
		
		//貸与資産オーダーテーブルを参照
		var gr = new GlideRecord('sn_hamp_loaner_asset_order');
		
		//モデルが存在するかつ、作業開始日時データも存在する場合
		if (gr.get(model) && gr.get(work_start)) {
			return false;
		}
		return true;
		
	},

    type: 'CheckDateTime'
});
	

次ぎが原因かも知れません。.get()はレコードを取得するので1レコードに対して1回しか使いません。

複数の条件がある場合は.addQuery()を使います。なお、get()の引数は1つの場合はsys_idになります。

if文の条件をaddQuery()に移しました。

		var gr = new GlideRecord('sn_hamp_loaner_asset_order');
		//モデルが存在するかつ、作業開始日時データも存在する場合
		gr.addQuery('model', model);  // 列名が「model」の場合
		gr.addQuery('work_start', work_start); // 列名が「work_start」の場合
		gr.query();
		if (gr.next()) {
			return false;
		}
		return true;