IBM Cognos BI 最佳实践: 高级提示 — IBM Cognos BI 8.3 和 8.4

IBM Cognos 8.4 在现有的提示缓存特性中增加了两个特性。第一个大大简化了缓存的管理,第二个提供增强的多语种用户支持。在本文中,我们将重点讨论这两个主题: IBM Cognos 8.4 中对提示的改进,以及定制的提示控件。

1 简介

在本文中,我们将讨论两个主题: IBM Cognos 8.4 中对提示的改进,以及定制的提示控件。

IBM Cognos 8.4 中对提示进行改进的目的是,扩展提示缓存特性,让提示缓存更易于管理。

定制的提示控件的设计目的是,让用户掌握创建自己的提示控件的原理,提供一些有用的示例,比如选项卡式提示界面和随需选择列表。

定制的提示控件已经用 IBM Cognos 8.3 和 IBM Cognos 8.4 测试过了。

本文发表于 2008 North America IBM Cognos Forum 。


2 对提示缓存的改进

IBM Cognos 8.4 在现有的提示缓存特性中增加了两个特性。第一个大大简化了缓存的管理,第二个提供增强的多语种用户支持。

2.1 动态的提示缓存刷新

IBM Cognos 8.3 引入了提示缓存,这允许缓存并重用提示查询值。以前控制缓存刷新的方法是,通过使用作业运行报表提示查询来刷新缓存。

客户的反馈意见表明,尽管这个特性确实可以通过重用查询结果提供更好的提示性能,但是使用作业管理提示缓存刷新非常麻烦,这增加了管理员的维护工作量。

因此, IBM Cognos 8.4 简化了提示缓存的管理。为了保证升级兼容性,仍然可以使用作业维护提示缓存。但是,现在在报表属性 Report 选项卡中增加了一个新选项:

图 1. 提示缓存选项卡
图 1. 提示缓存选项卡

在使用这个选项时,提示缓存将由系统自动管理,不需要作业或其他干预
措施。

这个选项使用用户报表的执行驱动提示缓存刷新活动。在执行报表时,系统根据在报表属性中指定的有效期,判断缓存是有效的,还是过期了。如果缓存足够新,就不执行任何操作。如果缓存过期了,就删除缓存的数据并执行提示查询来创建新的缓存。

2.2 多语种缓存

提示缓存是多语种的,用来填充缓存的查询与用户的内容位置(用来运行报表和查看数据的语言)相关。

在使用动态刷新方法刷新缓存时,使用当前用户的内容语言运行提示查询。只有当后续用户使用不同的语言运行报表时,才会为另一种语言创建缓存。当提示缓存过期时,同时删除所有语言的缓存。

为便于理解,请考虑以下场景和事件:

创建一个没有提示缓存的新报表。设置 Dynamic Prompt Cache 选项,有效期为 7 天。

在创建报表的当天,一位法语用户运行这个报表,这会促发法语提示缓存的创建。这时设置缓存创建日期。

在第二天,另外两位法语用户运行同一个报表。因为法语的提示缓存已经存在了,该缓存适用于所有法语用户。

在第三天,一位德语用户运行这个报表。因为还没有德语的提示缓
存,所以运行提示查询并创建德语的提示缓存。这个操作不影响法语的提示缓存。在第三天,还有新的法语用户运行报表,使用第一天创建的法语缓存。

在第四天到第七天,更多的法语和德语用户运行报表,分别使用各自语言的提示缓存。

在第八天,一位德语用户运行报表。因为在第一天由法语缓存设置了有效期,提示缓存现在超过了 7 天的期限。删除所有语言的提示缓存,尽管德语缓存只存在了 4 天。为了满足德语报表请求,现在创建新的德语缓存。

在以后 6 个月里,一直没有用户运行这个报表。缓存不受影响,因为没有用户操作驱动缓存刷新。

一位英语用户运行报表。缓存(德语)已经过期了,所以删除它并创建英语缓存。

以此类推,根据需要缓存与语言相关的数据。

2.3 单语种缓存

多语种应用程序的一种有意思的变体是,让多语种用户用单语种数据库运行报表。也就是说,用户希望根据他们的内容位置显示数据,例如数字和日期相应地显示为 $123.45 与 123,45$ 或 1 January 2008 与 janvier 01, 2008 ;但是,数据都是同一种语言的。一个 IBM Cognos 客户(一家大型航空公司)用英语记录所有信息,但是允许用户选择 IBM Cognos 8 用户界面和数据格式化所用的语言。

在这种变体中,为不同的用户内容语言创建提示缓存是没有意义的,因为它们都包含来自单语种数据库的相同数据。

为了满足这个需求, IBM Cognos 8.4 提供一个高级服务器属性,可以用它指定一种在创建所有提示缓存时使用的语言。在服务器管理屏幕上 Cognos Connection 中设置属性 RSVP.PROMPTCACHE.LOCALE=<locale> ,让服务器知道使用哪种语言创建所有提示缓存。在创建提示缓存时,这个设置优先于用户的内容位置。

