@CALCMODE
この関数を使用すると、式の実行にブロック・モードを使用するかセル・モードを使用するかを手動で制御できます。ブロック・モードは通常は高速ですが、ブロック内のセル間に依存関係がある場合は、完全な計算には使用できません。セル・モードでは、各セルが、アウトライン内の密ディメンションの順序で計算されます。たとえば、SalesYTD = CurMth + PriorMth
は、それぞれの月がアウトラインの順序で計算されるように、セル・モードで計算する必要があります。
ハイブリッド・キューブでは、セルの計算は、ブロック・メンバーの解決順序によって決まった順序で実行されます。
@CALCMODEは、次の2種類のモードを制御できます。
-
特定の関数(@ISMBRなど)を含む数式を計算するときに、数式がブロック計算モードで計算されるかセル計算モードで計算されるか
-
スパース・メンバーに割り当てられる式がボトムアップ・モードで計算されるかトップダウン・モードで計算されるか
ブロック計算モードとセル計算モードの理解
ブロック計算モードを使用すると、Essbaseは、ブロック内のセルをグループ化し、同時に各グループ内のセルを計算します。ブロック計算モードは高速ですが、結果のデータが正確になるように、ブロック内のデータ依存性を慎重に検討する必要があります。
セル計算モードを使用すると、Essbaseは、アウトライン内の密ディメンションの順序に基づく計算順序に従って、各セルを順番に計算します。
ボトムアップ計算モードとトップダウン計算モードの理解
Essbaseは、ボトムアップ計算(デフォルト)またはトップダウン計算の2つの方法のいずれかを使用してアウトラインの完全な計算を実行します。アウトラインに複雑なメンバー式が含まれている場合、Essbaseはそのメンバーに対してトップダウン計算を実行します。数式がコンパイルされるときに、数式がトップダウンで計算される場合、Essbaseはアプリケーション・ログ・ファイルにメッセージを記録します。
ボトムアップ計算の場合、Essbaseは、データベースを計算する前に、どの既存のデータ・ブロックを計算する必要があるかを判断します。次に、Essbaseは、データベース全体の計算中に計算する必要のあるブロックのみを計算します。この計算は、既存の最小ブロック番号から始まり、既存の最後のブロックに到達するまで、後続の各ブロックを通して実行されます。
対照的に、トップダウン計算では、メンバーを持つすべての潜在的データ・ブロックに対して式が計算されます。トップダウン計算は、必要以上に多くのブロックが計算される可能性があるため、ボトムアップ計算よりも効率が悪い場合があります。トップダウン計算はボトムアップ計算よりも効率的ではありませんが、計算結果が正しいことを保証するために、トップダウン計算が必要な場合があります。例4を参照してください。
構文
@CALCMODE (CELL|BLOCK|TOPDOWN|BOTTOMUP)
ノート
セル・モードとブロック・モードは相互に排他的です。トップダウン・モードとボトムアップ・モードは相互に排他的です。1つの@CALCMODE指定内で指定できるオプションは1つだけです。両方の種類のモードを指定するには、命令を2回実行します。この例は次のとおりです。
@CALCMODE (CELL)
@CALCMODE (TOPDOWN)
ブロック計算モード(Essbase構成設定CALCMODEがBLOCKに設定されている場合は有効になっている)は、フェデレーテッド・パーティション・キューブには適用できません。計算処理はAutonomous Data Warehouseにプッシュされます。例外が存在し計算がかわりにEssbaseサーバーで処理される場合は、解決順序によって依存関係分析が決定されます。
Essbaseによるセル・モードまたはブロック・モードおよびトップダウン・モードまたはボトムアップ・モードの使用基準の理解
-
Essbaseが式をコンパイルすると、次のメッセージのように、式の実行モードを説明するメッセージがアプリケーション・ログ・ファイルに出力されます。
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などの複雑な数式の場合、Essbaseはトップダウン計算を実行します。これは、Aのすべての可能な組合せを調べて、B->DかC->Dが存在するかどうかを確認する必要があるためです。
-
デフォルトでは、Essbaseは、次を含む数式にセル計算モードを使用します。
-
@ANCEST
-
@CURRMBR
-
密メンバー上の@ISMBR
-
@MDANCESTVAL
-
@MDPARENTVAL
-
@MDSHIFT
-
@NEXT
-
@PARENT
-
@PARENTVAL
-
@PRIOR
-
@SANCESTVAL
-
@SPARENTVAL
-
@SHIFT
-
@XWRITE
他のすべての数式の場合、Essbaseはデフォルトでブロック計算モードを使用します。
-
- Essbaseは、FIX...ENDFIXブロック内でVARを使用する(シリアル計算中)、またはFIXPARALLEL...ENDFIXPARALLELブロック内でTHREADVARを使用する(並列計算中)計算スクリプトをセル・モードで計算します。
ブロック計算モードでのデータ依存関係の問題の理解
1つ以上のメンバーの正確な計算が別のメンバーに依存するか、以前に計算されたメンバーに依存する場合、データ依存性が発生します。ブロック計算モードでのデータ依存性の問題のほとんどは、数式にIF ELSE条件またはIF ELSEIF条件が含まれている場合に発生します。ただし、データ依存性は他の数式で発生する可能性があります。たとえば、@PRIOR関数を使用する場合です。
IF ELSEおよびIF ELSEIFのデータ依存性の問題
Essbaseがブロック計算モードを使用して、IF ELSE条件またはIF ELSEIF条件を含む式を計算する場合、計算されるメンバーを2つのグループに分けます。最初のグループには、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の値)です。
次のように、値10、20、30をJan、Feb、MarのBudget Salesデータ・ブロックにロードするとします。
表3-17 Budget Salesデータ・ブロックにロードされた値
(軸) | Jan | Feb | Mar |
---|---|---|---|
Budget Sales | 10 | 20 | 30 |
Essbaseは、ブロック計算モードを使用して、最初にIF条件を満たすメンバーを計算します。この例では、FebがIF条件を満たす唯一のメンバーです。Essbaseは、Febを計算した後、メンバーのJanとMarを計算します。この例では、結果は次のように予想されます。
表3-18 ブロック計算モードの結果
(軸) | Jan | Feb | Mar |
---|---|---|---|
Budget Sales | 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に基づいて計算します。次の結果になることを求めています。
表3-19 目的の計算結果
(軸) | Jan | Feb | Mar |
---|---|---|---|
Budget Sales | 110 | 100 | 120 |
次のように、値10、20、30をJan、Feb、MarのBudget Salesデータ・ブロックにロードするとします。
表3-20 Budget Salesデータ・ブロックにロードされる値
(軸) | Jan | Feb | Mar |
---|---|---|---|
Budget Sales | 10 | 20 | 30 |
Essbaseは、ブロック計算モードを使用して、最初にIF条件を満たすメンバーを計算し、次にELSEIF条件を満たすメンバーを計算し、次にELSE条件を満たすメンバーを計算します。この例では、Essbaseは、Mar、Jan、Febの順序でメンバーを計算します。JanとMarの計算はFebの計算に依存し、FebはJanとMarの後に計算されるため、目的の結果どおりになりません。不正確な結果は次のとおりです。
表3-21 Budget Salesデータ・ブロックの不正確な計算
(軸) | Jan | Feb | Mar |
---|---|---|---|
Budget Sales | 30 | 100 | 40 |
目的の結果を得るには、@CALCMODE(CELL)を使用します。
例3
次の式は、@PRIOR関数を使用して、Opening InventoryメンバーとEnding Inventoryメンバーを計算します。Opening InventoryとEnding Inventoryの間にはデータ依存性があります。この数式は、Opening Inventoryメンバーに配置されます。この例は、1月、2月、3月の結果を示しています。
@CALCMODE(BLOCK)
"Opening Inventory"=@PRIOR("Ending Inventory")+10;
"Ending Inventory"="Opening Inventory";
計算前は、これらのメンバーのデータはありません(データは#MISSINGまたは#MIです)。
表3-22 在庫計算前の欠落データ
(軸) | Jan | Feb | Mar |
---|---|---|---|
Opening Inventory | #MI | #MI | #MI |
Ending Inventory | #MI | #MI | #MI |
ブロック計算モードを使用して、Essbaseはメンバーを同時に計算し、前月のEnding Inventory #MISSING値をすべてのメンバーの組合せに対して0として、10を加算します。これは目的の結果ではありません。
表3-23 不正確な在庫計算の結果
(軸) | Jan | Feb | Mar |
---|---|---|---|
Opening Inventory | 10 | 10 | 10 |
Ending Inventory | 10 | 10 | 10 |
Opening Inventoryメンバーの次の数式により、Essbaseはセル計算モード(@PRIORを含む数式のデフォルト)を使用します。
"Opening Inventory"=@PRIOR("Ending Inventory")+10;
"Ending Inventory"="Opening Inventory";
結果は次のとおりです。
表3-24 セル計算モードの在庫結果
(軸) | Jan | Feb | Mar |
---|---|---|---|
Opening Inventory | 10 | 20 | 30 |
Ending Inventory | 10 | 20 | 30 |
例4
数式とデータの構造に応じて、数式をトップダウンで計算する場合とボトムアップで計算する場合を比較すると、パフォーマンス(実行する必要がある計算の数を反映)と精度の2つの問題が関係する可能性があります。この例では、計算結果を比較して、これらの問題の両方を説明します。
計算の前に、ActualとBudgetがスパース・ディメンションのメンバーであり、次のデータが含まれているとします。
表3-25 ActualメンバーとBudgetメンバーのデータ
(軸) | Cola | New York Sales |
---|---|---|
(軸) | Actual | Budget |
Jan | #MISSING | 50 |
Feb | 200 | #MISSING |
Mar | 400 | 450 |
次の式はボトムアップで計算されます。
Budget(
@CALCMODE(BOTTOMUP);
Budget=Actual*1.10;
)
ボトムアップ計算では、Essbaseは既存のデータ・ブロックからのみ数式を実行します。したがって、Budgetの既存の組合せに基づいて、JanとMarの2つの値のみが計算されます。
表3-26 ActualとBudgetのボトムアップ計算結果
(軸) | Cola | New York Sales | (コメント) |
---|---|---|---|
(軸) | Actual | Budget | - |
Jan | #MISSING | #MISSING | (#MISSING*1.10) |
Feb | 200 | #MISSING | (計算は実行されません) |
Mar | 400 | 440 | (400*1.10) |
次の式はトップダウンで計算されます。
Budget(
@CALCMODE(TOPDOWN);
Budget=Actual*1.10;
)
トップダウン計算では、Essbaseは、計算に関連するすべての潜在的なデータ・ブロックを具体化し、それらのブロックで数式を実行します。したがって、Jan、Feb、Marの3つの値はすべて、Budgetのすべての潜在的な組合せに基づいて計算されます。結果は次のようになります。
表3-27 ActualとBudgetのトップダウン計算結果
(軸) | Cola | New York Sales | (コメント) |
---|---|---|---|
(軸) | Actual | Budget | - |
Jan | #MISSING | #MISSING | (#MISSING*1.10) |
Feb | 200 | 220 | (200*1.10) |
Mar | 400 | 440 | (400*1.10) |