跨 Rational Team Concert 中的多个项目区域创建定制报表

本文将介绍如何通过在 Rational Team Concert 中的多个项目区域内为两个角色(管理人员和开发人员)逐步创建定制报表,使他们能够采取行动,确保项目的正常运行。本文主要使用 BIRT 脚本和计算列,向管理人员和开发人员展示您自己的视图的必要信息。本文还将提供示例报表文件。

Ken Kumagai, 软件工程师, IBM

作者照片Ken Kumagai 是一名 IBM Rational ClearCase MultiSite 团队的 IBM 软件开发人员。他在日本 Yamato 软件开发实验室(YSL)工作。他目前的兴趣之一是如何让已有的系统可以与 IBM Rational Team Concert 和协作工具无缝地一起工作,这主要基于 IBM Rational Jazz 技术,通过生命周期协作开放服务(OSLC)来进行。在业余时间,Ken 喜欢在附近的星巴克咖啡店阅读书籍。



2012 年 7 月 06 日

下载 IBM® Rational® Team Concert 试用版  |  在线试用 IBM Rational 协作化生命周期管理解决方案
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

报表如何帮助您检查项目的健康情况

从不同角度查看有关项目的信息,这对于在整个软件开发中确保项目的良好健康来说非常重要。收集 IBM® Rational Team Concert™ 中有关项目的信息,并以快照的形式将它们存储在数据仓库中。快照类似于关系数据库管理系统中的表,目前已经有针对工作项、版本、软件配置管理 (SCM) 等内容的快照。您可以创建报表,通过使用 BIRT(参阅 参考资料 小节中的 “数据仓库的概念” 和 “数据仓库快照模式” 链接)从您喜欢的角度显示此信息。

本文可以指导您获得有用的报表,尤其是从您自己的角度出发的有关工作项的定制报表,帮助您确保项目处于健康状态下。出于这个目的,您需要考虑开发人员管理人员 这两个角色,以及针对每个角色的定制报表。每个角色都有自己的职责,并且需要获得对某些操作的支持。

  • 每个开发人员都从属于团队和项目。开发人员致力于所分配的工作项,以便在规定期限内完成工作,处理由其他开发人员批准的工作项请求,从而维护可交付产品的品质。
  • 每个管理人员都需要负责监督项目和团队。管理人员需要分配在指定的迭代结束前要完成的工作项,并平衡开发人员之间的工作量,以避免任何开发人员超负荷工作。

在标题为 “使用 BIRT 和 Rational Team Concert 创建定制报表”(参阅 参考资料 小节的链接)的由三个部分组成的系列文章中,介绍了用于报表的一些技术。本文将重点讨论如何创建报表来显示必要的信息,使每个角色的人员都能够通过检查报表确定项目的健康情况。


设置创建报表的环境

请参阅在 Jazz.net 中的开发团队 wiki 上的 “创建和部署新报表”(参阅 参考资料 中的链接),了解设置环境的步骤。如欲遍历本文中的所有步骤,则需要安装以下软件版本:

  • Rational Team Concert 3.0.1
  • Eclipse 框架和工具:
    • Eclipse Modeling Framework 2.5.0
    • Web Tools Platform 3.1.2
    • Data Tools Platform 1.7.2
    • Business Intelligence and Reporting Tools (BIRT) 2.5.2

请按照下列步骤打开示例报表文件:

  1. 打开 Report Design 透视图。在 Data Explorer 视图中,单击示例报表文件 .rptdesign
  2. 在 Data Sources 文件夹下面,单击每个数据源 以打开对话框。
  3. 在 Enter Repository 和 Enter Project Area 窗格中,分别选择您的存储库和项目区域。
    注:
    如果没有出现存储库和项目区域,请进行检查,确保已创建了存储库连接,并且您已登录到项目区域。
  4. 打开 Work Items 透视图。
  5. 在 Team Artifact 视图中,展开您的项目区域下的 Reports 文件夹,然后右键单击 Report Templates 并选择 New > Report Template
  6. 在内容窗格中单击 Browse,选择一个示例报表文件 (rptdesign)。
  7. 单击 OK

定制报表的类型

本文解释了如何使用以下三种报表类型来报告相关信息:表、饼图和条形图(重点主要是绑定到 Live_Workitem_Cnt 表的信息)。

表报表
表通过设置参数来显示所列出的工作项的有关信息。第一个表报表设置了 CONTRIBUTOR_ITEMID。第二个表报表设置了 APPROVAL_APPROVER_ITEMID。此外,BIRT 脚本使您可以定义自己的输出列。
 
饼图报表
饼图显示了按照输出列的值进行分组的工作项的有关信息。通过将输出列设置为类别定义并将 WI_COUNT 设置为片大小定义,显示每个组的级别。第一个饼图设置 WI_SEVERITY,第二个饼图将 WI_PRIORITY 设置为类别定义。
 
条形图报表
条形图通过将输出列设置为 Category (X) 系列并将 WI_COUNT 设置为 Value (Y) 系列来显示工作项的数量。第一个条形图设置了 CONTRIBUTOR_NAME,第二个条形图将 APPROVAL_APPROVER_NAME 设置为 Category (X) 系列。

工作项分配和批准请求

第一个表报表显示了分配给每个开发人员的未完成工作项,按截止日期或优先级进行排序(参见图 1)。开发人员可以在迭代过程中的任何时间看到未完成工作项,从而决定首先要处理​​哪些工作项。

