@CALCMODE
Formulaの実行モードを選択できます。@CALCMODEでは、次の2つのタイプのモードを制御できます:
-
特定の関数(@ISMBRなど)を含む式を計算する際に、式をブロック計算モードとセル計算モードのどちらで計算するか
-
疎メンバーに割り当てられた式がボトムアップ・モードまたはトップダウン・モードのどちらで計算されるか
ブロック計算モードとセル計算モードの理解
Essbaseでは、ブロック計算モードを使用してブロック内のセルがグループ化され、各グループ内のセルが同時に計算されます。 ブロック計算モードは高速ですが、ブロック内のデータ依存性を慎重に考慮して、結果のデータが正確であることを確認する必要があります。
Essbaseでは、セル計算モードを使用して、アウトラインの密ディメンションの順序に基づく「計算順序」に従って、各セルが順次計算されます。
ボトムアップ計算モードとトップダウン計算モードの理解
Essbaseは、次のいずれかのメソッドを使用してアウトラインを完全に計算: ボトムアップ計算(デフォルト)またはトップダウン計算。 アウトラインに複雑なメンバー式が含まれている場合、Essbaseはそのメンバーに対してトップダウン計算を実行します。 Formulaのコンパイル時に、formulaをトップダウンで計算する場合、Essbaseはアプリケーション・ログ・ファイルにメッセージを記録します。
ボトムアップ計算の場合、Essbaseは、データベースを計算する前に計算する必要がある既存のデータ・ブロックを決定します。 Essbaseでは、データベース全体の計算中に計算する必要があるブロックのみが計算されます。 計算は、最も小さい既存のブロック番号から始まり、最後の既存のブロックに達するまで後続の各ブロックで実行されます。
対照的に、トップダウン計算では、メンバーを含む潜在的なすべてのデータ・ブロックの式が計算されます。 トップダウン計算は、必要以上に多くのブロックが計算される可能性があるため、ボトムアップ計算よりも効率が悪い場合があります。 トップダウン計算はボトムアップ計算より効率的ではありませんが、場合によっては、計算結果が正しいことを確認するためにトップダウン計算が必要になります。 「例」 4を参照してください。
構文
@CALCMODE (CELL|BLOCK|TOPDOWN|BOTTOMUP)
パラメータ
ノート
セル・モードとブロック・モードは相互に排他的です。 トップダウン・モードとボトムアップ・モードは相互に排他的です。 単一の@CALCMODE仕様では、指定できるオプションは1つのみです。 両方のモードを指定するには、次のように指示を2回実行します:
@CALCMODE (CELL)
@CALCMODE (TOPDOWN)
Essbaseがセル・モードまたはブロック・モード、およびトップダウン・モードまたはボトムアップ・モードを使用する場合の確認
-
EssbaseでFormulaをコンパイルすると、次のようなFormulaの実行モードを説明するメッセージがアプリケーション・ログ・ファイルに出力されます:
Formula on member Profit % will be executed in CELL and TOPDOWN mode.
Essbaseで式がブロック・モードおよびボトムアップ・モードで実行されると判断された場合、アプリケーション・ログ・ファイルにメッセージは書き込まれません。
-
計算スクリプトでは、@CALCMODE文をカッコで囲み、特定のデータベース・メンバーに関連付ける必要があります。
-
デフォルトでは、A = B + Cなどの単純な式の場合、Essbaseはボトムアップ計算を実行します。 Aは、BまたはCがデータベースに存在する場合にのみ計算されます。 計算が開始される前に、BおよびCに対する計算式の依存関係がわかります。
A = B->D + C->Dなどの複雑な式の場合、B->DまたはC->Dが存在するかどうかを確認するためにAの考えられるすべての組合せを調査する必要があるため、Essbaseはトップダウン計算を実行します。
-
デフォルトでは、Essbaseは次を含む式にセル計算モードを使用します:
-
@ANCEST
-
@CURRMBR
-
密メンバーに対する@ISMBR
-
@MDANCESTVAL
-
@MDPARENTVAL
-
@MDSHIFT
-
@NEXT
-
@PARENT
-
@PARENTVAL
-
@PRIOR
-
@SANCESTVAL
-
@SPARENTVAL
-
@SHIFT
-
@XWRITE
他のすべての式では、Essbaseはデフォルトでブロック計算モードを使用します。
-
ブロック計算モードでのデータ依存性の問題の理解
データの依存関係は、1つ以上のメンバーの正確な計算が、以前に計算されたメンバーに依存している場合に発生します。 ブロック計算モードでのデータ依存関係の問題のほとんどは、式にIF ELSEまたはIF ELSEIF条件が含まれている場合に発生します。 ただし、@PRIOR関数を使用する場合など、他の式ではデータの依存関係が発生する可能性があります。
IF ELSEおよびIF ELSEIFでのデータ依存性の問題
Essbaseでブロック計算モードを使用してIF ELSEまたはIF ELSEIF条件を含む式を計算する場合、計算されるメンバーは複数のグループに分割されます。 最初のグループには、IF条件を満たすメンバーが含まれます。 2番目のグループには、ELSEまたはELSEIF条件を満たすメンバーが含まれます。
Essbaseは、2番目のグループのメンバーを同時に計算する前に、最初のグループのメンバーを同時に計算します。 「例」 1を参照してください。
式にデータの依存関係が含まれている場合は、次の条件が満たされていることを確認します:
-
他のメンバーの正確な計算が依存するメンバーは、最初のグループに属します。
-
依存メンバーは2番目のグループに属します。
IF条件に複数のELSEIF条件がある場合、Essbaseは各ELSEIF条件を評価し、ELSEIF条件を満たすメンバーを最初のグループに配置し、後続のELSEIFまたはELSE条件を満たすメンバーを2番目のグループに配置します。 「例」 2を参照してください。
その他のデータ依存性の問題の理解
IF ELSE条件を含まない式では、データの依存関係が発生する可能性があります。 @PRIORを含む式でのデータ依存性の例は、「例3」を参照してください。
例
例1、例2および例3は、@CALCMODEのBLOCKおよびCELLオプションの使用方法を示しています。 「例4」は、BOTTOMUPおよびTOPDOWNオプションの使用方法を示しています。
例 1
時間と勘定科目の2つの密ディメンションを持つデータベースについて考えてみます。 次の式は、勘定科目ディメンションのBudget Salesメンバーに配置されます。 これは密メンバー(Budget Sales)に適用される@ISMBRを含む式であるため、Essbaseではデフォルトでセル計算モードが使用されます。 @CALCMODE(BLOCK)を使用して、この式のブロック計算モードを指定します。
@CALCMODE(BLOCK);
IF(@ISMBR(Feb))
"Budget Sales"=100;
ELSE
"Budget Sales"=Feb+10;
前述の式によると、計算されるメンバーがFebの場合、Budget Salesの値は100であると想定されています。 計算されるメンバーがFebでない場合、Budget Salesの値は100+10 (Feb + 10の値)です。
次のように、Jan、FebおよびMarのBudget Salesデータ・ブロックに値10、20および30をロードするとします:
表2-18予算販売データ・ブロックにロードされた値
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
予算販売 | 10 | 20 | 30 |
ブロック計算モードを使用して、Essbaseは最初にIF条件を満たすメンバーを計算します。 この例では、FebがIF条件を満たす唯一のメンバーです。 Febを計算した後、EssbaseはJanとMarのメンバーを計算します。この例では、結果は想定どおりです:
表2-19ブロック計算モードの結果
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
予算販売 | 110 | 100 | 110 |
例 2
ここで、例1と同じデータベースを考えてみますが、勘定科目ディメンションのBudget Salesメンバーに次の式を配置します。 例1と同様に、これは密ディメンション・メンバー(Budget Sales)に適用される@ISMBRを含む式であるため、Essbaseではデフォルトでセル計算モードが使用されます。 ただし、@CALCMODE(BLOCK)を使用して、この式のブロック計算モードを指定します。
@CALCMODE(BLOCK);
IF(@ISMBR(Mar))
"Budget"->"Sales"=Feb+20;
ELSEIF(@ISMBR(Jan))
"Budget"->"Sales"=Feb+10;
ELSE
"Budget"->"Sales"=100;
ENDIF
この式に従って、JanおよびMar Budget Salesの値をFeb Budget Salesの値(100)に基づいて計算します。 次の結果を確認します:
表2-20必要な計算結果
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
予算販売 | 110 | 100 | 120 |
次のように、Jan、FebおよびMarのBudget Salesデータ・ブロックに値10、20および30をロードするとします:
表2-21予算販売データ・ブロックにロードされた値
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
予算販売 | 10 | 20 | 30 |
ブロック計算モードを使用して、Essbaseは最初にIF条件を満たすメンバーを計算し、次にELSEIF条件を満たすメンバー、次にELSE条件を満たすメンバーを計算します。 この例では、Essbaseは次の順序でメンバーを計算 : Mar, Jan, Feb.の計算はJanとMarの計算に依存し、FebはJanとMarの後に計算されるため、結果は望ましくありません。不正確な結果は次のとおりです:
表2-22予算販売データ・ブロックの不正確な計算
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
予算販売 | 30 | 100 | 40 |
目的の結果を得るには、@CALCMODE(CELL)を使用します。
例 3
次の式は、@PRIOR関数を使用して、期首インベントリおよび期末インベントリ・メンバーを計算します。 期首インベントリと期末インベントリの間にはデータ依存関係があります。 式は期首インベントリ・メンバーに配置されます。 この例は、January、FebruaryおよびMarchの結果を示しています。
@CALCMODE(BLOCK)
"Opening Inventory"=@PRIOR("Ending Inventory")+10;
"Ending Inventory"="Opening Inventory";
計算の前に、次のメンバーのデータはありません(データは#MISSINGまたは#MIです):
表2-23インベントリ計算前の欠落データ
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
インベントリのオープン | #MI | #MI | #MI |
期末インベントリ | #MI | #MI | #MI |
Essbaseは、ブロック計算モードを使用してメンバーを同時に計算し、すべてのメンバーの組合せに対して前月の期末インベントリ#MISSING値を0として取得し、10を加算します。 これは望ましくない結果です。
表2-24インベントリ計算の不正確な結果
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
インベントリのオープン | 10 | 10 | 10 |
期末インベントリ | 10 | 10 | 10 |
期首インベントリ・メンバーの次の式により、Essbaseでセル計算モード(@PRIORを含む式のデフォルト)が使用されます:
"Opening Inventory"=@PRIOR("Ending Inventory")+10;
"Ending Inventory"="Opening Inventory";
結果は次のとおりです:
表2-25セル計算モード・インベントリ結果
(軸) | 1月 | 2月 | 3月 |
---|---|---|---|
インベントリのオープン | 10 | 20 | 30 |
期末インベントリ | 10 | 20 | 30 |
例 4
式とデータの構造によっては、式のトップダウンとボトムアップの計算に2つの問題が含まれる場合があります: パフォーマンス(実行する必要がある計算の数を反映)および精度。 この例では、計算結果を比較して、これら両方の問題を示します。
計算の前に、実績および予算が疎ディメンションのメンバーであり、次のデータが含まれているとします:
表2-26実績メンバーと予算メンバーのデータ
(軸) | コーラ | New York Sales |
---|---|---|
(軸) | 実績 | 予算 |
1月 | #MISSING | 50 |
2月 | 200 | #MISSING |
3月 | 400 | 450 |
次の式はボトムアップで計算されます。
Budget(
@CALCMODE(BOTTOMUP);
Budget=Actual*1.10;
)
ボトムアップ計算では、Essbaseは既存のデータ・ブロックからのみ式を実行します。 したがって、予算の既存の組合せに基づいて、JanとMarの2つの値のみが計算されます。
表2-27実績および予算のボトムアップ計算結果
(軸) | コーラ | New York Sales | (コメント) |
---|---|---|---|
(軸) | 実績 | 予算 | - |
1月 | #MISSING | #MISSING | (#MISSING*1.10) |
2月 | 200 | #MISSING | (計算は実行されません) |
3月 | 400 | 440 | (400*1.10) |
次の式はトップダウンで計算されます。
Budget(
@CALCMODE(TOPDOWN);
Budget=Actual*1.10;
)
トップダウン計算では、Essbaseは計算に関連するすべての潜在的なデータ・ブロックをマテリアライズし、それらのブロックで式を実行します。 したがって、Jan、FebおよびMarの3つの値はすべて、Budgetの考えられるすべての組合せに基づいて計算されます。 結果は次のとおりです:
表2-28実績および予算のトップダウン計算結果
(軸) | コーラ | New York Sales | (コメント) |
---|---|---|---|
(軸) | 実績 | 予算 | - |
1月 | #MISSING | #MISSING | (#MISSING*1.10) |
2月 | 200 | 220 | (200*1.10) |
3月 | 400 | 440 | (400*1.10) |