IBM Cognos 最佳实践: IBM Cognos 8 Report Studio 中的列表动态排序
文档性质:技巧或技术;产品:IBM Cognos 8 BI;关注领域:报表
免费下载:IBM® Cognos® Express V9.5 或者 Cognos® 8 Business Intelligence Developer Edition V8.4 试用版 |
---|
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。 |
简介
目的
本文档描述一种使用定制的 IBM Cognos 8 Report Studio 工具箱对象在列表上应用动态列排序的技术。
适用性
本文档描述的技术已经在以下软件中测试过:
- IBM Cognos 8.4.102-18-0,使用示例附带的 Go Sales (query) 包。
仅当 IBM Cognos 8 Report Studio 报表(其 HTML 输出类型使用英文语言运行环境)内单个列表需要排序时,本文概述的步骤才适用。
被使用的无文档记载和不支持的功能
此技术需要使用 IBM Cognos 8 中无文档记载和不支持的功能。在以后的版本中对这些功能的支持可能会改变或完全取消。
在 List Report 上应用动态排序
更新工具箱文件
在启动 IBM Cognos 8 Report Studio 之前,需要用附带的文件更新几个 IBM Cognos 8 安装文件,其中包含新的工具箱对象,可以把这些对象拖放到画布上以添加排序逻辑。定制的工具箱对象让报表作者可以快速地在报表中添加所有必需的组件,而不必手工设置所有东西。
- 找到 <install_dir>/webcontent/pat/res 目录,这里的 <install_dir> 是 IBM Cognos 8 实例的根目录。
- 备份以下文件:
- reportstudio_en.xml
- Toolbox.xml
- ToolboxControls.xml
- 将上述文件(不是备份)替换为本文档附带的同名文件。
在 List Report 上应用排序
在这个示例中,我们要用 GO Sales (query) 示例数据创建一个新报表。如果有现有的报表,也可以从第 3 步开始对其应用排序。
- 打开新的 Report Studio 实例,出现提示时创建一个新的列表报表。
- 把希望在列表中显示的数据项拖放到画布上的列表对象中。对于这个示例,使用整个 Sales (query)\Retailer Query Subject。
图 1. 把 Retailer Query Subject 拖放到 List Report 中的 IBM Cognos 8 Report Studio 屏幕图
- 下一步是在每个列中添加排序逻辑。为此,首先需要解锁页面对象。解锁页面对象的方法是打开 Structure 菜单,单击 Lock Page Objects 菜单项,让它处于未选中状态。
图 2. 未选中 Lock Page Objects 设置的 Structure 菜单
也可以通过单击工具栏上的锁图标解锁它们(锁图标会变成打开的锁图标)。 - 解锁页面对象之后,进入左边的面板,单击工具箱选项卡。
- 在 Insertable Objects 面板上,向下滚动到接近底部。应该会看到 Column Sorting Function 和 Sortable Column Title 工具箱对象。
图 3. IBM Cognos 8 Report Studio 工具箱显示新的工具箱对象 Column Sorting Function 和 Sortable Column Title
- 把 "Sortable Column Title" 拖放到希望实现排序功能的列的标题单元格中。画布应该显示如下图像。
图 4. 在列表列中突出显示的第 2 项是原来的列标题,第 1 项是新的列标题
- 编辑文本,让它包含想要的列标题,删除单元格原来的内容。完成之后,屏幕现在应该显示下述截图。
图 5. 在列表列中指定了可排序列标题并删除了原来的列标题
- 对于希望实现排序功能的每个列,重复步骤 5 到 7。
- 现在,应该再次锁住页面对象。为此,打开 Structure 菜单,单击 Lock Page Objects 菜单项,让它处于选中状态。也可以通过单击工具栏上的锁图标锁住它们(图标会变成锁住的锁)。
- 为了在报表中正确地显示,这些新的列标题要求设置某些显示变量。为了设置这些变量,把鼠标停在 Condition Explorer 选项卡(在Insertable Objects 面板与画布之间,具有 Conditional Explorer 图标)上,当它展开时,单击 Variables 文件夹。
下图所示的变量视图会取代画布。图 6. IBM Cognos 8 Report Studio Conditional Explorer 视图
- 在左边的 Insertable Objects 面板上,拖放三个 “Column Sort” 变量(“Column Sort – Sorting Controls Rendering”、“Column Sort – Sorting Column Rendering” 和 “Column Sort – PDF Image Rendering”)。
- 把鼠标停在 Page Explorer 选项卡上(在与 Condition Explorer 相同的位置上),从而返回到画布。当它展开时,单击列表所在的页面。对于这个示例,页面是 Page1。
- 接下来,要添加排序列。如果还没有锁住页面对象,现在应该这么做(见步骤 9)。下面描述两种方法,可以选用更适合自己需要的方法。
方法 A:一个升序列,一个降序列
第一种方法可能是最简单、最高效的方法,但是根据使用的数据库类型它的表现可能不符合期望。在这种方法中,要创建两个列:一个用于升序排序,另一个用于降序排序。- 进入左边的面板,单击工具箱选项卡。
- 在 Insertable Objects 面板中,找到 “Query Calculation”。把它拖放到列表的末尾(确保它被放在列表上而不是列表后面)。
- 现在会出现 Create Calculation 对话框。
- 在 Create Calculation 对话框中,输入一个有意义的名称,比如 “Order By ASC”,单击 OK。Data Item Expression 对话框出现。
图 7. IBM Cognos 8 Report Studio Data Item Expression 对话框
- 我们要在这里定义用于排序的列。
- 在 Data Item Expression 对话框中,单击 functions 选项卡。Available Components 框会刷新。单击 “Constructs” 文件夹,把 “if then else” 项拖放到 Expression Definition 框中。
- 在 Expression Definition 框中,用以下代码替换
<condition>
:
?OrderBy? = '1'
- 单击 data items 选项卡。把代表第一个列的对象拖放到 Expression Definition 框中的第一个 <expression>(需要手工删除 <expression> 文本):
图 8. IBM Cognos 8 Report Studio Data Item Expression 对话框
注意,如果使用 OLAP 数据源而且在 Available Components 框中出现层次,就无法在表达式中使用它们。在这种情况下,需要进入 source 选项卡并选择希望用于列排序的数据项。 - 把另一个
<expression>
替换为null
或任何静态值(例如 ‘ASC
’)。现在,表达式应该像下面这样:
IF ( ?OrderBy? = '1' ) THEN ( [Retailer type code] ) ELSE ( null )
这个表达式意味着,如果 “OrderBy” 参数的值是 “1”,就用第一列 “Retailer type code” 的内容填充这个排序列。否则,用 null/空值填充它。
注意,在使用 OLAP 数据源时,不能在 else 语句中使用null
,需要使用一个静态值。 - 为了对所有列应用排序,需要把它们添加到
if-then-else
语句中。可以重复前面的步骤以拖放对象,也可以手工输入表达式。表达式最后应该像下面这样:IF (?OrderBy? = '1') THEN ([Retailer type code]) ELSE IF (?OrderBy? = '2') THEN ([Retailer type]) ELSE IF (?OrderBy? = '3') THEN ([Retailer code]) ELSE IF (?OrderBy? = '4') THEN ([Retailer name]) ELSE IF (?OrderBy? = '5') THEN ([Retailer name (multiscript)]) ELSE IF (?OrderBy? = '6') THEN ([Retailer start date]) ELSE (null)
- 用对话框右上角的 Validate Expression 按钮检查表达式(可能会提示输入 “OrderBy” 参数的值,在这种情况下可以输入零并单击 OK)。
如果在 Information 框中出现 “No errors”,在对话框中单击 OK。
在某些情况下,会出现下面这样的消息:
QE-DEF-0459 CCLException QE-DEF-0478 Invalid coercion from 'value' to 'string' for '<data item>' in '<expression>'
图 9. IBM Cognos 8 Report Studio Data Item Expression 对话框,已经完成计算,在 Information 框中出现错误
如果发生这种情况,尝试调整表达式中条件的次序,把数据类型相似的项(数字、字符串、日期等等)分组在一起。例如,在前面的表达式中,把两个整数数据项(“Retailer type code” 和 “Retailer code”)放在一起,错误消息就会消失了。图 10. IBM Cognos 8 Report Studio Data Item Expression 对话框,通过调整计算次序避免了错误
注意(?OrderBy? = ‘2’)
和(?OrderBy? = ‘3’)
条件对换了位置。如果这没有解决问题,可能必须使用第二种排序方法。 - 解决所有错误之后,单击 OK 关闭对话框。您会注意到列表中添加了一个新的列。
- 选择这个新列的标题或内容。
- 在 Report Studio 工具栏中,单击排序图标并在下拉列表中选择 Sort Ascending。
- 注意,现在此列中会出现图标,表示它将按升序排序。
- 对于降序排序列重复步骤 13.A.1 到 13.A.15,但是有几点不同:
- 给列指定不同的名称(例如 “Order By DESC”)。
- 在
Expression Definition
中把条件改为使用负数,例如:IF (?OrderBy? = '-1') THEN ([Retailer type code]) ELSE IF (?OrderBy? = '-3') THEN ([Retailer code]) ELSE IF (?OrderBy? = '-2') THEN ([Retailer type]) ELSE IF (?OrderBy? = '-4') THEN ([Retailer name]) ELSE IF (?OrderBy? = '-5') THEN ([Retailer name (multiscript)]) ELSE IF (?OrderBy? = '-6') THEN ([Retailer start date]) ELSE (null)
可以复制并粘贴升序列中的表达式,然后只需把条件中的值由正数改为负数。 - 在 sort 菜单中选择
Sort Descending
。
- 现在,在列表的末尾应该有两个新的列,如下所示:
图 11. IBM Cognos 8 Report Studio 列表,最后两列显示刚创建的两个计算
第二种方法需要多做点儿工作,可能不那么简便,但是更可靠。在这种方法中,为查询中的每个数据类型创建两个列:一个用于升序排序,另一个用于降序排序。- 因为无论选择哪种方法,概念都是相同的,所以按步骤 13.A.1 到 13.A.15 为列表中的每个数据类型创建一个升序排序列。需要考虑到以下不同之处:
- 给列指定一个有意义的名称。对于整数升序列,“Order By Int ASC” 这样的名称比较好。
- 修改表达式,让它只包含相同类型的项。例如,对于整数,表达式是:
IF (?OrderBy? = '1') THEN ([Retailer type code]) ELSE IF (?OrderBy? = '3') THEN ([Retailer code]) ELSE (null)
注意,这里没有列出其他四个数据项。
- 为这个数据类型创建升序列之后,按步骤 13.A.16 为同一数据类型创建降序列。
- 对于列表中的所有数据类型重复步骤 13.B.1 到 13.B.2。对于这个示例,最终添加六个排序列:
Order By Int ASC
数据类型:整数
方向:升序
表达式:IF (?OrderBy? = '1') THEN ([Retailer type code]) ELSE IF (?OrderBy? = '3') THEN ([Retailer code]) ELSE (null)
Order By Int DESC
数据类型:整数
方向:降序
表达式:IF (?OrderBy? = '-1') THEN ([Retailer type code]) ELSE IF (?OrderBy? = '-3') THEN ([Retailer code]) ELSE (null)
Order By Varchar ASC
数据类型:字符/字符串
方向:升序
表达式:IF (?OrderBy? = '2') THEN ([Retailer type]) ELSE IF (?OrderBy? = '4') THEN ([Retailer name]) ELSE IF (?OrderBy? = '5') THEN ([Retailer name (multiscript)]) ELSE (null)
Order By Varchar DESC
数据类型:字符/字符串
方向:降序
表达式:IF (?OrderBy? = '-2') THEN ([Retailer type]) ELSE IF (?OrderBy? = '-4') THEN ([Retailer name]) ELSE IF (?OrderBy? = '-5') THEN ([Retailer name (multiscript)]) ELSE (null)
Order By Date ASC
数据类型:日期
方向:升序
表达式:IF (?OrderBy? = '6') THEN ([Retailer start date]) ELSE (null)
Order By Date DESC
数据类型:日期
方向:降序
表达式:IF (?OrderBy? = '-6') THEN ([Retailer start date]) ELSE (null)
- 无论选择什么排序方法,都要隐藏排序列。选择排序列之一。
- 在左边的 Properties 面板中的标题区域中,单击 ancestors 图标。
- 在上下文菜单中,选择 List Column 对象。
- 在 Properties 面板中 Conditional 部分下面,双击 Render Variable。
- 在 Variable 下拉列表中,选择 “Sorting Columns Rendering” 并单击 OK。
- 对于其他排序列重复步骤 15 到 19。
- 最后,可以添加最后一部分 —— 让列表能够动态排序的逻辑。进入左边的面板,单击工具箱选项卡。
- 在 Insertable Objects 面板中,向下滚动到接近底部。应该会看到 Column Sorting Function 和 Sortable Column Title 工具箱对象。
- 把 “Column Sorting Function” 拖放到列表上方。画布现在应该像下面这样。
图 12. 包含排序的列的列表对象,列表上方有另一个 html 项
- 为了使用排序功能,需要保存报表。保存报表。
- 返回到 Cognos Connection 门户(不要关闭 Report Studio),找到此报表。
- 在 Actions 栏下面,选择 Set properties 图标。
- 在 Set properties 窗口的 General 选项卡中,单击右边的链接 View the search path, ID and URL。应该会打开一个新的对话框。
- 选择 Default action URL 框中的文本并把它复制到剪贴板。
- 返回到 Report Studio,双击文本项 “Copy the Default action URL for the report here. Only the Default action URL should exist between these two HTML items”。这应该会打开 Text 对话框。
- 把现有的字符串替换为报表的默认动作 URL,单击 OK 关闭 Text 对话框。报表现在应该像下面这样。
图 13. IBM Cognos 8 Report Studio 列表报表,排序已经就位,列表的最后两列是查询计算
确认 URL 中的主机不是 “localhost”,否则其他用户在使用排序时可能会遇到问题。
还要注意,如果改变报表名称或把它转移到另一个位置,就需要更新报表中的 URL。 - 注意,默认动作 URL 后面有两个 HTML Item 对象。如果在列表排序时希望传递报表的任何现有参数,需要像下面这样定义它们:
- 在工具箱选项卡的 Insertable Objects 面板中,找到 Layout Calculation 对象,把它拖放到这两个 HTML Item 对象之间。Report Expression 对话框出现。
- 对于希望传递的第一个参数,输入(或使用 Available Components 面板插入)以下代码:
ParamName('<parameter name>')+ '=' + ParamValue('<parameter name>')
- 对于希望传递的每个参数,重复步骤 1 和 2。注意,这里不需要包含 OrderBy 参数。
- 最后,每个 Layout Calculation 对象的表达式应该与图 14 中的相似。另外,Layout Calculation 对象应该出现在两个 HTML Item 对象之间,见图 14。
图 14. 列排序的参数规范,似乎应该出现在 IBM Cognos 8 Report Studio 中。圈出的是 Report Expression 代表的 Layout Calculation 对象的位置
然后,这些值被添加到排序 JavaScript 函数使用的 URL 中。
要点:为满足最常见的场景,在 JavaScript 代码中处理参数值时有几个约定:- 参数值是用逗号分隔的。这意味着可以使用多选的参数,参数值表示为 “value1, value2, value3”。如果有一个本身包含逗号的参数值,会把它当作两个值对待。
- 以 “Between” 开头的参数值代表一个值范围。这意味着可以使用日期范围这样的参数。如果有一个本身以 “Between” 开头的参数值,会按提取值范围的方式解析它。
- 保存报表。
使用动态排序功能
本节概述投入报表工作中的排序功能的工作方式。
- 在 IBM Cognos Connection 或 IBM Cognos 8 Report Studio 中,作为 HTML 运行报表。
- 应该会提示输入 “OrderBy” 参数。输入 0 并单击 OK。
注意,可以在报表属性页面中为这个参数设置默认值,让 Cognos Viewer 不提示输入值。 - 报表内容应该像下面这样(注意,这里只显示输出的第一页):
图 15. IBM Cognos 8 Report Viewer 输出,以 HTML 格式显示列表
注意,两个排序列是不可见的。 - 把鼠标停留在任何列标题上,就会看到排序图标。
- 单击当前的排序图标。报表运行结束之后,它会按选择的列升序排序(注意,这里只显示输出的第一页):
图 16. HTML 格式的列表的 IBM Cognos 8 Report Viewer 输出,选择的列上显示定制的排序图标
注意,排序图标已经变成升序排序图标,这表示排序方向。 - 单击当前的排序图标。报表运行结束之后,它会按选择的列降序排序。
注意,排序图标已经变成降序排序图标,这表示排序方向。 - 单击当前的排序图标。报表运行结束之后,它不再按选择的列排序。
注意,排序图标已经消失了,这表示没有执行排序。