ウィンドウ計算例

このセクションでは、ウィンドウ計算の詳細例とその動作方法について説明します。ただし、最初に、条件文の拡張バージョンと対応するプレースホルダー付きのテンプレート計算を紹介します。これを使用することで、基本的な計算を作成できます。

TRIGGER_OBJECT の TRIGGER_FIELD に設定されている場合、ターゲットプロパティtrue/false に変更する。

この条件文に対応する計算は次のとおりです。

コピー
import System
static def GetAttributeValue(Incident):
    PropertyState = false
    if TRIGGER_OBJECT.TRIGGER_FIELD != null and TRIGGER_OBJECT.TRIGGER_FIELD._Title == '値':    
        PropertyState = true
    return String.Format(":SetPROPERTY(ターゲット, {0});", PropertyState)

計算の条件文のプレースホルダーを置換してから、計算エディタの [依存関係] パネルに TRIGGER_FIELD を追加すると、目的の計算を取得できます。また、「PropertyState」へのすべての参照を、よりわかりやすい変数名に変更することをお勧めします。

このセクションの以降の部分では、この計算に基づく例を示し、ロジックについて説明します。後半の例では、計算をさらに拡張します。

これらの計算におけるインデントは非常に重要であり、関数の範囲を設定します。したがって、このマニュアルの例をコピーする場合、計算エディタに貼り付けるときには、必ず正しいインデントを保持してください。

if 文を使用した値のリセット

次の例は、ウィンドウ計算の設定で紹介する例を拡張して、[影響] フィールドを任意に設定し、[緊急度] フィールドが 緊急 に設定された場合にのみ必須にします。フィールドがクリア (Null に設定)されるか、別の値に設定された場合、[影響] フィールドは再度任意に設定されます。

この条件文は次のとおりです。

[緊急度] が 緊急 に設定されているときには、[影響] の [必須に設定] を true にします。

つまり、トリガー フィールドは [緊急度] であり、ターゲット属性は [影響] です。また、ウィンドウ関数は :SetMandatory(,) です。

適切なウィンドウ計算の構造

  • 開始時に、ウィンドウ関数の一般的な True または Flase 値を指定する変数を停止します。
  • 次に、該当する値が選択されたときに、変数を変更する文を作成します。
  • 最後に、True/False パラメータを設定する変数を使用してウィンドウ関数を返します。

例:

コピー
import System
static def GetAttributeValue(Incident):
    MandatoryUrgency = false
    if Incident._IncidentUrgency != null and Incident._IncidentUrgency._Title == '緊急':
        MandatoryUrgency = true
    return String.Format(":SetMandatory(_Impact, {0});", MandatoryUrgency)

3 行目、4 行目、および最終行のインデントは 1 つで、5 行目のインデントは 2 つです。

3 行目は変数 MandatoryUrgency を作成し、その値を false に設定します。これは最も一般的な、計算の既定値です。

4 行目は、[緊急度] が 緊急 (Incident._IncidentUrgency._Title == '緊急') に設定されているかどうかを確認するためのテストを行います。この計算言語では、計算が属性 Incident._IncidentUrgency._Title の値をテストする前に、属性のオブジェクトが Null ではないこと (Incident._IncidentUrgency != null) をテストする必要があります。

4 行目が True で、[緊急度] が Null ではなく、緊急 に設定されている場合、5 行目が実行され、変数 MandatoryUrgency の値が True に設定されます。

最後に、6 行目が実行され、計算属性の値を設定します。変数を参照しているため、計算言語では、String.Format 関数を使用して戻り文字列を生成する必要があります。この形式は String.Format("function(attribute, {0});", variable) です。{0} は、文字列が生成されるときに変数で置換され、:SetMandatory(_Impact,MandatoryUrgency); を返します。既定では、MandatoryUrgencyfalse であるため、[影響] フィールドは必須ではありません。ただし、[緊急度] が 緊急 に設定されている場合、4 行目で規定されている条件が満たされ、5 行目が実行されます。これにより、変数 MandatoryUrgencytrue に設定され、[影響] フィールドが必須になります。

3 行目と 5 行目は 1 つの等号 = を使用しますが、4 行目は 2 つの等号 ==を使用します。
= は「等しい」を意味し、== は「等しいかどうか」を意味します。

1 つの計算による 2 つのフィールドの更新

次の例では、前の例と同様の計算を使用し、1 つの計算で 2 つのフィールドを更新する方法について説明します。この例では、[カテゴリ] が [ハードウェア] に設定されている場合にのみ、[構成項目] フィールドと [構成項目タイプ] フィールドが表示されます。

