集約ストレージとMDXアウトライン式

ブロック・ストレージ・アウトラインの式を記述するために、Essbaseでは、一連の計算関数、および計算機(Calc)言語と呼ばれる演算子が提供されています。計算機言語を使用して、集約ストレージ・データベースのメンバー式を作成することはできません。集約ストレージ・アウトラインの式はMDXを使用して記述します。

次のセクションでは、ブロック・ストレージから集約ストレージに移行されたアウトラインの計算機式をMDXで書き換えるための情報を提供します。数式を書き直す前に、集約ストレージのアウトラインの基本的な動作をよく理解している必要があります。

計算機関数のMDX関数への変換

計算機式をMDXに変換するときは、ブロック・ストレージ・アウトラインと集約ストレージ・アウトラインの次の違いに注意してください。

  • メンバーのストレージ特性、したがってそれに関連するすべてのセルは、動的計算(および動的計算/保管)属性と保存された属性を介してブロック・ストレージ・アウトラインで定義されます。このような属性は、集約ストレージ・アウトラインには存在しません。明示的にタグ付けされた勘定科目ディメンションに沿った上位レベルのメンバーと、数式が添付されたメンバーは、このようなデータベースで常に動的に計算されます。

  • ブロック・ストレージ・アウトラインでは、計算順序は、メンバーがアウトラインに表示される順序に依存しますが、数式は集約ストレージ・アウトラインでの依存関係の順序で実行されます。さらに、セルの評価があいまいな場合の計算順序、および2パス計算タグは集約ストレージ・アウトラインでは必要ありません。

  • ブロック・ストレージ・アウトラインのレイアウトとディメンションの密および疎への分離は、特定の計算のセマンティクスに影響を与え、トップダウン計算モード、セルおよびブロック計算モード、方程式のブロック作成などの概念を生み出します。ディメンションを密と疎に分離しない集約ストレージ・アウトラインの単純さは、そのような概念を必要としません。

計算機の数式をMDXに変換するための一般的なガイドライン

このセクションでは、計算機の数式をMDXに変換するための一般的なガイドラインをいくつか示します。

集約ストレージ・アウトラインを使用するようにアプリケーションが再設計されていることを確認してください。この点で、経費のタグ付けに依存する分散関数や共有メンバー(@RDESCENDANTSなど)を操作する関数など、ブロック・ストレージ固有のアウトライン構造を数式が参照しないようにしてください。そのような構成は、集約ストレージ・アウトラインでは無効です。

MDXの直接の相対要素が存在する、明示的にタグ付けされた勘定科目ディメンションに添付された式の各関数を書き直します。表4-23に、具体的な情報と例を示します。次に、間接的な書き換えが必要な関数を特定します。表4-23は、これらの関数の情報と例も示しています。

ブロック・ストレージ・アウトラインの式の計算順序のセマンティクスを理解します。ブロック・ストレージと同じ結果が得られるように、集約ストレージ・アウトラインで従属式を慎重に整理します。

数式がカスタム定義関数またはマクロを参照している場合は、可能であれば、他のMDX関数を使用してそれらを書き直すことを検討してください。

次の表に、計算機言語のすべての関数とMDXの類似関数(およびその逆)を示します。直接アナログが存在しない場合は、変換ルールと例が提供されます。

表4-23計算機からMDX関数へのマッピング

計算機 MDX コメントと例
@ABS Abs

計算機

@ABS(Actual-Budget)

MDX

Abs([Actual]-[Budget])
@ALLANCESTORS Ancestors 共有メンバーは、集約ストレージ・アウトラインには関係しません。
@ALIAS 必要ありません。 MDXでは、@ALIASへの引数は外部関数にそのまま渡せます。
@ANCEST CurrentMemberを入力として持つAncestor。タプルを使用して、結果を@ANCEST関数の省略可能な3番目の引数と組み合せます。 計算機
@ANCEST(Product,2,Sales) 
MDX
( 
  Sales,
  Ancestor(
    Product.CurrentMember,
    Product.Generations(2)
   )
)
@ANCESTORS Ancestors 計算機
@ANCESTORS("New York")
MDX
 Ancestors([New York].parent, [Market].levels(2))
