我有一个显示交叉表的报告页面。这由5个参数过滤。这些参数由用户通过页面复选框提示提交。
要求是在第一次运行时选择的所有参数中返回包含所有值的数据。如果我将默认选择留空,则会实现此行为,但取消选中所有复选框,这会给用户带来误导性反馈。
作为替代方案,我手动指定了默认选择中的所有值。但是,这会对性能产生影响。
有没有人有其他建议?
我一直在寻找一种方法来专门将重新提示按钮链接到值列表,因此只重新提交这些参数(而不是整个页面),但还没有找到任何内容。
提前致谢 - 即使答案是'否,这是一个不好的方法'!
答案 0 :(得分:2)
一种选择是在呈现页面后使用JavaScript检查所有复选框,而不应用过滤。为此,必须将所有过滤器设置为可选。将使用所有数据和未选中的复选框呈现页面。 JavaScript会触发并检查所有复选框,以便提示的状态与数据的状态相匹配。这种情况发生得太快,用户可能不会知道最初没有检查过这些盒子。点击后,重新按钮将强制执行用户在此之后做出的任何选择。
从10.2版开始,Cognos提供了一个相当简单的JavaScript API,允许对提示控件进行渲染时操作。希望您使用10.2或更高版本,否则提供的代码将无法正常工作。以下是一些JavaScript代码,它将遍历所有提示并选择其中的所有值:
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 Prompt API,所有值提示的行为方式都相同。无论您选择下拉列表,列表,复选框还是单选按钮界面都无关紧要。我们为所有这些变化编码的方式是相同的。提供的代码与列表一样适用于复选框。
确保将代码包装在脚本标记中,并且放置在页面上用于保存代码的HTML Item对象显示在所有提示控件下方。如果它放在别处,它将无法找到提示控件,因为代码执行时它们不会被渲染。
代码假定页面上的唯一提示是您要检查的复选框。如果页面上还有其他提示,则必须使用API中提供的getControlByName()函数来定位单个提示,而不是循环遍历所有提示。有关Cognos JavaScript Prompt API的更多信息,请参见here。
这里代码的关键部分是getValues()和addValues()Cognos JavaScript Prompt API函数。 getValues( true )返回一个JSON格式的对象,表示从值提示中选择或不选择的所有值。 addValues( values )接受一个JSON格式的对象,表示要选择的值并选择它们。因此,这是一个抓住所有值然后传入它们以进行选择的问题。
if块的原因是我们只希望此代码在第一页渲染时运行一次。当用户首次运行报表时,我们希望选中所有复选框,但之后我们希望复选框保留状态。如果我们没有使用if块,则在重新提示后将覆盖用户的选择。有关此技术的更多信息,请在我的博客上查看本教程:JavaScript: Running Code Only Once。
<强>附录强>
如果您希望在后续重新插入后在部分中检查所有框时都不应用任何过滤器,则可以通过调整过滤器来实现。
假设我们正在检查基于模型的项目[Item1]。我们在?parameter1?中有一个当前过滤器:[Item1]。我们还有四个复选框,其值为'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的第二个组件。