集約ストレージ・アウトラインでの式の開発
式は、データベース・アウトラインのメンバー間の関係を計算します。 ブロック・ストレージ・アウトラインでの式の使用に精通している場合は、集約ストレージ・アウトラインで式を使用する際に次の相違点を考慮してください:
-
Essbaseには、ブロック・ストレージ・アウトラインに式を記述するためのネイティブ計算言語が用意されています。 集約ストレージ・アウトラインの式を記述するには、MDX (多ディメンション式)言語を使用します。
-
式をデータベース・アウトラインのメンバーに直接適用します。 ブロック・ストレージ・データベースの場合、計算スクリプトに式を配置できます。 集約ストレージ・データベースの場合、計算スクリプトに式を配置できません。
この章では、MDXを使用して集約ストレージ・データベースに式を記述する方法について説明します。 MDXを使用した問合せの記述の詳細は、「MDX問合せの記述」を参照してください。 ブロック・ストレージ・アウトラインの式の記述の詳細は、「ブロック・ストレージ・データベースの式の開発」を参照してください。 MDX構文の詳細は、MDXを参照してください。
MDX式の使用
「An MDX」式は常にMDX数値式である必要があります。 MDXでは、数値式は、次のいずれかのアクションを実行する関数、演算子およびメンバー名の任意の組合せです:
-
値を計算
-
条件をテスト
-
算術演算を実行
数値式は、集合式とは異なります。 集合式は問合せ軸で使用され、メンバーとメンバーの組合せを記述します。 数値式は値を指定します。
数値式は、計算済メンバーを構築するために問合せで使用されます。計算済メンバーは、問合せのWITHセクションでアナリティク目的で作成される論理メンバーですが、アウトラインには存在しません。
次の問合せは、計算済メンバーを定義し、数値式を使用してその値を提供します:
WITH MEMBER
[Measures].[Prod Count]
AS
'Count (
Crossjoin (
{[Units]},
{[Products].children}
)
)', SOLVE_ORDER=1
SELECT
{[Geography].children}
ON COLUMNS,
{
Crossjoin (
{[Units]},
{[Products].children}
),
([Measures].[Prod Count], [Products])
}
ON ROWS
FROM
ASOsamp.Sample
サンプル問合せでは、WITH句によって、Measuresディメンションの計算済メンバーProduct Countが次のように定義されます:
WITH MEMBER
[Measures].[Prod Count]
数値式はWITH句の後に指定し、一重引用符で囲みます。 サンプル問合せでは、数値式は次のように指定されています:
'Count (
Crossjoin (
{[Units]},
{[Products].children}
)
)'
SOLVE_ORDERプロパティは、メンバーおよび式が評価される順序を指定します。 「計算順序」を参照してください。
数値式は、既存のアウトライン・メンバーの値を計算するMDX式としても使用できます。
したがって、サンプル問合せを作成するかわりに、サンプル問合せで仮定Prod Countが計算されたのと同じ方法でアウトラインで計算されるProd CountというMeasuresディメンションにアウトライン・メンバーを作成できます。
式を使用して計算済メンバーを作成するには:
アウトラインのメンバーに式を適用する前に、計算済メンバーを含むMDX問合せを記述できます。 必要な計算済メンバー結果を戻すMDX問合せを記述できるようになったら、数値式のロジックをアウトライン・メンバーに適用し、式を検証およびテストできます。 「MDX問合せの記述」を参照してください。
集約ストレージ・データベースの式の計算
Essbaseでは、データの取得時にのみ集約ストレージ・アウトラインの式が計算されます。 計算順序は計算結果に影響する可能性があります。 集約ストレージ・アウトラインの複数のディメンションでMDX式を使用する場合は、各メンバーまたはディメンションの解決順を設定することをお薦めします。 「計算順序」を参照してください。
ノート:
集約ストレージ・データベースの計算を設計する場合は、MDX式を含む集約ストレージ・データベース・メンバーが動的に計算されることを考慮してください。 動的に計算されたメンバーは、問合せが行われるまで#MISSINGの値を持ちます。
集約ストレージ・データベースの式の構文
集約ストレージ・アウトラインのメンバー式を作成する場合は、次のルールに従います:
-
次のいずれかの条件を満たす場合は、メンバー名を角カッコ(
[]
)で囲みます:-
数字で始めるか、空白を含めます(例:
[100]
)。 わかりやすく、コードを読みやすくするために、すべてのメンバー名に角カッコを付けることをお薦めします。 -
演算子またはfunction名と同じです。
-
ハイフン(
-
)、アスタリスク(*
)またはスラッシュ(/
)など、英数字以外の文字を含めます。
ノート:
式では、
$
または&
で始まるメンバー名を角カッコで囲む必要があります。 たとえば、$testmember
は式では["$testmember"]/100
として表されます -
-
IIF関数を使用して、単一のelse条件で条件テストを記述します。 IIF関数の構文では、else条件を識別するためのELSEIFキーワードや、文を終了するためのENDIFキーワードは必要ありません。 IIF関数をネストして、より複雑な式を作成できます。
-
Case、WHEN、THEN構成要素を使用して、複数の条件を持つ条件テストを記述します。
-
tuplesが正しく指定されていることを確認してください。 タプルは、同じディメンションから2つのメンバーを取得できないという制限があるメンバーのコレクションです。 タプルはカッコで囲みます(例:
(Actual,
Sales)
)。 -
setsが正しく指定されていることを確認してください。 セットは、1つ以上のタプルの順序付きコレクションです。 セットに複数のタプルがある場合は、次のルールが適用されます: セットの各タプルで、メンバーはセットの他のタプルのメンバーと同じディメンションを表す必要があります。 また、ディメンションは同じ順序で表される必要があります。 つまり、セットのすべてのタプルが同じdimensionalityを持つ必要があります。
「セットの指定に関する規則」を参照してください。
セットは中カッコで囲みます。次に例を示します:
{ [Year].[Qtr1], [Year].[Qtr2], [Year].[Qtr3], [Year].[Qtr4] }
集約ストレージ・アウトラインでの式の作成
式はプレーン・テキストです。 式を式エディタに直接入力するか、任意のテキスト・エディタで式を作成して式エディタに貼り付けることができます。
MDXベースの構文チェックでは、誤ったタイプの関数名や存在しないメンバーなど、式の構文エラーが示されます。 不明なメンバー名は、関数名のリストに対して検証できます。 サービス・インスタンスまたはアウトラインに関連付けられたアプリケーションに接続していない場合、Essbaseによって接続され、不明な名前が検証されることがあります。
式を検証または保存すると、構文チェックが行われます。 エラーはユーザー・インタフェースに表示されます。 エラーが発生した場合は、式を保存するかどうかを選択します。 エラーのある式を保存すると、アウトラインを保存するときに警告が表示されます。 エラーのある式を計算する場合、式は無視され、メンバーに値が指定されます。
構文チェッカでは、式のセマンティック・エラーについて警告できません。 セマンティック・エラーは、式が期待どおりに機能しない場合に発生します。 式のセマンティック・エラーを検出するには、式を定義する数値式を問合せに配置し、問合せを実行して結果が期待どおりであることを確認します。 式を問合せに配置する方法は、「MDX式の使用」を参照してください。
ディメンション構築データ・ソースに式を含めることができます。 「フィールド・タイプ情報の設定」を参照してください。
集約ストレージ・アウトラインでの式の構成
この項の次のトピックでは、集約ストレージ・アウトラインのメンバーに様々な式を記述する方法について説明し、その例を示します。
集約ストレージ・アウトラインの基本方程式
数学演算を数式に適用して、基本的な数式を作成できます。 たとえば、次の式は、ASOsamp.Sampleデータベースの平均単位/トランザクション・メンバーに適用されます:
[Units]/[Transactions]
平均ユニット/トランザクションの式では、ユニット数をトランザクション数で除算して、トランザクション当たりの平均ユニット数に到達します。
集約ストレージ・アウトラインでは、メンバーを費用アイテムとしてタグ付けできません。 したがって、費用タグを考慮して2つのメンバー間の差異を決定する@VARや@VARPERなどのCalcの関数は、集約ストレージ・アウトラインには関係ありません。
MDX減算演算子を使用して、2つのメンバー間の差異を計算できます。 たとえば、次の式をASOsamp.Sampleの価格差異という新しいメンバーに適用して、支払価格と当初価格の差異を計算できます:
[Price Paid]-[Original Price]
集約ストレージ・アウトラインのディメンション全体のメンバー
ASOsamp.Sampleには、合計に対する割合(%)というメンバーの式が用意されています。 このメンバー式は、トランザクションによって生成されるメジャー合計の割合を示します。 合計に対する割合(%)の式:
Transactions/
(Transactions,Years,Months,[Transaction Type],[Payment Type],
Promotions,Age,[Income Level],Products,Stores,Geography)
式では、メンバー(Transactions)をタプル(Transactions, Years, ...)で除算して指定します。 式には、すべてのディメンションの最上位メンバーがリストされます。つまり、現在の年メンバーのトランザクション・データではなく、Yearsディメンションのすべてのメンバーのトランザクション・データ、最初の2つの四半期の月のトランザクション・データ、すべての月のトランザクションなどです。 このように、合計に占める割合(%)の値は、トランザクションによって生成されるメジャー合計の割合を表します。
集約ストレージ・アウトラインの式での条件テスト
条件テストまたは一連の条件テストを使用してメンバーの値を決定する式を定義できます。 IIF関数を使用して、else条件でテストを実行します。 IIF関数をネストすると、より複雑な問合せを作成できます。
この例では、会社がクレジット・カード・トランザクションに対して支払う必要がある価格を表すメンバーの算式を指定します。これには5%の手数料が含まれます。 次の例では、Credit PriceメンバーがASOsamp.SampleデータベースのMeasuresディメンションに追加されていることを前提としています。 クレジット価格には次の算式があり、支払タイプがクレジット・カードの場合は支払価格に5%が加算されます。
IIF (
[Payment Type].CurrentMember=[Credit Card],
[Price Paid] * 1.05, [Price Paid]
)
CASE、WHEN、THEN構成要素を使用して、複数のテストおよびelse条件を持つ式を作成します。
Filter関数は、指定された検索条件の基準を満たす入力セットのタプルを返します。 たとえば、すべての製品のベースライン(100)を設定するには、次のようにベースライン・メンバーを追加し、その式を作成します:
Count(Filter(Descendants([PersonalElectronics],
[Products].Levels(0)),[Qtr1] > 100.00))
集約ストレージ・アウトラインの式でのUDAの指定
UDAは、メンバーに対して作成する単語またはフレーズです。 たとえば、Sample.Basicでは、Marketディメンションの最上位メンバーにUDA Small MarketまたはUDA Major Marketがあります。
このトピックで使用されているMajor Marketの例は、すべての主要な市場メンバーの販売合計を示すメンバーの式を作成する方法を示しています。 この例では、新しいメンバー(Major Market Total)がSample.Basicに追加されていることを前提としています。
-
MDXには、メンバーにUDAタグが関連付けられている場合にTRUEを戻すブール関数IsUDAが用意されています。 次の構文は、Marketディメンションの現在のメンバーにUDA Major Marketがある場合にTRUEを戻します:
IsUda([Market].CurrentMember, "Major Market")
-
Filter関数は、IsUDAとともに使用すると(次の構文に示すように)、Marketディメンションの各メンバーを循環し、Major Market UDAを持つ各メンバーの値を戻します:
Filter([Market].Members, IsUda([Market].CurrentMember, "Major Market"))
-
Sum関数は、Filter関数によって返された値を加算します。Major Marketの例では、次の式が生成されます:
Sum (Filter([Market].Members, IsUda([Market].CurrentMember, "Major Market")))
この式は、Major Market Totalメンバーに関連付けられています。