IBM Cognos BI 最佳实践: 报表设计高级提示和提示性能调优

IBM Cognos BI 最佳实践: 报表设计高级提示和提示性能调优

本文档旨在向报表创建者展示如何处理第一个提示页面性能低下的问题。

developerWorks 中国网站编辑团队, 编辑, IBM

2010 年 6 月 17 日

  • +内容

1 简介

1.1 目的

本文档旨在向报表创建者展示如何处理第一个提示页面性能低下的问题。

1.2 适用范围

这里的信息只适用于 IBM Cognos 8.2 BI。

2 第一个提示页面的性能

当用户运行包含多个复杂查询的报表时,常常需要等待很长时间才会看到第一个提示页面出现。例如,在一个客户场景中,报表用了 40 秒才显示出第一个提示页面。

可以通过两方面的努力改进第一个提示页面的性能:

  1. 减少提示调节(prompt reconciliation)的时间
  2. 减少为提示控件获取数据的时间

3 提示调节

3.1 什么是提示调节?

提示调节确保参数定义与参数的用法匹配。在筛选和计算中定义参数。在提示中使用定义好的参数。

参数定义包含几个关键项:

  • 基数 – 可以提供给参数的输入值的数量。
  • 离散性 – 决定输入值是定义单一值,还是定义一个值范围。
  • 可选性 – 决定参数在筛选或计算的上下文中是必需的,还是可选的。
  • 数据类型 – 为了与引用的其他数据项或常量匹配,在筛选或计算的上下文中期望的数据类型。数据类型可以是 Numeric、Date、Time、Date Time、Interval、String 或 Member Unique Name (MUN) 。

3.1.1 筛选表达式

请考虑可选的筛选:

 [Order number] = ?pOrderNumber?

通过分析这个筛选,可以判断出参数 pOrderNumber 的一些性质:

基数:单一值

  • 等号表明只能使用单一值。
  • 使用多个值需要适当的操作符,比如“in”:
    [Order number] in ?pOrderNumber?

离散性:简单值

  • 等号表明了这一点。
  • 值的范围需要适当的操作符,比如“in_range”:
    [Order number] in_range ?pOrderNumber?
    • 如果一个参数在多个上下文中使用,那么对于是范围值的参数,所有引用都必须是范围值。

可选性:可选的

  • 这个筛选定义为可选的,所以参数也是可选的。
  • 参数也可以是必需的。如果一个参数在多个上下文中使用,那么对于可选的参数,所有引用都必须是可选的。

数据类型:Numeric

  • 这个参数是数字,因为 Order number 数据项是数字。

现在,把参数的特性应用于引用它的提示。这意味着,提示控件会体现参数的一部分特性,从而让提示控件与参数定义保持兼容。如果在创建的提示页面中引用参数,会在运行时修改提示定义,以便与参数的基数、可选性和离散性匹配。数据类型不匹配可能会导致运行时错误。如果没有创建的提示页面,那么这些特性应用于生成的提示页面上的提示。

3.1.2 数据项表达式

与通过宏表达式定义的参数不同,在数据项表达式中使用的参数是必需的。

3.1.3 宏表达式

在宏表达式中定义的参数 1 可以是可选的或必需的,可以是单一值或多值。

请考虑宏表达式:

 #prompt ( ‘ pOrderNumber ’ , ‘ integer ’ )#

基数:单一值

  • prompt() 宏函数只接受单一输入值。
  • 可以用 prompt() 定义多个值:
    #promptmany ( ‘ pOrderNumber ’ , ‘ integer ’ )#

离散性:简单值

  • 提示宏总是简单值,而不是范围。

可选性:必需的

  • 没有默认值(这个宏函数的第三个可选参数)表明了这一点。
  • 包含可选参数的示例如下:
    #prompt ( ‘ pOrderNumber ’ , ‘ integer ’ , ‘ 5 ’ )#

3.2 提示调节如何影响性能?

为了执行提示调节,IBM Cognos 8 要检查查询,判断有哪些参数及其特性。查询越大、越复杂,这个过程花费的时间越长。

在 IBM Cognos 8.1 中,一个包含 200 多个查询的客户报表需要超过 40 秒才能显示出第一个提示页面。大多数时间花费在提示调节方面。

3.3 在 Cognos 8.2 中如何改进提示调节?

在 IBM Cognos 8.2 中通过三种方式改进提示调节:

  • 更快的提示调节
  • 用于提示调节调优的报表服务器属性
  • 用于提示调节调优的查询属性

3.4 IBM Cognos 8.2 中更快的提示调节

