使用 Rational Team Concert 与 BIRT 为数据处理创建定制报表,第 3 部分

向报表添加报表元素和代码

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 使用 Rational Team Concert 与 BIRT 为数据处理创建定制报表,第 3 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:使用 Rational Team Concert 与 BIRT 为数据处理创建定制报表,第 3 部分

敬请期待该系列的后续内容。

下载试用版:IBM® Rational® Team Concert 标准版  |  IBM® Rational® Team Concert 免费版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

向报表添加元素

本专题第二篇文章中所概括的目标之一,是以树形结构显示工作项。IBM® Rational® Team Concert™ 方案让您能够使用无限的树形结构层次,但是它们只限于实际的程序,这样我们将会使用固定的表格,来更清晰地显示工作项。

我们已经创建了三个数据集来获取工作项信息,而且我们已经知道了怎样得到参数的值。工作项可能包含有子工作项;因此内部表格应该包含一个嵌入的内部表格和联系表格。两个内部表格可以与相同的数据集相绑定,因为两个表格可以从相同的数据区域中获得数据,并使用相同的参数来筛选数据。唯一的差别在于数据集中参数值的源。为了再使用数据集,在编辑元素的值,而不是编辑数据集的属性将元素与数据集绑定时,我们应该设置参数的值;图 1 显示了怎样编辑一个元素的绑定属性,以配置数据集的参数值。

图 1.设置数据集的参数值
设置数据集的参数
设置数据集的参数

图 1 的大图

为了估计工作项的状态,我们需要从参与者的个人或者群组里载入参与者信息以及使用率。我们可以将 Team Member 数据集拖拉到报表之中,并使用它来创建 TeamMember 表格元素;我们必须使用全局数组变量,通过书写 JavaScript 代码来存储参与者的信息。在报表初始化时那些变量得到了声明。我们所添加的代码如图 2 所示。但是我们并不想看到这些表格之中的信息,所以我们可以设置两个表格 Visibility 属性,以隐藏那些元素。

图 2. 添加至 TeamMember 的 JavaScript 代码
显示信息的 JavaScript 代码
显示信息的 JavaScript 代码

图 2 的大图

现在我们可以将 Assignment 数据集拖拉到报表之中,以创建分配表元素。接下来的一步是编辑 CONTRIBUTOR_ITEMID 参数,从用于存储参与者项目 ID 的全局变量中得到它的值。

图 3. 将 Assignment 配置为数据集的参数
设置 Assignment 数据集值
设置 Assignment 数据集值

现在我们可以将 Top Work Items 数据集拖拉到报表之中,而顶级层次的表格将会得到自动创建。然后我们可以将 Links 数据集拖拉到报表之中,而联系表格会得到创建。在此之后,我们需要编辑 TARGET_ITEMID 参数,设置参数的值,这样就可以从顶级层次 WI_ITEMID 列表格中获得该参数的值。

接下来,我们必须要创建内部表格。内部数据参数的值来自于联系表格的 SOURCE_ITEMID 列,因为一个工作项可以通过从 Links 表格中获得数据,来找到其子工作项的 WI_ITEMID。因此,我们可以在联系表格中创建一个内部表格作为嵌入的表格。然后第二个层次的工作项就可以显示出来了(查看图 4 得到具体内容)。

图 4. 联系表格中嵌入的表格
固定表格的关系
固定表格的关系

有了这个设计,内部表格一次只获取一个工作项,这样随着子工作项数量的增加,构建报表就需要花费更长的时间。正如前面所提到的那样,我们可以使用 JavaScript 变量来在报表构建期间存储数据,这样我们可以使用一个全局变量,来存储联系表格的 SOURCE_ITEMID 列的值。然后我们可以使用全局变量作为内部表格的 WORK_ITEMID 参数值,来在联系表格外面创建一个内部表格。JavaScript 代码与参数的值设置如图 5 所示。

图 5. 设置参数的内部表格值
固定表格的参数
固定表格的参数

结果,显示第二层工作项的该方法可以节省大量的时间(查看图 6 获得更多的具体信息)。

图 6. 内部表格没有嵌入到联系表格中
固定表格的关系
固定表格的关系

因此,我们将会选择第二种方法来设计报表。对于更深层次中找到的工作项,我们可以按照相同的方式,将新的联系表格和内部表格嵌入到已存在的内部表格之中。设计的报表预览图如图 7 所示。

图 7. 设计的报表
报表的设计图
报表的设计图

图 7 的大图

添加 JavaScript 代码以实施规则

在载入工作项信息之前,我们需要载入上级工作项。但是在估计工作性的状态之前,应该收集包含 Total Balance Time 和 Total Extra-plan Time 的统计性数据。因此,首先应该估计子工作项的 Balance Time 与 Extra-plan Time。

考虑到这些,工作项数据的载入序列,工作项的时间数据总结逆转过来了,这样在子工作项完全载入之前,我们就不能估计工作项的状态了。您知道工作项和子工作项得到了完全的载人,因为在事件执行序列的基础之上元素事件揭示了这一点;从这些数据中我们可以总结工作项的时间数据。

事件处理器执行序列

ReportItem 与 ReportDesign 事件的事件引发序列在运行时环境中是不同的,因为在报表构建期间有几个阶段。它包含了一个生成阶段,一个演示阶段等等,在相同的阶段中,事件引发序列是固定的。

在特定的阶段中,Business Intelligence 与 Reporting Tool(BIRT)通过处理其他报表项目中不包含的报表项目,来处理一个报表的主体。BIRT 会处理项目,从左至右,一次处理一行直到右下方。

