在 Oracle Essbase 计算脚本中,如果条件为 true,则使用 if
语句执行代码,如果前面求值的条件为 false,则使用 else
和 else if
语句指定要测试的各个新条件。
您可以优化使用 if
和 else if
语句的代码,方法是分析符合大部分数据的条件,然后将对该条件的求值移至代码开头,以便尽早执行代码。
考虑 Sample.Basic 的以下计算脚本示例,其中帐户和时间是密集维:
SET UPDATECALC OFF; "SalesYTD"( IF(@ismbr("Jan")) SalesYTD" = "Sales"; Else "SalesYTD"="Sales" + @prior("SalesYTD"); Endif )
在此示例中,超过 90% 的数据满足 else
条件的评判标准。只有大约 10% 的数据满足 if
条件的评判标准。由于 else
条件中的 @prior
函数,必须在所有其他月份之前计算 January。运行此计算时,报告的总用时如下:
Total Calc Elapsed Time for [IF.csc] : [0.203] seconds
在此计算中,请注意 "SalesYTD" 成员是在单元格模式下计算的,这意味着无论 if
条件语句的顺序如何,都会先计算 January,因为它出现在大纲中其他月份之前。
您可以通过对语句重新排序并向第一个条件添加 NOT
运算符来优化此类脚本,如以下示例中所示:
SET UPDATECALC OFF; "SalesYTD"( IF(NOT(@ismbr("Jan"))) "SalesYTD" = "Sales" + @prior("SalesYTD"); Else "SalesYTD"="Sales"; Endif )
此示例与前一个示例相比,计算用时不到原来的四分之一,因为超过 90% 的数据满足 if
语句中的评判标准。
Note:
在此示例中,必须按大纲顺序(必须在 January 后面计算 February,在 February 后面计算 March,依此类推)计算公式才能获得正确结果。如果未自动实现,您可以使用@calcmode(Cell)
强制设置顺序。