- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
03-31-2022 12:42 AM
スクリプトに関して質問です。
現在、サービスカタログで入力された日時とテーブルに入っている日時の比較をしたいと考えています。
具体的に行いたいこととしては、
- サービスカタログで入力された作業開始日時と作業終了日時が、
貸与資産オーダーテーブルに入っている(既存の)作業開始日時と作業終了日時が被っているか判定。
(それぞれの日時が一緒だけでなく、入力された作業開始日時・作業終了日時のどちらかが、
既存で入っている作業開始日時と作業終了日時の間の場合も) - 被っている場合は、エラーメッセージを表示し、送信できないようにする。
以下のクライアントスクリプトとスクリプトインクルードを書いてみましたが、
うまく動かないため、ご教授いただければ幸いです。
【カタログクライアントスクリプト】
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'
});
解決済! 解決策の投稿を見る。

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-01-2022 02:08 AM
次ぎが原因かも知れません。.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;

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
03-31-2022 02:18 AM
aさん、
GlideAjaxは非同期のためにonSubmitでは利用できません。スクリプトインクルードから返事が戻る前にonSubmit処理が次の処理を実行します。
チェックを行うのであればonChangeで行います。但し、onChangeでチェックしてエラーの場合でもonSubmitが実行できます。
一般ではフィールドは必須にしてonChangeでエラーの場合はフィールドをclearにします。必須にするフィールドはonChange対象のフィールドでなくても非表示フィールドにすることも可能です。

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
03-31-2022 03:01 AM
それともビジネスルールでチェックして問題がある場合はaddInfoMessage()でメッセージを表示して終了させる。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-01-2022 12:11 AM
ご回答ありがとうございます。
ご教授いただいた通りに修正しましたが、
「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'
});

- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-01-2022 02:08 AM
次ぎが原因かも知れません。.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;