示例窗口计算

此部分包含窗口计算的其他示例,以及如何运行这些示例的说明。首先,此处提供所需语句的扩展版本,以及带有占位符的相应模板计算。使用这些内容有助于编写基本计算。

TRIGGER_FIELD(位于 TRIGGER_OBJECT)设置为 VALUE 时,希望将 TARGET属性更改为真/假

与这条所需语句对应的计算为:

复制
import System
static def GetAttributeValue(Incident):
    PropertyState = false
    if TRIGGER_OBJECT.TRIGGER_FIELD != null and TRIGGER_OBJECT.TRIGGER_FIELD._Title == 'VALUE':
        PropertyState = true
    return String.Format(":SetPROPERTY(TARGET, {0});", PropertyState)

更改计算中的所需语句的占位符,然后将TRIGGER_FIELD添加到“计算”编辑器的依赖性面板中,从而提供所需的计算。还建议将所有对 "PropertyState" 的引用替换为更具描述性的变量名称。

此部分还提供基于此计算的示例,并且介绍其逻辑。后面的示例进一步对计算进行扩展。

这些计算中的缩进非常重要,因为它们设置了函数的范围。因此,如果您从此文档中复制示例,则在将它们粘贴到计算编辑器时请务必保持正确的缩进。

使用 if 语句重置值

以下示例深入介绍了设置窗口计算中给出的示例,以便将影响字段设置为非必填,并且仅当紧急度字段设置为 紧急 时才转为必填。如果字段已被清除(设置为空)或设置为其他值,那么影响字段将重新设置为非必填。

为此,我们所需的语句为:

紧急性设置为 紧急 时,我要将影响的 SetMandatory 设置为真。

由此我们可以看出,触发字段为紧急性,目标属性为影响,窗口函数为 :SetMandatory(,)

窗口计算的良好结构为:

  • 在开始时定义变量,该变量为窗口函数指定典型的“真”或“假”值
  • 然后构建用于在选中相应的值时更改变量的语句
  • 最后返回使用变量来设置其真/假参数的窗口函数

例如:

复制
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)

第三、第四和最后一行具有单格缩进;第五行有双格缩进。

第三行创建了名为 MandatoryUrgency 的变量,并将其值设置为。这是计算中最常见的默认值。

第四行进行测试以查看紧急度是否设置为 紧急 (Incident._IncidentUrgency._Title == '紧急')。请注意,在计算可以测试属性 Incident._IncidentUrgency._Title 的值之前,计算语言会要求我们测试属性的对象是否为空 (Incident._IncidentUrgency != null)。

如果第四行为真,紧急度不为空,并且设置为 紧急,那么将运行第五行并将变量 MandatoryUrgency 的值设置为

最终,将运行第六行并设置计算属性的值。由于我们引用了变量,计算语言将要求我们使用 String.Format 函数生成返回字符串。格式为 String.Format("function(attribute, {0});", variable) – 生成字符串时,{0} 将替换为变量,从而得出 :SetMandatory(_Impact,MandatoryUrgency);。默认情况下,MandatoryUrgency 为假,因此影响字段不是必填。但是,如果紧急度设置为 紧急,那么将满足第四行中指定的条件并运行第五行。这会将变量 MandatoryUrgency 设置为,因此影响字段会变为必填。

请注意,第三行和第五行使用单个等号 =,而第四行使用两个等号 ==
= 表示“使其等于”,而 == 表示“这是否相等?”

利用一次计算更新两个字段

接下来的示例显示如何使用一次计算更新两个字段,此示例中使用了与先前示例中类似的计算。在此示例中,仅当类别设置为硬件时才显示配置项目配置项目类型字段。

为此,我们所需的语句为:

类别设置为 硬件 时,我要将配置项目配置项目类型SetHidden 更改为

由此我们可以看出,触发字段为类别,目标属性为配置项目配置项目类别,而窗口函数为 :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)

第三、第四和第六行具有单格缩进;第五行有双格缩进。较长的第六行在计算编辑器中显示为一行。

第三行将变量 HideCI 设置为

第四行测试类别是否非空并且设置为 硬件

如果第四行为真,那么将运行第五行并将 HideCI 设置为

最终将运行第六行并将计算属性的值设置为 String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});", HideCI, HideCI)。默认情况下,HideCI,因此 ConfigurationItemTypeConfigurationItem 字段为隐藏。但是,如果类别设置为 硬件,那么将满足第四行中指定的条件,并运行第五行。这随后将变量 HideCI 设置为,因此 ConfigurationItemTypeConfigurationItem 字段将变为可视。

使用 String.Format 返回多个使用变量的函数时,您可以将函数中的变量引用为用弯括号括起来的数字,然后添加变量以供将来使用。例如:

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

:SetHidden 还可以显示和因此与目标属性关联的标签。但是,您不能将 :SetHidden 用于“窗口管理器”的控件树中添加的静态标签。