因为很难演示这个高级服务器属性的效果,这里不提供相关的示例。关于高级服务器属性的更多信息,请参见 IBM Cognos 8.4 管理手册。


3 可重用的工具箱对象

报表项目常常在不同的报表中需要相同的 Report Studio 对象,比如提示定义。这可以通过两种方法实现:在报表之间使用报表布局引用,或者使用定制的工具箱对象。因为本文后面讨论的提示方法要使用定制的工具箱对象,本节主要讨论这种方法而不是布局组件引用( Report Studio User Guide 中讨论了布局组件引用)。

定制的工具箱对象仅仅是取自报表的有效 xml 片段。例如,标准 Report Studio 工具箱中的 HTML 对象是下面的 xml 报表规范片段:

 <!-- HTML Item --> <HTMLItem id="HTMLItem"> 
 <dataSource> 
 <staticValue/> </dataSource> 
 </HTML Item>

在创建定制的工具箱对象之前,您至少应该基本了解 Report Studio XML 报表规范。 IBM Cognos 8 BI SDK 指南全面记录和解释了报表规范 XML 模式。

根据报表规范,报表中添加的定制的 HTML/JavaScript 代码出现在 HTMLItem 元素的 <staticValue> 标记中,如下所示:

<HTMLItem> 
<dataSource> 
<staticValue>This is my <b>CUSTOM</b> HTML.
</staticValue>
</dataSource> 
</HTML Item>

这个示例在报表中以 HTML 格式显示简单的文本:

图 2. 可重用的工具箱对象
图 2. 可重用的工具箱对象

要想把它添加到 Report Studio 工具箱中,需要了解两个文件:

  1. Toolbox.xml
  2. ToolboxControls.xml

Toolbox.xml 创建工具箱的结构,工具箱结构决定在不同的 Report Studio 上下文中出现哪些对象;导航到 Report Studio 用户界面的不同部分,工具箱中会出现不同的对象。在 Toolbox.xml 文件中定义对象名称、上下文、参数等。

例如,在 toolbox.xml 中 HTML 对象的定义如下:

定义 含义
<listItem 这个对象出现在对象列表中。
controlRef="HTMLItem" 出现在 ToolboxControls.xml 中的对象 id
( HTMLItem )。这个 id 在该文件中必须是惟一的。
value="" 保留,供 Report Studio 使用。在创建新对象时,总是使用与默认对象相同的值。
label="HTML Item" 在 Report Studio 工具箱中显示的标签 。
tooltip="HTML Item" 在 Report Studio 工具箱中显示的工具提示。
smallIcon="HTMLItem.gif"/> 在工具箱中显示的图标的名称。可以在 ...\c8\webcontent\pat\images 目录中找到图标。

ToolboxControls.xml 定义 xml 报表片段。请记住,在 toolbox.xml controlRef 标记和 toolboxControls.xml id 中使用的名称必须相同,而且 xml 片段必须是有效的 xml 。

ToolboxControls.xml 定义对象本身:

定义 含义
<HTMLItem id="HTMLItem"> HTMLItem 元素告诉 Report Studio 这是什么类型的对象。
id=”HTMLItem” 属性把元素链接到 Toolbox.xml ,确保在 Report Studio 工具箱中正确地放置对象。这个 id 在该文件中必须是惟一的。
 <dataSource> 
 <staticValue/> 
 </dataSource>
按 XML 报表规范模式指定的对象定义。
</HTMLItem> 结束定义。

请记住, XML 片段在报表规范中必须是有效的。怎么确认呢?在创建定制的工具箱对象之前测试它。

创建定制的工具箱对象之后,它出现在 Report Studio 中,可以把它拖到报表中。

3.1 专题示例:可重用的 HTML 对象

这个示例演示如何创建可在 Report Studio 中使用的 HTML 对象。

打开 Report Studio 和 GO Sales (query) 包 。

创建列表报表:

  • \Sales (query)\Products\Product line

如下所示:

图 3. 创建列表报表
图 3. 创建列表报表

把 HTML 对象从 Report Studio 工具箱拖到页面体中列表后面:

图 4. 页面体
图 4. 页面体

双击 HTML 对象,编辑 HTML 内容:

图 5. 编辑 HTML 内容
图 5. 编辑 HTML 内容

单击 OK 并运行报表:

图 6. 运行报表
图 6. 运行报表

这表明这个 HTML 对象是有效的,结构良好。

返回到 Report Studio 并选择这个 HTML 对象。使用 CTRL-c 或 Report Studio 工具箱中的复制按钮把这个 HTML 对象复制到 Windows 剪贴板中。

打开 notepad 或另一个文本编辑器,把剪贴板的内容粘贴到文本编辑器中,就可以看到 XML 代码:

 <RSClipboardFragment version="2. 0"> 
 <HTMLItem> 
 <dataSource> 
 <staticValue>This is &
 lt;b&gt;MY&lt;/b&gt; HTML item.
 </staticValue> 
 </dataSource> 
 </HTML Item> 
 </RSClipboardFragment>