@ANCESTVAL CurrentMemberを入力として持つAncestor。タプルを使用して、結果を@ANCESTVAL関数の省略可能な3番目の引数と組み合せます。 計算機
@ANCESTVAL(Product,2,Sales) 
MDX
(Sales, 
  Ancestor(
   Product.CurrentMember,
   Product.Generations(2)
  )
 ).Value
@ATTRIBUTE Attribute

計算機

@ATTRIBUTE(Can)

MDX

Attribute([Can])
@ATTRIBUTEBVAL [BaseDim] .CurrentMember.AttributeDim MDXプロパティについて計算機を参照してください。
@ATTRIBUTEBVAL(Caffeinated)
MDX
Product.CurrentMember.Caffeinated
@ATTRIBUTESVAL [BaseDim] .CurrentMember.AttributeDim MDXプロパティについて計算機を参照してください。
@ATTRIBUTESVAL("Pkg Type")
MDX
Product.CurrentMember.[Pkg Type]
@ATTRIBUTEVAL [BaseDim] .CurrentMember AttributeDim MDXプロパティについて計算機を参照してください。
@ATTRIBUTEVAL(Ounces)
MDX
Product.CurrentMember.Ounces
@AVG

@AVGに設定された入力のすべての要素のディメンションが同じである場合は、Avgを使用します。SKIPNONEをINCLUDEEMPTYに変換します。

@AVGに設定された入力のすべての要素のディメンションが同じでない場合は、タプルを明示的に追加し、セットのカーディナリティ(セット内のタプルの数)で除算して平均を算出します。

MDX Avg関数は、デフォルトで欠落しているセル値をスキップすることに注意してください。

計算機

@AVG(SKIPMISSING, @CHILDREN(East))

MDX

Avg([East].Children)

SKIPMISSINGがSKIPNONEに置き換えられた場合、変換は次のように変更されます。

Avg([East].Children, Sales, INCLUDEEMPTY)

SKIPZEROの場合、変換は次のとおりです。

Avg([East].Children,
  IIF(Market.CurrentMember.Value=0, Missing,
    IIF(Market.CurrentMember= Missing,0,
        Market.CurrentMember.Value
    )
  )
 )

SKIPBOTHの場合、変換は次のとおりです。

Avg([East].Children,
     IIF(Market.CurrentMember=0, Missing,
         Market.CurrentMember.Value)
   )
@AVGRANGE CrossJoin (first argument, set created out of second argument)。入力セットのすべての要素のディメンションが同じである場合、残りは@AVGに似ています。

計算機

@AVGRANGE(SKIPMISSING, Sales, @CHILDREN(West))

MDX

Avg(CrossJoin({Sales},{[West].Children)})

SKIPMISSINGがSKIPNONEに置き換えられた場合、変換は次のようになります。

Avg({[West].Children)},Sales,INCLUDEEMPTY)

SKIPZEROが使用される場合、変換は次のようになります。

Avg([West].Children),
 IIF(Sales = 0,  Missing,
    IIF(Sales =  Missing, 0, Sales)
    )
 )
@CHILDREN Children

計算機

@CHILDREN(Market)

MDX

Children(Market)

または

Market.Children
@CONCATENATE Concat

計算機

@MEMBER(@CONCATENATE("Qtr1", "1"));

MDX

Concat("01", "01")
@CORRELATION MDXではサポートされません。 .
@COUNT

SKIPNONEの場合はCountを使用します。

SKIPMISSINGの場合はNonEmptyCountを使用します。

SKIPZEROの場合、次の列の例を参照してください。

SKIPBOTHの場合、Count (Filter(set, value <> 0 && value <> MISSING))を使用します。

