分配基于条件的值和规则

Azure DevOps Server 2020 |Azure DevOps Server 2019 |TFS 2018

可以使用 WHENWHENNOTWHENCHANGEDWHENNOTCHANGED 元素定义有条件地运行的规则。 使用这些规则定义定义子句 True时运行的元素。 可以基于指派给特定字段的值或者用户是否修改特定字段来定义条件。 例如,你可以创建依赖选取列表以提供详细的安全性或自定义行为。

字段条件是你在 (定义) 元素或 FIELD (工作流) 元素内FIELD列出的其他元素。 有关这些元素的详细信息,请参阅 FIELD (Definition) 元素引用FIELD (工作流)

以下代码是 WHEN 子句的简单示例:

<FIELD  . . .  > 
<WHEN field="referenceName" value="yyy">  
</FIELD>

此子句表示,只要字段 refname 具有值“yyyy”,此 FIELD 元素中的任何内容都适用。 该字段必须为有效的字段引用名称。 有关详细信息,请参阅 工作项跟踪对象的命名约定

注意

值属性不区分大小写。 所以,如果字段引用名称存储的值为“YYY”,则匹配将包括值为“yyy”或“YYY”的所有项。

条件元素的语法结构

下表描述了可以指定为 (Definition) 元素的 FIELD 子元素或 FIELD (Workflow) 元素的条件规则。 这些元素接受以下一个或多个属性:

  • field:描述字段的字符串。 必须包含 1 至 255 个字符。
  • value:当指定的字段具有此值时,元素WHENWHENNOT中的规则将应用于当前字段。

元素和语法

说明

WHEN

<WHEN field="fieldReferenceName" value="value">
<ALLOWEDVALUES> . . . </ALLOWEDVALUES>
<ALLOWEXISTINGVALUE> . . . <ALLOWEXISTINGVALUE>
<CANNOTLOSEVALUE> . . . </CANNOTLOSEVALUE>
<COPY> . . . </COPY>
<DEFAULT> . . . </DEFAULT>
<EMPTY> . . . </EMPTY>
<FROZEN> . . . </FROZEN>
<MATCH> . . . </MATCH>
<NOTSAMEAS> . . . </NOTSAMEAS>
<PROHIBITEDVALUES> . . . </PROHIBITEDVALUES>
<READONLY> . . . </READONLY>
<REQUIRED> . . . </REQUIRED>
<SERVERDEFAULT> . . . </SERVERDEFAULT>
<SUGGESTEDVALUES> . . . </SUGGESTEDVALUES>
<VALIDUSER> . . . </VALIDUSER>
</WHEN>

指定在另一个字段具有特定值时要应用于当前字段的一个或多个规则。 父元素定义当前字段。

当指定的字段具有此值时,该元素中的规则会应用到当前字段。

WHENNOT

<WHENNOT field="fieldReferenceName" value="value">
<ALLOWEDVALUES> . . . </ALLOWEDVALUES>
<ALLOWEXISTINGVALUE> . . . <ALLOWEXISTINGVALUE>
<CANNOTLOSEVALUE> . . . </CANNOTLOSEVALUE>
<COPY> . . . </COPY>
<DEFAULT> . . . </DEFAULT>
<EMPTY> . . . </EMPTY>
<FROZEN> . . . </FROZEN>
<MATCH> . . . </MATCH>
<NOTSAMEAS> . . . </NOTSAMEAS>
<PROHIBITEDVALUES> . . . </PROHIBITEDVALUES>
<READONLY> . . . </READONLY>
<REQUIRED> . . . </REQUIRED>
<SERVERDEFAULT> . . . </SERVERDEFAULT>
<SUGGESTEDVALUES> . . . </SUGGESTEDVALUES>
<VALIDUSER> . . . </VALIDUSER>
</WHENNOT>

指定将一个或多个规则应用于当前字段的条件。 在另一个字段的值发生更改时,这些规则会应用于当前字段。 父元素定义当前字段。

当指定的字段不包含特定值时,该元素中的规则会应用到当前字段。

WHENCHANGED

<WHENCHANGED field="fieldReferenceName" >
<ALLOWEDVALUES> . . . </ALLOWEDVALUES>
<ALLOWEXISTINGVALUE> . . . <ALLOWEXISTINGVALUE>
<CANNOTLOSEVALUE> . . . </CANNOTLOSEVALUE>
<COPY> . . . </COPY>
<DEFAULT> . . . </DEFAULT>
<EMPTY> . . . </EMPTY>
<FROZEN> . . . </FROZEN>
<MATCH> . . . </MATCH>
<NOTSAMEAS> . . . </NOTSAMEAS>
<PROHIBITEDVALUES> . . . </PROHIBITEDVALUES>
<READONLY> . . . </READONLY>
<REQUIRED> . . . </REQUIRED>
<SERVERDEFAULT> . . . </SERVERDEFAULT>
<SUGGESTEDVALUES> . . . </SUGGESTEDVALUES>
<VALIDUSER> . . . </VALIDUSER>  
</WHENCHANGED>

指定将一个或多个规则应用于当前字段的条件。 在工作项修订过程中另一个字段的值变化时,这些规则会应用于当前字段。 父元素定义当前字段。

WHENNOTCHANGED