为了让 XML 片段更清晰,这里已经加了换行符。

删除 RSCliboardFragment 元素的开始和结束标记(上面示例的第一行和最后一行):

 <HTMLItem> 
 <dataSource> 
 <staticValue>This is &lt;b&gt;MY&lt;/b&gt; HTML item.
 </staticValue> 
 </dataSource> 
 </HTML Item>

staticValue 的内容包含 &lt;b&gt; 等奇怪的信息。这是 HTML 编码的文本,用来确保正确地传输特殊的字符,比如 < 和 > ( &lt; 和 &gt; )。工具箱对象不需要特殊字符的 HTML 编码,所以可以把编码的字符替换为常规字符。但是,保持编码字符形式不会影响工具箱对象定义。

打开 Toolbox.xml 。

插入一个新行,见下面突出显示的文本:

 <!-- 
 Copyright (C) MyCompany Incorporated. All Rights Reserved. 
 - -> 
 <resources> 
 <!-- Categories 
 A = Basic
 B = Text items 
 C = Prompting 
 - -> 
 <listView id="Toolbox_PageView" 
 classPrefix="clsListItem_tb"> <listItems>  
 <listItem controlRef="myHTMLItem" value="A" 
 label="My HTML Item" 
 tooltip="This is my personal HTML Item"/>

注意,对象在这个文件中的次序决定它们在 Report Studio 中出现的次序,所以这个新对象在工具箱中最先出现。

保存并关闭 Toolbox.xml 文件。

打开 ToolboxControls.xml 。

把新的 HTML 对象定义复制并粘贴到这个文件中:

 <!-- 
 Copyright (C) MyCompany Incorporated. All Rights Reserved. 
 - -> 
 <resources> 
 <xmlFragment id="ToolboxControls"> 
 <!-- Custom HTML Item --> 
 <HTMLItem> 
 <dataSource> 
 <staticValue>This is &lt;b&gt;MY&lt;/b&gt; HTML item.</staticValue> </dataSource> 
 </HTMLItem>

注意,在新的 HTML 对象前面添加了一个注释标记。严格地说,这些注释并不是必须的,但是在修改 ToolboxControls.xml 文件时注释有助于寻找和了解内容。

添加 ID 以创建到 Toolbox.xml 的链接:

 <!-- 
 Copyright (C) MyCompany Incorporated. All Rights Reserved. 
 - -> 
 <resources> 
 <xmlFragment id="ToolboxControls"> 
 <!-- Custom HTML Item --> 
 <HTMLItem id="myHTMLItem"> 
 <dataSource> 
 <staticValue>This is &lt;b&gt;MY&lt;/b&gt; HTML item.</staticValue> </dataSource> 
 </HTML Item>

保存并关闭这个文件。

添加新对象的过程现在完成了。关闭并重新打开 Report Studio 让修改生效,就会在 Report Studio 中看到新对象。在 Report Studio 启动时装载 toolbox.xml 和 toolboxCongrols.xml ,因此需要重新打开 Report Studio 。但是,不需要重新启动 IBM Cognos 8 服务器。

使用 Product line 创建新的列表报表:

图 7. 创建新的列表报表
图 7. 创建新的列表报表

打开工具箱,会看到定制的对象出现在最前面:

图 8. 打开工具箱
图 8. 打开工具箱

把这个 HTML 对象拖到报表中列表后面:

图 9. 报表中列表
图 9. 报表中列表

在此之后,所有操作都与从头创建 HTML 对象时一样。可以像修改其他 HTML 对象一样在报表布局中修改定制的 HTML 对象。

运行报表:

图 10. 运行报表
图 10. 运行报表

总之,在工具箱中添加对象的步骤如下:

  1. 在 Report Studio 中创建需要的对象。
  2. 把对象复制到剪贴板。
  3. 删除第一行和最后一行的 RSClipboardFragment 标记。
  4. 使用惟一的 id 在 Toolbox.xml 中创建一个新对象。
  5. 在 ToolboxControls.xml 中创建新对象。
    1. 粘贴报表 XML
    2. 添加 id
  6. 在报表中使用它。

请记住,把新对象插入报表之后,它就独立于工具箱中定义的对象了。这意味着,对工具箱定义的修改不会应用于已经插入报表的对象。

3.2 专题示例:可重用的提示控件

有时候,报表创建者希望非常简便地重用提示控件定义。例如,假设创建者创建了一个包含大量静态值的选择列表提示。每次在 Report Studio 中创建它时,都需要:

  1. 把 Value 提示拖到报表中。
  2. 把 Select UI 属性设置为 List box 。
  3. 把 Multi-select 属性设置为 Yes 。
  4. 输入静态值。

对于短列表,这个过程相当简单;但是对于很长的静态值列表,每次都要重新创建这个提示就太繁琐了。

