Cognos 11如何根据年月提示动态设置提示控件精确默认值
Cognos 11 按年月动态匹配提示默认值实现方案
方案一:原生无JS实现(优先推荐,稳定性最高)
不需要写任何代码,用Cognos原生控件能力就能实现,不会受版本升级影响:
- 先确认映射表查询(存储年、月、promptValue对应关系的查询)配置正确,明细过滤器写法为:
[映射表年字段] = ?year? AND [映射表月字段] = ?month?
确保传入确定的年、月参数时,查询仅返回唯一一条对应的promptValue记录。 - 页面上依次放置3个提示控件:
- 年值提示:参数绑定
year,开启「自动提交」属性 - 月值提示:参数绑定
month,开启「自动提交」属性,设置级联来源为年提示 - 目标值提示:数据源直接用上面配置好的映射查询,显示值、提交值都选
promptValue字段,开启「自动选择第一个匹配项」属性
- 年值提示:参数绑定
- 运行验证:选完年、月后页面自动刷新,目标提示会自动过滤出唯一匹配的promptValue,原生逻辑会自动选中该值作为默认提交值,完全满足需求。
方案二:JS自定义实现(适合目标提示有复杂固定选项的场景)
如果目标提示有固定选项列表,不能直接用映射查询做数据源,就用下面的JS实现,把代码嵌入HTML控件即可:
- 先给3个提示控件分别设置自定义名称(在控件「常规」属性栏的「名称」项配置,注意不是参数名,大小写敏感):
- 年提示名称:
prompt_Year - 月提示名称:
prompt_Month - 目标提示名称:
prompt_Target
- 年提示名称:
- 拖入一个「HTML项目」控件,放在所有提示控件的下方,控件内容粘贴以下代码,注意把代码里的
映射查询名称替换成你实际建的年月-值映射查询的名字:
require(['bns/client/widget/Factory', 'cognos/Report'], function(Factory, Report) { const reportRef = Report.getReport("_THIS_"); function updateTargetPromptValue() { const yearWidget = Factory.getWidgetByName('prompt_Year'); const monthWidget = Factory.getWidgetByName('prompt_Month'); const targetWidget = Factory.getWidgetByName('prompt_Target'); // 年月未选全时不执行逻辑 if (!yearWidget.get('selectedItem')?.value || !monthWidget.get('selectedItem')?.value) return; // 从映射查询取匹配的默认值 const mapQueryResult = reportRef.query.getQueryData('映射查询名称'); const matchedDefaultVal = mapQueryResult.data[0][0].value; // 给目标提示赋值,不触发重复提交 targetWidget.set('selectedItem', { value: matchedDefaultVal, display: matchedDefaultVal }); targetWidget.validate(); } // 页面首次加载时延迟执行,等控件渲染完成 setTimeout(updateTargetPromptValue, 300); // 绑定年月提示的选值变更事件 Factory.getWidgetByName('prompt_Year').on('change', updateTargetPromptValue); Factory.getWidgetByName('prompt_Month').on('change', updateTargetPromptValue); });
- 注意事项:
- 确保映射查询在年、月参数确定时只返回唯一一条promptValue记录,否则会取第一条结果导致赋值错误
- 如果目标提示的提交值和显示值不一致,把代码里
display: matchedDefaultVal替换成对应的显示文本取值逻辑即可 - 不要改代码里的
_THIS_常量,这是Cognos内置的当前报表引用标识
内容的提问来源于stack exchange,提问作者martin_sk
相关产品推荐
相关产品推荐

