数据仓库和商业智能工具
商业智能和报告工具(BIRT)项目是基于Eclipse技术的开源项目。 BIRT提供了报表设计功能,使报表开发人员可以创建复杂的报表供用户在其Web浏览器中查看。 从本文“ 相关主题”部分中的Eclipse网站链接可以找到有关BIRT的详细信息。
您可以使用BIRT的报表设计器图形用户界面启用许多报表功能。 此外,BIRT还使您能够使用JavaScript扩展这些功能。
本文介绍了一套技术,您可以使用这些技术向标准BIRT报告设计器提供的功能之外的BIRT报告中添加其他功能。 作为BIRT的基础,我们建议您从以下两本关于BIRT的书开始: BIRT由Addison-Wesley出版的《 BIRT 报告 , 集成和扩展 领域指南》 。
本文是为希望为其BIRT报告的用户提供高级功能的解决方案开发人员而写的。 我们假设读者是:
- 熟悉BIRT报表设计器的大多数方面,并能够通过以下方式从头开始创建报表设计:
- 创建数据源和数据集
- 在设计中添加表格和表格等报表元素
- 使用样式,字体,颜色等自定义报告
- 在报告中添加文本和注释
- 指定报告的参数
- 熟悉JavaScript语言以及如何将JavaScript代码插入BIRT报表设计中
- 能够将BIRT报告部署到WebSphere Application Server。
下面的每个部分都描述了BIRT报告中可能需要的不同高级功能。 本节介绍了该功能,然后介绍了实现该功能的步骤。 每个部分彼此独立,因此可以单独引用。
单个用户可分类的列
描述
在查看报告时,用户通常希望基于一列中的值对表中的数据进行排序,其中该排序与报告设计中提供的默认排序顺序不同。 例如,默认情况下,产品信息的报告可以按产品名称排序,但是用户可能希望查看按交货日期排序的数据。
本节介绍可用于自定义BIRT报告的两种技术,以便用户可以指定报告数据的排序顺序。
实施方案1
在此实现中,通过修改数据集使用SQL查询将排序下推到数据库。 用户通过单击要排序的列的标题来指定要排序的列。
- 将以下代码添加到整个报表定义的初始化处理程序中。 为此,请打开布局编辑器,单击报表的边距(这样就不会选择任何报表元素),单击“ 脚本”选项卡,然后在下拉列表中选择“ 初始化” 。 添加代码后,将第一行中的dataSetName替换为要排序的数据集的名称。
dataSetName = "EPCLifecycleDataSet"; sortCol = reportContext.getHttpServletRequest().getParameter("sortCol"); sortDir = reportContext.getHttpServletRequest().getParameter("sortDir"); currentURL = reportContext.getHttpServletRequest().getRequestURL() + "?" + reportContext.getHttpServletRequest().getQueryString(); sortClause = ""; targetURL = ""; abbrSortCol = ""; if (sortDir != null) { if (sortDir.indexOf("ASC") != -1) sortDir = "DESC"; else sortDir = "ASC"; } else sortDir = "ASC"; if (sortCol != null && sortCol.length != 0) { sortClause = " ORDER BY " + sortCol + " " + sortDir; lastIndex = sortCol.lastIndexOf("."); if (lastIndex == -1) abbrSortCol = sortCol; else abbrSortCol = sortCol.substring(lastIndex + 1); } reportContext.getReportRunnable().getDesignInstance(). getDataSet(dataSetName).queryText += sortClause; if (currentURL.indexOf("__sorting=") != -1 ) targetURL = currentURL.substring(0, currentURL.indexOf("__sorting") - 1); else targetURL = currentURL; targetURL = targetURL + "&__sorting=true&sortDir=" + sortDir + "&sortCol=";
- 选择要允许用户排序的列的列标题,如图1所示。
图1.选定的列标题
- 在属性编辑器视图中:
- 单击属性选项卡。
- 点击表格中的超链接 ,
- 单击“ 链接到:”输入字段旁边的...按钮。
- 在“ 超链接选项”对话框中,将“ 超链接类型”选择为URI 。
- 单击位置:字段旁边的...按钮。
- 在表达式构建器中,输入以下内容作为超链接的表达式:
targetURL + "VIEWSCHEMA.EPC_LIFECYCLE.EPC";
将表达式中的列名更改为您要对所选特定列进行排序的关系数据库中列的名称。
- 对要允许用户进行排序的每一列执行步骤2和3。
- 如果要显示图像以指示要排序的列和排序的方向,则将以下代码添加到要排序的每个列标题的onCreate处理程序中。 为此,在布局编辑器中,单击您希望用户能够对其进行排序的列标题文本,以便标题文本被突出显示,如上所示。 单击脚本选项卡,然后从下拉列表中选择onCreate并添加以下代码:
var sortedColName = abbrSortCol; var sortedDirName = sortDir; if (sortedColName != null) { if (sortedColName == "EPC") { if (sortedDirName == "DESC") this.getStyle().backgroundImage = "images/up.gif"; else this.getStyle().backgroundImage = "images/down.gif"; this.getStyle().backgroundRepeat = "no-repeat"; this.getStyle().backgroundPositionX = "98%"; this.getStyle().backgroundPositionY = "50%"; } else this.getStyle().backgroundImage = null; }
- 将图像添加到适当的图像目录,以显示要用来指示排序方向的图像。
实施方案2
此实现允许用户指定排序顺序和方向(升序或降序)作为报告的参数。
- 创建数据类型为String的报告参数sortColumn ,然后单击“ 链接到报告参数”字段旁边的...按钮。
- 将报表中的列名称添加为静态值。 如图2所示,将一列设置为默认值。这里的值是可以对其进行排序的列的名称。
图2.排序列
- 创建一个名为sortOrder的报告参数,如图3所示,其静态值包括升序和降序。 将其中之一设置为您喜欢的默认设置。
图3.排序顺序
- 将以下JavaScript代码添加到用于提供报告数据的数据集的beforeOpen事件处理程序中。
queryString = this.queryText; queryString = queryString + " order by " + reportContext.getParameterValue("sortColumn") + " " + reportContext.getParameterValue("sortOrder"); this.queryText = queryString ;
控制分页
描述
在查看报告时,用户可能希望选择每页要显示的行数。 您应该能够从下拉列表中选择要显示的行数。
本节介绍如何使用BIRT报告参数和分组功能来自定义报告,以使用户能够动态分页。 在报表设计期间,您将设置一些值,例如20、30和40。在BIRT报表查看器中运行报表时,系统将提示用户一个报表参数列表框,其中包含在设计期间指定的一组值时间。
注:此功能只能在WebSphere Application Server中部署的Report Viewer中进行测试。
实作
通过按所需的行数对数据行进行分组,然后在每个组之后插入一个分页符,可以在报表中启用此功能。 要将行按特定数量分组,将对每行进行索引。
- 在报表中选择包含数据的表,然后在属性编辑器中选择“ 绑定”以创建新的列绑定。 指定Total.runningCount()作为表达式。 当BIRT处理每个数据行时,此聚合函数将提供当前行号。 图4显示了使用Total.runningCount()的列绑定row_index 。
图4.运行计数规范
- 在属性编辑器为表选择组和柱结合ROW_INDEX添加一组如图5所示的场范围的值将被通过JavaScript从用户输入动态地设置。 将组命名为Rows_group ,并确保选中“ 重复标题”选项,并且“ 分页后”设置为值Always 。
图5.组详细信息
- 在布局编辑器中,删除BIRT自动添加到组标题的数据元素。 如果不这样做,则报告将在每个组的开头显示行号。
- 创建一个报告参数RowsTobeDisplayed并添加静态值,这些值是您希望用户为其报告的每个页面指定的行数,如图6所示。
图6.报告参数
- 在大纲编辑器中,选择在第2步中创建的组Rows_group ,如图7所示,然后单击Script选项卡。 从下拉列表中选择onPrepare事件处理程序,然后输入以下JavaScript代码:
NoOfRows = reportContext.getParameterValue("RowsToBeDisplayed"); NoOfRows = parseInt(NoOfRows) + parseInt(1); NoOfRows = NoOfRows * 1; this.intervalRange = NoOfRows;
图7.组选择
展开和折叠详细数据
描述
用户可能希望在详细报告和该报告的摘要之间来回切换。 例如,假设一个报告包含三列:PRODUCTLINE(类别),PRODUCTNAME和BUYPRICE。 该报告归类于PRODUCTLINE,每个类别的总购买价。 用户希望最初查看包含显示所有产品名称和价格的详细信息的报告,然后想要切换以查看仅显示类别和总价格的摘要报告。
实作
我们将通过使用report元素的超链接属性来启用此功能,该属性将链接到另一个报告,该报告是详细报告的摘要。
- 为详细报告创建一个新报告,并使用如下查询创建一个数据集:
select CLASSICMODELS.PRODUCTS.PRODUCTLINE, CLASSICMODELS.PRODUCTS.PRODUCTNAME, CLASSICMODELS.PRODUCTS.BUYPRICE from CLASSICMODELS.PRODUCTS
- 将数据集的列与报表设计器的调色板视图中的表绑定。
- 在布局视图中,选择在先前步骤中创建的表,然后单击“ 组”选项卡。
- 创建一个新组,如图8所示。
图8.组详细信息
- 在布局视图中选择报告,然后在初始化事件处理程序中添加以下两行:
totalPrice = 0 // For storing the total buy price of each category allCategoryTotal = 0 // For storing the total buy price of all // categories
- 选择表的详细行,如图9所示,然后在onCreate事件处理程序中添加以下代码:
total = this.getRowData().getExpressionValue("row[BUYPRICE]"); total = total * 1; totalPrice = total + totalPrice; allCategoryTotal = allCategoryTotal + total;
图9.详细信息行选择
- 在组页脚行中添加标签,如图10所示。
图10.添加标签
- 在标签的onCreate事件处理程序中添加以下行:
this.text = "Total BUY Price-----" + totalPrice totalPrice = 0 // initializing to zero every group
- 在表格下方的报表布局中创建标签,并添加以下代码。 它显示所有类别的总数。
this.text = "ALL CATEGORY TOTAL=" + allCategoryTotal
- 使用以下针对数据集的查询创建一个新报告以显示详细报告的摘要:
select CLASSICMODELS.PRODUCTS.PRODUCTLINE, SUM(CLASSICMODELS.PRODUCTS.BUYPRICE) as TOTAL from CLASSICMODELS.PRODUCTS group by CLASSICMODELS.PRODUCTS.PRODUCTLINE
请按照前面针对详细报告所述的步骤显示所有类别的总计。 - 如图11和12所示,在第一个详细报告中添加一个名为Summary的标签,并向摘要报告添加超链接。
图11.到摘要报告的超链接
图12.超链接详细信息
- 同样,在摘要报告中添加标签。 返回到详细信息,然后超链接到详细报告。
选择标准为空白的数据
描述
可以为需要用户提供参数值的BIRT报告指定参数。 这些参数通常用于以某种方式过滤报告数据行。 在某些情况下,您可能希望指定一个用于过滤报告行的参数,但也允许用户指示他们希望查看所有行而不使用过滤器参数值。 提供此功能的一种方法是允许用户将参数值留为空白。 然后,报告将解释一个空白参数,表示不需要对该参数进行过滤。
例如,假设有一个包含三列的报告:PRODUCTLINE,PRODUCTNAME和BUYPRICE。 该报告还具有一个参数,该参数使用户可以输入要在其上过滤报告的特定PRODUCTLINE值。 因此,当用户输入参数值时,仅显示PRODUCTLINE值等于参数值的行。
现在,如果用户选择将PRODUCTLINE参数值保留为空白,那么将显示所有行,无论其PRODUCTLINE值如何。
实作
可以通过使用报表参数和报表使用的数据集的beforeOpen事件处理程序中的一些JavaScript在报表中启用此功能。
- 创建一个名为“ DataSet”的数据集,该数据集将用于在报表上显示数据并按如下方式定义该数据集SQL查询:
select CLASSICMODELS.PRODUCTS.PRODUCTLINE, CLASSICMODELS.PRODUCTS.PRODUCTNAME, CLASSICMODELS.PRODUCTS.BUYPRICE from CLASSICMODELS.PRODUCTS
当PRODUCTLINE上的选择标准留空时,将执行此操作。 - 创建另一个名为“ ProductLine”的数据集,并如下定义SQL查询:
select CLASSICMODELS.PRODUCTS.PRODUCTLINE from CLASSICMODELS.PRODUCTS
这将用于提供参数的选择值。 - 创建一个报表参数“ Product Line”,并将其绑定到数据集ProductLine的PRODUCTLINE列。 创建报告参数时,请确保已选中“ 允许空白值”选项,如图13所示。
图13.编辑参数
- 将以下JavaScript代码添加到将在报表中显示的数据集DataSet的beforeOpen事件处理程序中。 每当选择条件时,这组脚本都会更改queryText。
productLine = reportContext.getParameterValue("Product Line"); if (productLine != '') { queryString = this.queryText; queryString = queryString + " where CLASSICMODELS.PRODUCTS.PRODUCTLINE = " + "'" + productLine + "'"; this.queryText = queryString; }
多个用户可分类的列
描述
查看报告时,用户可能希望根据多个条件对数据进行排序。 有时,用户可能只想根据可用选择标准之一对数据进行排序,而将其他选择标准留空,或者不选择标准就将所有标准都留空对数据进行排序。
例如,在三列CUSTOMERNAME,COUNTRY和CITY的报告中,用户可能希望首先对COUNTRY上的数据进行排序,然后对COUNTRY中的CITY进行排序,或者用户可能只想对CITY上的数据进行排序,或者提供将所有排序条件都留为空白,根本不会进行排序。
实作
本节介绍解决方案开发人员如何使用BIRT报告参数和JavaScript事件处理程序自定义BIRT报告并启用此功能。
- 创建一个名为DataSet的数据集,该数据集将用于显示报告中的数据,并带有如下所示SQL查询:
select CLASSICMODELS.CUSTOMERS.COUNTRY, CLASSICMODELS.CUSTOMERS.CUSTOMERNAME, CLASSICMODELS.CUSTOMERS.CITY from CLASSICMODELS.CUSTOMERS
- 创建一个称为First Sort Criteria的报告参数,如图14所示。
图14.第一个排序参数
- 创建另一个报告参数,称为Second Sort Criteria ,如图15所示。
图15.第二排序参数
- 在大纲视图中选择数据集DataSet ,如图16所示,然后单击Script选项卡。
图16.选择大纲中的数据集
- 在脚本选项卡中选择事件处理程序beforeOpen并添加以下代码:
sortC1 = reportContext.getParameterValue("First Sort Criteria") sortC2 = reportContext.getParameterValue("Second Sort Criteria") if (sortC1 != '') { queryString = this.queryText; queryString = queryString + " order by " + reportContext.getParameterValue("First Sort Criteria"); this.queryText = queryString; } if (sortC2 != '') { if (sortC1 != '') { this.queryText = this.queryText + " , " + reportContext.getParameterValue("Second Sort Criteria"); } else { this.queryText = this.queryText + " order by " + reportContext.getParameterValue("Second Sort Criteria"); } }
。
隐藏或显示列
描述
当用户查看报告时,他们可能希望通过删除列并随后将这些列重新添加到报告中来自定义报告。
实作
您可以通过使用报表参数和列的可见性属性在BIRT中启用此功能。 在这里,我们将显示FIRSTNAME,LASTNAME和EMAIL的报告。 用户可以通过选中报表参数窗口中的相应复选框来隐藏或取消隐藏任何这些列。
- 使用如下查询创建数据源和数据集:
select CLASSICMODELS.EMPLOYEES.FIRSTNAME, CLASSICMODELS.EMPLOYEES.LASTNAME, CLASSICMODELS.EMPLOYEES.EMAIL from CLASSICMODELS.EMPLOYEES
- 创建一个名为hideFirstName的报告参数,如图17所示。
图17. hideFirstName参数
- 为另外两个列Last Name和Email创建第二个报表参数hideHastName和hideEmail ,如步骤2所述。
- 在布局视图中,选择每一列,然后在属性编辑器中,选择可见性属性并编写以下表达式:
params ["hideFirstName"] params ["hideLastName"] params ["hideEmail"]
视情况而定,如图18和19所示。图18.列可见性表达式
图19.表达式条目
结论
上面概述的六种技术应使解决方案开发人员能够为BIRT报告扩展报表用户的其他交互功能。 希望它们还会激发您更多关于如何将JavaScript与BIRT结合使用以进一步增强和自定义报告的想法。
翻译自: https://www.ibm.com/developerworks/data/library/techarticle/dm-0708tomlyn/index.html
数据仓库和商业智能工具