在团队开发中,一般都要使用一些工具来追踪项目开发进度。在 VS 中可以使用 TFS 的工作项来追踪项目开发进度。下面介绍一下使用 TFS 如何进行工作项的查询。
环境: VS 2017 + TFS 2013
我们新建一个查询:
可以看到,查询由若干个子句组成,子句之间通过逻辑运算符(|| 和 &&)连接。
整个查询等价于一个相对复杂(如果子句比较多的话)的条件表达式,值为 true/false,子句就是子表达式,子表达式也有值。
举个例子:
子句1 && 子句2 || 子句3 && 子句4 && 子句5
// 子句1之前没有逻辑运算符,所以第一条子句的 【与/或】 一列为空
那么在这里可以看出来,判断某个工作项是否属于查询的结果,实际上也就是判断条件表达式对于该工作项是否为真。那么具体如何判断条件表达式对于该工作项是否为真呢? 这就到了程序员擅长的领域了,毕竟条件语句嘛,谁都写过。将工作项的属性值放进条件表达式,依次判断子表达式的值,然后进行逻辑运算,得到结果就搞定了。
这里我们作以下探讨:
1.如何判断子句的值,进而得到整个查询的值
2.如何根据个人需要编辑查询
子句
子句的3个属性
1. 字段
也就是工作项的属性。字段的类型很丰富,比如 Assigned To(分配给),Changed By(最后一个修改),Work Item Type(工作项类型) 等等。工作项的所有属性都可以作为字段。对于具体的某个工作项,该属性有一个值,这个值对应子句的第三个属性。当我们查询使用久了,常用的字段自然就比较熟悉了。
一般我们常用的字段有这么几种:
Assigned To: 分配给。工作项当前指派给的人。
State: 状态。有 Active,New,Closed,Resolved等值。
Work Item Type: 工作项类型。有Bug,Risk,Task等常见类型。
Team Project: 团队项目。当公司里有多个项目时,每个项目便有一个名称。
ID: 工作项ID。该ID在不同的 Team Project 中唯一。
Changed By: 最后一个修改人。
Created By: 工作项创建人。
Closed By: 工作项关闭人。
2. 运算符
运算符是依赖于字段的,也就是说,不同的字段可使用的运算符是不一样的。在子句中选择好字段后,运算符一列会自动更新可用的运算符列表,下拉选择即可。 比如,字段 Team Project 可使用的运算符有 =、<>、隶属、Not In,但字段 State 可使用的运算符就比较多了,如下图。每一个字段具体可使用哪些运算符取决于字段的含义,这需要一个一个去理解。
我们来看看常用的几个运算符的含义:
= : 等于。这适用于一些数值型,枚举型,字符串型的字段。
<>: 不等于。适用同上。
< : 工作项属性的值 小于 子句中的值。适用同上。
>: 大于。适用同上。
>=: 大于等于。适用同上。
<=: 小于等于。适用同上。
包含: 顾名思义为一个值序列包含某一个值,其含义为工作项属性的值是否包含一个子句中的值,而工作项的值可以有多个。
不包含: 执行逻辑同上。
隶属: 工作项的值是否隶属于子句中的值序列。显然,子句中的值可以有多个,若要提供多个值,值之间用 逗号 分隔。
这适用于我们想一次性查询满足字段多个值中任何一个的所有工作项的情况。比如我们想查询指派给本小组所有成员的工作项,就可以使用该运算符。
Not In:执行逻辑同上。
=[字段]: 此时在查询界面的值一列选择一个字段,表示将 工作项中字段对应的属性的值 与 值一列选择的字段对应的属性的值进行运算。
实际上,该运算符也就是将工作项的两个属性的值进行运算。
<>[字段]:执行逻辑同上。
>[字段]: 执行逻辑同上。
<[字段]: 执行逻辑同上。
<=[字段]:执行逻辑同上。
<=[字段]:执行逻辑同上。
3. 值
字段的值。有些字段可用的值应该都是确定的。比如,State(状态):其可用的值列表如下图;Risk(风险):有低、中、高3个可用的值。
这里要注意一下 带 [字段] 的这类运算符,比如 = [字段],这时本列将选择一个字段,这表示将字段一列选择的字段的值与本列选择的字段的值进行是否相等的运算。如下图的第三个子句,它表示将判断工作项中 State 的值 与 Risk 的值是否相等。
判断子句的值
在判断子句的值的时候,首先观察字段,然后在工作项中找到对应属性,将对应属性的值与子句的值进行比较,怎么比较,取决于子句的运算符。比如有一条子句依次为: [Work Item Type],[=],[Bug]; 如果工作项的 Work Item Type 为 Task,那么显然子表达式不成立,所以子句的值为false。
从这里可以看出来:判断子句的值,只需要把子句抽象成一个简单的表达式,然后将工作项中对应属性的值放进表达式进行判断即可,比如刚才的子句对应的表达式为: 工作项的Work Item Type == Bug。比如某个工作项的 Work Item Type 为 Task,那么显然 Task != Bug,所以该子句为 false。
实际上,工作项并不是所有属性都有,对于某个子句的字段,可能工作项没有对应的属性,这时候子句的值为false。
判断查询的值
在明白如何判断子句的值之后,我们需要得到整个查询的值。同理,我们把整个查询也抽象成一个通过 ||和&& 连接的表达式,然后判断即可。
比如上面的查询,我们以 c/c++代码的形式抽象的表达式为:
// 定义字段对应的变量
// Work Item Type 为 typeCur
// Team Project 为 prjCur
// State 为 stateCur
// Assigned To 为 people
(typeCur == Bug) && (prjCur == XX Project) && (State != Closed) && (people == xx)
该查询只有逻辑与运算符,所以要满足查询为 true,那么需要保证所有子句为true,我们来看下面这个工作项
typeCur == Bug: Work Item Type 为 Bug,相等,子句为 true。
prjCur == XX Project:Area 为 TonghaoBIM,不相等,子句为 false。
State != Closed:State为 Active,不相等,字句为 true。
people == xx:Assigned To 为 xx,相等,子句为 true。
综上,第二条子句为 false,所以查询对于该工作项的值 false,运行该查询后,该工作项将不显示到列表上。
根据个人需求编辑查询
例1
最常见的应该是查询某个项目团队上,指派给自己的工作项,我们来看看需要用到哪些字段以及使用哪些运算符。
首先是字段 Team Project, 指定为当前我们所在的团队项目,比如 TonghaoBIM,运算符为 =。
再是指派给自己,Assigned To,运算符为 =,值为自己的名字,或者使用宏 @我。
再则我们只查询未关闭的工作项,那么指定一个 State 字段,运算符为 <>,值为 Closed。
最后,如果我们只需要查询类型为Bug的工作项,那么指定一个 Work Item Type,运算符为 =,Bug。
所有字句需要同时满足,因此都用 与 连接,查询的编辑结果如下:
编辑好查询之后,单击运行即可。对于经常会用到的查询,我们也可以保存查询并添加到收藏夹,下次查询就不用再编辑了。
例2
查询服务器上,本团队昨天创建的Bug。
首先是字段 Team Project。
再是工作项类型为Bug。
最后是创建时间为昨天,我们使用表示今天的宏:@今天,那么昨天为 @今天 - 1。
例3
查询本团队内,指派给所在小组所有成员的尚未关闭的Bug。
首先是字段 Team Project。
再是工作项类型为Bug。
再是 State,运算符为 <>,值为 Closed
最后为字段Assigned To,这里我们使用运算符 隶属,再指定多个值即可。
我们看一下结果:
发现结果是按照 id的升序进行排序的,可能我们更习惯按照指派给的人名进行排序,这时我们进行一些设置,在查询界面的工具条中单击列选项,进入排序标签页,再指定 字段 Assisgned To 参与排序,并将其作为 优先排序字段即可。
我们看到,查询结果已经是我们想要的排序结果了
例4
查询 标题中包含 任务1 字样,并且ID 在 1000以内或者 6000-7000范围内的本团队的Bug。
首先是字段 Team Project。
再是标题,我们使用运算符 包含,值为 任务1。
再是工作项类型为Bug。
再是ID,ID有两个条件,满足其中一个即可,这时我们需要用到 逻辑或 来连接这两个条件对应的子句。我们知道,在c++中的运算符中, 逻辑或 的优先级要低于 逻辑与,如果我们将这两个连续的子句放到查询的后面,那么显然,在查询等价的条件表达式中,这两个子句将会被分开。这时我们可以用查询的分组功能(也就是将若干个子句用括号括起来),在 与/或 这一列前的空白列中,我们同时选中两个子句,然后右键或者在工具条的分组按钮中,将两个子句分组就行了。由于 ID 在 6000-7000内 也对应两个子句,我们先对它们进行分组,再将 ID在 1000以内 对应的子句和分好组的两个子句继续分组,这样就完成了。
以上就是 TFS 工作项查询功能的一些介绍,使用该功能是慢慢熟练的过程,当然有些字段及运算符可能我们平时用不到,对于一些基础的字段及运算符的使用,我们还是有必要去熟悉的。