这个示例演示如何创建可重用的提示控件,让创建者不必为每个新报表输入值。

打开 Report Studio 和 GO Sales (query) 包。

创建一个列表报表:

  • \Sales (query)\Order method\Order method
图 11. 创建一个列表报表
图 11. 创建一个列表报表

选择 Order method 并按 Build Prompt Page 工具箱按钮。

Report Studio 将创建一个适当的 Order method 筛选,插入提示页面,创建包含查询的提示。

假设 Order method 的列表是不变的,就可以使用静态值的列表,而不是用查询填充提示控件。

选择提示。

把 Query method 设置为 (Default) 。

添加静态值:

图 12. 添加静态值
图 12.

运行报表,检查各个静态值,确保它们与查询筛选表达式的要求匹配。添加静态值

返回到 Report Studio 。

选择提示并把它复制到 Windows 剪贴板。

打开 notepad 并粘贴代码。删除 RSClipboardFragment 标记,就得到了一个标准的提示定义:

 <selectValue parameter="Order method" required="true" 
multiSelect="true" range="false" autoSubmit="false"
 selectValueUI="listBox"> 
 <XMLAttributes> 
 <XMLAttribute name="dataType" value="xsdString" render="true"/> </XMLAttributes> 
 <selectOptions> 
 <selectOption useValue="E-mail"> 
	 <displayValue>E-mail< /displayValue> 
 </selectOption> 
 <selectOption useValue="Fax"> 
	 <displayValue>Fax< /displayValue> 
 </selectOption> 
 <selectOption useValue="Mail"> 
	 <displayValue>Mail< /displayValue> 
 </selectOption> 
 <selectOption useValue="Sales Visit"> 
	 <displayValue> Sales Visit< /displayValue> 
 </selectOption> 
 <selectOption UseValue="Special"> 
	 <displayValue> Special< /displayValue> 
 </selectOption> 
 <selectOption UseValue="Telephone"> 
	 <displayValue>Telephone< /displayValue> 
 </selectOption> 
 <selectOption useValue="Web"> 
	 <displayValue>Web< /displayValue> 
 </selectOption> </selectOptions> </selectValue>

我们把这个提示命名为 OrderMethodPrompt 。

打开 Toolbox.xml 。

创建一个新行:

 <listItem controlRef="OrderMethodPrompt" 
 value="C" label="Order method prompt" 
 tooltip="Order method prompt with statis values"/>

注意, value 属性是“ C ”。这取自 Toolbox.xml 文件中列出的 selectValue 提示对象的默认属性。 selectValue 对象是在 Report Studio 中创建的定制值提示控件的基础。

保存 Toolbox.xml 文件。

打开 ToolboxControls.xml ,把提示定义粘贴到 <xmlFragment id="ToolboxControls"> 元素中。

添加 id=”OrderMethodPrompt” 属性。

 <selectValue id=”OrderMethodPrompt”
 parameter="Order method" required="true" 
 multiSelect="true" range="false" 
 autoSubmit="false" 
 selectValueUI="listBox"> 
 ... </selectValue>

保存文件。

关闭并重新打开 Report Studio 。

创建列表报表:

  • • \Sales (query)\Order method\Order method
图 13. 创建列表报表
图 13. 创建列表报表

在 Order method 上创建筛选(注意,使用的参数名必须与 ToolboxControls.xml 文件中可重用提示控件的 parameter= " Order method " 属性中指定的名称相同):

 [Order method] in (?Order method?)

添加一个新的提示页面。

把 Order Method Prompt 从工具箱拖到新提示页面的布局中。

运行报表。

报表现在完成了,它使用来自定制的工具箱定义的预定义对象。

尽管报表创建者并不经常需要这样做,但是在下一节它将作为设置内容的
基础。


4 定制的提示控件概述

本节讨论定制的提示控件的基本功能,然后提供一些具体的提示示例。目的是帮助报表创建者了解如何创建定制的提示控件和使用提供的示例。

如果系统提供的提示控件无法满足报表需求,可以使用定制的提示控件。可以使用报表提示页面或报表页面布局中嵌入的 HTML/JavaScript 代码定义定制的提示控件,从而创建所需的用户体验并向报表表达式提供值。向报表表达式提供值是比较容易的部分。

在报表中添加定制的提示需要三个步骤:

  1. 创建定制的提示控件。
  2. 把定制的提示控件放到提示页面中。
  3. 设置参数值。

4.1 创建定制的提示控件

这个过程中最困难的部分是,设计和编写定制的提示控件以满足报表需求。创建提示控件的这个阶段需要 HTML/JavaScript 编程技能,这超出了本文的范围,但是可以通过许多第三方技术手册、课程和在线资料掌握这些技能。

4.1.1 Beer Glass 控件

下面是一个定制的提示控件示例。在运行时,它的外观如下:

图 14. Beer Glass 控件
图 14. Beer Glass 控件

