今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求。需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因此对需求的管理有一个基线跟踪的过程,也就是说,当产品发布后,质量管理部门希望统计出与该版本发布后相关的需求、Bug、任务等工作项是否发生变更,以及变更的什么数据。

初始讨论这个需求时,根据对TFS的了解,第一判断出这个数据是可以统计出来了,但是可能要费一番周折。实现的过程确时如此:

首先从TFS的数据Warehouse数据库入手,查询WIT之间的关联关系以及变更历史数据,管理关系的数据查询sql如下:

1、根据工作项ID查询出该工作项所有相关联的其他工作项目

select * from FactWorkItemLinkHistory wh
left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id
where cwv.System_Id ='25429'

  

2、从工作项历史记录数据中统计出1中的相关工作项的变更历史

select  cwv.System_Title as versionTitle , linkCWV.System_Title as targetTitle,linkCWV.ProjectNodeName from FactWorkItemLinkHistory wh

left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id  and cwv.TeamProjectCollectionSK = wh.TeamProjectCollectionSK

left join CurrentWorkItemView linkCWV on  wh.TargetWorkItemID = linkCWV.System_Id and  linkCWV.TeamProjectCollectionSK = wh.TeamProjectCollectionSK

where  cwv.System_Id ='25429'

  

3、通过添加过滤条件查询出工作项相关的工作项数据在某个基线后是否发生了变化

select  cwv.System_Title as versionTitle , linkCWV.System_Title as targetTitle,linkCWV.ProjectNodeName from FactWorkItemLinkHistory wh

left join CurrentWorkItemView cwv on wh.SourceWorkItemID = cwv.System_Id  and cwv.TeamProjectCollectionSK = wh.TeamProjectCollectionSK

left join CurrentWorkItemView linkCWV on  wh.TargetWorkItemID = linkCWV.System_Id and  linkCWV.TeamProjectCollectionSK = wh.TeamProjectCollectionSK

where  cwv.System_Id ='25429'

and wh.TargetWorkItemID   in (
select distinct System_Id from WorkItemHistoryView group by System_Id having max(LastUpdatedDateTime) >= cwv.LastUpdatedDateTime
)

  

通过上述统计,本以为已经统计出所需数据了,但是经过仔细的分析,TFS中的工作项任何的变更,比如添加了新的相关关联项,但其内容,比如需求说明、bug症状、测试步骤并没有方式变化,这样的数据就不应该是基线的变化,因此这样统计出的数据是有出入的,不准确。

基于这样的考虑,仅仅在TFS的Warehouse数据库中是统计不出相关报表的,必须从Collection数据库中来进行统计,Collection库结构是很复杂,如果仅仅是读取数据,分析一下,是没问题的,但如果是想直接修改里面的数据,就别考虑了,说不定就搞出问题,特别是在客户的大型生产环境中。

通过目测、查询、和搜索网络,终于找到了在Collection库中工作项各个字段修改历史记录的数据:

基于上面在两个数据库中的查询,终于统计出所需的数据。

网上搜到一个详细介绍TFS数据库的Blog,分析的很透彻。

https://visualstudiomagazine.com/articles/2009/03/09/inside-the-tfs-databases-an-occasional-series.aspx

TFS工作项数据统计及相关数据库结构分析的更多相关文章

  1. TFS 测试用例步骤数据统计

    TFS系统集成了一套BI系统,基于SQL Server的Analysis Service进行实现的.通过这几年的深入使用,能够感触到这个数据数据仓库模型是多么的优秀,和微软官方提供的数据仓库示例Adv ...

  2. 自定义TFS工作项“所有链接”列表中的列

    这个功能只有使用团队资源管理器查看工作项才有

  3. 如何彻底删除TFS的工作项字段

    TFS的工作项字段可以在所有工作项类型之间共享.例如自定义了一个字段"验证迭代"(Mycompany.IterationValidation)那么在需求.Bug中都可以添加这个字段 ...

  4. TFS二次开发系列:七、TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一:连接TFS服务器,并且得到之后需要使用到的类方法. /// < ...

  5. TFS代码变更和工作项关联,为系统变更提供完美的跟踪轨迹

    TFS是微软的应用软件生命周期管理(ALM)的解决方案产品,相比我们常见的一些ALM产品,例如HP ALM, IBM Rational, Atlanssian Jira等,其最大的区别在于TFS将软件 ...

  6. TFS二次开发的数据统计以PBI、Bug、Sprint等为例(一)

    TFS二次开发的数据统计以PBI.Bug.Sprint等为例(一) 在TFS二次开发中,我们可能会根据某一些情况对各个项目的PBI.BUG等工作项进行统计.在本文中将大略讲解如果进行这些数据统计. 一 ...

  7. 如何修改TFS 2013中工作项附件大小限制

    默认情况下,TFS工作项的附件大小限制为4MB.我们可以通过调用TFS提供的Web Service将这个限制调整最高到2GB. 调整这个设置的必备条件是你需要拥有TFS应用层管理员的权限.下面来看看如 ...

  8. TFS API : 四、工作项查询

    TFS API : 四.工作项查询 本节将讲述如何查询工作项,将用户统计数据. 使用WorkItemStore.Query方法进行查询工作项,其使用的语法和SQL语法类似: Select [标题] f ...

  9. [转载]基于TFS实践敏捷-工作项跟踪

    工作项跟踪(1) 可跟踪性是软件过程的重要能力,TFS主要是以工作项来实现过程的可跟踪性.曾有人问:"你们实际项目里的工作项是怎么样的?能不能让我们看看?"我也一直很好奇别的公司T ...

随机推荐

  1. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  2. 立即执行函数表达式(IIFE)

    原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...

  3. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  4. 微信小程序中利用时间选择器和js无计算实现定时器(将字符串或秒数转换成倒计时)

    转载注明出处 改成了一个单独的js文件,并修改代码增加了通用性,点击这里查看 今天写小程序,有一个需求就是用户选择时间,然后我这边就要开始倒计时. 因为小程序的限制,所以直接选用时间选择器作为选择定时 ...

  5. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

  6. bash字符串操作

    参考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 问题:bash怎么提取字符串的最后一位?例如python中strin ...

  7. UML图中经常用到几种的关系图例

    学习这个东西挺奇怪的,时间一长就容易忘记,或者记不清楚.今天看到一些UML图的关系,发现有些出入了,索性就写下来,以后再忘记的时候过来看看. 在UML的类图中,常见的有以下几种关系: 继承(Gener ...

  8. 使用gulp解决RequireJS项目前端缓存问题(二)

    1.前言 这一节,我们主要解决在上一节<使用gulp解决RequireJSs项目前端缓存问题(一)>末尾提到的几个问题: 对通过require-config.js引入的js文件修改后,没有 ...

  9. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  10. hibernate-mapping-3.0.dtd;hibernate-configuration-3.0.dtd;hibernate.properties所在路径

    hibernate-mapping-3.0.dtd 所在路径:hibernate-release-5.2.5.Final\project\hibernate-core\src\main\resourc ...