Cognos 10 Report Studio:页面提示和性能

Cognos 10 Report Studio: On Page Prompts & Performance

我有一个显示交叉表的报告页面。这是由 5 个参数过滤的。这些参数由用户通过页面复选框提示提交。

要求是return第一个运行上选择的所有参数中所有值的数据。如果我将默认选择留空,则会实现此行为,但所有复选框都未选中,这会给用户带来误导性反馈。

作为替代方案,我在默认选择中手动指定了所有值。但是,这会影响性能。

有人有其他建议吗?

我一直在寻找一种方法来专门 link 一个值列表的重新提示按钮,因此只有那些参数被重新提交(而不是整个页面),但还没有找到任何东西。

提前致谢 - 即使答案是 'no and this is a bad way to go about it'!

一种选择是使用 JavaScript 在未应用过滤的情况下呈现页面后选中所有复选框。为此,所有过滤器都必须设置为可选。该页面呈现所有数据和未选中的复选框。 JavaScript 触发并选中所有复选框,以便提示的状态与数据的状态相匹配。这种情况发生得如此之快,以至于用户可能不知道这些框最初没有被选中。重新提示按钮将在单击时强制执行用户之后所做的任何选择。

从版本 10.2 开始,Cognos 提供了一个相当简单的 JavaScript API 来允许对提示控件进行渲染时操作。希望您使用的是 10.2 或更高版本,否则提供的代码将无法运行。这是一些 JavaScript 代码,它将遍历所有提示和 select 其中的所有值:

var report = cognos.Report.getReport("_THIS_");
var prompts = report.prompt.getControls();

if (typeof firstrun == "undefined") {
    var values;
    for (var i=0;i<prompts.length;i++) {
        values = prompts[i].getValues(true);
        prompts[i].addValues(values);
    }
    var firstrun = false;
}

备注:

对于 10.2+ JavaScript 提示 API,所有值提示的行为方式相同。选择下拉、列表、复选框或单选按钮界面都没有关系。我们为所有这些变体编码的方式是相同的。所提供的代码在列表中的效果与在复选框中的效果一样好。

确保将代码包装在脚本标记中,并且您放置在页面上以保存代码的 HTML Item 对象显示在所有提示控件下方。如果它被放置在其他地方,它将无法找到提示控件,因为它们在代码执行时不会被渲染。

该代码假定页面上唯一的提示是您要选中的复选框。如果页面上还有其他提示,则您必须使用 API 中提供的 getControlByName() 函数来定位单个提示,而不是遍历所有提示。有关 Cognos JavaScript 提示 API 的更多信息,请参见 here

这里代码的关键部分是 getValues() 和 addValues() Cognos JavaScript Prompt API 函数。 getValues(true) returns 表示所有值的 JSON 格式的对象,selected 与否,来自值提示。 addValues(values) 采用 JSON 格式的对象,表示要 selected 和 selects 的值。因此,这是获取所有值然后将它们传递给 selected.

的问题

if 块的原因是我们只希望这段代码 运行 在第一页呈现时一次。当用户第一次 运行 报告时,我们希望所有复选框都被选中,但之后我们希望复选框保持状态。如果我们不使用 if 块,用户的选择将在重新提示后被覆盖。有关此技术的更多信息,请查看我博客上的本教程:JavaScript: Running Code Only Once.

附录

如果您不希望在一个部分中的所有框都被选中时应用任何过滤器,即使在随后的重新提示之后,您可以通过调整过滤器来实现。

假设我们正在检查基于模型的项目 [Item1]。我们有一个当前过滤器:[Item1] in ?parameter1?。我们还有四个复选框,其值为 'Choice1'、'Choice2'、'Choice3' 和 'Choice4'.

以下修改后的过滤器将仅在未选中所有四个复选框时才将复选框应用于过滤器:

(
'Choice1' in ?parameter1?
AND
'Choice2' in ?parameter1?
AND
'Choice3' in ?parameter1?
AND
'Choice4' in ?parameter1?
)
OR
[Item1] in ?parameter1?

如果选中所有四个复选框,则满足 OR 的第一部分,所有行将被返回。它也应该很快,因为大多数语言,包括 SQL 的迭代,如果满足第一个组件,将不会测试 OR 的第二个组件。