この条件文は次のとおりです。

[カテゴリ] が ハードウェア に設定されているときに、[構成項目] と [構成項目タイプ] の [非表示に設定] を false に設定します。

つまり、トリガー フィールドは [カテゴリ] で、ターゲット属性は [構成項目] と [構成項目タイプ] です。ウィンドウ関数は :SetHidden(,) です。

コピー
import System
static def GetAttributeValue(Incident):
    HideCI = true
    if Incident.Category != null and Incident.Category.FullName == 'ハードウェア':
        HideCI = false
    return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI)

3 行目、4 行目、および 6 行目のインデントは 1 つで、5 行目のインデントは 2 つです。長い 6 行目は、計算エディタでは 1 行に表示されます。

3 行目は変数 HideCItrue に設定します。

4 行目は、[カテゴリ] が Null ではなく、ハードウェア に設定されていることをテストします。

4 行目が真の場合、5 行目が実行され、HideCIfalse に設定されます。

最後に、6 行目が実行され、計算属性の値が String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI) に設定されます。既定では、HideCItrue であるため、[構成項目タイプ] フィールドと [構成項目] フィールドは非表示です。ただし、[カテゴリ] が ハードウェア に設定されている場合、4 行目で規定されている条件が満たされ、5 行目が実行されます。これにより、変数 HideCIfalse に設定されるため、[構成項目タイプ] フィールドと [構成項目] フィールドが表示されます。

String.Format を使用して、変数を使用する複数の関数を返すときには、波括弧で囲んだ数値として関数の変数を参照してから、順に変数を追加します。例:

String.Format("function(attribute, {0});function(attribute, {1});function(attribute, {2});", variable 0, variable1, variable 2)

:SetHidden も、ターゲット属性に関連付けられたラベルを表示および非表示にします。ただし、ウィンドウ マネージャの [コントロール] ツリーから追加された固定ラベルでは、:SetHidden を使用できません。

1 つのトリガーによる異なる関数の使用

前の例では、常にウィンドウ関数を 1 つだけ返し、1 つ以上のフィールドの必須状態を変更するか、非表示状態を変更しました。この例では、1 つの計算を使用して、2 つの異なる関数を更新する方法について説明します。この例は前の例を拡張します。[カテゴリ] が ハードウェア に設定されている場合に、[構成項目] フィールドと [構成項目タイプ] フィールドが表示され、[構成項目タイプ] も必須になります。

この条件文は次のとおりです。

[カテゴリ] が ハードウェア に設定されているときに、[構成項目] と [構成項目タイプ] の [非表示に設定] を false に設定し、[構成項目タイプ] の [必須に設定] を true に変更します。

つまり、トリガー フィールドは [カテゴリ] で、ターゲット属性は [構成項目] と [構成項目タイプ] です。ウィンドウ関数は :SetHidden(,)SetMandatory(,) です。

コピー
import System
static def GetAttributeValue(Incident):
    HideCI = true
    MandatoryCI = false
    if Incident.Category != null and Incident.Category.FullName == 'ハードウェア':
        HideCI = false
        MandatoryCI = true
    return String.Format("return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{0});:SetMandatory(ConfigurationItemType,{1});", HideCI, MandatoryCI)", HideCI, HideCI, MandatoryCI)

3 行目、4 行目、5 行目、および 8 行目のインデントは 1 つで、6 行目および 7 行目のインデントは 2 つです。長い 8 行目は、計算エディタでは 1 行に表示されます。

3 行目は変数 HideCItrue に設定します。既定では、[CI] フィールドと [CI タイプ] フィールドを非表示にします。

4 行目は変数 MandatoryCIfalse に設定します。既定では、[CI タイプ] フィールドは必須ではありません。

5 行目が真の場合、6 行目と 7 行目が実行され、HideCIfalse に、MandatoryCItrue に設定されます。これらの行は計算内でインデントが同じため、いずれの行も実行されます。

最後に、長い 8 行目が実行され、HideCI の値が最初の 2 つの関数に、MandatoryCI の値が 3 番目の関数に渡されます。

最初の 2 つの関数に同じ変数を渡しているため、8 行目を次のように書き換えることができます。
return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{0});:SetMandatory(ConfigurationItemType,{1});", HideCI, MandatoryCI)

1 つのトリガー値に基づいた複数の関数の使用