首先,在 IBM Cognos 8.2 中提示调节过程已经得到优化,大大提高了速度。与 IBM Cognos 8.1 相比,这个过程花费的时间减少了 75% 到 90%。

例如,在 IBM Cognos 8.2 中客户示例报表的提示调节只花费了 5 秒,与 IBM Cognos 8.1 中的 40 多秒相比降低了 80%。

只需迁移到 IBM Cognos 8.2,就实现了 80% 的性能改进。不需要采取其他措施。

3.5 用于提示调节调优的报表服务器属性

IBM Cognos 8.2 为整个系统和具体报表的提示调节调优提供了三个相互关联的选项。

第一个选项是一个针对整个报表服务器启用的报表服务器高级属性:RSVP.PROMPT.RECONCILIATION。这个属性有几个值:

COMPLETE - 在显示第一个提示页面之前,调节所有查询。这是默认设置,用来确保与以前版本的兼容性。

CHUNKED – 分批调节所有查询,直到调节了第一个提示页面所需的参数为止。以不固定的次序处理查询。可以用高级服务器属性 RSVP.PROMPT.RECONCILIATION.CHUNKSIZE 修改 CHUNK 大小。默认的 CHUNK 大小是 5 个查询。

GROUPED – 按组调节查询,直到调节了第一个提示页面所需的参数为止。这些组如下:

  • 筛选的报表查询
  • 筛选的提示查询
  • 未筛选的报表查询
  • 未筛选的提示查询

按这些组的次序处理查询,直到调节了第一个提示页面中引用的所有参数为止。常常只需处理第一个或前两个组。但是,在某些情况下,需要处理所有查询。例如,如果在提示查询中的计算查询项中引用参数,就会发生这种情况。报表服务器调节第一个提示页面的参数之后,向用户显示这个页面。如果后续提示页面引用在已经处理的查询中没有的参数,在显示这些提示页面之前,报表服务器可能需要调节更多查询。

CHUNKED GROUPED – 分批调节查询组中的查询,直到调节了第一个提示页面所需的参数为止。

我们的客户场景只包含一个筛选的查询,但是假设报表中的所有 200 个查询都使用相同的参数进行筛选。GROUPED 会同时调节这 200 个查询,因为所有查询都属于筛选的报表查询组。CHUNKED 每次调节 x 个查询,x 是 CHUNKED 大小(默认值为 5)。因此对于 CHUNKED GROUPED,将调节 5 个查询。如果找到了第一个提示页面所需的参数,就显示页面。如果没有找到,就处理后 5 个查询,直到找到参数为止。

以我们的客户报表为例,设置 RSVP.PROMPT.RECONCILIATION = GROUPED 会迫使提示调节首先处理包含筛选的查询(我们只有一个这样的查询)。

这导致客户示例报表的提示调节在 IBM Cognos 8.2 中只需花费不到 1 秒,与 IBM Cognos 8.1 中的 40 多秒相比性能提高了 98%。

只需设置一个高级服务器属性,就实现了 98% 的性能改进。不需要采取其他措施。

坦白地说,这个示例不太典型,因为筛选的查询和非筛选的查询的比例高于一般水平。但是,这个示例说明 GROUPED 调节选项的优点是只需要处理所有查询中的一部分。关于如何处理大量的筛选查询,请参见“用于提示调节调优的查询属性”。

3.5.1 最佳默认设置是什么?

如果使用 COMPLETE 之外的其他设置,可能会导致运行时错误,因为相同的参数可能在同一报表中以不同方式定义两次或更多次。

假设报表中有一个可选的筛选(比如 X in ?P1?)和一个计算 Y + ?P1? 。

筛选把 P1 定义为可选的和多值的。

计算把 P1 定义为必需的和单值的。

如果使用 COMPLETE 查询调节,就会处理所有查询,而且使用限制性最强的定义修改提示,这会产生必需的单值提示。

如果使用 GROUPED,就只处理筛选的查询,这允许使用可选的多值提示。如果用户跳过这个提示或者选择多个值,那么当处理计算时就会产生运行时错误。

说到这里要补充一点,在使用高级调节属性时,正确使用参数并解决这些不匹配的参数定义应该是创建者的责任。

在使用 CHUNKED GROUPED 时,还可能有两个或更多筛选以不同方式定义同一个参数。同样,这也是在创建报表时计划和实现不完善的表现。

出于性能考虑,CHUNKED GROUPED 是推荐的设置,因为它允许只处理部分查询组。但是,应该进行适当的报表测试,以确保不会出现由于报表创建者使用参数的方式不一致所导致的运行时错误。默认的 CHUNK 大小 5 对于大多数情况已足够。