deadline(数据类型:Date)
该类型是在 Live_Workitem_Cnt 和 Iteration 表的 Joint 数据集的计算列中定义的。如果 Live_Workitem_Cnt 表中的 DUE_DATE 存在,那么 deadline 就是 Live_Workitem_Cnt 表中的 DUE_DATE,否则,deadline 是 Iteration 表中的 ENDDATE。按照 deadline 对工作项排序非常重要,在 DUE_DATE 比 ENDDATE 早的情况下尤为重要,因为开发人员通常会计划在迭代结束前完成工作项,然后忽视截止日期 (due date)。
 
priority_label(数据类型:String)
该类型是在 Live_Workitem_Cnt 表的数据集的计算列中定义的。priority_label 存储人类可读的字符串,比如从带有数值前缀的从 WI_PRIORITY 转换的 high、medium 和 low,数值越小,优先级越高。

需要使用五种表(如表 1 中列出的类型)来创建图 1 所示的报表。Project_Area、Live_Contributor 表中的报表参数是按该顺序进行级联的。

表 1. 用于报告所分配的工作项的表
解释
IterationENDDATE 供计算列 deadline 使用(报表中显示了 deadline)。
Live_Contributor报表参数的已选定的 CONTRIBUTOR_ITEMID 被设置为 Live_Workitem_Cnt 的 CONTRIBUTOR_ITEMID。
Live_Workitem_Cnt表报表中显示了 WI_ID、SUMMARY 和 PROJECT_AREA_NAME。

DUE_DATE 供计算列 deadline 使用。

将未完成状态设置为 STATE_NAME。

报表中显示了计算列的 priority_label。
PriorityPRIORITY_ID 和 WI_PRIORITY 在脚本 onFetch 中分别存储为变量 priority_map (Default Value: new Object ()) 的键和值。

priority_map 用作 Live_Workitem_Cnt 的 priority_label。
Project_Area报表参数的已选定的 PROJECT_AREA_ITEMID 被设置为 Live_Workitem_Cnt 和 Live_Contributor 的 PROJECT_AREA_ITEMID。
图 1. 按 deadline 顺序排列的已分配工作项
根据 deadline 列出的六个工作项

第二个表报表显示了请求每个开发人员批准的工作项(图 2)。如果完成工作项的条件中包括要求批准,那么忽视批准可能会导致其他开发人员受阻。开发人员在迭代过程中的任何时间都能看到这个报表,因而可以避免忽视请求批准的工作项。

通过使用 Live_Workitem_Cnt、Live_Contributor(表 2)替换 Live_Workitem_Cnt、Live_Contributor(表 1),您需要使用五种表来创建如图 2 所示的报表。

表 2. 使用不同的表来报告工作项中请求批准的项
解释
Live_Workitem_Cnt除设置 STATE_NAME 外,其他与表 1 相同。

将挂起状态设置为 APPROVAL_STATE,而不是设置 STATE_NAME。
Live_Contributor报表参数中的已选定的 CONTRIBUTOR_ITEMID 被设置为 Live_Workitem_Cnt 的 APPROVAL_APPROVER_ITEMID。
图 2. 按优先级排序的工作项批准请求
按照优先级排序的三个工作项列表

迭代中的未完成工作项

第一个饼图报表显示了按严重性顺序排列的未完成缺陷(参见图 3)。管理人员在规划迭代时可以看到该报表,因此可以将工作项直接分配给开发人员,并检查该项目是否能按期完成。

severity_label(数据类型:String)
该类型是在 Live_Workitem_Cnt 表的数据集的计算列中定义的。severity_label 存储人类可读的字符串,比如 Blocker、Critical、Major、Normal 或 Minor,这些字符串从带有数值前缀的 WI_SEVERITY 转换而来,数值越小,严重性越高(0 = 最严重)。

同样,您需要使用五种表(参见表 3)来创建图 3 所示的报表。Project_Area、Live_devline、Live_iteration 表的报表参数就是按照此顺序进行级联的。

表 3. 按严重性顺序报告缺陷的表
解释
com.ibm.team.process.DevelopmentLine (Live_devline)该表从属于 Live 快照。报表参数的已选定 itemId 用于设置 Live_iteration 的 internalDevelopmentLine.itemId。
com.ibm.team.process.Iteration (Live_iteration)该表从属于 Live 快照。报表参数的已选定的 itemId 被设置为变量 iteration_param(默认值为 "")。如果未选中 itemId,则将使用 Live_devline 筛选的所有 itemId 串联成脚本 onFetch 的 iteration_paramiteration_param 被设置为 Live_Workitem_Cnt 的 ITERATION_ITEMID。
Live_Workitem_Cnt在饼图中,在按 PROJECT_AREA_NAME 对行进行分组的表中放上组标题行。

按 severity_label 的值对工作项进行分组。每个组的所占的比例是按 WI_COUNT 进行计算的,并按严重性的顺序显示在饼图报表中。

工作项类型(即缺陷)被设置为 WI_TYPE。

未完成的状态被设置为 STATE_NAME。
Project_Area报表参数的已选定的 PROJECT_AREA_ITEMID 被设置为 Live_Workitem_Cnt 的 PROJECT_AREA_ITEMID 和 Live_devline 的 internalProjectArea.itemId。
SeveritySEVERITY_ID 和 WI_SEVERITY 分别存储为脚本 onFetch 的 severity_map 变量(默认值为 new Object () )的键和值。

severity_map 用作 Live_Workitem_Cnt 的 severity_label。

要在一个饼图中显示某个项目区域的信息,在饼图中,在按 PROJECT_AREA_NAME 对行进行分组的表中放上组标题行。图 3 显示了在两个项目区中各自的未完成缺陷数量,并按照严重性进行排序。

图 3. 按严重性排序的未完成缺陷报表
显示缺陷数量的两个饼图

