フィールドが必須項目かどうかをチェックする方法

d-aizawa
Kilo Sage

皆様、いつもお世話になっております。

私は特殊な要件を抱えており、作成したフィールドが3つあります。

・Approve(u_approve):選択肢(necessary, completed, unnecessary)
・DEV(u_dev):Approveがnecessaryかcompletedの場合、必須項目化(UI Policyで設定)、入力は"TEST"ロール所持ユーザのみ限定
・TEST(u_test):Approveがnecessaryかcompletedの場合、必須項目化(UI Policyで設定)、入力は"TEST"ロール所持ユーザのみ限定

上記は"TEST"ロールを所持していないユーザで操作すると、UI Policyが機能しません。

お客様からはその状態で「解決済み」ステータスに移行したくないとの要望があったため、
Business Ruleを作成し、ステータス移行を防ぎ、未入力のフィールドはエラーメッセージで表示されるようにしています。

以下のスクリプトで機能はしておりますが、今後フィールド数が増えるとパターンが増えてしまい、スクリプト量が多くなってしまうため、もっと良い方法はないかと模索中です。

(function executeRule(current, previous /*null when async*/ ) {
    if (current.u_approve == "necessary" || current.u_approve == "completed") {
        var fields = [{
                "fieldName": "u_dev",
                "fieldMsg": "DEV"
            },
            {
                "fieldName": "u_test",
                "fieldMsg": "TEST"
            }
        ];
        var missingFields = [];
        for (var oField in fields) {
            if (gs.nil(current[fields[oField].fieldName])) {
                missingFields.push(fields[oField].fieldMsg);
            }
        }
        if (missingFields) {
            gs.addErrorMessage("次の必須項目を入力してください:" + missingFields.join(","));
            current.setAbortAction(true);
            action.setRedirectURL(current);
            current.state = previous.state;
            current.incident_state = previous.state;
            current.update();
        }
    }
})(current, previous);

2行目でDEVとTESTが必須項目かどうか、IF文を記載しておりますが、フィールドが必須項目かどうかチェックする方法をご存知の方がいらっしゃいましたら、ご教示頂けないでしょうか。

よろしくお願いいたします。

find_real_file.png

3 REPLIES 3

Anil Lande
Kilo Patron

Hi,

You can create a system property to store fields and use property to get fields. Next time if you want to add/remove fields then just update the property.

find_real_file.png

 

and use it in your script like below:

(function executeRule(current, previous /*null when async*/ ) {
    if (current.u_approve == "necessary" || current.u_approve == "completed") {
        var fields = JSON.parse(gs.getProperty("incident.mandatory_fields"));  //replace your property name here
        var missingFields = [];
        for (var oField in fields) {
            if (gs.nil(current[fields[oField].fieldName])) {
                missingFields.push(fields[oField].fieldMsg);
            }
        }
        if (missingFields) {
            gs.addErrorMessage("次の必須項目を入力してください:" + missingFields.join(","));
            current.setAbortAction(true);
            action.setRedirectURL(current);
            current.state = previous.state;
            current.incident_state = previous.state;
            current.update();
        }
    }
})(current, previous);

 

Thanks,

Anil Lande

ご教示頂き、ありがとうございます。

参考にさせて頂きます。

また私の説明不足で申し訳ありません。

今後増える可能性があるのは、u_approveのようなフィールドも含まれます。

現時点だと、2行目のIF文のパターンを何個も記載する必要があります。
例えば、approveのようなフィールドが3つあると、8パターンあり、4つにもなると16パターンのスクリプトを記載する必要がある認識です。

Hitoshi Ozawa
Giga Sage

d-aizawaさん、

質問の内容を確認させてください。

インシデントフォームにフィールドapprove, dev, testを追加。フィールドdevとtestはロールTESTのユーザが申請した場合のみ入力が必須。

>上記は"TEST"ロールを所持していないユーザで操作すると、UI Policyが機能しません。

なぜロールTESTを付与されていないユーザはUI Policyは適用されないのでしょうか?UI Policyはロールとは関係なく実行されるはずです。

スクリーンショットでは項目devとtestは必須項目と表示しています。なぜ再びビジネスルールで必須チェックが必要なのでしょうか?

UI Policyの代わりにクライアントスクリプトで項目を必須に設定することもできます。例えばApproveフィールにonChange()クライアントスクリプトを設定して

if (newValue == "necessary" || newValue == "completed") {
  g_form.setMandatory('u_test', true);
  g_form.setMandatory('u_dev', true);
} else {
  g_form.setMandatory('u_test', false);
  g_form.setMandatory('u_dev', false);
}

https://developer.servicenow.com/dev.do#!/reference/api/sandiego/client/c_GlideFormAPI#r_GlideFormSe...