1

因此,我在我的报告中使用了 jQuery,并且我有一套报告,由于 jQuery 可以一次性全部加载,所以客户感觉转换速度更快,因为他们不必在每次点击之间等待。我希望能够根据客户使用的提示更改所有报告。因此,如果他们选择特定日期,套件中的所有报告都将更改为该日期。或者,如果他们选择了特定区域,则所有报告都会转到该区域。这将使客户不必在每个报告的提示中加载参数。我想知道是否有办法做到这一点。我已经看过了,还没有找到任何东西。

编辑.. 所以在包含所有 iframe 和我命名为 changeMonth 的值提示的报告中,我有这个 JS

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('monthChange');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
    currentRadioValue = values[0]; //Assign new value for later comparison
    for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
             window.frames[i].changeValue(values[0].use); //Call the changeValue     function passing in the radio button value
    }
 }
return true; //Indicates the prompt is valid
}
</script>

在我想要 iframe 的报告中,我有一个值提示,它是一个下拉列表,此代码位于 HTML 标记中。

<script>
function changeValue(str){
var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
var control = report.prompt.getControlByName('monthChange'); //Grab a handle for the    prompt control
control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

如果这很重要,它们都是下拉列表。我看到您将它们列为单选按钮,所以我稍后会在这里尝试并让您知道这是否改变了任何东西。但是我是如何设置它的,我还应该做些什么吗?

4

1 回答 1

0

我可以通过在每个子报表中创建一个 JavaScript 函数来实现这一点,该函数会更改查询所依赖的隐藏提示值,然后重新提示页面。以下是需要在每个子对象中的代码部分:

儿童报告代码

<script>
function changeValue(str){
    var report = cognos.Report.getReport("_THIS_"); //Grab a handle for the report
    var control = report.prompt.getControlByName('controlname'); //Grab a handle for the prompt control
    control.addValues([{"use":str,"display":str}]); //Change the prompt to the passed in value
    report.sendRequest(cognos.Report.Action.REPROMPT); //Reprompt the page
}
</script>

这利用了 Cognos 10.2 版中添加的 Cognos JavaScript Prompt API。函数 getReport、getControlByName、addValues 和 sendRequest 都是 Cognos 提供的函数,用于简化 JavaScript 中的提示操作。这里有更多信息:

Cognos JavaScript 提示 API 文档

在容器报告中,我创建了一个 Cognos 单选按钮值提示。我编写了 JavaScript 代码,以利用 API 中 Cognos 提供的内置 onchange 验证钩子在单选按钮更改时运行代码。代码循环遍历所有 iFrame 并调用上面在每个子报告中定义的函数,传入所选单选按钮的值。

容器报告代码

<script>
var report = cognos.Report.getReport("_THIS_");
var radio = report.prompt.getControlByName('radio');

var currentRadioValue = radio.getValues()[0]; //Get initial value object

radio.setValidator(validateRadio); //Define function to validate prompt

function validateRadio(values) {
    if (values && values.length > 0 && values[0].use != currentRadioValue.use) { //Only do anything if control has value and has changed
        currentRadioValue = values[0]; //Assign new value for later comparison
        for (var i=0; i<window.frames.length; i++) { //Loop through all iFrames
                 window.frames[i].changeValue(values[0].use); //Call the changeValue function passing in the radio button value
        }
    }
    return true; //Indicates the prompt is valid
}
</script>

请注意,在上面的代码中,字符串 'controlname' 和 'radio' 对应于相关提示控件的 Name 属性。默认情况下,Cognos 不会为提示控件命名。因此,您必须在创建后提供名称。无论您给它们起什么名字,都必须相应地调整脚本以允许 JavaScript 访问它们的 Cognos Prompt API 对象。

可以修改此技术以从 Cognos 中可用的各种提示控件中获取输入。此外,理论上,容器甚至根本不必是 Cognos。它可以是一个独立的网页,其中包含在标准 HTML onchange 事件触发时调用 iFrame 中的 JavaScript 函数的控件。唯一需要注意的是,由于安全限制,浏览器不允许从具有与 iFrame 不同域的容器调用 iFrame 中的函数。这是设计解决方案时需要考虑的问题。

于 2014-08-07T21:09:44.977 回答