計算機

@COUNT(SKIPMISSING,@RANGE(Sales, Children(Product)))

MDX

NonEmptyCount(CrossJoin({Sales},{Product.Children}))

Countは常に空のセルを含めてカウントしますが、NonEmptyCountはカウントしないことに注意してください。

SKIPNONEの場合、変換は次のとおりです。

Count(Product.Children)

SKIPZEROの場合、変換は次のとおりです。

NonEmptyCount
 (Product.Children,
  IIF(Sales=0,  Missing,
   IIF(Sales =  Missing, 0, sales)
  )
 )
@CURGEN Generation (CurrentMember(dimension))

計算機

@CURGEN(Year)

MDX

Year.CurrentMember.Generation
@CURLEV Level (CurrentMember(dimension))

計算機

@CURLEV(Year)

MDX

Year.CurrentMember.Level
@CURRMBR CurrentMember

計算機

@CURRMBR(Product)

MDX

[Product].CurrentMember
@CURRMBRRANGE RelMemberRange

計算機

@CURRMBRRANGE(Year, LEV, 0, -1, 1)

MDX

RelMemberRange
      (Year.CurrentMember, 1, 1, LEVEL)
@DESCENDANTS Descendants (member) 例については、MDX Descendantsのドキュメントを参照してください。
@EXP Exp

計算機

@EXP("Variance %"/100);

MDX

Exp([Scenario].[Variance %]/100)
@FACTORIAL Factorial

計算機

@FACTORIAL(5)

MDX

Factorial(5)
@GEN, @LEV Generation, Level .
@GENMBRS, @LEVMBRS layer.Members .
@IALLANCESTORS Ancestors 共有メンバーは、集約ストレージ・アウトラインには関係しません。
@IANCESTORS Ancestors 共有メンバーは、集約ストレージ・アウトラインには関係しません。
@ICHILDREN Union(member, member.Children)

計算機

@ICHILDREN(Market)

MDX

Union({Market}, {Market.children})
@IDESCENDANTS Descendants(member)

計算機

@IDESCENDANTS(Market)

MDX

Descendants(Market)
@ILSIBLINGS MemberRange (member.FirstSibling,member)

計算機

@ILSIBLINGS(Florida)

MDX

MemberRange(Florida.FirstSibling, Florida.Lag(1))
@INT Int

計算機

@INT(104.504)

MDX

Int(104.504)
@ISACCTYPE IsAccType 例については、MDX IsAccTypeのドキュメントを参照してください。
@ISANCEST IsAncestor

計算機

@ISANCEST(California)

MDX

IsAncestor(Market.CurrentMember, California)
@ISCHILD IsChild 例については、MDX IsChildのドキュメントを参照してください。
@ISDESC 例を参照してください。

計算機

@ISDESC(Market)

MDX

IsAncestor([Market], [Market].Dimension.CurrentMember)

または