第二个饼图报表显示了未完成的工作项,而不是缺陷,并按优先级对它们进行排序(参见图 4)。priority_label 是在 LIVE_WORKITEM_CNT 表的数据集的计算列中定义的。

同样,通过使用 Live_Workitem_Cnt 和 Priority(表 4)替换 Live_Workitem_Cnt 和 Severity(参见表 3),您需要使用五种表来创建图 4 所示的报表。

表 4. 报告按优级排序的工作项的不同表
解释
Live_Workitem_Cnt在饼图中,在按 PROJECT_AREA_NAME 对行进行分组的表中放上组标题行。

按 priority_label 的值对工作项进行分组。每个组所占的比例是根据 WI_COUNT 进行计算的,并按优先级的顺序显示在饼图中。

工作项类型(而不是缺陷)被设置为 WI_TYPE。

未完成状态被设置为 STATE_NAME。
PriorityPRIORITY_ID 和 WI_PRIORITY 在 onFetch 脚本中分别存储为 priority_map 变量(默认值为 new Object() )的键和值。

priority_map 用作 Live_Workitem_Cnt 的 priority_label。priority_map 和 priority_label 的计算方式与分配工作项报表中的方式相同。

要在一个饼图中显示某个项目区域的信息,可以采用与第一个饼图相同的步骤。图 4 显示了两个项目区中各自的未完成工作项(而不是缺陷)的数量,并按照优先级对它们进行排序。

图 4. 按优先级排序的未完成工作项
显示了工作项数量的两个饼图

生产力和贡献

第一个条形图报表显示了每个开发人员完成了多少工作项(参见图 5)。管理人员可以在迭代结束时检查该报表,查看谁是生产力最高的人。

需要使用六种表(表 5)来创建图 5 中的报表。在 Project_Area、Live_teamarea、Live_devline、Live_iteration 表的报表参数以此顺序进行级联。

表 5. 报告生产力的表
解释
Live_Contributor将按 Live_teamarea 筛选的所有 CONTRIBUTOR_ITEMID 都串联为 onFetch 脚本的 contributor_param 变量(默认值:"")。

contributor_param 设置为 Live_Workitem_Cnt 的 CONTRIBUTOR_ITEMID。
com.ibm.team.process.DevelopmentLine (Live_devline)该表属于 Live 快照。

报表参数的已选定的 itemId 用于设置 Live_iteration 的 internalDevelopmentLine.itemId。
com.ibm.team.process.Iteration (Live_iteration)该表属于 Live 快照。

报表参数的已选定的 itemId 被设置为 iteration_param 变量(默认值为 "")。

如果没有选中的 itemId,则将使用 Live_devline 筛选的所有 itemId 串联为 onFetch 脚本的 iteration_param

iteration_param 被设置为 Live_Workitem_Cnt 的 ITERATION_ITEMID(计算方式和 iteration_param 的设置与未完成缺陷和未完成工作项的报表相同)。
com.ibm.team.process.TeamArea (Live_teamarea)报表参数的已选定的 itemId 被设置为 Live_Contributor 的 TEAM_AREA_ITEMID。
Live_Workitem_Cnt使用 WI_COUNT 对每个 CONTRIBUTOR_NAME 的已完成工作项进行计数,按降序显示每个数量。

将已完成状态设置为 STATE_NAME。
Project_Area,报表参数的已选定的 PROJECT_AREA_ITEMID 用于设置三个参数:Live_teamarea 的 projectArea.itemId、Live_devline 的 internalProjectArea.itemId 和 Live_Workitem_Cnt 的 PROJECT_AREA_ITEMID。

要在一个条形图中显示来自多个项目区域的信息摘要,可以使用堆叠的条形图,并将 PROJECT_AREA_NAME 列设置为可选的 Y 系列分组。图 5 显示了两个项目区域中的每个贡献者的已完成工作项数量。

图 5. 每个开发人员完成的工作项
按名称排列的已完成工作项数量

第二个条形图显示了开发人员批准了多少个工作项(参见图 6)。管理人员可以在迭代结束时会检查它,查看谁的贡献最大。

通过将 Live_Contributor、Live_Workitem_Cnt(表 5)替换为 Live_Contributor、Live_Workitem_Cnt(表 6),您需要使用六种表来创建图 6 的报表。

表 6. 报告贡献的不同表
解释
Live_Contributor将按 Live_teamarea 筛选的所有 CONTRIBUTOR_ITEMID 串联为脚本 onFetch 的变量 contributor_param。将 contributor_param 设置为 Live_Workitem_Cnt 的 APPROVAL_APPROVER_ITEMID。
Live_Workitem_Cnt使用 WI_COUNT 对每个 APPROVAL_APPROVER_NAME 的已批准工作项进行计数,并按降序显示每个数量。

将批准的已完成状态设置为 APPROVAL_STATE。

要在一个条形图中显示来自多个项目区域的信息摘要,请遵循第一个条形图的步骤。图 6 显示了两个项目区域中的每个贡献者的已批准工作项数量。

图 6. 按开发人员排序的已批准工作项
按项目和按名称排序的工作项数量

创建报表

本节将介绍在应用于 Rational Team Concert 中的项目区域的流程是 Scrum 时如何创建报表。本节将介绍创建已分配工作项报表的所有步骤。还将介绍其他报表的要点。

已分配工作项

创建 Assigned Work Items 报表包括以下七个步骤:

  1. 创建数据源
  2. 创建数据集
  3. 创建报表参数
  4. 在数据集上设置报表参数
  5. 创建带变量的计算列
  6. 创建一个报表参数,以选择排序类型
  7. 创建布局

创建数据源

