使用 IBM Business Process Manager 中的 Coach Reporting Framework 开发自定义报告

学习如何使用 TWList 模式(Coach Reporting Framework 的一部分),针对报告用途创建查询应用程序数据的自定义报表。我们将演示如何创建包含使用自定义工具包配置的向上追溯和向下钻取选项的两个报告。 本文来自于 IBM Business Process Management Journal 中文版

Smitha Venugopal, IT 专家, IBM

Smitha Venugopal 的照片Smitha VenugopalIBM Software Services for WebSphere (ISSW) 的一位 IT 专家。她拥有超过 10 年的 IT 经验,专注于业务流程管理。她擅长 WebSphere Process Server、IBM Business Monitor 和 WebSphere Business Modeler,在 BPM 解决方案的设计、开发、部署方面有丰富的经验。她目前的研究重点是 WebSphere Lombardi。



Sateesh Balakrishnan, IT 专家, IBM

Sateesh Balakrishnan 是 IBM Software Services for WebSphere (ISSW) 的 IT 专家。他拥有 10 多年的从业经验,目前从事 BPM 和 BRMS 研究,专攻 WebSphere Lombardi 和 WebSphere ILOG。在以前的 ISSW 职位上,他从事过应用程序基础架构研究,专攻 WebSphere Application Server、J2EE 应用程序迁移,以及故障排除和 WebSphere Application Server 调优。他在 IBM 从事过各种工作,包括 J2EE 解决方案的设计和开发。他目前的兴趣是 BPM 和 BRMS 系统。



2013 年 12 月 16 日

简介

IBM Business Process Manager 提供了几个报告选项:开箱即用的记分卡、定制的报告和第三方工具中生成的报告。开箱即用的报告使您能够分析个人绩效、团队绩效、业务流程绩效和 SLA 违规。定制报告使您能够分析特定于您的流程的业务数据。您可以在 Process Designer 中定义要跟踪的变量,并创建定制报告来查询跟踪的数据。用户可以在 Process Portal 中查看生成的报表。

在本文中,您将学习如何使用 Coach Reporting Framework 中的 TWList 模式,针对报告用途创建查询应用程序数据的自定义报表。我们将引导完成创建两个报告的过程,这两个报告包含使用自定义工具包配置的向上追溯和向下钻取选项。

在我们的示例中,我们不会使用跟踪事件或自动跟踪特性来捕获报告数据。相反,我们将查询现有的自定义应用程序数据库,使用它来代替 Performance Data Warehouse Database(PDWDB,性能数据仓库数据库)保存应用程序数据。通过消除对 PDWDB 数据库的额外数据库操作(DB INSERT),这种方法可以提高性能。在业务流程跨越企业中多个产品或逻辑连接的集成框架的情况下,使用这种方法非常有利。您可以维护一个中央数据库,并基于此中央数据库建立报告,而不是在特定于 BPM 的 PDWDB 中跟踪所需的数据。

我们会使用在下面各节所描述的场景来证明这一点。


示例场景

在该场景中,我们将创建一个报告,计算一家组织的特定部门在任意特定年度的员工平均工资。

为便于说明,我们创建了一个人工服务,演示如何使用 TWList 模式在两个 Coach(Yearly Salary ReportYearly Income by Dept and Grade)中开发自定义的报告,如图 1 所示。这里使用的集成服务有助于在 Coach 报告中显示数据。

图 1. 人工服务的流程图
人工服务的流程图

我们将使用 Coach Reporting Framework Toolkit 的 TWList 模式来构建报告。为了使用数据对象和所提供的其他构造和元素,在从 BPM wiki 导入 TW List Pattern 工具包后,您需要创建流程应用程序和工具包之间的依赖关系。

工具包中包括以下内容:

  • 数据
    • lswR2ChartData
    • lswDrillDown
    • lswTestObject
    • lswTestObject2
    • lswTimeTrend
  • 图表布局类型
    • 柱形图
    • 组合图
    • 饼形图
  • 报告
    • ReportFromTWList
  • 数据转换,
    • 将使用在工具包中提供的 Object Data Transform(对象数据变换)。

我们将使用 DataObject lswR2ChartData 指定在报告中映射的数据,并使用 DataObject lswDrillDown 从顶层报告向下钻取详细的报告。我们还将在 Coach 中使用来自工具包的报告 ReportFromTWList

生成报告主要包括两个步骤:

  1. 生成要在报告中显示的数据。
  2. 在 Coach 中嵌入报告。

我们会在下面各节通过开发两个报告来演示这一点。


创建一个年度薪酬报告

图 1 所示,您可以开发一个集成服务,以 lswChartData 类型的列表的形式填充数据。Get Annual Salary 服务从持久介质(在我们的示例中是应用程序数据库)检索所需的数据(在我们的示例中是在选定年份的每个部门的平均工资),并构建一个 lswChartData 对象列表。图 2 描述了 Get Annual Salary 集成服务与所使用的 SQL 查询。变量 tw.local.resultslswChartData 类型的列表。

图 2. Get Annual Salary 集成服务
Get Annual Salary 集成服务