Count(Intersect({Member.Descendants}, 
  {Member.dimension.CurrentMember}) = 1
@ISGEN IsGeneration

計算機

@ISGEN(Market, 2)

MDX

IsGeneration(
  Market.CurrentMember, 2)
@ISIANCEST IIF(Is(member, ancestormember) OR IsAncestor(member, ancestormember), <true-part>, <false-part>)

計算機

@ISIANCEST(California)

MDX

IIF(
  IS(Market.CurrentMember, California)
   OR 
  IsAncestor(Market.CurrentMember, California),
  <true-part>, <false-part>
)
@ISIBLINGS Siblings(member) 指定したメンバーおよびその兄弟を含むセットを返します。
@ISICHILD IIF(Is(member, childmember) OR IsChild(member, childmember), <true-part>, <false-part>)

計算機

@ISICHILD(South)

MDX

IIF(
 Is(Market.CurrentMember,South)
  OR 
 IsChild(Market.CurrentMember,South),
 <true-part>, <false-part>
)
@ISIDESC 例を参照してください。

計算機

@ISIDESC(South)

MDX

(Count(Intersect({[South].Descendants}, {South}) = 1
OR
Is(CurrentMember, [South]))
@ISIPARENT IIF(Is(member, parentmember)

計算機

@ISIPARENT(Qtr1) 

MDX

IIF(
  Is(Time.CurrentMember, [Qtr1])
   OR 
  IsChild([Qtr1], Time.CurrentMember),
  <true-part>, <false-part>)
@ISISIBLING IsSibling(member, siblingmember)

計算機

@ISISIBLING(Qtr2)

MDX

IIF(
     IsSibling( 
     [Qtr2], Time.CurrentMember
         ),
 <true-part>, <false-part>
)
@ISLEV IsLevel .
@ISMBR IIF(Count(Intersect (member-set, member)) = 1, true-part, false-part) 計算機を使用すると、MDXセットのルールにサブスクライブしていないメンバーまたはクロス・メンバーのコレクションを2番目の引数として表示できます。この機能は、2番目のセットの各要素を列挙し、交差をテストしないかぎり、簡単に複製することはできません。

ただし、2番目の引数がMDXセット・ルールにサブスクライブしている場合は、次に示すように、変換が簡単になります。例:

計算機

@ISMBR("New York":"New Hampshire")

MDX

IIF(
 Count(
   Intersect(
    {MemberRange([New York],[New Hampshire])},
    {Market.CurrentMember}
   )
  ) = 1,
 <true-part>, <false-part>
)
@ISPARENT IsChildを使用します。

計算機

@ISPARENT("New York")

MDX

IsChild(Market.CurrentMember,[New York])
@ISSAMEGEN,@ISSAMELEV IIF (member.Generation = CurrentMember(dimension).Generation, <true-part>, <false-part>)

計算機

@ISSAMEGEN(West)

MDX

IIF(
 Ordinal(
   Market.CurrentMember.Generation
 ) 
 = Ordinal(West.Generation),
 <true-part>, <false-part>
)
@ISSIBLING IsSibling 例については、MDX IsSiblingのドキュメントを参照してください。
@ISUDA IsUda 例については、MDX IsUdaのドキュメントを参照してください。
@LIST . メンバー・セットがMDXセット・ルールにサブスクライブしていない場合、明示的な列挙が必要です。rangelistの場合、CrossJoin(member, set)を使用します。
@LN, @LOG, @LOG10 Ln, Log, Log10 .
@LSIBLINGS

@RSIBLINGS

MemberRange(member.FirstSibling, member.Lag(1))

MemberRange(member.Lead(1), member.LastSibling)

計算機

@LSIBLINGS(Qtr4)

MDX

MemberRange([Qtr4].FirstSibling, [Qtr4].Lag(1))

計算機

@RSIBLINGS(Qtr1)

MDX

MemberRange([Qtr1].Lead(1), [Qtr1].LastSibling)
@MATCH . .
@MAX Max 引数リストがセットの場合、Maxを使用します。それ以外の場合、引数リストを明示的に列挙することで、ケース構造を使用してロジックを書き換えます。

計算機

@MAX(Jan:Mar)

MDX

Max(MemberRange([Jan], [Mar]))
@MAXRANGE Max

計算機

@MAXRANGE(Sales, @CHILDREN(Qtr1))

MDX

Max(
  CrossJoin(
    {Sales},
        {[Qtr1].Children}
  )
)
または
Max([Qtr1].Children, Sales)
@MAXS Max

計算機

@MAXS(SKIPMISSING,Sales,@CHILDREN(Qtr1))

MDX

Max(
  Children([Qtr1]),Sales)
)

SKIPZEROの場合、変換は次のとおりです。

Max (Children ([Qtr1]), IIF (Sales = 0, MISSING, Sales))

SKIPBOTHの場合、Maxはデフォルトで欠落値をスキップするため、変換はSKIPZEROの場合と同じです。

@MAXSRANGE Max

計算機

@MAXSRANGE(SKIPMISSING, Sales, @CHILDREN(Qtr1))

MDX

Max(
  Children([Qtr1]),Sales)
)

SKIPZEROの場合、変換は次のとおりです。

Max (Children ([Qtr1]), IIF (Sales = 0, MISSING, Sales))

SKIPBOTHの場合、Maxはデフォルトで欠落値をスキップするため、変換はSKIPZEROの場合と同じです。

@MDANCESTVAL 例に示すように、AncestorValueCurrentmemberを使用します。

計算機

@MDANCESTVAL(2, Market, 2, Product, 2, Sales)

MDX

MeasuresディメンションからのSales、Marketディメンションに沿った現在のメンバーの祖先、Productディメンションに沿った現在のメンバーの祖先から構成されるタプルを作成します。次に、タプルの値を取得します。

(Sales, Ancestor(Market.CurrentMember, 2),
 Ancestor(Product.CurrentMember, 2)).Value
@MDPARENTVAL 例に示すように、ParentValueCurrentMemberを使用します。

計算機

@MDPARENTVAL(2, Market, Product, Sales)

MDX

MeasuresディメンションからのSales、Marketディメンションに沿った現在のメンバーの親、Productディメンションに沿った現在のメンバーの親から構成されるタプルを作成します。次に、タプルの値を取得します。

(Sales, Market.CurrentMember.Parent, 
 Product.CurrentMember.Parent).Value
@MDSHIFT @NEXTに相当するMDXを参照し、シフトする必要のあるディメンションごとにこれを繰り返します。CrossJoinは各ディメンションの結果を取得し、最終的なタプルの値を取得します。@MDANCESTVALのコメントを参照してください。 .
@MEDIAN MDXではサポートされません。 .
@MEMBER MDXでは必要ありません。 .
@MERGE Union(set1,set2) @MERGEへの入力として指定されたリストが、MDXセットのルールにサブスクライブしていない場合、@MERGE関数は変換できません。次の例では、リストがMDXセット・ルールにサブスクライブしていることを前提としています。

計算機

@MERGE(@CHILDREN(East),@CHILDREN(West))

MDX

{Union([East].Children, [West].Children)}
@MIN Min 引数リストがセットである場合、Minを使用します。それ以外の場合、引数リストを明示的に列挙することで、ケース構造を使用してロジックを書き換えます。

計算機

@MIN(Jan:Mar)

MDX

Min(MemberRange([Jan], [Mar]))
@MINRANGE Min

計算機

@MINRANGE(Sales, @CHILDREN(Qtr1))

MDX

Min(
  CrossJoin(
    {Sales},
        {[Qtr1].Children}
  )
)
または
Min([Qtr1].Children, Sales)
@MINS Min

計算機

@MINS(SKIPMISSING,Sales,@CHILDREN(Qtr1))

MDX

Min(
 Filter(
  Children([Qtr1]),
  Sales <> Missing
 )
)

SKIPZEROの場合、変換は次のとおりです。

Min(
 Filter(
  Children([Qtr1]),
  Sales <> 0
 )
)

SKIPBOTHの場合、変換は次のとおりです。

Min(
 Filter(
  Children([Qtr1]),
  Sales <> 0 AND
  Sales <> Missing
 )
)
@MINSRANGE Min

計算機

@MINSRANGE(SKIPMISSING, Sales, @CHILDREN(Qtr1))

MDX

Min(
 Filter(Children([Qtr1]), 
  Sales <> Missing
 )
)

SKIPZEROの場合、変換は次のとおりです。

Min(
 Filter(Children([Qtr1]), 
  Sales <> 0
 )
)

SKIPBOTHの場合、変換は次のとおりです。

Min (
 Filter(Children([Qtr1]), 
  Sales <> 0 AND
  Sales <> Missing
 )
)
@MOD Mod .
@MODE MDXではサポートされません。 .
@NAME MDXでは必要ありません。 .
@NEXT

@NEXT(member,[n, range])は、指定したメンバーからの範囲内のn番目のセル値を返します。指定したメンバーが範囲内に存在しない場合、関数は欠落値を返します。範囲が指定されていない場合、時間ディメンションのレベル0メンバーが使用されます。

MDXには、任意の範囲に対する同等の関数はありません。ただし、範囲が特定のレベルまたは世代のメンバーに制限されている場合は、NextMember (if n=1)またはLead/Lagは、サンプル変換に示されているように機能します。これはおそらく一般的なケースです。

計算機

@Next(Cash)

MDX

(NextMember(
 [Year].CurrentMember, LEVEL), 
 [Cash]).Value

代替:

計算機

@Next(Cash, 2)

MDX

CrossJoin(
  Year.CurrentMember.Lead(2, LEVEL),
  Cash).Value
@NEXTS MDXではサポートされません。 .
@PARENT Parent .
@PARENTVAL CurrentMemberを入力として持つParent。タプルを使用して、結果を@PARENTVAL関数の省略可能な2番目の引数と組み合せます。

計算機

@PARENTVAL(Market, Sales)

MDX

([Sales], [Market].CurrentMember.Parent).Value
@POWER Power .
@PRIOR

@PRIOR(member,[n, range])は、提供されたメンバーからの範囲内のn番目のセル値を返します。指定したメンバーが範囲内に存在しない場合、関数は欠落値を返します。範囲が指定されていない場合、時間ディメンションのレベル0メンバーが使用されます。

MDXには、任意の範囲に対する同等の関数はありません。ただし、範囲が特定のレベルまたは世代のメンバーに制限されている場合は、PrevMember (if n=1)またはLead/Lagは、サンプル変換に示されているように機能します。これはおそらく一般的なケースです。

計算機

@Prior(Cash)

MDX

PrevMember(Year.CurrentMember, LEVEL), [Cash]).Value

