機械翻訳について

Goal-LOOPコマンドを使用したシーク

この例では、特定の製品の特定の利益を得るために到達する必要がある販売値を計算する方法を示します。 この場合、計算スクリプトでは、SalesのBudget値が調整され、Janの15,000 Profitの目標に到達します。

次のアウトラインに示すように、「動的計算」としてタグ付けされたメンバーがなく、Profit per Ounceメンバー(MeasuresディメンションのRatiosの下)が計算に含まれていないとします。

図25-4 メジャー・ディメンション


この図は、図の前のテキストで説明されているMeasuresディメンションのアウトラインを示しています。

ゴール・シーク計算スクリプトを実行する前のデータ値は次のとおりであるとします:

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という名前の1ディメンション配列を宣言して、Budget値を格納します。

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

  3. すべての製品および市場メンバーのJan -> Budget値を修正します。

  4. LOOPとENDLOOPの間のコマンドが「メンバーの組合せごと」の35倍に循環していることを確認します。 ただし、Quit変数が1に設定されている場合、LOOPは中断され、ENDLOOPコマンドの後に計算が続行されます。

  5. メンバーの組合せを循環し、次の計算を実行します:

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

    2. ターゲット値(15000)にAcceptableErrorPercent値(0.001)を掛けて、許容できるエラーを計算します。 結果はAcceptableError変数に格納されます。

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

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

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

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

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

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

      • DependencyCheckが0でない場合、現在の利益からターゲット値(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