其他报表项目中没有包含的报表项目叫做顶级的报表项目。每一个报表至少拥有一个顶级层次的报表项目,通常是一个格子,一个列表,或者一个表格。如果一个报表拥有不止一个顶级层次的报表项目,那么 BIRT 会按照从左至右,从上到下的顺序处理顶级项目。

对于每一个顶级层次的项目,BIRT 会在处理下一个顶级层次项目之前,处理所有二级层次的项目。所谓的二级层次报表项目,是顶级层次项目中所包含的报表项目。例如,表格中所包含的一个内部表格,就是一个二级层次的报表项目。还有意向其他层次的报表项目,— 以查看特定层次的报表项目,您可以在 Outline 中检查报表设计的结构,如图 8 所示。

图 8. Outline 视图
报表设计的概述
报表设计的概述

BIRT 会以交互性的方式来处理所有层次的项目,接下来它会以对顶级层次项目相同的操作来处理每一个层次。例如,您可以看一下 Take 表格元素及其 onRender 事件;事件引发序列如图 9 所述。

图 9. onRender 事件引发序列
元素的事件引发序列
元素的事件引发序列

但是,如果您拥有两个没有上下级关系的元素,而且它们在树形结构中不是同一层次,那么它们的事件引发序列就是不同的。

声明全局变量与函数

为了估计工作项的状态,我们需要使用全局变量,来将数据与工作项目存储在同一层次。它们是按照序列性的顺序来载入的,这样我们就可以在同一层次上重复使用全局变量了。全局变量的数量是有限的,这样我们就可以在报表初始化时声明它们了。我们定义的函数是在计算时间数据时进行调用的,所以我们也可以在报表的初始化阶段声明它们(见于图 10)。

图 10. 声明全局变量与函数
JavaScript 代码之中的变量与函数
JavaScript 代码之中的变量与函数

图 10 的大图

计算工作项状态

工作项在载入之后,表格会得到创建,而该表的每一行都得到了一个工作项记录。在演示阶段工作项的数据已经获得了,这样工作项的 Balance Time 与 Extra-plan Time 可以在行的演示阶段得到计算。但是此时,我们不能计算工作项的状态,因为它可能包含了子工作项,这样我们需要声明两个全局变量,以存储这些值。

在最底层的工作项完全载入之后,我们就可以得到工作性的 Balance Time 与 Extra-plan Time。接下来的一步,是计算工作项的状态并显示结果。至于最底层的工作项,它们的工作项状态使用 Balance Time 与 Extra-plan Time 工具来轻松计算的,而结果可以直接显示出来。但是对于其他的工作项层次,我们需要总结 Total Balance Time 与 Total Extra-plan Time。

正如前面所提到的那样,工作项要比子工作项更先载入,但是显示的结果要比其子工作项更晚一些。因此,在工作项的子工作项的时间数据得到计算之前,全局变量已经得到了声明,并在子工作项的工作项状态得到计算之后,用于计算工作项状态。因此,我们可以在子工作项状态计算之后,向工作项的相关全局变量添加子工作项的全局变量。当所有的子工作项的工作项状态显示时,该工作项的 Total Balance Time 和 Total Extra-plan Time 会得到接受,然后我们可以接受该工作项的工作项状态。具体的过程如图 11 所示。

图 11. 总结工作项数据的过程
怎样计算工作项时间数据
怎样计算工作项时间数据

在我们的需求中,我们可以使用元素的 onRender 事件引发序列。为了完成该操作,我们可以使用一个固定表来设计报表。通过这种方式,内部表格就是外部表格单元的一个元素,以及表格的 onRender 事件,具体行和单元会在内部表格操作之前引发。我们可以在行的 onRender 事件引发时,编写 JavaScript 代码来计算工作项的 Balance Time 与 Extra-plan Time(见于图 12 以得到更多的具体内容)。

图 12. 计算工作项的时间数据
计算时间数据的 JavaScript 代码
计算时间数据的 JavaScript 代码

图 12 的大图

为了显示工作项状态并得到总体的时间数据,我们应该等待,直到其子工作项的 onRender 事件得到执行为止。然后我们可以添加一个元素,它可以引发该行 — 的 onRender 事件,而您可以从内部表格的下边找到元素,或者在该行的当前单元的右边找到单元。在我们的报表之中,我们可以向当前单元的右边上的单元添加一个名为 Event 的文本元素,如图 13 所示。

图 13. Event 元素位置
添加至报表的事件元素
添加至报表的事件元素

图 13 的大图

现在我们需要编辑该元素的属性,并编写 JavaScript 代码,以协调元素的 onRender 事件引发,这样它们就可以计算工作项的状态,然后向其上级工作项的全局变量添加工作项的 Balance Time 与 Extra-plan Time(见于图 14)。

图 14. 计算工作项状态并总结时间数据
JavaScript 工作项与时间数据
JavaScript 工作项与时间数据

图 14 的大图

至于其他层次上的元素,我们可以按照相同的方式来添加 JavaScript 代码。我们已经获取了工作项的工作项状态,您还可以添加一个文本元素以显示结果。定制报表的运行结果如图 15 所示。

图 15. 报表的运行结果
报表的最终结果视图
报表的最终结果视图

图 15 的大图

总结

在本文中,我们介绍了怎样使用 BIRT 方法,来处理拥有复杂关系的数据,怎样基于这些数据定制一个复杂的报表,以计算工作项状态并显示结果。

而且,我们使用定制的运算规则,来计算基于时间估计相关数据的工作项状态。在我们定制的报表中,每一个工作项的状态都得到了轻松的获取。这可以帮助团队领导和管理团队更好地掌握项目的过程,而每一个团队成员可以更加轻松地了解他们的工作状态。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=645566
ArticleTitle=使用 Rational Team Concert 与 BIRT 为数据处理创建定制报表,第 3 部分: 向报表添加报表元素和代码
publish-date=04062011