这个提示控件显然与 IBM Cognos 在 Report Studio 中提供的任何控件都很不一样。用户可以使用 Drink 和 Fill 按钮选择更高或更低的值。

4.2 把定制的提示放到提示页面中

这非常容易。 Report Studio 在工具箱中提供了一个专门用于这种操作的 HTML 对象。

这个 HTML 对象可以包含您指定的任何 HTML/JavaScript 代码。代码放在提示页面中,让浏览器可以执行它。

如果要多次使用一个定制的提示控件,可以按第 3 节和第 4 节的说明把它添加到 Report Studio 工具箱中。

在创建可重用的定制提示工具箱对象时,应该考虑到以下问题:

  1. 所有提示必须有惟一的名称 —— 这在 JavaScript 中使用 HTML div 来实现。惟一的名称由报表创建者指定。
  2. 提示设置参数 —— 需要把参数名传递给定制的提示控件。
  3. 提示可能要设置其他参数。例如, Beer Glass Prompt 允许 Report Studio 创建者设置高值和低值。

通过把提示放进一个命名的 HTML div 惟一地标识它们。

4.3 设置参数值

提示值作为参数传递给报表。在 Report Studio 筛选或计算中使用 ?<parameter name>? 语法指定参数,比如
[Country] in ?CountryParm? 。

在提示页面中,当用户按 Finish 按钮时,参数作为 HTML 表单字段变量传递给 IBM Cognos 8 BI 服务器。为了让 IBM Cognos 8 BI 服务器能够把参数变量与其他变量区分开,参数使用命名约定 p_<Parameter name> 。因此,参数 CountryName 通过表单字段变量 p_CountryName 传递。

因此,定制的提示控件传递参数值非常容易,只需设置具有正确名称的表单字段变量。

提示控件必须把适当的表单字段变量设置为用户指定的值。


5 使用样例

5.1 设置样例

  1. 把文件解压到一个新目录中。
  2. 在执行报表时要使用 bmp 和 png 图像。把 bmp 和 png 文件复制到 webcontent\samples\images 目录中。
  3. gif 文件用于在 Report Studio 工具箱中创建图标。把 gif 文件复制到 webcontect\pat\images 目录中。
  4. 把 toolbox.xml 的内容插入 ../c8/webcontent/pat/res 目录中的 Toolbox.xml 文件中。应该插入在 Toolbox_PageView 部分中以下代码后面:

    <listView id="Toolbox_PageView" classPrefix="clsListItem_tb"> <listItems>

  5. 把 toolboxControls.xml 的内容插入 ../c8/webcontent/pat/res 目录中的 toolboxControls 文件中。应该添加在以下代码后面:

    <resources>

    <xmlFragment id="ToolboxControls">

  6. 把 reportstudio_en.xml 合并到 webcontent/pat/res 中同名的文件中,放在 RSB UI 部分中以下代码后面:

    <section name="RSB" type="UI">

  7. 把 customPromptControls.js 文件复制到 webcontent\prompting 。

定制控件的代码在 customPromptControls.js 文件中。 toolboxControls.xml 中的 HTML/JavaScript 是在 Report Studio 中显示提示控件所需的基本代码。

对 customPromptControls.js 中的 JavaScript 代码使用外部引用,这样就可以更新代码并把修改传播到所有报表。尽管可以在 ToolboxControls.xml 文件中定义 JavaScript 代码,但是这么做就会导致在每个报表规范中嵌入静态的 JavaScript 代码。如果要更新报表中嵌入的代码,报表创建者就必须分别修改每个报表。

5.2 定制的提示按钮

定制的提示按钮实际上与默认的提示按钮一样,只是用图像替代了文本。下面解释使用这些新对象的步骤。

打开 Report Studio 和 GO Sales (query) 包。

创建新的列表报表:

  • \Sales (query)\Product\Product line

选择 Product line 并按 Build Prompt Page 工具栏按钮。

创建一个提示页面,其中包含默认的提示按钮:

图 15. 创建一个提示页面
图 15. 创建一个提示页面
图 16. 包含默认的提示按钮
图 16. 包含默认的提示按钮

选择并删除每个提示按钮。

把 Prompt Button Set 拖到页脚中。

运行报表:

图 17. 把 Prompt Button Set 拖到页脚中
图 17. 把 Prompt Button Set 拖到页脚中
图 18. 运行报表
图 18. 运行报表

出现了一组更漂亮的提示按钮。

Prompt Button Set 实际上是一个标准的报表 Block 对象,其中有四个提示按钮。每个提示按钮的 <contents> 是用表格、图像和一些文本定制的。下面是标准 Cancel 按钮的规范:

 <promptButton type="cancel"> 
	 <contents/> 
	 <style> 
	 <defaultStyles> 
	 <defaultStyle refStyle="bp"/> </defaultStyles> 
	 </style> 
	 </promptButton>

