この項の内容:
この章の情報は、ブロック・ストレージ・データベースのみに適用され、集約ストレージ・データベースとは関係がありません。
集約ストレージとブロック・ストレージの比較。も参照してください。
この章のすべての例は、Sample.Basicデータベースに基づいています。
高機能計算コマンドSET UPDATECALCとSET CLEARUPDATESTATUSを使用する例は、SET CLEARUPDATESTATUSの使用例の確認と複数パス計算の例と解決策の確認を参照してください。
次の例には、Budget値とActual値の間の差異パーセンテージの計算が含まれています。
図135は、VarianceおよびVariance %が動的計算、2パス・メンバーとしてタグ付けされているアウトラインを示しています。
デフォルト計算では、Essbaseによって、市場次元と製品次元の値が集約されます。パーセンテージ値は正確に集約されないので、デフォルトの計算後にVariance %式を再計算する必要があります。
Variance %は、動的計算、2パス・メンバーとしてタグ付けされているため、Essbaseでは、Variance %値の取得時にその値を動的に計算します。動的計算によって、正しくない値が正しく計算されたパーセンテージで上書きされます。
Variance %を動的計算、2パス・メンバーとしてタグ付けしない場合は、次の計算スクリプトを使用して、デフォルト計算を実行し、Variance %の式を再計算します。この計算スクリプトでは、高機能計算がオン(デフォルト)になっていることを前提とします:
CALC ALL; SET UPDATECALC OFF; SET CLEARUPDATESTATUS AFTER; "Variance %";
2パス計算タグまたは計算スクリプトの選択と2パス計算の使用を参照してください。
次の例は、地域のマーケティング・マネージャがデータベースの各領域を計算する方法を示しています。計算スクリプトでは、@DESCENDENTS(East)を使用して計算をEast地域に限定し、Eastの各子の年次元、メジャー次元および製品次元を計算します。
図136は、市場次元のEast、West、SouthおよびCentralのメンバーのアウトラインを示しています:
スクリプト例:
/* Calculate the Budget data values for the descendants of East */ FIX(Budget, @DESCENDANTS(East)) CALC DIM(Year, Measures, Product); ENDFIX /* Consolidate East */ FIX(Budget) @DESCENDANTS(East); ENDFIX
次の例では、Budget値を計算して、VarianceとVariance %メンバーを再計算します。
スクリプト例:
/* Calculate all Budget values */ FIX(Budget) CALC DIM(Year, Product, Market, Measures); ENDFIX /* Recalculate the Variance and Variance % formulas, which requires two passes */ Variance; "Variance %";
次の例では、市場と製品ごとに製品のシェア値と市場のシェア値を計算します。シェア値は次のように計算されます:
次の4つのメンバーをメジャー次元に追加していることを前提とします:
Market Share
Product Share
Market %
Product %
スクリプト例:
/* First consolidate the Sales values to ensure that they are accurate */ FIX(Sales) CALC DIM(Year, Market, Product); ENDFIX /* Calculate each market as a percentage of the total market for each product */ "Market Share" = Sales % Sales -> Market; /* Calculate each product as a percentage of the total product for each market */ "Product Share" = Sales % Sales -> Product; /* Calculate each market as a percentage of its parent for each product */ "Market %" = Sales % @PARENTVAL(Market, Sales); /* Calculate each product as a percentage its parent for each market */ "Product %" = Sales % @PARENTVAL(Product, Sales);
CALC DIMコマンドを使用して、年次元、市場次元および製品次元を計算します。メジャー次元にはSalesメンバーが含まれているので、集計されません。シナリオ次元はラベルのみなので、集計する必要はありません。
データベースを循環し、各月の各市場における各製品のSales値を取得し、このSales値を、各製品のすべての市場の合計Salesのパーセンテージとして計算することで、Market Shareを計算します(Sales -> Market)。
各月の各市場における各製品のSales値を取得し、このSales値を、各市場のすべての製品の合計Salesのパーセンテージとして計算することで、Product Shareを計算します(Sales -> Product)。
各月の各市場における各製品のSales値を取得し、このSales値を、市場次元の現在のメンバーの親のSales値のパーセンテージとして計算することで、Market %を計算します。
@PARENTVAL関数を使用して、市場次元の親のSales値を取得します。
各月の各市場における各製品のSales値を取得し、このSales値を、製品次元の現在のメンバーの親のSales値のパーセンテージとして計算することで、Product %を計算します。
@PARENTVAL関数を使用して、製品次元の親のSales値を取得します。
次の例では、各月の各市場における各製品に間接費を割り当てます。間接費は、各製品のSales値に基づいて、すべての製品の合計Salesのパーセンテージとして割り当てられます。
次の2つのメンバーをメジャー次元に追加していることを前提とします:
OH_Costs(割り当てる間接費用)
OH_TotalCost(合計間接費)
スクリプト例:
/* Declare a temporary array called ALLOCQ based on the Year dimension */ ARRAY ALLOCQ[Year]; /* Turn the Aggregate Missing Values setting off. If this is your system default, omit this line */ SET AGGMISSG OFF; /* Allocate the overhead costs for Actual values */ FIX(Actual) OH_Costs (ALLOCQ=Sales/Sales->Product; OH_Costs = OH_TotalCost->Product * ALLOCQ;); /* Calculate and consolidate the Measures dimension */ CALC DIM(Measures); ENDFIX
各メンバーの組合せについて、合計SalesのパーセンテージとしてSales値を一時的に保管するために、ALLOCQという1次元の配列を作成します。
ALLOCQのサイズは、年次元のメンバー数によって決まります。
#MISSING値はその親に集約されません(SET AGGMISSG OFF)。親レベルで保管されているデータ値は上書きされません。
SET AGGMISSG OFFがシステムのデフォルトの場合、この行を省略します。#MISSING値の集計を参照してください。
次の例では、@ALLOCATE関数を使用して、2つの製品の支出カテゴリに合計支出の予算を割り当てます。合計支出の予算は、前年の実績値に基づいて割り当てられます。
図137のアウトラインに示すように、次の変更が行われていることを前提とします:
ColasとRoot Beerについて、それぞれデータ値1000と2000がBudget -> Total Expensesにロードされていることを前提とします。この値は、PY ActualのTotal Expensesの欠落していない子に基づいて値を均等に分配して、各支出カテゴリに割り当てる必要があります。割当て値は、最も近いドルに丸める必要があります。
スクリプト例:
/* Allocate budgeted total expenses based on prior year */ FIX("Total Expenses") Budget = @ALLOCATE(Budget->"Total Expenses", @CHILDREN("Total Expenses"),"PY Actual",, spread,SKIPMISSING,roundAmt,0,errorsToHigh) ENDFIX
Budget PY Actual Colas Marketing 334 * 150 Payroll #MI #MI Lease 333 200 Misc 333 100 Total Expenses 1000 450 Root Beer Marketing 500 300 Payroll 500 200 Lease 500 200 Misc 500 400 Total Expenses 2000 1100
* 丸め誤差がこの値に追加されています。手順5を参照してください。
Essbaseでは、データベース内を循環して、次の計算が実行されます:
FIXステートメントに@ALLOCATEを付けて使用すると、計算パフォーマンスが向上することがあります。
Budget -> Colas -> Marketingの場合、各月のPY Actual -> Colasにおける、各支出カテゴリの欠落していない値の合計数で、1を除算します。
この場合は、Budget -> Colasに対する欠落していない支出値が3つなので、1を3で除算します。
手順2の値(.333)を取得し、その値にBudget -> Colas -> Total Expensesの値(1000)を掛け、最も近いドル(333)に丸めます。その結果はBudget -> Colas -> Marketingに配置されます。
Budget -> Colasの各支出カテゴリに対して手順2と手順3を繰り返し、次にBudget -> Root Beerに対して同じ手順を繰り返します。
計算スクリプトで指定されたとおりに、割当て値を最も近いドルの整数に丸めます。
Essbaseは、ブロックに2回目のパスを行い、丸められた値の合計を割当て値に等しくします(たとえば、Budget -> Colas -> Total Expensesの場合は1000)。この例では、支出カテゴリの合計は1000ではなく999なので、Budget -> Colas -> Total Expensesに1の丸め誤差があります。すべての割当て値は同じ((333)なので、丸め誤差1が割当て範囲の最初の値Budget -> Colas -> Marketingに追加されます(このため、値が334になります)。
次の例では、@MDALLOCATE関数を使用して3つの次元に合計支出の予算のロードされた値を割り当てます。合計支出の予算は、前年の実績値に基づいて割り当てられます。
この例の場合、Eastの州全体で製品100の子の支出カテゴリに値750(Budget -> Total Expenses -> Product -> East -> Jan)を割り当てる必要があります。割当てでは、PY Actualからの値を使用して、各カテゴリの比率を決定します。
/* Allocate budgeted total expenses based on prior year, across 3 dimensions */ SET UPDATECALC OFF; FIX (East, “100”, “Total Expenses”) BUDGET = @MDALLOCATE(750,3,@CHILDREN(“100”),@CHILDREN("Total Expenses"),@CHILDREN(East),"PY Actual",,share); ENDFIX
Jan PY Actual Marketing Payroll Misc Total Expenses 100–10 New York 94 51 0 145 Massachusetts 23 31 1 55 Florida 27 31 0 58 Connecticut 40 31 0 71 New Hampshire 15 31 1 47 100-20 New York 199 175 2 376 Massachusetts #MI #MI #MI #MI Florida #MI #MI #MI #MI Connecticut 26 23 0 49 New Hampshire #MI #MI #MI #MI 100-30 New York #MI #MI #MI #MI Massachusetts 26 23 0 49 Florida #MI #MI #MI #MI Connecticut #MI #MI #MI #MI New Hampshire #MI #MI #MI #MI 100 New York #MI #MI #MI #MI Massachusetts 12 22 1 35 Florida 12 22 1 35 Connecticut 94 51 0 145 New Hampshire 23 31 1 55 East 237 220 3 460
Essbaseでは、データベース内を循環して、次の計算が実行されます:
East、100の子およびTotal Expensesを確定します。
FIXステートメントに@MDALLOCATEを付けて使用すると、計算パフォーマンスが向上することがあります。
割当てを実行する前に、各製品と州の組合せについて、PY Actualでの各支出カテゴリの比率を使用して、750の各支出カテゴリへの配分比率(割り当てる値)を決定します。PY Actual -> 100-10 -> New Yorkから始めて、Essbaseでは最初の支出カテゴリMarketingの値を、PY Actual-> 100-10 -> East -> Total Expensesの値で割って、そのカテゴリの比率を計算します。
たとえば、EssbaseでPY Actual -> 100-10 -> New York -> Marketingの値(94)をPY Actual -> 100-10 -> East -> Total Expensesの値(460)で割ると、Marketingカテゴリの比率(約20.4%)が算出されます。
各支出カテゴリ、各製品と州の組合せに対して、手順2を繰り返します。
割当て時にEssbaseでは、手順2と手順3で計算した比率を使用して、各製品と州の組合せに対して、BudgetのTotal Expensesの各子への750の配分比率を決定します。
たとえば、Marketingの場合、Essbaseでは手順手順2で計算した20.4%という数値を使用して、750の20.4%(約153)を取得して、その割当て値をBudget -> 100-10 -> New York -> Marketingに配置します(この手順の下に記載されている結果を参照してください)。
手順2と手順3で計算したPY Actualでの比率を使用して、各支出カテゴリおよび各製品と州の組合せに対して、手順4を繰り返します。
Budgetの割当ての結果:
Jan Budget Marketing Payroll Misc Total Expenses 100–10 New York 153.26 83.15 0 236.41 Massachusetts 37.50 50.54 1.63 89.67 Florida 44.02 50.54 0 94.56 Connecticut 65.22 50.54 0 115.76 New Hampshire 24.26 50.54 1.63 76.63 100-20 New York #MI #MI #MI #MI Massachusetts #MI #MI #MI #MI Florida 42.39 37.50 0 79.89 Connecticut #MI #MI #MI #MI New Hampshire #MI #MI #MI #MI 100-30 New York #MI #MI #MI #MI Massachusetts #MI #MI #MI #MI Florida #MI #MI #MI #MI Connecticut #MI #MI #MI #MI New Hampshire 19.57 35.87 1.63 57.07 100 New York 153.26 83.15 0 236.41 Massachusetts 37.50 50.54 1.63 89.67 Florida 86.41 88.04 0 174.46 Connecticut 65.22 50.54 0 115.76 New Hampshire 44.02 86.41 3.26 133.70 East 386.41 358.70 4.89 750
次の例は、特定の製品で特定の利益を得るために達成する必要がある売上高を計算する方法を示しています。この例では、計算スクリプトで、1月の目標15,000 Profitを達成するためにSalesのBudget値を調整します。
図138のアウトラインに示すように、「動的計算」のタグが付けられているメンバーがないこと、および(メジャー次元のRatiosの下にある) 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では、次の計算を実行します:
Budget値を保管するためのRollbackという1次元配列を宣言します。
Rollbackのサイズは、メジャー次元のメンバー数によって決まります。
LOOPとENDLOOPの間のコマンドが、メンバーの組合せに対して35回循環されます。ただし、Quit変数が1に設定された場合、LOOPは中断され、計算はENDLOOPコマンドの後に続行されます。
Budget -> Sales値をRollback一時配列変数に置きます。
Target値(15000)とAcceptableErrorPercent値(0.001)を乗算し、許容誤差を計算します。その結果はAcceptableError変数に配置されます。
PctNewVarChange値(0.1)と現在のSales値を乗算し、現在のSales値を加算して、新しいSales値を計算します。その結果はSalesに配置されます。
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コマンドの後に続行されます。
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
次の例では、線形回帰予測法を使用して、選択した前月の既知のデータ値から始まり、既知の値に基づく予測値へと続くトレンド(@TREND)、つまり線を作成します。また、既知のデータ値への適合度について、トレンドの結果を検査する方法を示します。この例では、計算スクリプトで、6月から12月の売上高データを予測します。5月までのデータが揃っていることを前提とします。
メジャー次元に子ErrorLRが追加されていることを前提とします。この子には、適合度の結果が配置されます。
スクリプト例:
Sales (@TREND(@LIST(Jan,Mar,Apr),@LIST(1,3,4),, @RANGE(ErrorLR,@LIST(Jan,Mar,Apr)), @LIST(6,7,8,9,10,11,12), Jun:Dec,LR););
表89に、予測計算スクリプトで使用されるパラメータを示します:
表 89. 将来値を予測するための計算スクリプト例で使用されるパラメータ
Essbaseでは、データベース内を循環して、次の計算が実行されます:
YlistとXlistパラメータで指定されたとおりに、トレンドで基になる既知のデータ値(Jan、Mar、AprのSales)を検索します。
YforecastListパラメータで指定されたとおりに、線形回帰を使用してトレンド線を計算し、その結果をJunからDecのSalesに置きます。
Jan、MarおよびAprのデータ値に対するトレンド線の適合度を計算し、その結果をそれぞれの月のErrorLRに置きます。
たとえば、1月のErrorLR値(4.57)は、Essbaseによってトレンド線が計算された結果、1月のSales値(2339)とトレンド線上の1月の値の間の差異が4.57であることを意味します。2月と5月は、Ylistに含まれていないので、そのErrorLR値は#MISSINGです。
100 West Actual Sales ErrorLR Jan 2339 4.57 Feb 2298 #MI Mar 2313 -13.71 Apr 2332 9.14 May 2351 #MI Jun 2315.14 #MI Jul 2311.29 #MI Aug 2307.49 #MI Sep 2303.57 #MI Oct 2299.71 #MI Nov 2295.86 #MI Dec 2292 #MI