通过一个触发器使用不同函数

前面的示例中始终仅返回一个窗口函数:无论是更改一个或多个字段的必填状态,还是更改隐藏状态。此示例将展示如何通过一个计算来更新两个不同的函数。此示例将进一步扩展上一示例,如果类别设置为 硬件,那么将显示配置项目配置项目类型字段,并将配置项目类型设置为必填。

为此,我们所需的语句为:

类别设置为 硬件 时,我要将配置项目配置项目类型的 SetHidden 设置为并将配置项目类型SetMandatory 设置为

由此我们可以看出,触发字段为类别,目标属性为配置项目配置项目类别,而窗口函数为 :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(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{1});:SetMandatory(ConfigurationItemType,{2});", HideCI, HideCI, MandatoryCI)

第三、第四、第五和第八行具有单格缩进;第六行和第七行有双格缩进。较长的第八行在计算编辑器中显示为一行。

第三行将变量 HideCI 设置为 – 默认情况下我们希望隐藏配置项目配置项目类型字段。

第四行将变量 MandatoryCI 设置为 – 默认情况下我们希望配置项目类型字段不是必填字段。

如果第五行为真,将运行第六行和第七行,并将 HideCI 设置为,将 MandatoryCI 设置为。这两行都将运行,因为在计算中,它们具有相同的缩进。

最终,将运行较长的第八行,并将 HideCI 的值传递至前两个函数,将 MandatoryCI 的值传递至第三个函数。

因为您要将相同的变量发送到前两个函数,因此可以将第八行重写为:
return String.Format(":SetHidden(ConfigurationItemType,{0});:SetHidden(ConfigurationItem,{0});:SetMandatory(ConfigurationItemType,{1});", HideCI, MandatoryCI)

根据一个触发器的值使用不同的函数

此示例显示如何使用根据触发属性中选择的值使用不同的函数。如果优先级设置为 ,那么原因字段将为必填且可以编辑;如果优先级设置为 ,那么原因字段不为必填并且只读;在其他情况下,原因字段将保持其默认状态。

此计算需要将一个名称设置为 _reason 的属性添加到事件对象。

为此,我们所需的语句为:

优先级设置为 时,我要将原因SetMandatory 更改为,并将原因SetReadOnly 更改为;当优先级设置为 时,我要将原因SetReadOnly 更改为,将原因SetMandatory 更改为

由此我们可以看出,触发字段为优先级,目标属性为原因,窗口函数为 SetMandatory(,)SetReadOnly(,)。我们还可以编写:

在任何其他情况下,我希望原因SetMandatorySetReadOnly

由此我们可以看出,原因的 SetMandatory 和 SetReadOnly 的默认值为

复制
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)

第三、第四、第五、第七和第九行具有单格缩进;第六行和第八行有双格缩进。较长的第九行在计算编辑器中显示为一行。

第三行将变量 MandatoryReason 设置为 – 默认情况下我们希望原因字段不是必填字段。

第四行将变量 ReadOnlyReason 设置为 – 默认情况下我们希望原因字段为只读。

如果第五行为真,并且优先级字段设置为 ,那么将运行第六行并将 MandatoryReason 设置为

如果第五行不是真,那么将运行第七行。只有之前一行为假时才运行 elif(“否则如果”)行。如果此行为真,并且优先级字段设置为 ,那么将运行第八行并将 ReadOnlyReason 设置为

最终,将使用 MandatoryReasonReadOnlyReason 的设置值运行第九行。

这意味着,默认情况下,MandatoryReasonReadOnlyReason,因此原因字段既不是必填也不是只读。但是,如果优先级设置为 ,则 MandatoryReason(第五行和第六行),但是 ReadOnlyReason 仍然为,因此原因将为必填但不是只读。如果优先级设置为 ,则 ReadOnlyReason(第七行和第八行),但是 MandatoryReason,因此原因将为只读但不是必填。

在计算中使用日期

在此示例中,如果在所需日期字段中所选择的日期被设置为当前日期的七天之内,那么原因字段将成为必填字段。

此计算需要将名称分别设置为 _reason_daterequired 的属性添加到事件对象。请记住,不要用不同的计算更新相同的字段。

为此,我们所需的语句为:

所需日期设置为今天的七天之内时,我要将原因SetMandatory 设置为

由此我们可以看出,触发字段为所需日期,目标属性为原因,窗口函数为 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)

第三、第四和最后一行具有单格缩进;第五行有双格缩进。

第三行创建名为 MandatoryReason 的变量,并将其设置为 – 默认情况下我们希望原因字段不是必填字段。

第四行使用名为 .AddDays 的 .Net 方法确定所需日期是否在从今天起的 7 天之内。如果是,那么将运行第五行并将 MandatoryReason 设置为

随后,第六行将生成相应的 SetMandatory 函数。

关于在计算中使用 .Net 方法的详细信息,请参阅 Ivanti 社区网站。