Cognos 11.1.7 框架管理器更改查询主题的表,键入数据
Posted
技术标签:
【中文标题】Cognos 11.1.7 框架管理器更改查询主题的表,键入数据【英文标题】:Cognos 11.1.7 Framework manager change the table for the query subject, type data 【发布时间】:2021-04-22 19:21:56 【问题描述】:使用 Cognos 11.1.7,数据库是 IBMi 上的 DB2 质量管理体系
试图弄清楚如何让框架管理器根据数据库中的值动态更改 SQL 定义
这个想法是基于与参数映射类似的概念。您可以更改 SQL 定义,但在下面的示例中,它基于会话参数。此示例非常适合多语言,因为它会动态更改 SQL 定义的 from 语句,如下所示:
Select * from [LIVE].TABLE_#$Parameter_mapkey#
也可以通过运行报告时传递的参数来执行此操作,但用户不知道要传递什么。所以我尝试了一些不同的东西......
为什么参数映射不起作用 本文解释了参数映射不起作用,因为在将任何查询发送到任何数据源之前需要输入值 https://www.ibm.com/support/pages/unable-get-parameter-map-accept-query-item-its-input-parameter
但是,使用 SQL,我认为可以。这是我尝试过的 嵌套 SQL 语句,如果括号内的 sql 解析为子选择,则嵌套 SQL 语句将通过将其更改为正确的表(如 TABLE_A)来完成 from 语句。
select * from (select X_VALUE from TABLE_X where X_CATEGORY = 'SALES')
对于这个例子,TABLE_X 有两列——X_CATEGORY X_VALUE
X_CATEGORY = 销售额
X_VALUE = TABLE_A
所以从 TABLE_X 中选择 X_VALUE,其中 X_CATEGORY = 'SALES'
将返回“TABLE_A”的值
顺便说一句,一个永无止境的程序每 10 分钟切换一次值 TABLE_A 或 TABLE_B 因为这些表格会不断更新预先汇总的数据
不幸的是,在 SQL(IBMi 上的 DB2)中,这将返回 X_VALUE 而不是 TABLE_A。 也许还有另一种方法可以在 DB2 for IBMi 上的 SQL 中完成此任务?我可能只是遇到了语法问题
使用 SQL - 如何根据另一个表更改 from 语句中的表?
目前我有一个解决方法,使用两组带有硬编码的 sql 定义的查询主题。使用完整的外部连接将它们拼接到常用表(如公司、位置、日期等)。
在报表级别,我根据 TABLE_X 呈现内容
这可行,但它对用户不友好且更难维护
【问题讨论】:
你能重写一下,让它更清楚你想要什么。一个问题是你写的很多东西都不是正确的句子。 另外,您希望查询层对象为 select * from table 格式,因此您希望在业务层模型查询主题中对此进行建模。 我改写/尝试使请求更清晰一些。展示我的研究,与我想要完成的概念相似的概念。例子。文章。和我目前的工作(select X_VALUE from TABLE_X where X_CATEGORY = 'SALES')
应该返回一个“表”,其中包含名为X_VALUE
的列中的值。因此,如果只返回一行,那么您应该期望得到像 'TABLE_A'
这样的值。你不会得到像TABLE_A
这样的表格参考。为了更清楚您的问题:数据库设计为在任何给定时间仅在一个表(TABLE_A 或 TABLE_B)中包含有效数据,并且可以通过运行 select X_VALUE from TABLE_X where X_CATEGORY = 'SALES'
找到哪个表有效?
Cognos 不是这里的问题。期望报告工具和/或您的业务用户知道要使用哪个表的整体设计是问题所在。话虽如此,也许您可以通过拥有一个视图来伪造它,并每 10 分钟更改一次该视图以指向另一张桌子?
【参考方案1】:
这是我对情况的理解。我遇到的一个问题是我需要猜测一下。
您有两个数据库,每个数据库都具有相同的元数据结构。您不断更新数据库。
您有一个保存两个数据库状态的表,并且您可以使用 something 作为最近更新数据库的指示器。
不清楚这是如何完成的,也不清楚该表中有多少条记录。
您可能想尝试这些方法。我没试过,所以细节涉及到相当程度的挥手。
您可以在 FM 模型的数据源连接属性中使用参数映射宏。
您需要导入用于跟踪数据库状态的表。您将在查询主题中创建一个过滤器以查找最大值(如果您使用时间戳)或过滤表的相关列中的值,该列告诉您哪个数据库是当前的。这意味着只会返回代表当前数据库的一行。
您将创建一个参数映射,该映射将获取查询主题中相关列返回的任何值。将该宏放入数据源连接的适当属性中。
Key Value
Sales DB1's name
AnotherThing DB2's name
【讨论】:
【参考方案2】:您也许可以使用 QueryValue 宏函数来动态构建 FROM 子句。下面的示例会将 FROM 子句更改为 GOSALES。野营装备。 (这将失败,因为它不是实际的 table_name)在你的情况下,你会替换 #dq(queryValue ('[Sales (query)].[Products].[Product line]'))# 使用包含要使用的 table_name 的数据库列。
SELECT
"PRODUCT_LINE"."PRODUCT_LINE_CODE" AS "Product_line_code",
"PRODUCT_LINE"."PRODUCT_LINE_EN" AS "Product_line"
FROM
"GOSALES".#dq(queryValue ('[Sales (query)].[Products].[Product line]'))# "PRODUCT_LINE"
【讨论】:
你打败了我。select * from #queryValue('[namespace].[TABLE_X].[X_VALUE]')#
基于 cognospaul.com/2019/06/06/… Cognos 大师再次找到了颠覆 DBA 废话的方法。如果表名中有空格,select * from #dq(queryValue('[namespace].[TABLE_X].[X_VALUE]'))#
需要注意的一点:这仅在版本 11.0.[something] 及更高版本中可用,并且仅在模型配置为使用 DQM 时可用。 OP 没有提供有关目标环境的信息。
我在顶部11.1.7声明,并添加了DQM来澄清
我明白了。我可能在看标签。添加cognos-11
可能会有所帮助。以上是关于Cognos 11.1.7 框架管理器更改查询主题的表,键入数据的主要内容,如果未能解决你的问题,请参考以下文章
Eclipse 的包资源管理器背景颜色遵循 windows 主题。我想在不更改 Windows 主题的情况下更改颜色。可能的?