Goal-LOOPコマンドを使用したシーク
この例では、特定の製品の特定の利益を得るために到達する必要がある販売値を計算する方法を示します。 この場合、計算スクリプトでは、SalesのBudget値が調整され、Janの15,000 Profitの目標に到達します。
次のアウトラインに示すように、「動的計算」としてタグ付けされたメンバーがなく、Profit per Ounceメンバー(MeasuresディメンションのRatiosの下)が計算に含まれていないとします。
図25-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は、次の計算を実行します:
-
VARコマンドを使用して、必要な一時変数を宣言します。 必要に応じて、初期値が設定されます。
-
Rollbackという名前の1ディメンション配列を宣言して、Budget値を格納します。
ロールバックのサイズは、Measuresディメンションのメンバー数に基づきます。
-
すべての製品および市場メンバーのJan -> Budget値を修正します。
-
LOOPとENDLOOPの間のコマンドが「メンバーの組合せごと」の35倍に循環していることを確認します。 ただし、Quit変数が1に設定されている場合、LOOPは中断され、ENDLOOPコマンドの後に計算が続行されます。
-
メンバーの組合せを循環し、次の計算を実行します:
-
Budget -> Sales値をRollback一時配列変数に配置します。
-
ターゲット値(15000)にAcceptableErrorPercent値(0.001)を掛けて、許容できるエラーを計算します。 結果はAcceptableError変数に格納されます。
-
現在のSales値を保持し、現在のメンバーの組合せのSales値をPriorVar一時変数に配置します。
-
現在の利益値を保持し、現在のメンバーの組合せの利益値をPriorTar一時変数に配置します。
-
PctNewVarChange値(0.1)に現在のSales値を乗算し、現在のSales値を加算して、新しいSales値を計算します。 結果はSalesに格納されます。
-
Measuresディメンションを計算して集計します。
-
PriorVar値からPriorTar値を減算し、その結果をDependencyCheck一時変数に格納します。
-
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コマンドの後も計算は続行されます。
-
-
-
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