下面是定制的 Cancel 按钮:

	 <promptButton type="cancel"> 
	 <contents> 
	 <table> 
		 <style> 
		 <defaultStyles> 
		 <defaultStyle refStyle="tb"/> 
		 </defaultStyles> 
		 <CSS value="border-collapse: collapse;width: 100%"/> </style> 
		 <tab leRows> 
		 <tab leRow> 
		 <tableCe lls> 
			 <tableCe ll> 
			 <contents> 
				 <image> 
				 <dataSource> 
 <staticValue>. . /samples/images/cancel.bmp 
	 </staticValue> 
				 </dataSource> </image> 
			 </contents> 
			 </tableCell> 
			 <tableCe ll> 
			 <contents> 
				 <textItem> 
				 <dataSource> 
				 <staticValue>Cancel< /staticValue> </dataSource> 
				 </textItem> 
			 </contents> 
			 </tableCell> 
		 </tableCells> 
		 </tableRow> 
		 </tableRows> 
	 </table> 
	 </contents> 
	 <style> 
	 <defaultStyles> 
	 <defaultStyle refStyle="bp"/> </defaultStyles> 
	 </style> 
	 </promptButton>

每个按钮的定义都属于标准的 XML 报表规范,而不是定制的 HTML 或 JavaScript 。每个按钮的内容是用一个包含两个单元格的单行表格定义的。一个单元格包含图像,例如在启用和禁用时按钮应该怎么样,所以不需要通过定制编程实现按钮操作。在运行时,提示按钮仅仅是报表的一部分,使用标准的 IBM Cognos 8 功能执行它们。

5.3 Beer Glass

Beer Glass 控件是一个定制的 HTML/JavaScript 控件,用户可以使用它调整啤酒杯中的液面高度,从而选择参数值。下面解释使用这个定制的提示控件创建报表的过程。

打开 Report Studio 和 GO Sales (query) 模型。

创建新的列表报表:

  • \Sales (query)\Order\Order number
  • \Sales (query)\Sales\Quantity

按 Quantity 升序排序。

运行报表。

向下滚动页面,可以看到 Quantity 值从 1 开始增加到更高的值。

返回到 Report Studio 。

创建筛选 [Quantity] >= ?pQty? 。

注意,参数名是 pQty 。

在报表中添加一个提示页面。

把 Beer Glass Prompt 拖到新的提示页面中。

会在报表中看到下面的 HTML 对象:

图 19. 在报表中添加一个提示页面
图 19. 在报表中添加一个提示页面

请记住,这个定制的提示控件是用 HTML/JavaScript 编写的,在运行报表时浏览器执行这些代码。

双击 HTML 对象,可以看到 HTML 源代码。

这个提示控件的代码实际上不在 Beer Glass Prompt 工具箱对象中。它通过调用 customPromptsControls.js 文件中的函数来创建提示。

查看代表这个定制提示控件的 HTML 对象的 HTML 定义。提示控件定义中的元素如下:

定义 含义
'<script 
 src=". . /prompting/customPromptControls.js ">
</script>' +
告诉浏览器这个提示控件在哪个文件中。
不要修改。
'<div id="[ BeerGlassContainer1] "></div>' + 这个 HTML div 提供用于引用提示控件的惟一 id 。只有当同一个提示页面上有多个 Beer Glass Prompt 时,才应该修改它,让每个控件有惟一的名称。
'<script>beerGlassControl ( 创建提示的函数的名称。不要修改。
"[ BeerGlassContainer1] ", 必须与分配给 div 元素的惟一 id 匹配。
"[ BeerGlassParameter1] ", 在报表的筛选表达式中使用的参数名。

Beer Glass Prompt 使用的默认参数是 [BeerGlassParameter1] 。因为筛选中使用的参数是 pQty ,应该把它改为“ pQty ”。

图 20. Beer Glass Prompt
图 20. Beer Glass Prompt

注意,参数名是区分大小写的,必须放在双引号中; pQTY 是无效的。

运行报表:

图 21. 运行报表
图 21. 运行报表

把鼠标移动到 Drink 或 Fill 按钮上,把值改为 85 。按 Finish 按钮,会看到 Quantity 值被筛选,在报表输出中只显示大于 85 的值。

图 22. 在报表输出中只显示大于 85 的值
图 22. 在报表输出中只显示大于 85 的值

报表现在完成了。报表创建者可以使用定制的提示调整报表,满足企业和客户的需要。

Beer Glass Prompt 的 JavaScript 代码实现清空和装满杯子这样有趣的效果。从提示的角度来看,最有意思的是它修改表单字段变量 p_pQty 的值。在 JavaScript 代码中,前面的一行代码获取提供的变量名并在它前面加上 p_ :

 var sFullParameterName = 'p_'+ sParameterName;

在用 Drink 和 Fill 按钮修改提示值时,设置表单字段变量 p_pQty 的值。在用 Finish 按钮提交提示页面时,把这个表单变量传递给报表。