3.6 用于提示调节调优的查询属性

对于某些报表,仅仅设置高级报表服务器属性可能无法实现良好的性能,还需要手动调优。报表创建者可以使用新的 Report Studio 查询属性 Use for Parameter Info 决定提示调节的执行方式。这个新属性只能在高级报表服务器属性 RSVP.PROMPT.RECONCILIATION 设置为 GROUPED 或 CHUNKED GROUPED 时使用。

这个属性实际上创建一个新的查询处理组,系统在处理筛选的报表查询之前处理这个组。新的处理次序是:

  • Use for Parameter Info = True 查询
  • 筛选的报表查询
  • 筛选的提示查询
  • 未筛选的报表查询
  • 未筛选的提示查询

如果在第一个组中找到了所需的参数,就不再处理其他查询。这个属性在两个场景中很有用。

3.6.1 在多个查询筛选中使用相同的参数

仍然以包含 200 个查询的示例报表为例,假设所有 200 个查询中的筛选都引用相同的参数。以前必须处理所有 200 个查询来调节参数。实际上,只需处理其中任意一个查询,就可以收集到所需的信息。报表创建者可以选择任何查询,并设置查询属性 Use for Parameter Info = True。系统只处理这个查询,就会找到所需的参数并显示第一个提示页面,不必处理其他查询。

3.6.2 在每个查询筛选中使用不同的参数

现在,考虑一个完全不一样(有点儿不真实)的用例。我们有 200 个查询,每个查询都引用一个不同的参数,在第一个提示页面中引用所有 200 个参数。在这种情况下,必须处理所有查询,这会导致性能降低(回到 5 秒水平)。

有一个非常聪明的办法:创建者可以创建一个定义所有 200 个参数的查询。不创建任何引用这个新查询的布局(即,没有列表、交叉表或图表使用这个查询)。只在这个查询上设置查询属性 Use for Parameter Info = True。现在,在运行报表时,只处理这一个查询。因为在布局中不引用这个查询,它不会实际执行。这样就解决了第一个提示页面的性能问题,而且不会有额外的开销。

包含 200 个查询而且每个查询使用不同的参数这样的示例有点儿极端,但是如果处理给定的查询或查询集造成了性能问题,就可以考虑使用这种方法。

估计只有非常少的报表需要使用 Use for Parameter Info 查询属性,因为 IBM Cognos 8.2 本身和使用 RSVP.PROMPT.RECONCILIATION GROUPED 产生的性能改进能够解决大多数性能问题。

3.6.3 提供不利提示

要确保您选择的查询提供所需的所有参数。如果在没有定义所有参数的查询集上设置‘ Use For Parameter Info ’查询提示(hint),会对性能产生消极影响,因为第一个请求没有调节所有参数,还需要通过另一个请求获得其他参数的参数特性。

3.7 SAP 考虑事项

在有非层次化数据源变量的 SAP 环境中,变量数量大而且这些变量具有许多可能的值,这会显著影响性能。

建议不要在这些环境中使用高级服务器属性,但是可以使用‘ Use For parameter Info ’查询提示改进性能。

4 提示查询性能

提示查询用于填充提示控件。在运行完提示查询之前,无法显示提示页面。在默认情况下,这些查询在每次向用户显示提示页面时运行一次。

在改进提示查询性能时,要关注三个方面:

  1. 查询的数量
  2. 避免重复运行提示查询
  3. 并行地运行提示查询

4.1 查询的数量

查询数量越大,处理提示页面花费的时间越长。尽管下面讨论的机制可以减少所需的时间,但是有时候第一个提示页面包含的提示查询太多,必须处理它们才能显示提示页面。

可以把提示分割为两个或更多页面。这样每个提示页面包含的查询就比较少了。

可以使用选项卡式的提示页面。系统只运行实际向用户显示的提示控件所需的查询,不运行不活跃的选项卡的提示查询。附录 A 讲解如何创建选项卡式提示界面。

可以使用隐藏在条件块中的提示,这些提示只在用户已经响应了一些提示并重新提示报表时显示。同样,因为系统只运行实际向用户显示的提示控件所需的查询,不运行隐藏块中的提示查询。

4.2 适当的提示控件

一些提示控件不适合容纳大量数据。例如,包含 100,000 个条目的值提示(选择列表)性能会很差,而且使用很不方便。对于这么大量的数据,更合适的控件是 Select & search 提示、Cascading 提示或 Tree 提示,因为它们在最初显示时并不装载整个数据集。

