不規則階層
不規則階層は、メンバ間の親子関係をサポートする特殊なタイプのエンティティです。不規則階層では、データはツリーに沿ってその場で集約されます。このような構造は、通常、財務レポートや組織構造で使用され、他の多くのビジネスモデルで一般的です。
不規則階層の例:

ツリー内のすべての項目は、同じエンティティのメンバです。各アイテムは複数の子を持つことができますが、親は1つだけです。子を持たないアイテムはリーフ(Leaves)と呼ばれ、データを格納できます。親を持たないアイテムはルート(roots)と呼ばれます。
この新しいタイプのエンティティはロールアップ・エンティティに似ていますが、メンバのコードがロールアップに沿って階層化されている必要があるという要件はありません。ロールアップ・エンティティは後方互換性のために引き続きサポートされますが、不規則階層はロールアップ・エンティティよりも柔軟性が高いため、不規則階層の使用を強くお勧めします。
不規則階層の有効化
不規則階層を有効にするには、データモデルのエンティティセクションでエンティティを選択し、プロパティ・パネルの[不規則階層(Unbalanced hierarchy)]チェックボックスをオンにします。
このフラグは、1つまたは複数のツリー内の既存の関係に関わらず、どのエンティティでも使用できます。不規則階層は、カスタム時間エンティティでは使用できません。

親子関係の構築
不規則階層を有効にすると、対象のエンティティは、親要素か子要素かに関係なく、常に階層自体のすべてのメンバが含まれます。
完全な不規則階層を作成するには、2つのデータリーダーが必要です。
- 階層の全メンバを選択したエンティティにインポートするデータリーダー
- 各メンバに親エンティティを割り当てる別のデータリーダー
親エンティティを持たないメンバは、ルートエンティティ、すなわち最も集約的なレベルのエンティティとみなされます。
親子関係を構造化するデータリーダーを設定するには、「データリーダー」セクションに移動し、新しいデータリーダーを構築します。マッピング・テーブルでは、不規則階層を含むエンティティは、通常の[コード(code)]と[説明(description)]フィー ルドに加えて、そのメンバに対して追加の[親(parent)]フィールドが表示されます。
子コードを[コード(code)]フィールドに、親コードを[親(parent)]フィールドにマッピングする必要があります。

または、データモデルの関係セクションから手動で親メンバを定義することもできます。これを行うには、エンティティとその同じエンティティ自身との間の関係を表示する必要があります。
親子関係を構築するには、メンバをクリックして、階層内のどのメンバが親になるかをツリーで選択します。

外部テーブルまたはファイルから不規則階層を読み込むには、まずデータリーダー(または手動)でエンティティ内のすべての親子項目を読み込み、次に関係を含む親子テーブルまたはファイルを読み込みます。
このインターフェイスでは、親子関係を定義するだけでなく、階層をツリー構造として確認することもできます。
これで、定義された階層に従ってデータを集約し、特定の選択を行うためのエンティティの準備が整いました。
ここで、そのディメンションに少なくとも1つの不規則階層エンティティを持つキューブを考えてみましょう。
このキューブは、ツリーのリーフからのデータのみを保持します。不規則階層に沿ってデータを集約する際、リーフ要素からのデータ以外のデータは無視されます。
このキューブを使用してレイアウトを実行すると、同じロジックに従ってデータが集約されます。
この集約ロジックは、以下の場合に適用されます。
- 不規則階層エンティティが、レイアウトで最もネストが深い(すなわち、[行(BY ROW)]フィールドで最も右の位置にある)。
- 不規則階層エンティティの選択が実行され、不規則階層エンティティがレイアウトの軸にない。
上記の集計ロジックは、以下の場合には適用されない。
- エンティティ内の不規則階層の親メンバに[参照(refer to)]条件が適用されている。
- 不規則階層エンティティがレイアウトの[列(BY COLUMN)]フィールドにある。
- 不規則階層エンティティがレイアウトで最もネストが深くない(つまり、[行(BY ROW)]フィールドの右端にない)。
- ブロック設定パネルの[RULES]メニューの[不規則階層を無効化(Disable Unbalanced hierarchy)]チェックボックスで、データブロックの集約が無効になっている。
- レイアウトがデータフローで使用されている
[行(BY ROW)]フィールドの不規則階層
不規則階層エンティティがレイアウトの[行(BY ROW)]フィールドに追加されると、値は階層に沿ってその場で集計されます。
レイアウトに表示される項目は、選択(Select)でフィルタされたものです。即時集計は選択(Select)フィルタの影響を受けないので、1つ以上の子を選択または除外しても、親項目の値は変化しないことに注意してください。選択(Select)フィルタは、レイアウトから返される行にのみ影響します。
例えば、3つのメンバで構成される階層を考えてみましょう。

このシナリオでは、MarginはCostとSalesの両方の親です。
キューブ内に物理的に保存されたデータは以下のとおりです。
- Cost -100
- Sales +1000
対応するデータビューには、以下の値が表示されます。