检查 lswChartData 对象,可以找到三个参数:Series(String)label(String)Value(Decimal)。此数据在 Yearly Salary Report 中使用,基于 2009201020112012 的过滤值显示报告。

为了在 Yearly Salary Report Coach 中嵌入报告,我们将使用一个自定义的 HTML 控件,并在自定义 HTML 的属性的 Presentation 选项卡中粘贴以下内容。为此,需要完成以下步骤:

  1. 创建在工具包中所提供的报告 ReportFromTWList 的一个实例,如下所示:
    <# var report = TWReport.getByName('ReportFromTWList'); #>
  2. 使用 TWlist pattern 所提供的 API 指定图表类型,如下所示:
    <#report.setFilterValue('reportType','3dGroupedBar'); #>

    BPM wiki 中提供了可用图表类型的列表。

  3. 指定如下所示的属性,为图表定义值、标签和系列或维度。
    <#
    report.setFilterValue('listVariableName','tw.local.results');
    report.setFilterValue('seriesConstant',tw.local.filterSelection);
    report.setFilterValue('labelProperty','label');
    report.setFilterValue('valueProperty','value');
    #>

    请注意,生成的数据 (tw.local.results) 被设置为 listVariableName 属性。同样,列表变量的属性现在已被设置,可使用 labelPropertyvalueProperty 属性指定 labelvalue 的值。

    在我们的示例中,因为在报告中只显示了一个系列值(选定的年份),所以我们将设置 seriesConstant 属性,而不是 seriesProperty

  4. 设置其他属性,如在 x 轴和 y 轴的标签、高度、宽度,如下所示。
    <#
    report.setFilterValue('chartBottomAxisLabel','Department');
    report.setFilterValue('chartLeftAxisLabel','Average Salary');
    report.setFilterValue('chartWidth',1000);
    report.setFilterValue('chartHeight',500);
    report.setFilterValue('chartColorTable','xff0f00_150,xfff00f_150,
    x0000ff_150');  
    #>
  5. 在 Yearly Annual Report 中,我们将启用向下钻取功能,从一个部门向下钻取,让用户可以基于选定部门在选定年份中查看下一级明细,如下所示。
    <# 
    report.setFilterValue('ddButtonId','ButtonGroup2_Button0');
    report.setFilterValue('ddSeriesVariableName',
    'tw#local#drillDown#series');
    report.setFilterValue('ddLabelVariableName',
    'tw#local#drillDown#label');
    report.setFilterValue('ddDataVariableName',
    'tw#local#drillDown#data');
    #>

    要启用向下钻取功能,需要将 ddButtomId 设置为一个隐藏按钮的控件 ID(在本例中是 ButtonGroup2_Button0)。

    注意:在 Coach 上,您需要有一个用于向下钻取的按钮,并将其可见性设置为 hidden

    当用户单击图中特定部门的柱形时,隐藏按钮被单击,并且根据在图中指定的连接,控件被导航到 Coach 外部。在我们的示例中,控件被导航到 Get Employee Salary 服务。

    当完成该操作时,需要将年份和选定部门传递给服务,为选定年份提取该部门的详细信息。该值是使用 ddSeriesVariableNameddLabelVariableNameddDataVariableName 在向下钻取对象中设置的,如前面的清单所示。

  6. 最后,在 Coach 中显示报告,如下所示:
    	<#= report.displayPage('report'); #>

报告应类似图 3。请注意,列出的 Average Salary (value) 对列出的不同部门 (label),以 2012 作为年份 (Series)。

图 3. 部门的年度薪水报告
部门的年度薪水报告

如果图中的其中一个柱形被单击,那么报告会向下钻取,以显示所选部门的年收入,这与该部门员工的不同等级有关。


创建一个按部门和等级排列的年收入报告

当用户从 Yearly Salary Report 向下钻取时,启动该报告,并将年份和部门作为输入传递给该服务。

类似于之前的报告,使用集成服务 Get Employee Salary 生成在报告中查看的数据,其中包括针对部门和年份的不同等级和平均工资。因此,lswChartData 对象列表采用等级作为标签,以平均工资作为值。我们也在报告中增加了一个表,以便提供更详细的信息。为此,该服务使用了一个列表 EmployeeSalaryData,其中包括在选定的部门以及该年份中的所有员工及其级别和工资。

图 4 显示了 Get Employee Salary 集成服务的详细信息。

图 4. Get Employee Salary 集成服务
Get Employee Salary 集成服务

如下面的 SQL 结果所示,tw.local.empSal 是一个用户定义的 DataObjects 列表,EmployeeSalaryData,其中包含该部门中的每个员工及其在选定年份中他所在的级别上的工资详细信息。SQL 结果将类似于以下清单。

<# 
report.setFilterValue('ddButtonId','ButtonGroup2_Button0');
report.setFilterValue('ddSeriesVariableName',
'tw#local#drillDown#series');
report.setFilterValue('ddLabelVariableName',
'tw#local#drillDown#label');
report.setFilterValue('ddDataVariableName',
'tw#local#drillDown#data');
#><object type="EmployeeSalaryData[]">
  <arrayElement size="4">
    <item type="EmployeeSalaryData">
      <property name="empcd" type="String">001</property>
      <property name="grade" type="String">B1</property>
      <property name="Salary" type="String">1500000</property>
      <metadata>
        <property name="dirty" type="Boolean">true</property>
        <property name="shared" type="Boolean">false</property>
        <property name="key" />
        <property name="version" />
      </metadata>
    </item>
    <item type="EmployeeSalaryData">
      <property name="empcd" type="String">002</property>
      <property name="grade" type="String">B2</property>
      <property name="Salary" type="String">1700000</property>
      <metadata>
        <property name="dirty" type="Boolean">true</property>
        <property name="shared" type="Boolean">false</property>
        <property name="key" />
        <property name="version" />
      </metadata>
    </item>
    <item type="EmployeeSalaryData">
      <property name="empcd" type="String">003</property>
      <property name="grade" type="String">B1</property>
      <property name="Salary" type="String">1200560</property>
      <metadata>
        <property name="dirty" type="Boolean">true</property>
        <property name="shared" type="Boolean">false</property>
        <property name="key" />
        <property name="version" />
      </metadata>
    </item>
    <item type="EmployeeSalaryData">
      <property name="empcd" type="String">004</property>
      <property name="grade" type="String">C</property>
      <property name="Salary" type="String">2200000</property>
      <metadata>
        <property name="dirty" type="Boolean">true</property>
        <property name="shared" type="Boolean">false</property>
        <property name="key" />
        <property name="version" />
      </metadata>
    </item>
  </arrayElement>
  <metadata>
    <property name="dirty" type="Boolean">true</property>
    <property name="shared" type="Boolean">false</property>
    <property name="key" />
    <property name="version" />
  </metadata>
</object>

服务器脚本 Split Lists 负责提供图表 lswChartData 列表中所需的数据 ,因为现在需要两个列表:一个用于报告,另一个用于表。

为了在 Yearly Income by Dept and Grade Report Coach 中嵌入报告,我们将使用一个自定义的 HTML 控件,如下所示:

  1. 创建在工具包中提供的 ReportFromTWList 报告的一个实例,如下所示:
    <# var report = TWReport.getByName('ReportFromTWList'); #>
  2. 使用工具包所提供的 API,将所需的图表类型设置如下:
    <# report.setFilterValue('reportType','groupedBar’);#>
  3. 指定如下所示的属性,为图表定义值、标签、系列或维度。
    <#
    report.setFilterValue ('listVariableName','tw.local.results');
    report.setFilterValue ('seriesProperty','label');
    report.setFilterValue ('labelProperty','label');
    report.setFilterValue ('valueProperty','value');
    #>

    请注意,生成的数据被设置为 listVariableName 属性(lswChartData 类型的 tw.local.results)。

    同样,列表变量的属性现在已被设置,可使用 seriesPropertylabelPropertyvalueProperty 属性指定 series、label 和 value 的值。

  4. 设置其他属性,如在 x 轴和 y 轴的标签、高度、宽度等,如下面的清单所示:
    	<#
    	report.setFilterValue ('chartBottomAxisLabel','Employee Grade');
    	report.setFilterValue ('chartLeftAxisLabel','Income');
    	report.setFilterValue ('chartWidth',600);
    	report.setFilterValue ('chartHeight',300);
    	report.setFilterValue ('chartColorTable','x00ff00_150');
    	#>
  5. 最后,在 Coach 中显示了报告,如下所示:
    <#= report.displayPage ('report'); #>
  6. 在这份报告中,我们需要显示一个表,以可充当图表引用的交叉表格式提供有关员工、他们的级别和收入的具体详细信息。为了显示这个表,请将用户定义的 DataObject EmployeeSalaryData 的变量 tw.local.empSal 从调色板拖到 Coach 上。一个重复表被自动创建。确保已在表的 Properties 视图中取消选中 Selection control 复选框。

图 5 显示了 2012 年的 Finance and Operations 部门的报告。

图 5. Finance and Operations 部门的 2012 Salary Report
Finance and Operations 部门的 2012 Salary Report

我们已经用一个表补充了报告图表,该表列出了所需部门中的员工的详细信息。

此外,我们提供了一个向上钻取功能,通过在 Coach 中引入一个按钮,导航到 Get Salary Service,在给定的过滤选择条件下检索每个部门在该年度的年收入。向上钻取时,显示之前的报告。


结束语

本文介绍了创建自定义报告的一种替代方法,说明如何让报告生成独立于性能数据仓库数据库以及 BPM 中提供的开箱即用的跟踪特性。由于使用这种方法在 coach 中嵌入了报告,所以您在为报告提供数据、用户界面、额外的过滤条件以及报告访问方式时,可以获得更大的灵活性。例如,在仪表板中,可以向某个角色或某一组特定的人员展示我们在本文中构建的服务,就像其他任何人工服务一样。

参考资料

学习

获得产品和技术

讨论

条评论

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=WebSphere
ArticleID=957590
ArticleTitle=使用 IBM Business Process Manager 中的 Coach Reporting Framework 开发自定义报告
publish-date=12162013