代替:

計算機

@Prior(Cash, 2)

MDX

(Year.CurrentMember.Lag(2, LEVEL), [Cash]).Value
@PRIORS MDXではサポートされません。 .
@RANGE CrossJoin(member, rangeset) 計算機は、範囲が指定されていない場合、時間ディメンションのレベル0メンバーを自動的に使用します。この機能はMDXには存在しないため、範囲を明示的に含める必要があります。

計算機

@RANGE(Sales, @CHILDREN(East))

MDX

CrossJoin({Sales}, {[East].Children})
@RANK MDXではサポートされません。これはベクター関数です。 .
@REMAINDER Remainder .
@REMOVE Except(set1, set2) 変換は、set1set2が本当のMDXセットである場合にのみ機能します。

計算機

@REMOVE(@CHILDREN(East),@LIST("New York",Connecticut))

MDX

Except ({[East].Children}, {[New York],[Connecticut]})
@ROUND Round .
@SHIFT @PRIORと@NEXTを参照してください。 .
@SIBLINGS Siblings .
@STDEV, @STDEVP, @STDEVRANGE MDXではサポートされません。 .
@SUBSTRING MDXではサポートされません。 .
@SUM Sum explistの各要素をタプルに変換します。そうすることで、タプルが集合的にセットを形成できるようにします。
@SUMRANGE Sum(CrossJoin(member, Xrangelist))

計算機

@SUMRANGE("New York",Jan:Jun)

MDX

Sum(CrossJoin({[New York]}, {[Jan]:[Jun]}))
@TODATE Todate .
@TRUNCATE Truncate .
@UDA Uda .
@VAR, @VARPER Arg1 - Arg2 集約ストレージ・アウトラインには費用タグがありません。そのため、差異機能はデフォルトで減算になります。
@VARIANCE, @VARIANCEP MDXではサポートされません。 .
@WITHATTR WithAttr .
@XRANGE MDXではサポートされません。 .
@XREF MDXではサポートされません。 .