创建 COMMON 和 WORKITEMS 数据源。

  1. 选择 File > New > Report,在 File name 中输入 assigned_workitems.rptdesign
  2. 单击 Next,选择 Blank Report,并单击 Finish
  3. 打开 Data Explorer 视图。
  4. 右键单击 Data Sources 选择 New Data source ,并执行以下步骤:
    1. 选择 Create from a data source type in the following list
    2. 从列表中选择 Jazz Data Source
    3. 在 Data Source Name 处输入 COMMON
    4. 单击 Next
  5. 在每个窗格中从列表中选择以下值,并单击 Finish
    • Enter Repository:your repository
    • Enter snapshot:COMMON_SNAPSHOT
    • Enter project area:your project
  6. 重复步骤 4 和步骤 5,在 Enter snapshot 窗格中选择 WORKITEMS_SNAPSHOT,以便创建另一个 WORKITEMS 数据源。

创建数据集

创建 Iteration、Live_Contributor、Project_Area、Live_Workitem_Cnt 和 Priority 数据集。

  1. 右键单击 Data Sets,并选择 New Data Set,然后完成以下步骤:
    1. 在 Data Source Selection 中单击 COMMON
    2. 在 Data Set Type 中选择 Jazz Simple Data Set
    3. 在 Data Set Name 中输入 Iteration
    4. 单击 Next
  2. 在每个窗格选中以下值,并单击 Finish
    • Data Set Name: ITERATION
    • Enter table name: ENDDATEITERAITON_ITEMIDITERATION_NAME
    • Select parameters: PROJECT_AREA_ITEMID
  3. 选中 COMMON 数据源,并重复步骤 1 和步骤 2,以创建以下数据集。
    • Data Set Name: Live_Contributor
      • Enter table name: LIVE_CONTRIBUTOR
      • Select columns: CONTRIBUTOR_ITEMID and CONTRIBUTOR_NAME
      • Select parameters: CONTRIBUTOR_ARCHIVED and PROJECT_AREA_ITEMID
    • Data Set Name: Project_Area
      • Enter table name: PROJECT_AREA
      • Select columns: PROJECT_AREA_ITEMID and PROJECT_AREA_NAME
      • Select parameters: PROJECT_AREA_ARCHIVED
  4. 选中 WORKITEMS 数据源,并重复步骤 1 和 2 以创建以下数据集。
    • Data Set Name: Live_Workitem_Cnt
      • Enter table name: LIVE_WORKITEM_CNT
      • Select columns: WI_ID, SUMMARY, PROJECT_AREA_NAME, ITERATION_ITEMID, WI_PRIORITY, and DUE_DATE
      • Select parameters: PROJECT_AREA_ITEMID, CONTRIBUTOR_ITEMID, and STATE_NAME
    • Data Set Name: Priority
      • Enter table name: PRIORITY
      • Select columns: PRIORITY_ID and WI_PRIORITY

创建报表参数

创建级联的参数组 ProjectArea 和 ContributorName。

  1. 右键单击 Report Parameters 选择 New Cascading Parameter Group
  2. 在 General 中输入以下值
    • Cascading Parameter Group Name: ProjectAreaAndContributorName
    • Prompt text: Select ProjectArea and ContributorName
  3. 选择 Multiple Data Sets.
  4. 单击 Add,并输入或选中以下值,然后单击 OK
    • 在 Name 输入 ProjectArea
    • 在 Data Set 选择 Project_Area
    • 在 Value 选择 PROJECT_AREA_ITEMID
    • 在 Display Text 选择 PROJECT_AREA_NAME
  5. 选择以下值:
    • Sort by: PROJECT_AREA_NAME
    • Sort direction: Ascending
  6. 执行以下步骤以重复步骤 4 和步骤 5。
    • 在 Name 输入 ContributorName
    • 在 Data Set 选择 Live_Contributor
    • 在 Value 选择 CONTRIBUTOR_ITEMID
    • 在 Display Text 选择 CONTRIBUTOR_NAME
    • 单击 OK
    • 在 Sort by 选择 CONTRIBUTOR_NAME
    • 在 Sort direction 选择 Ascending
  7. 单击 OK

在数据集上设置报表参数

在以下数据集上设置参数:Iteration、Live_Contributor、Live_Workitem_Cnt 和 Project_Area 数据集。

要获取未完成工作项,请在参数对话框中将未完成状态设置为 STATE_NAME。根据项目区域的流程或流程的用户定制,未完成状态可能会有所不同。通过打开项目区域和 Process Configuration Tab,指定状态标签的 id 属性值。清单 1 显示了组属性为 open 或 in progress 的值。

提示:
请记住,缺陷的 Resolved 状态与任务的 Done 状态具有相同的值 3,并且它们都在一个封闭的组中。这意味着,如果使用清单 1 中的代码,Resolved 状态的缺陷不会 在报表中显示。一种解决方法是创建两个 Live_Workitem_Cnt 数据集,分别显示缺陷和任务,并分别设置 STATE_NAME。

