在使用 SAP BO WEBI 4.2 SP3 的 sql 中使用 @Prompt
Posted
技术标签:
【中文标题】在使用 SAP BO WEBI 4.2 SP3 的 sql 中使用 @Prompt【英文标题】:Using @Prompt in sql using SAP BO WEBI 4.2 SP3 【发布时间】:2017-01-17 21:50:30 【问题描述】:我正在运行一系列报告,其中在查询中调用的时间窗口是滚动的,并且每个报告都是单独的。有些报告看起来是 400 天前,有些报告是 10 周前,而另一些报告是 -40 天/+80 天。 ..等等 - 很多选择。 所有报告都安排在每天或每周运行,这意味着设置提示将需要通过调度程序手动重置每个实例的提示。不是最优的。
我知道 Universe 设计者可以使用查询设计器设计特定的过滤器以拖入查询,但是有这么多不同的选项,我发现 Universe 设计者应该为这些特定目的创建特定的过滤器有点问题,添加大量用于特定用途的特定过滤器。
我正在寻找一个可以将计算分配给日期字段的选项,该选项在每个计划实例的报告中保持不变。
例如,查看从今天之前 400 天起的发票日期看起来像 Where DIM_TIME_INV.DAY_DAY >= sysdate -400
- 我可以将其硬编码到特定报告的 SQl 中,它将保留在调度程序中并为每天滚动 1 天报告运行。但是如果我决定对查询元素进行更改,那么 SQl 就搞砸了,我将不得不再次手动将修改添加到 SQL。
我找到了一个article reg。 @Prompt 的使用,并会要求 Universe 设计者尝试在我们的 BO 版本中将其沙箱化。 虽然我很不耐烦,但我根据链接文章中的示例 4 尝试使用以下代码。
SELECT
@select('DIM_TIME_INV.DAY_DAY') >= sysdate -(@prompt('Invoiced, days before today:','N',[DIM_TIME_INV.DAY_DAY],mono,free))
FROM
DIM_TIME_INV
测试 SQL 给出以下错误: ORA-00936 SAP kba 2054721
整个想法是拥有一个灵活而一致的维度,每次运行报表时都会计算,而不会在向报表中添加新项目时丢失代码。
有人知道在 SQL 中为 SAP WEBI 4.2 使用 @Prompt 的方法吗? - 或任何其他具有“灵活”时间维度的方式,可以独立设置开始日期或结束日期,甚至设置范围,而无需宇宙设计师创建大量过滤器并在各种宇宙中转储.
谢谢 // C
【问题讨论】:
【参考方案1】:关于您的示例代码,我认为您在正确的轨道上,但您的语法存在一些问题:
SELECT
@select('DIM_TIME_INV.DAY_DAY') >= sysdate -(@prompt('Invoiced, days before today:','N',[DIM_TIME_INV.DAY_DAY],mono,free))
FROM
DIM_TIME_INV
首先,@Select
和 @Prompt
都必须引用 Universe 对象,而不是列。两者的语法都是:class name\object name
。假设DIM_TIME_INV.DAY_DAY
与名为Dim Time
的类中名为Day Day
的Universe 对象相关联,则上述代码应为:
SELECT
@select('Dim Time\Day Day') >= sysdate -(@prompt('Invoiced, days before today:','N','Dim Time\Day Day',mono,free))
FROM
DIM_TIME_INV
还要注意@prompt 调用中的对象引用由单引号而不是括号分隔。
接下来,我假设 DAY_DAY 是一个日期字段。它在@prompt 调用中的引用将导致提示显示来自DAY_DAY 的值列表。但是您需要提示中的数字值,而不是日期,所以我将其省略,这将让用户输入数字值:
SELECT
@select('Dim Time\Day Day') >= sysdate -(@prompt('Invoiced, days before today:','N',,mono,free))
FROM
DIM_TIME_INV
接下来,即使使用此更正的语法,使用此代码也会出现问题。调试@prompt 问题的一个好方法是在收到错误后查看WebI 报告中的SQL——SQL 将显示呈现的结果,所有函数(@select 和@prompt)都已展开。对于上述情况,您可能会得到如下 SQL:
SELECT
DIM_TIME_INV.DAY_DAY >= sysdate -(400)
FROM
DIM_TIME_INV
这当然是无效的——在 SELECT 子句中不能有条件。如果这确实是一个条件(我认为是,基于您的目标),那么它应该是一个预定义的条件,而不是一个维度。
话虽如此,我认为您的目标是正确的。通过上述更正,您将拥有一个可以放入报告的预定义条件,这将使用户能够选择报告的开始时间段(按天数)。您可以使用不同的逻辑创建其他提示,例如:
@select('Dim Time\Day Day') >= sysdate -(@prompt('Invoiced, weeks before today:','N',,mono,free) * 7)
或
@select('Dim Time\Day Day')
BETWEEN sysdate - @prompt('Starting days ago:','N',,mono,free)
AND sysdate - @prompt('Ending days ago:','N',,mono,free)
【讨论】:
非常感谢!这是朝着正确方向的巨大推动。我已经咨询了我们的 Universe 设计师,并要求他在 Universe 级别创建我需要的过滤器/预定义条件。 SQL 如下所示: 'DIM_TIME_INV.DAY_DAY between sysdate-( 1 + (@Prompt('Invoiced, days before today:','N',,,Mono,free))) 和 sysdate-1' - 提示要求今天前 x 天直到前一天。以上是关于在使用 SAP BO WEBI 4.2 SP3 的 sql 中使用 @Prompt的主要内容,如果未能解决你的问题,请参考以下文章
单元格格式为文本或前面有撇号,SAP Webi 中生成的 Excel 文件