<WHENNOTCHANGED field="fieldReferenceName">
<ALLOWEDVALUES> . . . </ALLOWEDVALUES>
<ALLOWEXISTINGVALUE> . . . <ALLOWEXISTINGVALUE>
<CANNOTLOSEVALUE> . . . </CANNOTLOSEVALUE>
<COPY> . . . </COPY>
<DEFAULT> . . . </DEFAULT>
<EMPTY> . . . </EMPTY>
<FROZEN> . . . </FROZEN>
<MATCH> . . . </MATCH>
<NOTSAMEAS> . . . </NOTSAMEAS>
<PROHIBITEDVALUES> . . . </PROHIBITEDVALUES>
<READONLY> . . . </READONLY>
<REQUIRED> . . . </REQUIRED>
<SERVERDEFAULT> . . . </SERVERDEFAULT>  
<SUGGESTEDVALUES> . . . </SUGGESTEDVALUES>
<VALIDUSER> . . . </VALIDUSER>
</WHENNOTCHANGED>

指定将一个或多个规则应用于当前字段的条件。 在工作项修订过程中另一个字段的值未发生变化时,这些规则会应用于当前字段。 父元素定义当前字段。

下表描述了在使用 WHEN、WHENNOT、WHENCHANGED 或WHENNOTCHANGED 元素指定的条件子句时,每个可选基于条件的规则如何应用于父字段。 有关详细信息,请参阅 规则和规则评估

元素 说明
ALLOWEDVALUES 父字段中必须具备来自特定值列表中的值。
ALLOWEXISTINGVALUE 允许使用已存在的父字段值,即使该值违反了其他规则。 如果父字段的值发生更改,则此元素不适用。
CANNOTLOSEVALUE 用户可以将父字段的值更改为 NULL,但不能将其更改为其他任何值。
COPY 第三个字段中的值自动复制到父字段。 在 COPY 元素中指定第三个字段。
DEFAULT 此元素指定父字段的默认值。
父字段不能包含值。
冷冻 父字段被冻结。 字段冻结后,可以将其值更改为 NULL,但不能将其更改为其他任何值。
MATCH 父字段的值必须与指定的模式匹配。
NOTSAMEAS 父字段的值无法匹配第三个字段的值。 在 NOTSAMEAS 元素中指定第三个字段。
PROHIBITEDVALUES 父字段不能包含枚举列表中的任何值。
READONLY 父字段为只读。
必需 父字段必须包含非 NULL 值。
SERVERDEFAULT 父字段从指定的服务器组件中获取值。 有效的服务器组件是 时钟,即更新工作项的时间,而 currentuser 是更新工作项的用户的标识。
SUGGESTEDVALUES 枚举列表包含父字段的建议值。
VALIDUSER 只有指定的用户可以修改父字段。

定义依赖字段

你可以指定某个字段仅在另一个字段包含特定值时是必需的。 在下面的示例中,当客户报告 Bug 时,必须指定客户严重级别。 如果客户没有报告 Bug,则不需要输入客户严重级别。

<FIELD refname="MyCorp.Severity" name="Customer Severity" type="String">  
       <ALLOWEDVALUES>  
           <LISTITEM value="Blocking" />  
           <LISTITEM value="Major" />  
           <LISTITEM value="Minor" />  
       </ALLOWEDVALUES>  
       <WHEN field="MyCorp.CustomerReported" value="true">  
           <REQUIRED />  
       </WHEN>  
</FIELD>  

定义条件选取列表

下面的示例演示一个条件选取列表,在该列表中 Problem Type 字段的允许值是受限的,具体取决于是否将 ProblemCharacteristic 字段的值设置为 Documentation。

<FIELD refname="MyCorp.ProblemType" name="Problem Type" type="String">  
       <WHEN field="MyCorp.ProblemCharacteristic" value="Documentation">  
           <ALLOWEDVALUES>  
               <LISTITEM value="Spelling Error" />  
               <LISTITEM value="Bad Format" />  
               <LISTITEM value="Missing Info" />  
           </ALLOWEDVALUES>  
       </WHEN>  
</FIELD>  

当用户更改另一个字段时定义字段, (WHENCHANGED)

在下面的示例中,用户更改 MyCorp.State 字段的值时,MyCorp.Status 字段的值将设置为服务器始终显示的当前日期和时间。

<FIELD refname="MyCorp.StateDate" name="Date Of Last State Change" type="DateTime">  
       <WHENCHANGED field="MyCorp.State">  
           <COPY from="clock" />  
       </WHENCHANGED>  
</FIELD>   

在下面的示例中,用户更改 MyCorp.State 字段的值时,MyCorp.Status 字段的值将被清除。

<!-- Clear the status field whenever someone changes the state -->  
<FIELD refname="MyCorp.Status" name="Status" type="String">  
       <WHENCHANGED field="MyCorp.State">  
           <COPY from="value" value="">  
       </WHENCHANGED>  
</FIELD>  

基于用户不修改字段 (WHENNOTCHANGED) 定义字段值

在下面的示例中,用户不更改 MyCorp.State 字段的值时,MyCorp.StateDate 字段将变为只读。

<FIELD refname="MyCorp.StateDate" name="Date Of Last State Change" type="DateTime">  
<!-- Make the StateDate field read-only when the State field is not changed -->  
       <WHENNOTCHANGED field="MyCorp.State">  
           <READONLY />  
       </WHENNOTCHANGED>  
</FIELD>