清单 1. 在 scrum 流程中处于未完成状态的工作项
'\'1\',\'2\',\'6\',\'com.ibm.team.workitem.buildTrackingWorkflow.state.s2\',\'com.ibm.te
am.apt.epic.workflow.state.s1\',\'com.ibm.team.apt.epic.workflow.state.s2\',\'com.ibm.te
am.apt.story.idea\',\'com.ibm.team.apt.story.tested\',\'com.ibm.team.apt.story.defined\'
,\'com.ibm.team.workitem.retrospectiveWorkflow.state.new\',\'com.ibm.team.workitem.retro
spectiveWorkflow.state.inprogress\',\'com.ibm.team.workitem.impedimentWorkflow.state.s1\
',\'com.ibm.team.rtc.workflow.adoption.state.s1\',\'com.ibm.team.rtc.workflow.adoption.s
tate.s2\''
  1. 单击 Iteration 选择 Parameters,然后单击 Edit 选择以下值:
    • Parameter name: PROJECT_AREA_ITEMID
      • Data Type: String
      • Linked to Report Parameter: ProjectArea
  2. 在以下的其他数据集上重复步骤 1,选择并输入以下参数值:
    • 数据集:Live_Contributor
      • Parameter name: CONTRIBUTOR_ARCHIVED
        • Data Type: Boolean
        • Default value: false
      • Parameter name: PROJECT_AREA_ITEMID
        • Data Type: String
        • Linked to Report Parameter: ProjectArea
    • 数据集:Live_Workitem_Cnt
      • Parameter name: PROJECT_AREA_ITEMID
        • Data Type: String
        • Linked to Report Parameter: ProjectArea
      • Parameter name: CONTRIBUTOR_ITEMID
        • Data Type: String
        • Linked to Report Parameter: ContributorName
      • Parameter name: STATE_NAME
        • Data Type: String
        • Default value: Enter unfinished states of work items (Listing 1)
    • 数据集:Project_Area
      • Parameter name: PROJECT_AREA_ARCHIVED:
        • Data Type: Boolean
        • Default value: false

创建带变量的计算列

创建带有 project_area_arraypriority_map 变量的计算列 priority_label 和 deadline。

Live_Workitem_Cnt 的 WI_PRIORITY 的格式可能不可读。利用 Priority 的 PRIORITY_ID 和 Live_Workitem_Cnt 的 WI_PRIORITY 之间的关系,可以将它转换为 Priority 的 WI_PRIORITY(参见清单 2)。然后,将 Priority 的 WI_PRIORITY 存储在带有数值前缀的 priority_label 中,数字越小,优先级越高(0 = 最高级)。

清单 2. PRIORITY_ID 和 WI_PRIORITY 之间的关系
PRIORITY_ID (at Priority) = PROJECT_AREA_ITEMID (at Project_Area) + "p" + 
    WI_PRIORITY (at Live_Workitem_Cnt)

在将报表文件部署到 Rational Team Concert 服务器上之后,ProjectArea 报表参数会保存已选中的项目区域,保存格式为每个项目区域由单引号包围,并用逗号与其他项目区域分隔开(注:在本地环境中运行报表文件时,ProjectArea 会在不使用单引号和逗号的情况下保存项目区域)。代码清单 3 显示了如何解析 ProjectArea,并将每个 ID 存储在 project_area_array 变量中。在清单 4 中,项目区域信息用于计算 priority_map 变量。