注意,如果创建者非要使用包含大量数据的提示,那么在默认情况下数据会在 5000 行处截断,而且系统并不给出警告。可以使用提示控件的 Rows Per Page 属性显示更大的数据集。

4.3 缓存提示查询

在 IBM Cognos 8.1 中,可以缓存提示查询。如果提示中的值不经常变动(比如每天一次而不是随时),而且提示并不依靠另一个提示的值筛选提示查询,就可以使用这种技术。例如,可以缓存父级联提示的值,但是不能缓存子(或孙)提示,因为这些后续提示依靠父提示的值执行查询。

使用作业执行提示查询并缓存报表的值。用适当的调度计划(比如每天或每周)创建作业,从而反映提示值的变动频率。在作业中添加需要刷新提示查询的报表之后,把 Default Run 选项设置为 Run the report to Refresh the Report Cache(也可以为每个报表步骤设置这个选项)。

当作业运行时,它只执行提示查询并把结果缓存在 Content Store 中。如果在多个位置有提示,那么在作业步骤中设置这些位置,就会缓存所有位置的提示值。

当用户运行报表时,获取缓存的查询值;这一般会提高性能。

注意,无论是否考虑性能因素,这也是减少对数据库的查询数量的好方法,因为在用户每次请求运行报表时不再需要执行提示查询了。

4.4 并行地运行提示查询

如果提示值是高度动态的,缓存不是合适的选项,那么可以同时执行多个提示查询。

在默认情况下,单一报表中的所有查询一个接一个地运行。可以同时运行提示查询或数据查询。

报表服务器使用 helper 的概念管理可以在报表服务器中同时执行的查询数量。例如,把 helper 的数量设置为 10 就意味着整个报表服务器实例可以同时执行另外 10 个查询。

报表服务器高级属性 RSVP.CONCURRENTQUERY.NUMHELPERSPERPROCESS 用于设置服务器中可用的 helper 数量。默认值是零。如果不设置这个属性,就无法同时运行查询。

还必须使用报表服务器高级属性 RSVP.CONCURRENTQUERY.MAXNUMHELPERSPERREPORT 配置每个报表可以使用的 helper 数量。默认值是 1,即只允许每个报表每次执行一个查询;必须把它至少设置为 2,才能允许运行并行查询。

设置这两个选项之后,在默认情况下只对批执行运行并行查询。这是因为在交互式执行时,这可能会导致运行查询,但是用户根本不看它的结果,因此不必要地消耗了资源。假设一个报表有两个页面,每个页面有一个列表。用户运行这个报表;启用并行查询,让这两个列表查询同时运行。用户看了第一个页面 / 列表,然后关闭浏览器。第二个查询已经并行地运行了,但是未被使用,这浪费了资源。稍后讨论如何更好地处理这种情况。

要想为交互式执行启用并行查询,需要把报表服务器高级属性 RSVP.CONCURRENTQUERY.ENABLEDFORINTERACTIVEOUTPUT 设置为 True。

在给定的报表中,还必须使用查询属性 Execution Method 决定哪些查询可以并行地运行:

图 1.查询属性 Execution Method
图 1.查询属性 Execution Method

在提示查询上设置这个属性允许它们并行地运行,这常常会提高性能。

5 结束语

IBM Cognos 8.2 显著改进了第一个提示页面的基本性能,即使不进行定制配置,性能也很好。

还可以通过以下措施进一步提高提示性能:

  • 提示调节
  • 明智的提示页面设计
  • 提示查询缓存
  • 并行的查询执行

为了进一步提高提示性能,建议在所有 IBM Cognos 8.2 服务器上设置 RSVP.PROMPT.RECONCILIATION CHUNKED GROUPED(还应该进行适当的报表测试)。

6 附录 A – 选项卡式提示页面

注意:这份资料最初是一份单独的 Proven Practices 文档。这里的内容与原文档中相同。

6.1 更快的选项卡式提示页面

这里的场景是,客户希望向最终用户提供报表,在提示页面中使用选项卡式用户界面而不是一系列提示页面。最常用的提示出现在第一个选项卡中,其他选项卡显示不太常用的提示。

图 2.选项卡式提示页面
图 2.选项卡式提示页面

我们见过的一些应用程序示例有多达 60 个提示,它们分布在 6 到 8 个选项卡上。有两个问题会影响这些报表的性能。首先,提示数量大意味着 Cognos 8 在运行报表之前必须分析许多查询。一般情况下,这意味着每个提示有一个查询,还要加上报表查询本身。这个问题只能通过减少报表中使用的查询数量来解决,这超出了本文的范围。第二,原来使用的 HTML/JavaScript 技术的性质决定了它们的性能非常差。生成选项卡的标准 HTML/JavaScript 技术允许用户在不访问服务器的情况下切换选项卡。这意味着必须在显示第一个选项卡之前 填充所有提示(多达 60 个)。因为在默认情况下查询是串行运行的,需要的提示查询越多,用户等待的时间就越长。