应用 drink 和 fill 函数修改与提示控件相关联的数字值, JavaScript 代码的其他部分定义啤酒杯图像的外观。

5.4 Dynamic Picklist Prompt

这个定制的提示控件看起来像一般的选择列表,但是有一个较大的差异 —— 只有当用户单击控件本身时,才会填充它。不需要在显示提示页面之前执行提示查询和相关的处理,所以可以非常快地显示提示页面。这非常适合那些不常用的提示。

打开 Report Studio 和 GO Sales (query) 包。

创建新的列表报表:

  • \Sales (query)\Product\Product number
  • \Sales (query)\Product\Product name

按 Product number 升序排序:

图 23. 按 Product number 升序排序
图 23. 按 Product number 升序排序

用 Product number 创建一个新的筛选: [Product number] >= ? ProdNum?

注意,参数名是 ProdNum 。

添加提示页面。

把 Dynamic Picklist Prompt 拖到提示页面中。

报表中出现用于定义定制 Dynamic Picklist 控件的 HTML 对象:

图 24. 添加提示页面
图 24. 添加提示页面

请记住,这个定制的提示控件是用 HTML/JavaScript 编写的,在运行报表时由客户机 web 浏览器处理这些代码。

双击 HTML 对象,可以看到 HTML 源代码。

这里的代码实际上不是提示。它通过调用 customPromptsControls.js 文件中的函数来创建提示。

定义 含义
'<script 告诉浏览器这个提示控件在哪
src=". . /prompting/customPromptControls . js "></script>'+ 个文件中。
不要修改。
'<div id="[ PicklistContainer1] "></div>' + HTML div 提供惟一的名称。只有当同一个提示页面上有多个动态选择列表提示时,才应该修改它,让每个控件都有惟一的 id 。
'<script>dynamicPickListControl ("' + 
 ModelPath() + '" ,
创建提示的函数的名称。
不要修改。
"[ PicklistContainer1]", 必须与 div 元素定义的惟一 id 匹配。
"[ PicklistParameter1]", 在报表的筛选表达式中使用的参数名。
"[Label]", 在没有选择实际的选择列表值时显示的文本标签。
"[ UseValue]", 必需的 Use 值数据项的模型路径。
"[ DisplayValue (optional)]" 可选的 Display 值数据项的模型路径。
);</script>'

把参数名改为 "ProdNum" 。

把标签改为 "Product name" 。

为了设置 UseValue 和 DisplayValue ,必须确定 Product number 和 Product name 数据项的模型路径。

在 Report Studio 数据树(左面板中的模型树)中,找到 Product 查询主题:

图 25. 找到 Product 查询主题
图 25. 找到 Product 查询主题

右键单击 Product number 并选择 Properties 。

把 Ref 值复制到 Windows 剪贴板。

图 26. 把 Ref 值复制到 Windows 剪贴板
图 26. 把 Ref 值复制到 Windows 剪贴板

关闭属性表。

双击 HTML 对象,把“ [UseValue] ”替换为 Ref 值:

	"[Sales (query)] .[ Product] .[ Product number]"

重复这个过程,查明 Product name 的模型路径,使用这个路径作为 Display 值:

图 27. 查明 Product name 的模型路径
图 27. 查明 Product name 的模型路径

运行报表。

显示提示,其中显示 Label 值:

图 28. 显示 Label 值
图 28. 显示 Label 值

目前,还没有填充提示内容。也没有执行提示查询。

单击向下箭头。提示得到填充,列表展开,报表用户可以选择提示控件的值。可能必须向下滚动,才能找到提示按钮。

5.4.1 Dynamic Picklist Prompt 的工作方式

这是本文中最复杂的示例。动态地获取提示值的代码非常巧妙。

在单击它时, Dynamic Picklist Prompt 控件的 JavaScript 代码执行以下步骤:

  1. 获取 Use 和 Display 数据项的路径。
  2. 通过 Use 和 Display 项创建简单的 XML 报表规范,其中含有提示页面、提示和查询。
  3. 运行报表规范,将提示页面的值作为 HTML 片段返回。

    —— 换句话说,一个 JavaScript 变量现在包含提示页面的 HTML 。

  4. 通过识别 <selectOptions> 和 </selectOptions> 标记之间的数据找到 HTML 中的提示控件。
  5. 删除多余的字符,把 HTML 元素转换为定制提示控件的值。
  6. 把这些值插入下拉列表。

然后,浏览器显示提示,用户选择一个值,设置 p_ProdNum 表单字段变量。

5.5 Tab Control Prompt

报表创建者可以使用 Tab Control Prompt 创建选项卡式提示界面。如果有不常用的提示,可以使用这个控件从主提示界面中去移除它们。选项卡式界面把提示隐藏起来,但是将其保持在报表用户可以轻易接触到的范围之内。对于第二个及后面的选项卡,直到用户选择选项卡时才会处理其中的提示。由于推迟了提示查询的执行,生成提示页面所需的资源减少了,所以性能也提高了。

