機械翻訳について

集約ストレージおよびMDXアウトライン式

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

次の項では、ブロック・ストレージから集約ストレージに移行されたアウトラインのMDXで計算機式をリライトする方法について説明します。 式をリライトする前に、集約ストレージ・アウトラインの基本的な動作を理解しておく必要があります。 集約ストレージの詳細は、「Essbaseキューブの設計およびメンテナンス」を参照してください。

計算関数からMDX関数への変換

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

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

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

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

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

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

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

MDXに直接対応するものが存在する、明示的にタグ付けされた勘定科目ディメンションに添付された式の各関数を書き換えます。 「表4-23」には、特定の情報と例が用意されています。 次に、間接リライトが必要な関数を特定します。 「表4-23」では、これらの関数の情報および例も提供しています。

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

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

次の表に、Calculator言語のすべての関数とMDXでの類似点(およびその逆)を示します。 直接アナ・ログが存在しない場合は、トランスフォーメーション・ルールおよび例が提供されます。

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

電卓 MDX Remarks/Examples
@ABS Abs

電卓

@ABS(Actual-Budget)

MDX

Abs([Actual]-[Budget])
@ALLANCESTORS Ancestors 共有メンバーは、集約ストレージ・アウトラインには関係ありません。
@ALIAS 必要ありません。 MDXでは、@ALIASへの引数をそのまま外部関数に渡すことができます。
@ANCEST 入力としてCurrentMemberを使用した「祖先」 タプルを使用して、結果を@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を使用した「祖先」 タプルを使用して、結果を@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 (「最初の引数」, 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 (「フィルタ」 (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 . 「メンバー」 .
@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を使用します。 それ以外の場合は、引数リストの明示的な列挙によって、Case構文を使用してロジックを書き換えます。

電卓

@MAX(Jan:Mar)

MDX

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

電卓

@MAXRANGE(Sales, @CHILDREN(Qtr1))

MDX

Max(
  CrossJoin(
    {Sales},
        {[Qtr1].Children}
  )
)
OR
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 例に示すように、「祖先」ValueおよびCurrentmemberを使用します。

電卓

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

MDX

MeasuresディメンションからのSales、マーケット・ディメンションに沿った現在のメンバーの祖先、およびProductディメンションに沿った現在のメンバーの祖先で構成されるタプルを構築します。 次に、タプルの値を取得します。

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

電卓

@MDPARENTVAL(2, Market, Product, Sales)

MDX

MeasuresディメンションからのSales、マーケット・ディメンションに沿った現在のメンバーの親、および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を使用します。 それ以外の場合は、引数リストの明示的な列挙によって、Case構文を使用してロジックを書き換えます。

電卓

@MIN(Jan:Mar)

MDX

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

電卓

@MINRANGE(Sales, @CHILDREN(Qtr1))

MDX

Min(
  CrossJoin(
    {Sales},
        {[Qtr1].Children}
  )
)
OR
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番目のセル値を戻します。 指定されたメンバーが範囲内に存在しない場合、この関数は欠落している値を戻します。 範囲が指定されていない場合、時間ディメンションのlevel-0メンバーが使用されます。

MDXには、任意の範囲に相当する関数はありません。 ただし、範囲が特定のレベルまたは世代のメンバーに制限されている場合、NextMember (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関数のオプションの秒引数と結合します。

電卓

@PARENTVAL(Market, Sales)

MDX

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

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

MDXには、任意の範囲に相当する関数はありません。 ただし、範囲が特定のレベルまたは世代のメンバーに制限されている場合、PrevMember (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) 範囲が指定されていない場合、計算機は自動的に時間ディメンションのlevel-0メンバーを使用します。 この機能はMDXには存在しないため、範囲を明示的に含める必要があります。

電卓

@RANGE(Sales, @CHILDREN(East))

MDX

CrossJoin({Sales}, {[East].Children})
@RANK MDXではサポートされません。 これはベクトル関数です。 .
@REMAINDER Remainder .
@REMOVE Except(set1, set2) 変換は、set1およびset2が真の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ではサポートされません。 .