6.2 解决方案概述

这个解决方案使用条件块显示提示。选项卡本身仍然是用 HTML 和 JavaScript 创建的。使用条件块的优点是,系统知道隐藏的块中的提示是不可见的,因此不运行填充它们所需的查询。如果用户切换选项卡,提示变得可见并运行相关联的查询。缺点是切换选项卡需要向服务器发出请求。

实现这种技术的提示页面使用条件块决定显示哪些提示。请想像一系列重叠的矩形,在任何时候只显示其中的一个。

图 3.条件块显示提示
图 3.条件块显示提示

这些块在任何时候只有其中的一个是可见的,但是所有选项卡都是一直可见的。‘当前’选项卡的边框和文本颜色设置为黑色,让它看起来像在其他选项卡前面。非当前的选项卡是灰色的,让它们不太突出。

图 4.选定选项卡
图 4.选定选项卡

从某种程度上来说,编写报表相当简单。我们将创建一个条件块以及与选项卡数量相同的块 —— 在以上示例中是 4 个。然后,以表格单元格的形式创建基本选项卡结构(矩形),根据需要设置边框。用 HTML 和一些简单的 JavaScript 创建选项卡中显示的文本。

当用户单击选项卡(实际上是单击选项卡中的文本)时,显示相关联的条件块,修改选项卡边框和文本颜色,显示相关联的块。

在后台,通过设置一个参数值指定显示哪个选项卡,然后重新提示报表。在理想情况下,我们使用提示控件或提示按钮设置参数值并重新提示。但是,没有提示控件或按钮能够满足要求。一个提示可以设置参数值并重新提示(通过自动提交),但是无法看起来像文本。

6.3 适用范围

这种技术应该适用于 ReportNet 或 IBM Cognos 8 的任何版本。

6.4 未记录和不受支持的功能

正如下面详细讨论的,这个解决方案需要使用两个在 IBM Cognos 8 中未记录和不受支持的功能。因此,在以后的版本中对这两个功能的支持可能会改变或完全取消,从而需要重写这个解决方案。但是,这种风险很低,因为目前在这些方面没有修改计划。

6.5 选项卡式提示报表项目

在我们的场景中,第一个选项卡让用户选择 Order year(s),第二个选项卡让用户选择 Product name(s),以便运行一个非常简单的列表报表。

我们将从头到尾介绍创建示例报表的整个过程。为方便起见,我们只使用两个选项卡,每个选项卡上各有一个提示。

6.5.1 创建基本报表

打开 Report Studio 和 GO Sales and Retailers 包。

创建一个新的列表报表:

  • \Orders\Order year
  • \Orders\Product name
  • \Orders\Revenue

如图所示:

图 5.创建基本报表
图 5.创建基本报表

创建两个可选的 详细信息筛选:

  • [Order year] in ?p_OrderYear?
  • [Product name] in ?p_ProductName?

这样就行了。这就是将用来演示这种技术的基本报表。

6.5.2 创建基本提示页面

尽管创建选项卡式提示用户界面并不难,但是过程很长。大多数时间花在格式化方面。实际功能花费的时间很少。

首先我们需要一个提示页面。

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

图 6.添加一个提示页面
图 6.添加一个提示页面

把一个一行两列的表格拖到提示页面体中,如图所示:

图 7.把一个一行两列的表格拖到提示页面体中
图 7.把一个一行两列的表格拖到提示页面体中

我们暂时不管这个表格,但是稍后要使用它。

6.5.3 创建选项卡体

条件块最终包含出现在每个选项卡上的提示。

图 8.创建选项卡体
图 8.创建选项卡体

我们首先创建基本的选项卡体结构并使用一些文本项,让我们可以看出哪个选项卡是当前的。

把一个 Conditional Block 对象拖到页面体中:

图 9.把一个 Conditional Block 对象拖到页面体中
图 9.把一个 Conditional Block 对象拖到页面体中

选择条件块对象然后选择 Block Variable 属性。

创建一个 <New String Variable>,像这样:

  • Name: TabToShow
  • Values: Tab2
  • Expression: ParamValue('pTabToShow')

变量名 TabToShow、值 Tab2 和参数 pTabToShow 很重要,这个项目要多次引用它们。