Tab Control 使用一个由选项卡选择操作驱动的条件块。下面将创建一个报表来阐明选项卡式提示界面。

打开 Report Studio 和 GO Sales (query) 包。

创建新的列表报表:

  • \Sales (query)\Product\Product line
  • \Sales (query)\Order method\Order method
  • \Sales (query)\Sales\Quantity

如下所示:

图 29. 创建新的列表报表
图 29. 创建新的列表报表

创建两个筛选:

图 30. 创建两个筛选
图 30. 创建两个筛选

注意 Order method 筛选是可选的。

创建提示页面。

把 Tab Control Prompt 拖到提示页面中。

编辑 HTML :

定义 含义
'<script src="../prompting/customPromptControls.js" ></script>' + 告诉浏览器这个提示控件在哪个文件中。
不要修改。
'<div id="[ tabContainer1] "></div>' + HTML div 提供用于引用提示控件的惟一 id 。只有当同一个提示页面上有多个定制提示时,才应该修改它,让每个控件有惟一的 id 。
"<script> tabControl ( 创建提示的函数的名称。
不要修改。
'[tabContainer1]', 必须与 div 元素定义的惟一 id 匹配。
'[tabParameter1]', 在与提示页面条件块相关联的变量表达式中使用的参数名。
['[ Tab1] ', '[ Tab2] ', '[ Tab3] '], 包含选项卡名称的 JavaScript 数组。根据需要修改选项卡名称。可以指定任意数量的选项卡名称,以逗号分隔。
'" + (IF (ParamCount ('[ tabParameter1] ' ) 
 0) THEN ('0') ELSE (ParamDisplayValue 
 ('[ tabParameter1] '))) + =
告诉函数数组中定义了多少个选项卡。不要修改。
"') ;</script>" 结束脚本。不要修改。

把选项卡名称设置为 Product line 和 Order method :

'<script src=". ./prompting/customPromptControls.js">
</script>' + '<div id="[ tabContainer1] "></div>' + 

"<script>tabControl ( '[ tabContainer1] ', 
'[ tabParameter1] ', 
 ['Product line', 'Order method'], 
'" + (IF (ParamCount('[ tabParameter1] ') = 0) 
THEN ('0') ELSE (ParamDisplayValue ('[ tabParameter1] '))) + 
"') ;</script>"

一定不要删除包围选项卡名称的 [ ] ,因为这些字符表示 JavaScript 数组。

选项卡现在创建好了。当用户单击一个选项卡时,设置 [tabParameter1] 参数的值。

下一步是使用选项卡参数创建一个变量,把条件块与这个参数关联起来。

在 Report Studio 中打开 Condition Explorer :

图 31. 打开 Condition Explorer
图 31. 打开 Condition Explorer

使用以下表达式创建一个新的 String 变量 SelectedTab :

	 ParamValue('[ tabParameter1] ')

这会将这个变量与选项卡式提示控件用来切换选项卡的参数关联起来。当用户单击一个选项卡时,会设置选项卡参数值,然后更新变量,改变条件块以反映新的选项卡参数值。

在 Values 列表中添加值 1 :

图 32.在 Values 列表中添加值 1
图 32.在 Values 列表中添加值 1

这实际上定义两个变量值: 1 和 Other 。通过在变量的 Values 列表中添加选项卡编号,就可以定义更多选项卡。

进入提示页面。

选择条件块并把 Block Variable 属性设置为 SelectedTab 。

把 Current Block 属性设置为 Other 。

把 Value 提示拖到 Conditional Block 中。

在向导启动时,把参数设置为使用现有的 ProdLine 参数。

单击 Next 。

单击 Finish (接受默认的查询设置)。

把 Current Block 属性设置为 1 。

把 Value 提示拖到 Conditional Block 中。

在向导启动时,把参数设置为 OrderMethod 。

单击 Next 。

单击 Finish (接受默认的查询设置)。

运行报表:

图 33. 运行报表
图 33. 运行报表

用户可以通过单击“ Product line ”或“ Order method ”切换选项卡。

除非用户切换选项卡,否则不处理 Order method 提示(包括运行提示查
询)。这可以同时节省资源并提高性能。

定制工具箱对象中添加的 Tab Header Control Prompt 对象采用相同的工作方式,但是报表创建者必须从头创建条件块,而不能使用 Tab Control Prompt 工具箱对象已经定义好的条件块。


6 结束语

可以用定制的工具箱对象更新 Report Studio 界面,从而简化报表的创建过程,还有助于分发定制的提示控件。这些定制的提示控件扩展了 IBM Cognos 8.4 的功能,能够满足更多样的业务提示需求,改进最终用户的报表体验。

参考资料

学习

获得产品和技术

讨论

条评论

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=Information Management
ArticleID=496947
ArticleTitle=IBM Cognos BI 最佳实践: 高级提示 — IBM Cognos BI 8.3 和 8.4
publish-date=06172010