我们知道,一个Cognos报表就是一个XML定义。当我们在Report Studio中创建或者更新一张报表,相应的报表规格文件的XML标签被加入或者修改。但是有一些属性或者对象,他们在Report Studio中是不可见的。我们可以直接在报表的XML文件中,添加或者修改那些不可见的属性或者对象。
在此例中,我们将一起研究如何在XML文件中定义交叉表的行级别格式。
假定有一张在列上拥有若干度量的交叉表。用户希望高亮单价大于25的产品所在行。不在每列上应用条件样式,此例,我们将直接修改XML定义行级别的格式。
准备工作…
创建一张以product name作为行,数个度量作为列的交叉表。如下图所示:
如何实施…
1. 定义一个Boolean类型的条件 变量用来识别单价大于25的产品(这将在报表中高亮显示)。
将此变量命名为Is_Costly.
2. 选中Quantity所在列,设置Is_Costly作为其样式变量。为变量条件(Yes和No)设置合适的样式。关于设置的方式,我们已经在前面的博文中讨论过了。
3. 复制报表到剪贴板,然后粘贴到XML编辑器中。这里我们使用Visual Studio。
4. 搜索<conditionalStyle>标签。我们会在Quantity数据项下发现此标签。
5. 从<conditionalStyles>到</conditionalStyles>,复制整个元素。
6. 现在找到<crosstabRows>元素。我们可以看到其拥有一个为product name定义的<crosstabNodeMember>子元素。
7. 使用如下代码替换空标签<factCell/>。
<factCell>
</factCell>
8. 粘贴第5步中复制的<conditionalStyles>标签到<factCell>元素中。这时代码看起来如下:
9. 复制整个XML文档到剪贴板,并在Report Studio中打开。
10.运行并测试报表。
工作原理…
在Report Studio中,没有明示的功能可以选择和编辑交叉表的整行。因此,如果我们想应用任何行级别的格式,我们需要重复对每一列做操作。
然而,如果我们检查报表的XML文件,在<crosstabRows>元素下有一个<factCells/>元素(在高版本的Cognos中,可能无此元素,并且代码格式也不尽相同。但是不影响操作)。这里我们重写此元素,定义我们自己的样式,并应用到此行对应的所有交叉表度量单元格。
我们没有手动写整个的条件样式代码,我们先在一列(Quantity)上应用条件样式,然后复制条件样式代码到<crosstabRows>下的<factCell>标签内。这样,就把条件样式应用到整行上了。
更多…
此例使用的技巧可以节省开发时间。我们不要在每一列上应用格式。如果在以后的维护工作中需要对格式进行修改,这同样可以节省时间。同样的原理,当行上有多个成员时,我们也可以在<crosstabColumns>标签上应用格式以达到修改整个列的样式的效果。