选择好块之后,把 Current Block 属性设置为 Other。

把一个文本项‘ Tab 1 ’拖到块中,像这样:

图 10.把一个文本项‘ Tab 1 ’拖到块中
图 10.把一个文本项‘ Tab 1 ’拖到块中

这个文本用于提醒我们哪个选项卡是当前正在查看的。

选择块,把 Current Block 属性设置为 Tab2。

‘ Tab 1 ’文本项会从块中消失。

把文本项‘ Tab 2 ’拖到块中,像这样:

图 11.把文本项‘ Tab 2 ’拖到块中
图 11.把文本项‘ Tab 2 ’拖到块中

同样,这个文本用于提醒我们哪个选项卡是当前正在查看的。

选择块,在 Other 和 Tab2 之间来回变换 Current Block 属性值,应该可以看到 Report Studio 中的选项卡随之切换。

6.5.4 创建选项卡

正如前面所说的,我们要使用 HTML 项和一些未记录和不受支持的功能实现选项卡。

首先要做的是,使用 Report Viewer 将参数值传递给服务器。作为表单变量传递参数值,表单变量的名称是参数名(比如 pTabToShow)前面加上 p_,比如 p_pTabToShow。

这种参数传递机制是未记录和不受支持的。请注意本文前面的说明。

我们使用一个 HTML 对象创建这个表单变量。

把一个 HTML 项目拖到 Page Header 中,像这样:

图 12.把一个 HTML 项目拖到 Page Header 中
图 12.把一个 HTML 项目拖到 Page Header 中

这个项的位置无所谓,因为它不向用户显示。

选择 HTML 项并把 HTML 属性设置为:

 <input type="hidden" name="p_pTabToShow" value="Tab1"/>

这行 HTML 代码创建表单变量 p_pTabToShow 并将值设置为 Tab1。

这个表单变量让服务器认为报表中已经定义了名为 pTabToShow 的参数,所以服务器会保留它的值并在重新提示报表时把它传递回 Report Viewer。

现在,回到前面在该示例中添加的表格。

尽管目前还看不出来,但是这个表格中的两个单元格将变成用户可以单击的选项卡。

图 13.单击的选项卡
图 13.单击的选项卡

出现在选项卡上的文本项将是 HTML 项。

在每个表格单元格中添加一个 HTML 项,让它们在单元格中居中:

图 13.在每个表格单元格中添加一个 HTML 项
图 13.在每个表格单元格中添加一个 HTML 项

选择左边的 HTML 项并把 HTML 属性设置为:

 <button title="Show Tab 1" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value=' Tab1';
SetPromptControl('reprompt')">Show Tab 1</button>

这段 JavaScript 创建一个按钮:

  • 按钮标题(工具提示文本) – Show Tab 1
  • 操作:
    • 将表单变量 p_pTabToShow 设置为 Tab1
    • 运行函数 reprompt
  • 按钮标签 – Show Tab 1

换句话说,当用户按这个按钮时,它会设置表单变量并重新提示报表。

注意,reprompt 函数是未记录和不受支持的。请注意本文前面的说明。

选择右边的 HTML 项并把 HTML 属性设置为:

 <button title="Show Tab 2" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value='
 Tab2';
SetPromptControl('reprompt')">Show Tab 2</button>

运行报表:

图 15.运行报表
图 15.运行报表

可以通过单击按钮在选项卡之间切换,显示相应的文本。

图 16.切换选项卡
图 16.切换选项卡

核心选项卡功能现在完成了。剩下的工作都是装饰性的;这个用户界面是有效的,但是看起来不像选项卡式用户界面。另外,还要把提示放到选项卡上。

返回到 Report Studio。

6.5.5 设置选项卡的样式

我们要用边框、对齐和其他样式改变 HTML 按钮和块的外观,让它们看起来像选项卡。

首先,处理 HTML 按钮。

选择父表格,在 Table Properties 属性中选择 Fixed Size。

仍然选择表格,选择 Size and Overflow 属性并删除当前的宽度设置。

选择每个表格单元格并把宽度都设置为 100 pixels (px)。

在实际的报表中,必须调整宽度,让宽度与每个选项卡中的文本匹配。请记住,为了让选项卡更美观,所有选项卡常常采用相同的宽度。

现在,表格单元格和 HTML 按钮有点儿像选项卡了:

图 17.设置选项卡的样式
图 17.设置选项卡的样式

现在,需要重新设置 HTML 按钮的样式,让它们只显示文本。

选择 HTML 对象之一,会看到没有样式属性:

图 18. 重新设置 HTML 按钮的样式
图 18. 重新设置 HTML 按钮的样式