この例では、トリガー属性で選択された値に応じて、異なる関数を使用する方法について説明します。[優先度] が に設定されている場合、[理由] フィールドが必須かつ編集可能になります。[優先度] が に設定されている場合、[理由] フィールドが任意かつ読み取り専用になります。それ以外の場合、[理由] フィールドは既定の状態です。

この計算では、インシデント オブジェクトに追加するために、[名前] が _reason に設定されている属性が必要です。

この条件文は次のとおりです。

[優先度] が に設定されているときには、[理由] の [必須に設定] を true に設定し、[理由] の [読み取り専用に設定] を false に設定します。[優先度] が に設定されているときには、[理由] の [読み取り専用に設定] を true に設定し、[理由] の [必須に設定] を false に設定します。

つまり、トリガー フィールドは [優先度] であり、ターゲット属性は [理由] です。また、ウィンドウ関数はSetMandatory(,) および SetReadOnly(,) です。次のように記述することもできます。

その他のすべての場合には、[理由] の [必須に設定] と [読み取り専用に設定] の両方を false に設定します。

つまり、[理由] の [必須に設定] と [読み取り専用に設定] の両方の既定値が false になります。

コピー
import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    ReadOnlyReason = false
    if Incident.Priority != null and Incident.Priority.Title == '高':
        MandatoryReason = true
    elif Incident.Priority != null and Incident.Priority.Title == '低':
        ReadOnlyReason = true
    return String.Format(":SetMandatory(_reason, {0});:SetReadOnly(_reason, {1});", MandatoryReason, ReadOnlyReason)

3 行目、4 行目、5 行目、7 行目、および 9 行目のインデントは 1 つで、6 行目および 8 行目のインデントは 2 つです。長い 9 行目は、計算エディタでは 1 行に表示されます。

3 行目は変数 MandatoryReasonfalse に設定します。既定では、[理由] フィールドは必須ではありません。

4 行目は変数 ReadOnlyReasonfalse に設定します。既定では、[理由] フィールドは読み取り専用です。

5 行目が真で、[優先度] が に設定されている場合、6 行目が実行され、[必須理由] が true に設定されます。

5 行目が True ではない場合、7 行目が実行されます。elif (else if) 行は、前の行が False の場合にのみ実行されます。この行が真で、[優先度] が に設定されている場合、8 行目が実行され、[読み取り専用理由] が true に設定されます。

最後に、[必須理由] と [読み取り専用理由] の設定値を使用して、9 行目が実行されます。

つまり、既定では、[必須理由] と [読み取り専用理由] は false であるため、[理由] フィールドは必須でも読み取り専用でもありません。ただし、[優先度] が に設定されている場合、[必須理由] は true (5、6行目) ですが、[読み取り専用理由] は false であるため、[理由] フィールドは必須ですが、読み取り専用ではありません。ただし、[優先度] が に設定されている場合、[読み取り専用理由] は true (7、8 行目) ですが、[必須理由] は false であるため、[理由] フィールドは読み取り専用ですが、必須ではありません。

計算での日付の使用

この例では、[日付が必須] フィールドで選択された日付が現在の日付から 7 日以内に設定されている場合、[理由] フィールドを必須にします。

この計算では、インシデント オブジェクトに追加するために、[名前] が _reason および _daterequired に設定されている属性が必要です。異なる計算を使用して同じフィールドを更新しないでください。

この条件文は次のとおりです。

[日付が必須] フィールドで選択された日付が現在の日付から 7 日以内に設定されている場合、[理由] の [必須に設定] を true にします。

つまり、トリガー フィールドは [日付が必須] であり、ターゲット属性は [理由] です。また、ウィンドウ関数は :SetMandatory(,) です。

コピー
import System
static def GetAttributeValue(Incident):
    MandatoryReason = false
    if Incident._daterequired != null and Incident._daterequired < DateTime.Today.AddDays(7):
        MandatoryReason = true
    return String.Format(":SetMandatory(_reason,{0});", MandatoryReason)

3 行目、4 行目、および最終行のインデントは 1 つで、5 行目のインデントは 2 つです。

3 行目は変数 MandatoryReason を作成し、false に設定します。既定では、[理由] フィールドは必須ではありません。

4 行目は .Net メソッド .AddDays を使用して、[日付が必須] が現在の日付から 7 日以内であるかどうかを判断します。7 日以内の場合、5 行目が実行され、MandatoryReasontrue に設定されます。

次に、6 行目が適切な SetMandatory 関数を生成します。

計算での .Net メソッドの詳細な使用方法については、Ivanti コミュニティ Web サイトをご参照ください。