我们知道,在tfs中我们定义字段时,可以定义成String、Integer、Double、DateTime、PlainText、Html、TreePath和History,其中PlainText、Html和History不可用作报表格式。大多数情况下我们在定制流程时经常会用到PlainText类型字段,比如“说明”等,那么在定制报表时我们如何取出这些数据呢,当然我们用Excel的数据透视表可以实现,下面我们说一下是用报表开发工具如何读取此字段。
首先,我们定制报表是从Warehouse数据仓库和Analysis Services多维数据集里读取数据,而PlainText不能做为报表格式,所以要想从Warehouse数据库里捞取数据的想法是行不通的。那么我们另辟蹊径,既然在tfs上可以查到数据,那么这些数据就一定会存在这个项目所在项目集合的数据库中。假设我们的项目集合名字为DefaultCollection,那么我们现在看一下DefaultCollection数据库的表,明显的我们可以看到一张QueryItems表,这里面的Text字段记录了我们在tfs中定义的查询,我们现在取出一条看看:
select [System.Id], [Microsoft.VSTS.Common.StackRank], [System.Description], [System.WorkItemType], [System.State], [System.Title]
from WorkItems
where [System.TeamProject] = @project
and [System.AssignedTo] = @me
and [System.State] <> '已关闭'
and [System.WorkItemType] <> '共享步骤'
order by [Microsoft.VSTS.Common.StackRank], [Microsoft.VSTS.Common.Priority], [System.WorkItemType], [System.Id]
这就说明了我们的数据确实是存在这个数据库中的,或者是通过这个语句来指向其他的数据库中的。我们看到上面的查询语句是从WorkItems表里获取数据的,在DefaultCollection数据库里并没有这张表,我们现在做一下假设,WorkItems是tfs建立的临时表,是TFS和sql server数据库的中间表,那么既然这张表里能读到PlainText类型字段,那么说明此类型的字段还是在数据库中有存储的,通过查找MSDN,我们查到一张WorkItemLongTexts表,我们查询这张表,里面有一个Words字段,里面就记录了我们PlainText类型字段的值,又通过FldID来定位是哪个字段,通过ID来定位是哪个工作项,通过Rev来标志此条数据的版本。知道了这些,我们现在就可以通过跨数据库来实现查询。
例如我们现在要查询“研发任务”流程的ID、标题、指派给和问题说明,就可通过一下语句实现:
with LongText as
(select a.FldID,a.ID,MAX(a.rev) as REV
from Tfs_DefaultCollection.dbo.WorkItemLongTexts a
where a.FldID=52
group by a.FldID,a.ID)
select a.System_Id,a.System_Title,e.Name,c.Words,a.System_WorkItemType
from Tfs_Warehouse.dbo.DimWorkItem a,Tfs_Warehouse.dbo.FactCurrentWorkItem b,Tfs_DefaultCollection.dbo.WorkItemLongTexts c,LongText d,Tfs_Warehouse.dbo.DimPerson e
where a.TeamProjectSK=3
and a.TeamProjectSK=b.TeamProjectSK
and a.WorkItemSK=b.WorkItemSK
and a.System_AssignedTo__PersonSK=e.PersonSK
and a.System_Id=c.ID
and c.FldID=d.FldID
and c.ID=d.ID
and c.Rev=d.REV
and c.FldID=52
and a.System_WorkItemType='研发任务';
这样便查询出了PlainText类型的字段“说明”,顺便提一下,我现在使用的表DimWorkItem,我们也可以使用WorkItemHistoryView,这里面的人可以直接显示,不用再关联DimPerson表。