在 IBM Cognos 8 中,可以在报表中定义样式并把它们应用于报表对象。同样,也可以把这些样式应用于 HTML 对象。

6.5.6 IBM Cognos 8 按钮样式

在 IBM Cognos 8 中,可以定义一个类,然后在 HTML 按钮定义中引用它。

使用 Page Explorer 打开 Classes。

把一个 Class 对象从工具箱拖到 Local Classes 区域:

选择这个新的类对象并设置属性:

  • Name: HTMLButtons
  • Border: None
  • Box Type: Block
  • Background Color: White
  • Class or Selector: HB

返回到提示页面。

Class/Selector 属性是在把样式应用于 HTML 项时使用的标识符。

选择左边 Tab 1 的 HTML 对象并把 HTML 属性改为:

 <button title="Show Tab 1" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value=' Tab1';
SetPromptControl('reprompt')" class="HB"Show Tab 1</button>

选择右边 Tab 2 的 HTML 对象并把 HTML 属性改为:

 <button title="Show Tab 2" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value=' Tab2';
SetPromptControl('reprompt')" class="HB">Show Tab 2</button>

6.5.7 ReportNet 按钮样式

在 ReportNet 和 IBM Cognos 8 中都可以使用这种方法。

我们使用 HTML 样式属性在 HTML 按钮定义中直接应用样式,而不是引用在报表级定义的通用样式定义。

选择左边的 HTML 对象并把 HTML 属性改为:

 <button title="Show Tab 1" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value=' Tab1';
SetPromptControl('reprompt')" 
style="border-top- style:none;border-left-style:none;border-right-style:none;
border- bottom-style:none;display:block;background-color:white">Show Tab 
 1</button>

选择右边的 HTML 对象并把 HTML 属性改为:

 <button title="Show Tab 2" 
οnclick="document.formWarpRequest.elements['p_pTabToShow'].value=' Tab2';
SetPromptControl('reprompt')" 
style="border-top- style:none;border-left-style:none;border-right-style:none;
border- bottom-style:none;display:block;background-color:white">Show Tab 
 2</button>

6.5.8 运行报表

运行报表。删除按钮的按钮式外观,只留下文本。

图 19.运行报表
图 19.运行报表

6.5.9 显示活跃的和不活跃的选项卡

我们现在需要通过设置选项卡的样式表明哪个选项卡是活跃的。活跃的选项卡将采用黑色的边框和文本。不活跃的选项卡将采用灰色的边框和文本。

选择左边的表格单元格。

将 Style Variable 设置为 TabToShow。

使用 Variable Explorer 选择 TabToShow,再选择 Other:

图 20.
图 20.

仍然选择左边的表格单元格,将左边、上边和右边的 Border 设置为 Black、Solid Line、1.5 point (pt):

图 21.Border 设置
图 21.Border 设置
图 22. Tab 1 选项卡
图 22.Tab 1 选项卡

使用 Variable Explorer 选择 TabToShow,再选择 Tab2:

仍然选择左边的表格单元格,将左边、上边和右边的 Border 设置为 Silver、Solid line、1.5 point (pt):

图 23. Tab2 Border 设置
图 23.Tab2 Border 设置
图 24. Tab 2 选项卡
图 24.

运行报表:

图 25.运行报表 Tab 1
图 25.运行报表 Tab 1

单击 Show Tab 2,让 Tab 1 变成非当前的:

图 26.运行报表 Tab 2
图 20.运行报表 Tab 2

对 Tab 2(右边的表格单元格)重复相似的步骤。

返回到 Report Studio。

选择右边的表格单元格。

将 Style Variable 设置为 TabToShow。

使用 Variable Explorer 选择 TabToShow,再选择 Other:

图 27. 将 Style Variable 设置为 TabToShow
图 27. 将 Style Variable 设置为 TabToShow

仍然选择右边的表格单元格,将左边、上边和右边的 Border 设置为 Silver、Solid Line、1.5 point (pt):

图 28. Border 设置
图 28. Border 设置

使用 Variable Explorer 选择 TabToShow,再选择 Tab2:

仍然选择右边的表格单元格,将左边、上边和右边的 Border 设置为 Black、Solid Line、1.5 point (pt):

图 29. Tab2 Border 设置
图 29. Tab2 Border 设置

运行报表:

图 30. 运行报表
图 30. 运行报表

单击 Show Tab 2:

图 31. 运行报表 Show Tab 2
图 31. 运行报表 Show Tab 2

