使用 LOOP 命令查找目标

Essbase 计算脚本示例说明如何计算为获得特定产品的特定利润而必须达到的销售值。在这种情况下,计算脚本会调整“销售预算”值,以达到 1 月 15,000 利润的目标。

如下面的层次结构中所示,假定没有成员标记为动态计算,并且计算中不包括“每盎司利润”成员(在“度量”维中的比率下)。

图 24-4 度量维


度量维类似于 Sample Basic,但没有每盎司利润且没有动态计算。

假设在运行目标查找计算脚本之前,数据值为:

Product, Market, Budget   Jan
Profit                    12,278.50
   Margin                 30,195.50
      Sales               49,950.00
      COGS                19,755.00
   Total Expenses         17,917.00
      Marketing           3,515.00
      Payroll             14,402.00
      Misc                0
Inventory                 Label Only member
Ratios                    Label Only member
   Margin %               60.45
   Profit %               24.58

示例脚本:

/* Declare the temporary variables and set their initial values*/

VAR
   Target = 15000,
   AcceptableErrorPercent = .001,
   AcceptableError,
   PriorVar,
   PriorTar,
   PctNewVarChange = .10,
   CurTarDiff,
   Slope,
   Quit = 0,
      DependencyCheck,
      NxtVar;

/*Declare a temporary array variable called Rollback based on the Measures dimension */

ARRAY Rollback [Measures];

/* Fix on the appropriate member combinations and perform the goal-seeking calculation*/

FIX(Budget, Jan, Product, Market)
   LOOP (35, Quit)
      Sales (Rollback = Budget;
      AcceptableError = Target * (AcceptableErrorPercent);
      PriorVar = Sales;
      PriorTar = Profit;
      Sales = Sales + PctNewVarChange * Sales;);
      CALC DIM(Measures);
      Sales (DependencyCheck = PriorVar - PriorTar;
      IF(DependencyCheck <> 0) CurTarDiff = Profit - Target;
         IF(@ABS(CurTarDiff) > @ABS(AcceptableError))
            Slope = (Profit - PriorTar) / (Sales - PriorVar);
            NxtVar = Sales - (CurTarDiff / Slope);
            PctNewVarChange = (NxtVar - Sales) / Sales;
         ELSE
            Quit = 1;
         ENDIF;
      ELSE
         Budget = Rollback;
         Quit = 1;
      ENDIF;);
   ENDLOOP
   CALC DIM(Measures);
ENDFIX

Essbase 执行以下计算:

  1. 使用 VAR 命令声明所需的临时变量。在适当的情况下,设置初始值。

  2. 声明一个名为 Rollback 的一维数组,用于存储 Budget 值。

    回退的大小基于度量维中的成员数。

  3. 修复所有产品和市场成员的“Jan(一月)”->“Budget(预算)”值。

  4. 确保 LOOP 和 ENDLOOP 之间的命令循环到 每个成员组合的 35 倍。但是,如果 "Quit" 变量设置为 1,则会中断 LOOP,并在 ENDLOOP 命令之后继续计算。

  5. 循环处理成员组合,执行以下计算:

    1. 在“Rollback(回退)”临时数组变量中放置“Budget(预算)”>“Sales(销售)”值。

    2. 通过将目标值 (15000) 乘以 AcceptableErrorPercent 值 (0.001) 来计算可接受的错误。结果将放置在 AcceptableError 变量中。

    3. 保留当前销售值,并将当前成员组合的销售值置于 PriorVar 临时变量中。

    4. 保留当前利润值,并将当前成员组合的利润值置于 PriorTar 临时变量中。

    5. 通过将 PctNewVarChange 值 (0.1) 乘以当前 Sales 值并添加当前 Sales 值来计算新的 Sales 值。结果将置于“销售”中。

    6. 计算并合并“度量”维。

    7. 从 PriorVar 值中减去 PriorTar 值,并将结果置于 DependencyCheck 临时变量中。

    8. 检查 DependencyCheck 是否不是 0(零)(IF)。

      • 如果 DependencyCheck 不为 0,则从当前 Profit 中减去目标值 (15000),并将结果置于 CurTarDiff 临时变量中。

        IF 命令检查 CurTarDiff 的绝对值(不考虑 + 或–符号)是否大于 AcceptableError 的绝对值:

        • 如果大于 AcceptableError,则计算 Slope、NxtVar 和 PctNewVarChange 临时变量。

        • 如果不大于 AcceptableError,则通过将 Quit 的值设置为 1 来中断 LOOP 命令。在 ENDLOOP 命令之后继续计算。

      • 如果 DependencyCheck 为 0,则将回滚数组中的值置于 Budget 中。Essbase 通过将“退出”的值设置为 1 来打破 LOOP 命令。在 ENDLOOP 命令之后继续计算。

  6. 计算并合并“度量”维。

产品 100-10 的结果:

Product, Market, Budget   Jan
Profit                    15,000.00
   Margin                 32,917.00
      Sales               52,671.50
      COGS                19,755.00
   Total Expenses         17,917.00
      Marketing           3,515.00
      Payroll             14,402.00
      Misc                0
Inventory                 Label Only member
Ratios                    Label Only member
   Margin %               28.47839913
   Profit %               62.49489762