计算脚本中的公式

Essbase 公式计算数据库大纲中成员之间的数学和位置关系。您可以将它们应用于大纲中的成员,和/或在计算脚本中使用它们来严格控制您的计算。

在计算脚本中定义 Essbase 公式时,它们优先于应用于多维数据集大纲中的成员的任何公式。以这种方式使用公式可以使批处理计算在编码到多维数据集大纲中的关系之外具有更大的灵活性。

您可以使用基本方程式、条件方程式和相互依赖的公式编写公式进行计算。

Essbase 计算脚本中,可以执行以下两个操作:

  • 在多维数据集大纲上计算现有成员公式

  • 定义在计算脚本执行期间持续运行的新公式

要计算应用于大纲中成员的现有公式,请使用成员名称,后跟分号 (;)。例如,计算脚本中的以下命令将计算应用于大纲中的 Variance 成员的公式:

Variance;

要改写大纲计算产生的值,可以在计算脚本中手工应用公式。例如,计算脚本中的以下公式循环遍历多维数据集,在成员“薪资”、“市场营销”和“其他”中添加值,并将结果放置到“费用”成员中。此公式将覆盖大纲中放置在费用成员上的任何公式:

Expenses = Payroll + Marketing + Misc;

注意:

不能将公式应用于共享成员或仅标记成员。

另请参阅:为块存储多维数据集开发公式

Essbase 计算脚本中的基本方程式

Essbase 计算脚本中,可以使用方程式为多维数据集大纲成员分配值。分配将持续计算脚本的执行持续时间。

Essbase 计算脚本中方程式的语法如下:

member = mathematical_expression;

member 是大纲中的成员名称, mathematical_expression 是任何有效的数学表达式。

Essbase 对表达式求值,并将值分配给指定的成员。

在以下示例中, Essbase 会循环使用数据库,从“销售”中的值中减去销货成本中的值,并将结果放在“利润”中:

Margin = Sales - COGS;

在此示例中, Essbase 循环使用数据库,从 Retail 中的值中减去 Cost 中的值,以 Retail 中值的百分比计算结果值,并将结果放在 Markup 中:

Markup = (Retail - Cost) % Retail;

还可以使用方程式中的 >(大于)和 <(小于)逻辑运算符。

在以下示例中,如果二月份销售额大于一月份销售额,则“销售额增加标志”将产生值 1;如果为假,则结果为值 0:

Sales Increase Flag = Sales -> Feb > Sales -> Jan;

Essbase 计算脚本中的条件方程式

您可以在 Essbase 计算脚本公式中使用条件方程式来定义 if/else 逻辑并控制计算期间的事件流。

在计算脚本中将 IF 语句用作成员公式的一部分时,必须:

  • 将 IF 语句与单个成员关联

  • 将 IF 语句括在括号中

在以下示例中,整个 IF … ENDIF 语句用括号括起来,并与 Profit 成员 Profit (IF(...)...) 关联:

Profit
(IF (Sales > 100)
   Profit = (Sales - COGS) * 2;
ELSE
   Profit = (Sales - COGS) * 1.5;
ENDIF;)

Essbase 会循环使用数据库并执行以下计算:

  1. IF 语句将检查当前成员组合的 Sales 值是否大于 100。

  2. 如果 Sales 大于 100,则 Essbase 会从 Sales 中的值中减去 COGS 中的值,将差值乘以 2,并将结果置于 Profit 中。

  3. 如果 Sales 小于或等于 100,则 Essbase 会从 Sales 中的值中减去 COGS 中的值,将差值乘以 1.5,并将结果置于 Profit 中。

有关条件命令和控制计算脚本流的更多信息,请参见 Calculation Command Groups

Essbase 计算脚本中的相互依赖公式

与大纲中的公式一样,计算脚本中的公式计算 Essbase 多维数据集大纲中的成员之间的数学关系。

如果公式的评估取决于同一维的其他成员的值,则将其视为相互依赖

Essbase 中相互依赖的公式的一个很好的示例是现金流评估,其中期初库存取决于上个月的期末库存。

在计算脚本中使用相互依赖的公式时,请记住,相同的规则适用于 IF 语句。您必须:

  • 将公式与单个成员关联

  • 将公式括在括号中

在以下示例中,将整个相互依赖的公式括在括号中并与“期初库存”成员关联:

"Opening Inventory"
(IF(NOT @ISMBR (Jan))
   "Opening Inventory" = @PRIOR("Ending Inventory");
ENDIF;)
"Ending Inventory" = "Opening Inventory" - Sales + Additions;

计算脚本公式和智能计算状态

包含关系或财务功能的稀疏维成员上的公式始终会导致重新计算,即使 Essbase 智能计算将块标记为“干净”。

假设您在稀疏维成员上有一个公式,并且该公式包含以下任一类型的函数:

  • 关系(例如,@PRIOR 或 @NEXT)

  • 财务(例如,@NPV 或 @INTEREST)

Essbase 始终重新计算包含公式的数据块,即使为了智能计算将块标记为“干净”也是如此。

请参阅数据块的智能计算块存储多维数据集的智能计算

脚本中的组公式和维

通过在计算脚本中仔细分组 Essbase 成员公式和维,可以显著提高计算性能。

计算一系列成员公式

计算公式时,务必正确使用括号。

在以下示例中,括号放置错误会导致 Essbase 在多维数据集上执行两次计算传递:一次是在 Qtr1 和 Qtr2 成员上计算公式;一次是在 Qtr3 上计算公式:

(Qtr1;
Qtr2;)
Qtr3;

相比之下,以下配置会导致 Essbase 仅在多维数据集上循环一次,从而计算 Qtr1、Qtr2 和 Qtr3 成员上的公式:

Qtr1;
Qtr2;
Qtr3;

或者

(Qtr1;
Qtr2;
Qtr3;)

同样,以下公式会导致 Essbase 在多维数据集中循环一次,一次计算两个公式:

Profit = (Sales - COGS) * 1.5;
Market = East + West;

计算一系列维

在计算一系列维时,您可以通过尽可能对维进行分组来优化性能。

例如,以下公式会导致 Essbase 仅在多维数据集之间循环一次:

CALC DIM(Year, Measures);

相比之下,以下语法会导致 Essbase 在多维数据集中循环两次,每个 CALC DIM 命令一次:

CALC DIM(Year);
CALC DIM(Measures);