【问题标题】:Cognos passing a value to all promptsCognos 将值传递给所有提示
【发布时间】:2014-08-12 04:19:42
【问题描述】:

所以我在我的报告中使用了 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>

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

【问题讨论】:

  • 您的报告在哪里运行?报告工作室?工作区?你能提供更多细节吗?我在 Cognos 中使用 JavaScript 完成了大量工作,但需要更多信息来帮助您。
  • @Johnsonium 这一切都将在报告工作室中完成。在我们说话的时候,我正在努力让它发挥作用。所以我有两个 iFrame 设置,我想要一个提示来驱动这两个 iframe。在 iframe 中,我有交叉表。因此,如果我在提示中更改月份,它将在两个 iframe 中更改
  • 因此,您有一个 Report Studio 报表,其中包含一堆 iFrame,每个 iFrame 都有自己的 Report Studio 报表。这个对吗?另外,您能否指出您正在运行的 Cognos 版本?
  • @Johnsonium 我使用的是 10.2.1,是的,我目前的设置方式是每个报告都是 iframed 的,它们链接到顶部由 jQuery 代码运行的选项卡。因此,当报告运行时,所有报告同时运行,因此从一个选项卡到另一个选项卡没有任何等待,因为所有内容都已加载。当您转到每个选项卡时,它会像以前一样加载。因此,客户想要的是能够选择顶部的值提示来驱动所有 iframe 更改他们想要查看的月份。我发现一些 jquery 下拉菜单可能还不确定

标签: javascript jquery prompt cognos-bi cognos-10


【解决方案1】:

我能够通过在每个子报表中创建一个 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 Prompt API documentation

在容器报告中,我创建了一个 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 中的函数。这是设计解决方案时需要考虑的问题。

【讨论】:

  • 所以我尝试了您列出的内容。我将孩子放入将被 iFramed 放入的报告和带有提示的报告中的容器中。我在子报告中放置了一个值提示,并在提示中给出了一个月。我将其命名为 pMonth。然后我转到容器报告并命名应该驱动一切的提示,当我运行我的报告时它不会更改 iframe。也许我做错了什么。我研究了您链接的 API,它有所帮助,但我对如何实现所有内容仍然有些模糊。任何额外的帮助将不胜感激。
  • 要检查的关键事项是确保更改 getControlByName 函数的参数以匹配您在容器和子报告中创建的提示的名称属性。请注意,您必须指定每个提示的“名称”属性,而不是“参数”属性。这是两个不同的东西。 JavaScript API 通过查找指定名称(我上面的代码中的“radio”和“controlname”)来查找报告中的对象。
  • 我已经更改了 name 属性下每个提示的名称。我从 pMonth 更改了它们,因为这是 changeMonth 的参数,请查看我的编辑,我稍后将在此处使用所有代码以及我拥有它的位置进行编辑,也许您可​​以指导我朝着正确的方向前进。
  • 我的编辑代码有帮助吗?从昨天开始我就一直在玩这个,但我似乎仍然无法让它工作
  • 您的代码看起来正确。从 Cognos JavaScript 提示 API 的角度来看,使用下拉列表、列表还是单选按钮组都无关紧要。 JavaScript 处理提示对象的方式是相同的。运行报表时可以查看浏览器控制台吗?它通常会提供有用的错误信息。在大多数浏览器中,您可以通过按 F12 访问控制台。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多