MarginとCostのみを選択すると、データビューには以下の値が表示されます。

不規則階層エンティティをレイアウトの[行(BY ROW)]フィールドに追加すると、ルールやNexelの数式を適用することも可能です。
エンティティの選択
不規則階層エンティティをレイアウトの[行(BY ROW)]フィールドに設定せず、選択(Select)を使用して親を選択したとします。その場合、その親には紐づく子の値の合計が表示されます。
前の例では、Marginを選択することで、データビューには合計900が表示されます。

ドリルダウン
エンティティが不規則階層の場合、エンティティ自体をドリルダウンすることで、次の階層にドリルダウンすることができます。このプロセスは、階層の最も深いレベルであるリーフレベルまで繰り返すことができます。
選択
選択ウィンドウでは、不規則階層エンティティがツリー図として表示されます。
ノードの横にある小さな矢印をクリックしてノードを展開し、選択範囲に追加したいエンティティメンバーの横にあるチェックボックスをオンにします。
ウィンドウの右上隅にある検索機能により、検索されたメンバと、そのメンバに関係するすべての親子関係が表示されます。
不規則階層の単一のエンティティメンバーに対して選択する際に特別に使用可能なオプションもあります。
- 子孫(Descendants)
- 子(Children)
- リーフ(Leaves)
- 祖先(Ancestors)
- 親(Parent)
- 兄弟(Siblings)

これらの選択は動的であり、不規則階層に変更を加えると、影響を受けるすべての選択に反映されます。
たとえば、特定のメンバの子メンバの数が変更され、選択にそれらの子メンバが含まれる場合、選択は自動的に更新され、それに応じてメンバを含めたり除外したりします。
これらの機能はすべて、 縦一覧セレクタやポップアップウィンドウセレクタでも利用できます。また、レイアウトでの選択、プロシージャでの選択、画面選択、セキュリティでの選択でも利用できます。
子孫(Descendants)

このオプションは、選択したメンバのすべての子孫(子)を選択します。
オプションの横の値は、選択の深さを定義します。
- ALL : 任意のレベルにあるすべての子孫が選択されます
- 1 : 選択されたメンバから1レベル下のすべての子孫が選択されます。
- 2 : 選択されたメンバから2レベル下のすべての子孫が選択されます。
などです。
[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
[階層(hierarchy)]チェックボックスは、選択されたメンバと、選択の最大深度にあるメンバとの間のレベルを含めるかどうかを定義します。
子(Children)

このオプションは、選択したメンバの直系の子孫(子)を選択します。選択したメンバの子孫の子孫は選択されません。
[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
リーフ(Leaves)

このオプションは、選択したメンバの子孫であるリーフ・メンバを選択します。ノードは選択から除外されます。
[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
祖先(Ancestors)

このオプションは、ルート・メンバまで、選択されたメンバのすべての親メンバを選択します。
オプションの横の値は、選択の深さを定義します。
- ALL : 任意のレベルにあるすべての祖先が選択されます。
- 1 : 選択されたメンバより 1 レベル上のすべての祖先が選択されます。
- 2 : 選択されたメンバより 2 レベル上のすべての祖先が選択されます。
などです。
[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
[階層(hierarchy)]チェックボックスは、選択メンバとルート・メンバの間のレベルを含めるかどうかを定義します。
親(Parent)
このオプションは、選択したメンバの直接の親メンバを選択します。

[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
Siblings

このオプションは、選択したメンバのすべての兄弟を選択します。
[含む(Inclusive)]チェックボックスは、選択したメンバを選択に含めるかどうかを定義します。
不規則階層のソート
行の並べ替えは階層のツリー構造に従って行われるため、メンバはコード順や説明順には並べ替えられませんが、常にツリー図として表示されます。同じ親を共有している場合、メンバは エンティティの[ソート(Sort By)]フィールドで選択されたオプションに従って並べ替えられます。
レイアウトのソートオプションを使用して、個々のレイアウトのソート順を変更できます。
データエントリ
[行(BY ROW)]フィールドに不規則階層エンティティが追加されると、親メンバに対してデータ入力アクションを実行できるようになります。データは、Split&Splatのロジックに従って子メンバに比例配分されます。一方、リーフ上のデータ入力アクションは、それを保存する前に集約され、それを更新するためにデータモデルに送られます。
リーフ・データのみが保存されます。
セルがロックされると、以下のルールが適用されます。
- ロックされたセルがデータ入力を実行したセルの子孫である場合、そのセルはデータを再分配するときに無視され、その値は保持される。
- ロックされたセルがデータ入力を実行したセルの祖先である場合、その値は保持され、データは他のすべての子孫に再配分される。
ツリー内のエンティティ
ツリーオブジェクトのレイアウトに対して、[行(BY ROW)]フィールドに不規則階層エンティティが追加され、それが最も深いネストの位置である場合、ツリーは不規則階層を反映します。
