示例窗口计算
此部分包含窗口计算的其他示例,以及如何运行这些示例的说明。首先,此处提供所需语句的扩展版本,以及带有占位符的相应模板计算。使用这些内容有助于编写基本计算。
将 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为真,因此 ConfigurationItemType 和 ConfigurationItem 字段为隐藏。但是,如果类别设置为 硬件,那么将满足第四行中指定的条件,并运行第五行。这随后将变量 HideCI 设置为假,因此 ConfigurationItemType 和 ConfigurationItem 字段将变为可视。
使用 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(,)。我们还可以编写:
在任何其他情况下,我希望原因的 SetMandatory 和 SetReadOnly 为假。
由此我们可以看出,原因的 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 设置为真。
最终,将使用 MandatoryReason 和 ReadOnlyReason 的设置值运行第九行。
这意味着,默认情况下,MandatoryReason 和 ReadOnlyReason 为假,因此原因字段既不是必填也不是只读。但是,如果优先级设置为 高,则 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 社区网站。