LOOPコマンドを使用したゴールシーク計算

このEssbase計算スクリプトの例は、特定の製品で特定の利益を得るために達成する必要があるsales値を計算する方法を示しています。この例では、計算スクリプトで、1月の目標15,000 Profitを達成するためにSalesのBudget値を調整します。

次の階層に示すように、動的計算としてタグ付けされているメンバーがないこと、および(MeasuresディメンションのRatiosの下にある) Profit per Ounceメンバーが計算に含まれていないことを前提とします。

図24-4 Measuresディメンション


Sample Basicと似ているMeasuresディメンション(Profit Per Ounceと動的計算なし)。

ゴールシーク計算スクリプトを実行する前のデータ値は次のようになっているとします。

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. Budget値を保管するためのRollbackという1ディメンションの配列を宣言します。

    Rollbackのサイズは、Measuresディメンションのメンバー数に基づきます。

  3. ProductとMarketのすべてのメンバーに対して、Jan -> Budgetの値を確定します。

  4. LOOPとENDLOOPの間のコマンドを、各メンバーの組合せに従って35回繰り返します。ただし、Quit変数が1に設定された場合、LOOPは中断され、ENDLOOPコマンドの後の計算が続行されます。

  5. メンバーの組合せごとに次の計算を逐次実行します。

    1. Budget -> Sales値をRollback一時配列変数に置きます。

    2. Target値(15000)とAcceptableErrorPercent値(0.001)を乗算し、許容誤差を計算します。その結果はAcceptableError変数に配置されます。

    3. 現在のSales値を保持して、現在のメンバーの組合せのSales値をPriorVar一時変数に置きます。

    4. 現在のProfit値を保持して、現在のメンバーの組合せのProfit値をPriorTar一時変数に置きます。

    5. PctNewVarChange値(0.1)と現在のSales値を乗算し、現在のSales値を加算して、新しいSales値を計算します。その結果はSalesに配置されます。

    6. Measuresディメンションを計算し、集計します。

    7. PriorVar値からPriorTar値を減算して、その結果をDependencyCheck一時変数に置きます。

    8. DependencyCheckが0 (ゼロ)でないことを確認します(IF)。

      • DependencyCheckが0でない場合、現在のProfitからTarget値(15000)を減算し、その結果をCurTarDiff一時変数に置きます。

        IFコマンドによって、CurTarDiffの絶対値(+符号または-符号を無視した値)がAcceptableErrorの絶対値よりも大きいかどうかが検査されます:

        • AcceptableErrorより大きい場合、Slope、NxtVarおよびPctNewVarChange一時変数を計算します。

        • AcceptableError以下の場合、Quitの値を1に設定して、LOOPコマンドを中断します。計算は、ENDLOOPコマンドの後に続行されます。

      • DependencyCheckが0の場合、Rollback配列の値をBudgetに置きます。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