两个表格单元格之间的边框是灰色,但是我们在右边的表格单元格上已经把它设置为黑色了。因此它既有灰色也有黑色。每个表格单元格实际上有自己的边框,但是在默认情况下它们是重叠的。

也就是说,不会看到下面这样并列的边框:

图 32.不会看到下面这样并列的边框
图 32.不会看到下面这样并列的边框

边框会重叠在一起。当边框重叠时,按一定的规则决定(优先)显示哪个边框。在这里,显示左边的单元格边框。

当右边的单元格活跃时,我们需要调整边框,让左边的单元格没有边框。

返回到 Report Studio。

选择左边的单元格。

使用 Variable Explorer 选择 TabToShow,再选择 Tab2:

删除单元格右边的边框:

图 33.删除单元格右边的边框
图 33.删除单元格右边的边框

运行报表:

图 34. 运行报表
图 34. 运行报表

单击 Tab 2:

图 35. 单击 Tab 2
图 35. 单击 Tab 2

现在,边框样式能够适当地表明活跃的和不活跃的选项卡。

6.5.10 格式化选项卡体

现在需要把选项卡和选项卡体连接在一起。

返回到 Report Studio。

使用 Variable Explorer 选择 No variable:

图 36. 选择 No variable
图 36. 选择 No variable

选择块:

图 37. 选择块
图 37. 选择块

在四个边上将 Border 设置为 Black、Solid、1.5 point (pt):

图 38. Border 设置
图 38. Border 设置

仍然选择块,将 Current Block 属性设置为 Tab2。

在四个边上将 Border 设置为 Black、Solid、1.5 point (pt):

图 39. Tab2 Border 设置
图 39. Tab2 Border 设置

运行报表:

图 40. 运行报表
图 40. 运行报表

现在,选项卡的样式完全设置好了。

但是,我们想再设置一些样式,让选项卡更美观一点。

首先,我们想把选项卡向下移动,让它们窄一些。

返回到 Report Studio。

6.5.11 格式化页面并添加文本

选择 Page Body 对象,将左边、上边和右边的 Padding 设置为 100 pixels (px)。

这在选项卡的所有边上提供 100 像素的缓冲区。

最后,我们提供一些说明性文本,然后把报表提示放进选项卡中。

将标题文本编辑为“Revenue Report”

图 41. 格式化页面并添加文本
图 41. 格式化页面并添加文本

把一个块拖到页眉中,作为最后一项:

图 42. 把一个块拖到页眉中
图 42. 把一个块拖到页眉中

把文本对象拖到这个块中,输入文本“You may switch tabs to choose a different prompt.”:

图 43. 输入文本
图 43. 输入文本

选择页面体中的条件块。

将 Current Block 属性设置为 Other。

我们希望(tab 1 上的)主提示用于提示 Order year。

把一个 Value Prompt 对象拖到块中:

  • 使用现有的参数:p_OrderYear
  • 为 Order year 创建一个新查询(默认选项)

选择提示并把 Required 属性设置为 No(如果还没有设置的话)。

选择条件块并将 Current Block 属性设置为 Tab2。

我们希望(tab 2 上的)第二个提示用于提示 Product name。

把一个 Value Prompt 对象拖到块中:

  • 使用现有的参数:p_ProductName
  • 为 Product name 创建一个新查询(默认选项)

选择提示并把 Required 属性设置为 No(如果还没有设置的话)。

运行报表。

因为这些筛选是可选的,用户可以选择两个提示之一、都选择或都不选择。

6.6 结束语

这是一种很方便的方法。尽管它使用一些未记录和不受支持的产品功能,但是对于最终用户仍然很有价值。

当然,可以根据需要使用这种方法实现更多的选项卡、不同的提示、文本和许多其他对象和控件,从而满足用户对提示界面体验的偏好。

参考资料

学习

获得产品和技术

  • 在线试用 IBM Cognos BI 试用版软件,了解 IBM Cognos BI 商业智能解决方案的最新版本新功能。
  • 下载 IBM Cognos Express V9 试用版软件,了解 IBM 专为中型企业定制的集成商业智能和计划解决方案。
  • 下载免费的 IBM Information Management 试用版软件,了解 IBM Information Management 软件的最新版本和特性。
  • 获取更多 IBM 试用版软件,并熟练掌握来自 DB2®、Lotus®、Tivoli®,以及 WebSphere® 的开发工具和中间件产品,用这些试用版软件开发您的下一个项目。这些试用版软件可以免费直接从 developerWorks 下载。

讨论

条评论

请 登录 或 注册 后发表评论。

注意:评论中不支持 HTML 语法


剩余 1000 字符

快来添加第一条评论

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值