清单 3. 将选中的项目区域保存在 project_area_array 中
var project_area_str = params["ProjectArea"].value; 
var project_area_ids = project_area_str.split(","); 
var str = ""; 
var arr = new Array(); 
for(var count = 0; count < project_area_ids.length; count++ ){ 
    var project_area_id = project_area_ids[count]; 
    project_area_id = project_area_id.replace(/\'/g, ""); 
    arr.push(project_area_id); 
} 
vars["project_area_array"] = arr;
清单 4. 添加到 priority_map
var priority_id = row["PRIORITY_ID"]; 
var wi_priority = row["WI_PRIORITY"]; 
var arr = vars["project_area_array"]; 

if(priority_id != null){ 
    for(var count = 0; count < arr.length; count++){ 
        var project_area_itemid = arr[count]; 
        if(priority_id.indexOf(project_area_itemid)>= 0){ 
            vars["priority_map"][priority_id] = wi_priority; 
        } 
    } 
}
  1. 右键单击 Variables,选择 New Variable,输入以下值,并单击 OK
    • Type: Report Variable
    • Name: priority_map
    • Default value: new Object()
  2. 选择 Priority 数据集,然后选择 Script 选项卡,最后选择 onFetch,并输入脚本(清单 4)。

注:
该脚本将 PRIORITY_ID 和 WI_PRIORITY 分别存储为 priority_map 变量的键和值。

  1. 单击 Live_Workitem_Cnt,并选择 Computed Columns
  2. 单击 New,输入以下值,然后单击 OK
    • Column Name: priority_label
    • Data Type: String
    • Expression: 输入脚本(清单 5)
清单 5. priority_label 的表达式
var map = vars["priority_map"]; 
var label = ""; 
for(var key in map){ 
    var val = map[key]; 
    if(key.indexOf(row["WI_PRIORITY"]) >= 0){ 
        if(val == "High"){ 
            label = "id0:" + val; 
        }else if(val == "Medium"){ 
            label = "id1:" + val; 
        }else if(val == "Low"){
            label = "id2:" + val; 
        }else if(val == "Unassigned"){
            label = "id3:" + val; 
        } 
        break; 
    } 
} 
label;

创建一个联合数据集,其中包括来自 Live_Workitem_Cnt 和 Iteration 数据集的 Live_Workitem_Cnt_with_Iteration。在该联合数据集内,创建一个计算列 deadline。如果截止日期存在,deadline 就是截止日期,否则,deadline 是迭代的结束日期。可以使用 deadline 列对表进行排序。

  1. 右键单击 Data Sets,并选择 New Joint Data Set
  2. 选择并输入以下值,然后单击 Finish
    • 左窗格
      • Pulldown: Live_Workitem_Cnt
      • Menu: ITERATION_ITEMID
    • 右窗格
      • Pulldown: Iteration
      • Menu: ITERATION_ITEMID
    • Join Types: Left Outer Join
    • Data Set Name: Live_Workitem_Cnt_with_Iteration
  3. 单击 Live_Workitem_Cnt_with_Iteration,选择 Computed Columns,选择并输入以下值:
    • Column Name: deadline
    • Data Type: Date
    • Expression: 输入脚本(清单 6)
清单 6. deadline 的表达式
if(row["DUE_DATE"]){ 
    row["DUE_DATE"]; 
}else if(row["ENDDATE"]){ 
    row["ENDDATE"]; 
}else{ 
    null; 
}

创建一个报表参数来选择排序类型

创建一个 SortType 报表参数,以便按 deadline 或 priority 进行排序。

  1. 右键单击 Report Parameters,并选择 New Parameter
  2. 输入并选择以下值:
    • Name: SortType
    • Prompt text: Select sort type.
    • Data type: String
    • Display type: Radio Button
  3. 单击 New,输入以下值,然后单击 OK。重复相同的步骤两次,以便添加两组值:
    • 1st
      • Display Text: deadline
      • Value: sort_by_deadline
    • 2nd
      • Display Text: priority
      • Value: sort_by_priority

创建布局

您需要添加绑定到 Priority 数据集的动态文本。否则 onFetch 脚本不会运行,而 Priority 数据集的 priority_map 变量会保留为空值。

  1. 从 Palette 视图添加动态文本
    • 输入脚本以计算 project_area_array 变量(清单 3)。
    • 在 Property Editor 中的 Properties 选项卡上的 Visibility 选项卡,为所有输出选择 Hide Element
  2. 从 Palette 视图添加动态文本
    • 输入文本 "Priority data set for script onFetch"
    • 在 Property Editor 中的 Properties 选项卡上,为所有输出选择 Hide Element
    • 在 Property Editor 中的 Binding 选项卡上的 Data Set,选择 Priority
  3. 添加 Table,并设置 Property Editor 中的 Binding 选项卡上的 Data Set 的 Live_Workitem_Cnt_with_Iteration
  4. 在已添加的表中选择以下输出列:
    • Live_Workitem_Cnt::WI_ID
    • Live_Workitem_Cnt::SUMMARY
    • Live_Workitem_Cnt::priority_label
    • Live_Workitem_Cnt::PROJECT_AREA_NAME
    • Iteration::ITERATION_NAME
    • deadline
  5. 在 Property Editor 中,在已添加的表上单击 Sorting 选项卡上的 Add ,输入以下值,然后单击 OK
    • Key: Enter scripts (Listing 7)
    • Direction: Ascending
    • Locale: Auto
    • Strength: ASCII
  6. 疑难解答:
    • 如果数据没有出现在每个数据集的 Preview Result,那么请运行一个数据收集作业。在应用程序管理中,单击 Reports,然后单击 Run all data warehouse collection jobs
    • 如果要修改表的外观,请单击表的左上角的标题,在属性编辑器中编辑属性。例如,在 Advanced 选项卡中,将 Box 属性的 style 和 width 分别设置为 solid thin
清单 7. Sorting 选项卡的主键
var sorted_by = params["SortType"].value; 
sorted_by = sorted_by.replace(/\'/g, ""); 
if(sorted_by == "sort_by_deadline"){ 
    row["deadline"]; 
}else if(sorted_by == "sort_by_priority"){ 
    row["priority_label"]; 
}
图 7. 报表已分配工作项的布局
BIRT 的两个文本、动态文本和表
图 8. 请求参数
三个参数的选择

为了创建图 2 的表报表,清单 8 显示了 APPROVAL_STATE at Live_Workitem_Cnt 的参数,以报告被批准挂起的工作项。

清单 8. 将挂起状态设置为 APPROVAL_STATE
"com.ibm.team.workitem.approvalState.pending"

Unfinished work items in iterations

本节补充说明了按严重性排序的未完成缺陷报表和按优先级进行排序的工作项报表。

表 7 显示了 STATE_NAME 和 WI_TYPE 参数的值,以报告未完成缺陷。未完成就意味着处于四种状态之一:

  • New
  • In progress
  • Resolved
  • Reopened
表 7. Live_Workitem_Cnt 的 STATE_NAME 和 WI_TYPE
名称数据类型表达式
STATE_NAMEString'\'1\',\'2\',\'3\',\'6\''
WI_TYPEString"defect"

如果 Live_Workitem_Cnt 的 WI_SEVERITY 不是人类可读的格式,可以通过相关关系将它转换成 Severity 的 WI_SEVERITY(清单 9)。首先,将选中的报表区域存储在 project_area_array 变量中(清单 3)。

清单 9. SEVERITY_ID 和 WI_SEVERITY 之间的关系
SEVERITY_ID (at Severity) = PROJECT_AREA_ITEMID (at Project_Area) + "v" + 
        WI_SEVERITY (at Live_Workitem_Cnt)

接下来,将 Severity 的 SEVERITY_ID 和 WI_SEVERITY 存储在 severity_map 中(清单 10)。

清单 10. Severity 的 severity_map onFetch
var severity_id = row["SEVERITY_ID"]; 
var wi_severity = row["WI_SEVERITY"]; 
var arr = vars["project_area_array"]; 

if(severity_id != null){ 
    for(var count = 0; count < arr.length; count++){ 
        var project_area_itemid = arr[count]; 
        if(severity_id.indexOf(project_area_itemid) >= 0){ 
            vars["severity_map"][severity_id] = wi_severity; 
        } 
    } 
}

如果 severity_map 中的 SEVERITY_ID 包括 Live_Workitem_Cnt 的 WI_SEVERITY,则会返回 severity_map 中的 WI_SEVERITY,并带有数值前缀,数值越小,严重性就越高(清单 11)。

清单 11. Live_Workite_Cnt 的 severity_label 计算列
var map = vars["severity_map"]; 
var label = ""; 
for(var key in map){ 
    var val = map[key]; 
    if(key.indexOf(row["WI_SEVERITY"]) >= 0){ 
        if(val == "Blocker"){ 
            label = "id0:" + val; 
        }else if(val == "Critical"){ 
            label = "id1:" + val; 
        }else if(val == "Major"){ 
            label = "id2:" + val; 
        }else if(val == "Normal"){ 
            label = "id3:" + val; 
        }else if(val == "Minor"){ 
            label = "id4:" + val; 
        }else if(val == "Unclassified"){ 
            label = "id5:" + val; 
        } 
    } 
} 
label;

iteration_param 在 Live_iteration 中的 onFetch 上进行计算(清单 12)。

清单 12. Live_iteration 的 iteration_param onFetch
var userIter = params["Iteration"].value 

if(userIter == null || userIter == ""){ // only devline is selected. 
    var itemId = row["itemId"]; 
    var str = vars["iteration_param"]; 
    // itemId of one iteration is added to str at once. 
    if(itemId != null && str.indexOf(itemId) == -1 ){ 
        str += '\'' + itemId + '\'' + ","; 
        vars["iteration_param"] = str; 
    } 
}else{ // iteration is selected. 
    var str = vars["iteration_param"]; 
    if(str == ""){ 
        str = userIter + ","; 
        vars["iteration_param"] = str; 
    } 
}

经过计算之后,iteration_param 被设置为 Live_Workitem_Cnt 的 ITERATION_ITEMID(清单 13)。

清单 13. 在 Live_Workitem_Cnt 设置的 iteration_param
var iteration_param = vars["iteration_param"]; 
if(iteration_param.length > 0){ 
    iteration_param = iteration_param.substr(0, iteration_param.length - 1);
} 
iteration_param;

表 8 显示了报表项布局。这些报表项按顺序从上至下排列。

表 8. 报表项布局
报表项绑定的表表达式
动态文本添加 project_area_array 变量的计算(清单 3)。
动态文本Live_iteration添加 iteration_param 变量在 onFetch 的计算,在报表中不显示(在属性编辑器中的 Visibility 选中 hide element)。
动态文本Severity添加 severity_map 变量在 onFetch 的计算,在报表中不显示。
Live_Workitem_Cnt在输出列选中 PROJECT_AREA_NAME、WI_SEVERITY、WI_COUNT,并且在计算列创建 severity_label(清单 11)。以下是详细的设置:

  1. 通过在行标题上选择 Insert Group 创建一个组。
    • Name: ProjectAreaGroup
    • Group On: PROJECT_AREA_NAME
  2. 在每个组中,severity_label 编号(从 WI_SEVERITY 计算所得)由 WI_COUNT 进行计数。
  3. 在图表上放置 Group Header Row。
  4. 在 Sorting 选项卡上设置 severity_label:
    • Sort Key: row["severity_label"]
    • Sort Direction: Ascending
    • Sort Locale: Auto
    • Sort Strength: ASCII
(Inherit Data from Container: Inherit Columns and Groups)在报表中显示。该 Chart 报表项放在上述 Table 报表项中的组标题行上。

以下是详细设置:
  • Chart Type: Pie
  • Output Format: PNG (如果 SVG 在浏览器视图中无法工作)
  • Inherit Data from Container: Inherit Columns and Groups
  • Category Definition: row["severity_label"]
  • Slice size definition: row["WI_COUNT"]
  • Chart Title: Unfinished defects in order of severity
Live_Workitem_Cnt_list可选,需要查看工作项列表时使用。
图 9. 未完成缺陷报表的布局
BIRT 的动态文本、饼图、一个文本和一个表

为了创建图 4 中所示的饼图报表,表 9 显示了 STATE_NAME 和 WI_TYPE 参数的值,以报告未完成工作项,缺陷和跟踪版本项除外。未完成则意味着每个工作项类型有两个状态组:Open 或 In progress。这些是在 Scrum 流程的项目区域中定义的。

表 9. Live_Workitem_Cnt 的 STATE_NAME 和 WI_TYPE
名称数据类型表达式
STATE_NAMEString清单 14
WI_TYPEString清单 15
清单 14. STATE_NAME 表达式
'\'1\',\'2\',\'com.ibm.team.apt.epic.workflow.state.s1\',\'com.ibm.team.apt.epic.workflo
w.state.s2\',\'com.ibm.team.apt.story.idea\',\'com.ibm.team.apt.story.tested\',\'com.ibm
.team.apt.story.defined\',\'com.ibm.team.workitem.retrospectiveWorkflow.state.new\',\'co
m.ibm.team.workitem.retrospectiveWorkflow.state.inprogress\',\'com.ibm.team.workitem.imp
edimentWorkflow.state.s1\',\'com.ibm.team.rtc.workflow.adoption.state.s1\',\'com.ibm.tea
m.rtc.workflow.adoption.state.s2\''
清单 15. WI_TYPE 表达式
'\'com.ibm.team.apt.workItemType.epic\',\'com.ibm.team.apt.workItemType.story\',\'com.ib
m.team.workItemType.adoption\',\'com.ibm.team.workitem.workItemType.impediment\',\'com.i
bm.team.workitem.workItemType.retrospective\',\'task\''

使用 Priority 和 Live_Workitem_Cnt(表 10)替换表 8 的 Severity(动态文本)和 Live_Workitem_Cnt(表和图),将这些报表项用于布局。

表 10. 用于布局的报表项,从上至下按顺序进行排列
报表项绑定的表表达式
动态文本Priority添加 priority_map 变量在 onFetch 上的计算,在报表中不显示该项。
Live_Workitem_CntWI_SEVERITY 和 severity_label(表 8)分别被修改为 WI_PRIORITY 和 priority_label。

在 Sorting 选项卡上设置 priority_label。
(Inherit Data from Container: Inherit Columns and Groups)在报表中显示该项。这个图报表项放在上述 Table 报表项中的组标题行上。

除以下所述外的设置外,其他设置与表 8 相同。
Category Definition:
row["priority_label"]

生产力和贡献

本节将补充介绍说明每次迭代中有多少工作项已完成和批准的报表。

表 11 显示了 STATE_NAME 的值,以报告已完成工作项,跟踪版本项除外(表 11)。“已完成” 是指每个工作项类型的关闭状态组。(这表示 Resolved 状态的缺陷也计算在内)它是在 Scrum 流程的项目区域中定义的。

表 11. Live_Workitem_Cnt 的 STATE_NAME
名称数据类型表达式
STATE_NAMEStringListing 16
清单 16. STATE_NAME 表达式
'\'3\',\'4\',\'com.ibm.team.workitem.taskWorkflow.state.s4\',\'com.ibm.team.apt.epic.wor
kflow.state.s3\',\'com.ibm.team.apt.epic.workflow.state.s5\',\'com.ibm.team.apt.epic.wor
kflow.state.s6\',\'com.ibm.team.apt.storyWorkflow.state.s1\',\'com.ibm.team.apt.story.ve
rified\',\'com.ibm.team.apt.storyWorkflow.state.s2\',\'com.ibm.team.workitem.retrospecti
veWorkflow.state.finished\',\'com.ibm.team.workitem.retrospectiveWorkflow.state.s1\',\'c
om.ibm.team.workitem.impedimentWorkflow.state.s2\',\'com.ibm.team.workitem.impedimentWor
kflow.state.s3\',\'com.ibm.team.rtc.workflow.adoption.state.s4\',\'com.ibm.team.rtc.work
flow.adoption.state.s3\''

contributor_param 在 Live_Contributor 中的 onFetch 上进行计算(清单 17)。

清单 17. 在 Live_Contributor 中的 onFetch 的 contributor_param
var itemId = row["CONTRIBUTOR_ITEMID"]; 
var str = vars["contributor_param"]; 
if( itemId != null && str.indexOf(itemId) == -1 ){ 
    str += '\'' + itemId + '\'' + ","; 
    vars["contributor_param"] = str; 
}

经过计算后,contributor_param 被设置为 Live_Workitem_Cnt 的 CONTRIBUTOR_ITEMID(清单 18)。

清单 18. 在 Live_Workitem_Cnt 上设置的 contributor_param
var contributor_param = vars["contributor_param"]; 
if(contributor_param.length > 0){ 
    contributor_param = contributor_param.substr(0, contributor_param.length - 1);
}
contributor_param;

表 12 显示了报表项布局。这些报表项是按从上至下的顺序进行排列的。

表 12. 报表项布局
报表项绑定的表表达式
动态文本Live_iteration添加 iteration_param 变量在 onFetch 上的计算,在报表中不显示该项(在属性编辑器中的 Visibility 选中 hide element)。
动态文本Live_Contributor添加 contributor_param 变量在 onFetch 的计算,在报表中不显示该项。
Live_Workitem_Cnt在报表中显示该项。以下是具体设置:

Select Chat Type: Bar
  • Select Subtype: Stacked bar charts
  • Output Format: PNG(如果 SVG 在浏览器视图中不能正常工作。)
Category (X) Series: row["CONTRIBUTOR_NAME"]
  • Data Sorting: Ascending
  • Sort On: row["CONTRIBUTOR_NAME"]
  • Grouping Enabled: 取消选中
Value (Y) Series: row["WI_COUNT"]
  • Aggregation expression:
Optional Y Series Grouping: row["PROJECT_AREA_NAME"]
  • Data Sorting: Descending
  • Sort On: row["PROJECT_AREA_NAME"]
  • Grouping Enabled: 选中
  • Type: Text
  • Unit: String
  • Interval:1
Chart Title: The number of finished work items.
Live_Workitem_Cnt_list可选。需要查看工作项列表时会使用它。
图 10. 按开发人员分组的 Finished Work Items 报表的布局
BIRT 的动态文本、饼图、一个文本和一个表

为了创建图 6 的条形图报表,表 13 显示了用来报告在迭代中有多少工作项获得批准的参数。

表 13. 在 Live_Workitem_Cnt 上设置的参数
名称数据类型表达式
APPROVAL_STATEString"com.ibm.team.workitem.approvalState.approved"
APPROVAL_APPROVER_ITEMIDStringcontributor_param 进行设置(清单 18)。

使用 Live_Workitem_Cnt(表 14)替换 表 12 中的 Live_Workitem_Cnt (Chart),将这些报表项用于报表的布局。

表 14. 报表项布局
报表项绑定的表表达式
Live_Workitem_Cnt在报表中显示。除以下说明的设置外,其他设置与表 12 相同。

Category (X) Series:
  • row["APPROVAL_APPROVER_NAME"]

结束语

本文解释了如何通过使用 BIRT 在 Rational Team Concert 中创建报表,向开发人员和管理人员显示必要的信息。本文通过用例解释了需要向每一个角色报告的信息,还解释了如何分步实现它们。通过使用这些报表,各利益相关方可以采取相应的行动,使项目保持健康状态。


致谢

作者感谢 Masaki Wakao 提供的技术建议。


下载

描述名字大小
示例报表文件sample_report_files.zip54KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=828639
ArticleTitle=跨 Rational Team Concert 中的多个项目区域创建定制报表
publish-date=07062012