使用 LOOP 指令尋求目標

Essbase 計算指令碼範例顯示如何計算銷售值,您必須達到此值才能取得特定產品的特定利潤。在此情況下,計算指令檔會調整 Sales 的「預算」值,以達到 1 月的 15,000 Profit 目標。

如以下階層所示,假設未將任何成員標記為動態計算,且計算中未包含「每盎司利潤」成員 (在「計量」維度的「比率」下)。

圖 24-4 計量維度


測量維度類似於「基本範例」的維度,但沒有「每盎司利潤」,沒有「動態計算」。

假設在執行目標搜尋計算指令碼之前,資料值如下:

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. 宣告一個稱為「倒回」的維度陣列,以儲存「預算」值。

    「倒回」的大小是根據 Measures 維度中的成員數目而定。

  3. 修正 1 月 -> 所有產品與市場成員的預算值。

  4. 確定 LOOP 和 ENDLOOP 之間的命令會循環至每個成員組合 的 35 次。不過,如果將 Quit 變數設定為 1,則 LOOP 會中斷,且在 ENDLOOP 指令之後繼續計算。

  5. 循環成員組合,執行下列計算:

    1. 將「預算」->「銷售」值放在「倒回」暫時陣列變數中。

    2. 計算可接受的錯誤,方法是將「目標」值 (15000) 乘以 AcceptableErrorPercent 值 (0.001)。結果會放置在 AcceptableError 變數中。

    3. 保留目前的「銷售」值,並將目前成員組合的「銷售」值放置在 PriorVar 暫時變數中。

    4. 保留目前的 Profit 值,並將目前成員組合的 Profit 值放置在 PriorTar 暫時變數中。

    5. 將 PctNewVarChange 值 (0.1) 乘以目前的 Sales 值,然後新增目前的 Sales 值,來計算新的 Sales 值。結果會置於 Sales 中。

    6. 計算並合併 Measures 維度。

    7. 從 PriorVar 值減去 PriorTar 值,並將結果置於 DependencyCheck 暫時變數中。

    8. 檢查「依存項目檢查」不是 0 (零) (IF)。

      • 如果 DependencyCheck 不是 0,則會從目前利潤中減去目標值 (15000),並將結果置於 CurTarDiff 暫時變數中。

        IF 命令會檢查 CurTarDiff 的絕對值 (不論 + 或 – 符號) 是否大於 AcceptableError 的絕對值:

        • 如果大於 AcceptableError,則計算 Slope、NxtVar 和 PctNewVarChange 暫時變數。

        • 如果不大於 AcceptableError,請將 Quit 的值設為 1 以中斷 LOOP 指令。計算會在 ENDLOOP 指令之後繼續進行。

      • 如果 DependencyCheck 為 0,請將「倒回」陣列中的值放入「預算」。Essbase 會將 Quit 的值設為 1,以中斷 LOOP 指令。計算會在 ENDLOOP 指令之後繼續進行。

  6. 計算並合併 Measures 維度。

產品 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