レベルの定義の詳細
ここでは、レベルの定義について詳しく説明します。
ソース値の指定に関する情報を含む基本情報については、"ディメンジョン、階層およびレベルの定義" を参照してください。
"このドキュメントに示したサンプルのアクセス方法" も参照してください。
メンバ・キーの一意性の保証
レベルに親レベルが存在する場合、メンバ・キーが一意でない 可能性があります。詳細は、"メンバ・キーおよび名前の適切な定義" を参照してください。どのメンバにも容易に直接アクセスできるようにするため、必ずメンバ・キーを各レベルで一意にすることをお勧めします。また、メンバ・キーは最初の 113 文字内で一意である必要があります。
ソース値と階層を考慮し、重複メンバ・キーが存在する可能性がある場合は、以下の操作を実行します。
-
ソース値のみを単独で使用する代わりに、ソース値と、親メンバに対して一意の他の値を連結します。例えば、CityName と呼ばれるソース・プロパティをレベルの基にし、異なる国に同名の市区町村が存在する可能性があるとします。[プロパティ] を指定するのではなく、[式] を指定します。以下のような式を使用します。
%source.CountryName_%source.CityName
-
このような連結文字列をメンバ名として使用しない場合は、ソース値として一意の値 (ID など) を使用します。次にレベルにプロパティを追加して、そのプロパティ値をメンバ名として使用します。このページで後述の "プロパティ値をメンバ名として使用する方法" を参照してください。
レベルに対するヌル置換文字列の指定
レベルの [ヌル置換文字列] オプションは、NULL 値の代わりに使用する文字列を指定します。この文字列は、キューブで指定したヌル置換文字列より優先されます。
リスト・ベースのレベルの定義
リスト、配列、または InterSystems IRIS® クラス・リレーションシップに基づくレベルを定義できます。それぞれの個別リスト項目は、そのレベルの別個のメンバとしてインデックスが作成されます (このようなレベルの詳細は、必ず "リスト・ベースのレベルの使用に関する注意" を参照してください)。
システムでは、データ型 %ListOpens in a new tab のソース値を直接使用できます。これは、$List 関数から返される形式か、文字区切りリストです。その他の形式については、ソース値を変換してから使用する必要があります。
Note:
リスト・ベースのレベルは、独自の階層に含める必要があります。この階層内に他のレベルが存在することはできません。
ソース値が標準形式の場合のレベルの定義
ソース値が、$List 形式、%ListOpens in a new tab 形式、または文字区切りリストで使用できる場合、前述のように、以下の追加手順を使用してレベルを定義します。
-
[ソース値リスト・タイプ] で、以下のいずれかを選択します。
-
[$List 構造] — ソース値が $List 関数で返される形式であるか、データ型 %ListOpens in a new tab である場合に使用します。
-
[コンマ区切り] — ソース値がコンマ区切りリストの場合に使用します。
-
[その他の区切り] — ソース値が別の文字を区切り文字として使用するリストの場合に使用します。
-
[その他の区切り] を選択した場合は、[リスト区切り文字] でリストの区切りに使用する文字を指定します。
例
SAMPLES ネームスペースの Patients キューブには、以下のリスト・ベースのレベルの例があります。
-
Allergies レベルは、ユーティリティ・メソッドを使用してリストを返すソース式に基づいています。
-
Allergy Severities レベルは、ユーティリティ・メソッドを使用してリストを返すソース式に基づいています。
-
Diagnoses レベルは、$List 形式のプロパティを使用します。
時間レベルの定義
時間レベルは、データ内の日付/時間値 (生年月日、注文日、回答日など) に従ってデータをグループ化します。ここでは、このタイプのレベルの作成方法について説明します。以下のトピックについて説明します。
概要
時間レベルは、時刻ディメンジョン内で定義されるレベルです。時間レベルのセットの例については、Patients キューブの BirthD ディメンジョンを参照してください。BirthD ディメンジョンは、ソース・クラスの BirthDate プロパティに基づきます。このプロパティには、患者の生年月日が含まれています。
このディメンジョンの各レベルは、[時間関数] と呼ばれるオプションを使用して、生年月日の特定の部分を抽出します。例えば、Year レベルは、生年月日の年の部分のみを抽出します。
結果 :
-
Decade レベルには、2010s、2000s、1990s などのメンバがあります。
-
Year レベルには、2009、2008 などのメンバがあります。
-
Quarter Year レベルには、Q1 2009、Q2 2009 などのメンバがあります。
-
Period レベルには、2009-01、2009-02 などのメンバがあります。
-
Date レベルには、Jan 1 2009、Jan 2 2009 などのメンバがあります。
-
階層 H1 内のレベルの順序によって、Decade レベルが Year レベルの親となるように設定されます。例えば、メンバ 1990s は、メンバ 1990、1991、1992 などの親になります。
同様に、Year レベルは Quarter Year レベルの親です。例えば、メンバ 2009 は、メンバ Q1 2009、Q2 2009 などの親になります。
時間のレベルでは、NOW と呼ばれる特殊なメンバを使用できます。このメンバは現在の日付 (実行時) を使用して、そのレベルの適切なメンバにアクセスします。
Note:
既定では、グレゴリオ暦が使用されます。代わりに、ヒジュラ暦を使用することもできます。その場合は、メンバ名はここに示したものとは異なります (レコードはヒジュラ暦に適した形でメンバに割り当てられます)。
ロケールを使用した時間メンバ名の制御
キューブの構築時、システムは、時間ディメンジョンのメンバの名前を決定するために、現在のサーバ・ロケールを使用できます。以下のようにして、関連するオプションを確認することをお勧めします。
-
管理ポータルで、[システム管理]、[構成]、[各国語の設定]、[ロケール定義] の順に選択します。
このページには現在のサーバ・ロケールが表示されます。
-
[ロケールの日付/時刻/数値の形式を使用する] オプションの設定を確認して、必要に応じて変更します。
このオプションが [はい] に設定されている場合、システムはこのページに表示されるロケールに基づいて、時間ディメンジョンのメンバを構築または同期します。
後でロケールを変更した場合は、キューブをリコンパイルおよび再構築する必要があります。
"システム管理ガイド" の "ロケール定義" も参照してください。
時間レベルの定義
時間レベルを定義する手順は以下のとおりです。
-
前述のようにディメンジョンを定義します。ただし、2 つ変更点があります。
ディメンジョンを定義すると、ディメンジョンと階層が作成されます。
-
この階層内でレベルを定義します。
この場合、データ・ディメンジョンとは異なるオプションが表示されます。
-
[関数で値を抽出] で、日付/時間値の必要な部分を抽出する関数を選択します。以下のテーブルのいずれかの値を使用します。ヒジュラ暦の場合は、すべての関数がサポートされるわけではないことに注意してください。
時間関数 |
格納される値 |
表示される値 |
ヒジュラ時間ディメンジョンでの使用可否 |
MinuteNumber |
60958,5083 |
01:24 |
はい |
HourNumber |
60958,5083 |
1am |
はい |
DayMonthYear |
60958 |
Nov 24 2007 |
はい |
DayNumber |
24 |
24 |
はい |
WeekYear |
2007W47 |
2007W47 |
いいえ |
WeekNumber |
47 |
47 |
いいえ |
MonthNumber |
11 |
November |
はい |
MonthYear |
200711 |
November 2007 |
はい |
QuarterNumber |
4 |
Q4 |
はい |
QuarterYear |
20074 |
Q4 2007 |
はい |
Year |
2007 |
2007 |
はい |
Decade |
1950 |
1950s |
はい |
DayOfWeek |
1 |
Sunday (日曜日) |
不可 |
-
[時刻形式] には、オプションで、日付の表示方法を説明する形式文字列を指定します。詳細は、最初のサブセクションを参照してください。
-
[ヒジュラ (観測)] 暦を使用している場合は、%Calendar.Hijri クラスを使用して太陰観測値を追加します。
詳細は、%Calendar.Hijri のクラスリファレンスを参照してください。
WeekYear 関数と WeekNumber 関数は、ISO 8601Opens in a new tab 標準 (1 ~ 53 の週番号を 1 年のすべての日付に割り当てる) に準拠しています。365 または 366 は 7 で割り切れないので、週数が 53 になる年があります。年の第 1 週は、その年の最初の木曜日が含まれる週として定義されています。これは、1 月 1 日が前年最終週に含まれる年があることを意味します。同様に、12 月 31 日が翌年第 1 週に含まれる場合もあります。
部分日付
[部分] の [暦] タイプを選択すると、データ内で不確実な日付を使用できます。[部分] の [暦] タイプが設定された時間レベルでは、前のセクションで説明されている、QuarterYear や MonthYearPartial のような特別なバージョンの時刻関数が使用されます。これらの時刻関数は、他の [暦] タイプの時刻関数と同じ名前を共有していますが、2018-05-02 のような完全な日付が必要な他の [暦] タイプの時刻関数とは異なり、2017 や 2017-01 のような部分的な日付値を受け付けることができます。その後、部分日付時刻関数は、これらの部分日付を 2017-00-00 や 2017-01-00 のような完全なキーに変換します。欠落している情報がある日付のセクションは、00 で表されます。例えば、部分日付 2017-01 の場合、年と月はありますが日がないので、部分日付時刻関数によって 2017-01-00 という形式に変換されます。部分日付時刻関数は、2017-00-00 や 2017-01-00 のような部分日付形式も受け付けます。
部分日付に基づく暦を時間レベルの基礎として使用する場合、アナライザで検出されたキーでは、00 の値はすべて Unknown というテキストに変換されます。この変換はローカライズされており、フォーマット・ルールに従っています。例えば、キー 2018-07-00 と時刻形式 ddd mm yyyy の場合、Unk 07 2018 というラベルが生成されます。さらに、不明な日付が含まれる各レベルは、これらの不明な日付を格納するための追加メンバを持ちます。例えば、QuarterYear 時刻関数を使用する QuarterYearPartial という名前のレベルは、部分日付が理由で四半期が不明になっている日付を表すため、Q0 2009 や Q0 2012 のようなメンバを持つ場合があります。QuarterYearPartial レベルには、既知の日付 (Q1 2009 や Q4 2010 など) に対するメンバも含まれる可能性があります。
現在のところ、部分日付の時間レベルでは NOW とオフセットの使用がサポートされています。現在のキーに不明な部分がある場合、NOW オフセットは適用できず、元のキーが返されます。
現在のところ、[部分] の [暦] タイプに基づく時間レベルでは、LAG や LEAD などの MDX クエリ関数の使用はサポートされていません。同様に、キューブ・クラスの <level> 要素の timeOffset プロパティおよび timeFormat プロパティを変更することによる日付オフセットもサポートされていません。
カスタムのデータ型の使用
以下のいずれかのシナリオでは、タイム・レベルのベースに、カスタムのデータ型を使用するプロパティを直接使用できます。
-
最初のシナリオでは、このデータ型はデータを ODBC 日付形式で格納します。データ型クラスの ClientDataType は TIMESTAMP である必要があります。値は、完全な $Horolog 日付に変換されます。
-
2 番目のシナリオでは、このデータ型はデータを $Horolog 時刻 ($Horolog 文字列の 2 番目の部分) として格納します。データ型クラスの ClientDataType は TIME である必要があります。値は、完全な $Horolog 日付に変換されます。(日付の選択は任意であるため、このデータは時間レベルおよび分レベルに対してのみ使用する必要があります。)
%DeepSee.UtilsOpens in a new tab の %ConvertDate() の実装を参照してください。
時間レベルおよび階層
既に述べているように、階層内のレベルの順序はレベルのメンバの作成方法に影響します。同一階層内の隣接する 2 つのレベルでは、最初のレベル (レベル A) が 2 番目のレベル (レベル B) の親になります。階層は親子階層であるため、以下のようになります。
-
レベル A のメンバはすべて、レベル B の 1 つ以上のメンバの親です。
-
レベル B のメンバはすべて、レベル A の 1 つのメンバの子です。
-
レベル B の特定のメンバに属するレコードはすべて、必ずレベル A の同一メンバに属します。
このため、例えば [年] に基づくレベルが [四半期] に基づくレベルの親になることはできません。2 人の患者について考えてみましょう。1 人は 2007 年第 3 四半期に生まれ、もう 1 人は 1982 年第 3 四半期に生まれています。この 2 人の患者はいずれも Quarter レベルの同じメンバ (Q3) に属していますが、Year レベルでは異なるメンバ (それぞれ 2007 と 1882) に属しています。
また、例えば [月] に基づくレベルが [WeekNumber] に基づくレベルの親になることはできません。週は 2 つの月に渡ることがあるため、週メンバに属するレコードが必ずしも同じ月メンバに属しているとは限りません。
以下のテーブルは時間レベルとその一般的な子レベルを示しています。参考のため、各レベルのメンバ例も示しています。
時間関数に基づくレベル |
含まれるメンバの例 |
時間関数に基づく標準的な子レベル |
メモ |
Decade |
1950s |
Year、QuarterYear、MonthYear、または DayMonthYear |
このレベルは、日付のすべての部分を使用します。 |
Year |
2007 |
QuarterYear、MonthYear、または DayMonthYear |
このレベルは、日付のすべての部分を使用します。 |
QuarterYear |
Q4 2007 |
MonthYear または DayMonthYear |
このレベルは、日付のすべての部分を使用します。 |
MonthYear |
November 2007 |
DayMonthYear |
このレベルは、日付のすべての部分を使用します。 |
WeekYear |
2007W47 |
WeekNumber |
このレベルは、日付のすべての部分を使用します。 |
DayMonthYear |
Nov 24 2007 |
標準的な子レベルはなし |
このレベルは、日付のすべての部分を使用します。 |
QuarterNumber |
Q4 |
MonthNumber |
このレベルは、年に依存しません。 |
MonthNumber |
November |
標準的な子レベルはなし |
このレベルは、年に依存しません。 |
WeekNumber |
47 |
標準的な子レベルはなし |
このレベルは、年に依存しません。 |
DayNumber |
24 |
標準的な子レベルはなし |
このレベルは、年および年の部分に依存しません。 |
DayOfWeek |
Wednesday (水曜日) |
標準的な子レベルはなし |
このレベルは、年および年の部分に依存しません。 |
HourNumber |
1am |
MinuteNumber |
このレベルは、日に依存しません。 |
MinuteNumber |
01:24 |
標準的な子レベルはなし |
このレベルは、日に依存しません。 |
日付オフセットがあるカレンダーの処理
場合によっては、日付オフセットを含む財務カレンダーに時間レベルを一致させることが必要になります。例えば、会計年度は多くの企業で 10 月 1 日に開始します。以下のピボット・テーブルで考えてみましょう。
最も内側のグループ化では、このピボット・テーブルは実際の期間 (年と月の結合) によってレコードをグループ化します。例えば、実際の期間 2001 年 10 月に 14 レコードが関連付けられています。この期間は会計四半期にグループ化され、会計四半期は会計年度にグループ化されます。四半期 FY 2002–Q1 には、2001 年 10 月、11 月、12 月が含まれることに注意してください。
このような時間レベルの場合、スタジオでキューブ・クラスを編集し、<level> 要素の timeOffset プロパティと timeFormat プロパティを指定します。ここで示した例の場合は以下のようになります。
詳細は、"キューブ・クラスのリファレンス情報" の "日付オフセットの指定" を参照してください。
例
SAMPLES ネームスペースには、以下の時間レベルの例があります。
カスタム時間レベルの定義
時間を他の方法で使用するカスタム・レベルを定義できます。そのためには、以下の操作を実行します。
-
[タイプ] が ([時間] ではなく) [データ] であるディメンジョンを作成します。
-
レベルごとに、目的の値を返すように [式] に値を指定します。
-
このページで後述する "メンバの並べ替え順序の指定" を参照してください。
既定では、メンバはアルファベット順に並べ替えられます。
例
SAMPLES ネームスペースの Patients キューブでは、BirthWeekdayD ディメンジョンを参照してください。このディメンジョンの場合、式は以下のようになります。
$system.SQL.DAYNAME(%source.BirthDate)
このメソッドは、%SYSTEM.SQLOpens in a new tab クラスの DAYNAME() メソッドを実行します。このクラスには、データ値を処理するメソッドが大量に用意されています。
このディメンジョンを使用すると、以下のようにピボット・テーブルを作成できます。
このサンプル・ディメンジョンは、1 つのレベルのみ定義しています。適切なロジックを使用すると、例えば 4-4-5 カレンダーOpens in a new tabの週、月、および四半期を使用する階層を定義できます。
年齢レベルの定義
年齢レベルは、データ内のキューブの構築日付を基準にした年齢値に従ってレコードをグループ化します。例えば、(キューブの構築日付を基準に計算した) 年齢で患者をグループ化することができます。
Note:
年齢レベルを正確に維持するにはキューブを再構築する必要があります。InterSystems IRIS Business Intelligence のキューブ同期機能は、それらに対して何も作用しません。そのため、年齢レベルは通常お勧めしません。年齢でレコードをグループ化する必要がある場合、代わりに計算メンバを定義することをお勧めします。"年齢メンバの定義" を参照してください。
年齢レベルを定義する手順は以下のとおりです。
-
前述のようにディメンジョンを定義します。ただし、2 つ変更点があります。
-
[タイプ] で [年齢] を選択します。
-
[プロパティ] または [式] を指定します。
Important:
[プロパティ] を指定した場合、そのプロパティは $Horolog 形式であるか、データ型 %TimeStampOpens in a new tab (またはサブクラス) であることが必要です。
[式] を指定した場合、ソース式が $Horolog 形式のデータを返す必要があります。
ディメンジョンを定義すると、ディメンジョンと階層が作成されます。
-
この階層内でレベルを定義します。
この場合、データ・ディメンジョンとは異なるオプションが表示されます。
-
[関数で値を抽出] で、時間値の必要な部分を抽出する関数を選択します。以下の値のいずれかを使用します。
-
"Days" – 日単位で年齢を決定します。
-
"Months" – 月単位で年齢を決定します。
-
"Years" – 年単位で年齢を決定します。
Patients サンプルは、このタイプのレベルの説明には対応しないことに注意してください。Age、Age Bucket、および Age Group レベルは、架空の研究の患者を、研究の日付での年齢を基準にしてグループ化しています。これは遡及的な研究では一般的なことです。
範囲式の指定
データ・ディメンジョンのどのレベルでも、[範囲式] オプションを使用できます。このオプションを使用すると、実際のソース値の場所に新しい値を使用できます。数値データの場合、この変換によって、ソース値を個別なビンで置換できます。任意のデータに対して、この変換によって、置換文字列を指定できます。
どちらの場合も、新しい値がそのレベルのメンバの名前になります。この値は、メンバのキーにもなります。
範囲式を指定する手順は以下のとおりです。
-
[範囲式] フィールドの横にある検索ボタン をクリックします。
アーキテクトに以下のようなページが表示されます。
-
[元の値の形式] では、[数値範囲] または [文字列] のどちらかを選択します。
ここで選択した値は、このページの形式に影響します。
-
以下のように、一連の置換を追加します。
-
テーブルの最後に行を追加するには、[置換の追加] をクリックします。
詳細は、この後のサブセクションの指定に従って入力します。
-
行を削除するには、その行の [X] ボタンをクリックします。
行の順序によって、このレベルのメンバの既定の並べ替え順序が決まります。
-
[OK] をクリックして、このページを閉じます。
[範囲式] フィールドが以下のように表示されます (数値ビンの場合)。
(,0]:None;(0,0.2):1-19%;[0.2,0.5):20-49%;[0.5,1]:50%+;
または (文字列データの場合)
NONE:None;MINR:Minor;SERS:Serious;FATL:Fatal;UNK:Unknown;
メンバ名をローカライズ可能にするには、"InterSystems Business Intelligence の上級モデリング" の "レベルのメンバの手動指定" を参照してください。
数値ビンの定義
数値ビンを定義する場合、範囲式エディタは以下のように表示されます。
このテーブルの各行が、以下のように数値ビンを定義します。
-
行の左端のボタンは、下限の値を含む か、含まない かを示します。
下限が存在しない場合は、このオプションは何の効果も持ちません。
下限の値を含むとは、[下限] に示された値が範囲に含まれることを意味します。下限の値を含まないとは、[下限] の値が範囲に含まれないことを意味します。
-
[下限] は、指定されている場合は、ビンの下限を示します。
-
[上限] は、指定されている場合は、ビンの上限を示します。
-
行の右端のボタンは、上限の値を含む か、含まない かを示します。
上限が存在しない場合は、このオプションは何の効果も持ちません。
-
[置換値] は、このレベルのメンバ名として使用する文字列を指定します。ソース値が定義されている範囲内にあるレコードはすべて、このメンバに割り当てられます。
この値は、メンバのキーにもなります。
このレベルでは、ソース値がどの指定ビンにも該当しないレコードは無視されます。
文字列置換の定義
文字列置換を定義する場合、範囲式エディタは以下のように表示されます。
このテーブルの各行が、以下のように文字列置換を定義します。
このレベルでは、ソース値がどの元の指定値にも一致しないレコードは無視されます。
例
SAMPLES ネームスペースには、以下の範囲式の例があります。
表示値を使用するためのレベルの構成
InterSystems IRIS クラス・プロパティは、プロパティ・パラメータの VALUELIST と DISPLAYLIST によって、格納される値と表示される値の両方を保持できます。以下はその例です。
Property Gender As %String(VALUELIST = ",F,M", DISPLAYLIST = ",Female,Male");
このようなプロパティをレベルとして使用すると、既定では、VALUELIST パラメータで指定された値が使用されます。
レベル定義で [DISPLAYLIST の値を使用] オプションを選択すると、DISPLAYLIST パラメータで指定された値が使用されます。以下はその例です。
例
SAMPLES ネームスペースには、以下のような [DISPLAYLIST の値を使用] オプションを使用するレベルの例があります。
プロパティ値をメンバ名として使用する方法
既定では、レベルのソース値がそのレベルのメンバの名前になります。
代わりに、このレベルにプロパティを定義し、そのプロパティの値をメンバ名に使用することで、メンバ名を指定することができます。これは、以下のシナリオで役立ちます。
-
実行時にメンバ名へのアクセスを可能にする — 実行時にプロパティの値へのアクセスを可能にします (レベルの場合は異なります)。
-
メンバにわかりやすい名前を指定する — 場合によっては、わかりにくい一意の値をレベルの基にする必要があります。例えば、患者の一次診療医に基づくレベルがあるとします。人名は必ずしも一意であるとは限りません。このため、代わりに一意の医師 ID をレベルの基にする必要があるとします。この ID はユーザには無意味です。このような状況で、医師の名前にアクセスするプロパティも定義して、そのプロパティをメンバの名前として使用します。
レベルのメンバの名前にプロパティ値を使用する手順は以下のとおりです。
-
このレベルにプロパティを定義します。
レベルの各メンバにはこのプロパティの値があります。
-
このプロパティに対して [メンバ名として使用] オプションを選択します。
-
必要に応じて、実行時にプロパティ値を取得するには、[実行時に値を取得] オプションを選択します。
このオプションを使用する場合、以下の要件に注意してください。親レベル (取得するプロパティが含まれるレベル) では、そのレベルのソース・プロパティまたはソース式は ID として評価される必要があります。システムはそのことを想定して (少なくともこのレベルで)、ソース・データを正規化します。すなわち、そのレベルでは、データは別のテーブルに存在し、ソース・テーブルにはそのテーブルへのリンクが格納されます。
例
SAMPLES ネームスペースには、以下のような、[メンバ名として使用] または [実行時に値を取得]、あるいはその両方で構成されたプロパティを持つレベルの例があります。
-
Patients キューブの DxDoc レベル。このレベルには、Name プロパティがあります。このプロパティは、[メンバ名として使用] で構成されています。DxDoc レベルは、医師の一意の ID に基づいています。生成した患者の数によっては、同名の複数の医師が表示される場合があります。このレベルの定義方法により、これらの医師どうしは結合されません。
-
Patients キューブの City レベル。このレベルには、Name プロパティがあります。このプロパティは、[メンバ名として使用] と [実行時に値を取得] で構成されています。
-
HoleFoods Sales キューブの City レベルと Channel Name レベル。これらのレベルには、[メンバ名として使用] で構成されるプロパティがあります。
-
HoleFoods Sales キューブの Product Name レベル。このレベルには、[メンバ名として使用] と [実行時に値を取得] で構成されるプロパティがあります。
メンバの並べ替え順序の指定
ここでは、レベルのメンバの並べ替え順序を制御する方法を説明します。
データ・レベルの場合
データ・レベルの場合、既定では、メンバは以下のように並べられます。
データ・レベルのメンバの並べ替え順序を変更するには、後続のサブセクションで説明する方法のいずれかを使用します。
レベルのソート・オプションの指定
あるレベルのメンバに対するソート順序を指定する最も簡単な方法は、そのレベルの [ソート] オプションを設定することです。[昇順]、[昇順数値]、[降順]、または [降順数値] を選択します。
[昇順] と [降順] は、メンバをアルファベット順 (昇順または降順) に並べ替えます。[昇順数値] と [降順数値] は、数値順 (昇順または降順) に並べ替えます。
プロパティ値を基準にしたメンバの並べ替え
プロパティ値を基準にレベルのメンバを並べ替える手順は以下のとおりです。
-
このレベルにプロパティを定義します。
レベルの各メンバにはこのプロパティの値があります。
-
このプロパティには、[プロパティ値を基準にしたメンバの並べ替え] で [昇順]、[昇順数値]、[降順]、または [降順数値] のいずれかを選択します。
[昇順] と [降順] は、メンバをアルファベット順 (昇順または降順) に並べ替えます。[昇順数値] と [降順数値] は、数値順 (昇順または降順) に並べ替えます。
(既定では、いずれの値も選択されていません。また、プロパティはメンバの並べ替え順序に影響しません)。
レベルの複数のプロパティ内で [プロパティ値を基準にしたメンバの並べ替え] を指定すると、これらのプロパティのうち最初のプロパティでメンバが並べ替えられます。その後、これらのプロパティの 2 番目を基準に並べ替えられ、以下同様に実行されます。
例は、SAMPLES ネームスペースの Patients キューブを参照してください。このキューブで、Allergy Severities レベルには、[プロパティ値を基準にしたメンバの並べ替え] で構成されるプロパティがあります。このプロパティは、数値を返すソース式に基づいています。
プロパティ名をメンバ名として使用する方法
前述と同様のもう 1 つの方法として、以下の方法も使用できます。
-
メンバ名が望ましくなくても、必要な順序でメンバを並べ替える、レベルのソース式を使用します。
-
このレベルにプロパティを定義します。
-
このプロパティで、それぞれにより適した名前を返すソース値またはソース式を指定します。このプロパティに対して [メンバ名として使用] オプションを選択します。
時間レベルの場合
既定では、時間レベルのメンバは、時間によって昇順に並べ替えられています。
メンバに対して別の並べ替え順序を指定するには、[ソート] オプションを指定します。[昇順] (時間の昇順) または [降順] (時間の降順) のいずれかを選択します。
異なる階層に含まれるレベル間での依存関係の定義
場合によっては、相互に異なる階層に含まれるレベル間に、仮想依存関係が存在します。例えば、Country レベルと Product レベルを持つキューブがあるとします。これらのレベルは、論理的に相互に独立しています。理論上は、任意の製品を任意の国で販売できます。これらのレベルを同じディメンジョンの 1 つの階層に含めることは意味がありません。
しかし、特定の製品の販売先が特定の国々に限定される場合は、これらのレベル間に仮想依存関係が存在します。ユーザが国を選択したとき、望ましいのは、その国で販売可能な製品のみが表示されることです。そのような場合、以下のように、レベル間に依存関係を追加できます。
-
アーキテクトでキューブ・クラスを開きます。
-
依存レベルの定義を検索します。
-
[依存] オプションの値を編集します。以下のような値を使用します。
[dim].[hier].[level]
dim は他のディメンジョンの名前、hier は階層の名前、level はレベルの名前です。[dim].[hier].[level] は、そのレベルの MDX 識別子です。
以下はその例です。
[Region].[H1].[Country]
レベルが複数のレベルに依存する場合、コンマ区切りリストを指定します。以下はその例です。
[dim1].[hier1].[level1],[dim2].[hier2].[level2]
レベルの代わりにリレーションシップを指定することもできます。
このオプション属性はファクト・テーブルにインデックスを 1 つ追加するので、結果的に使用されるディスク容量が増えます。この属性は、控えめに使用してください。また、このオプションは、DependsOn コンパイラ・キーワードとはまったく関係ありません。
例
この機能の動作を確認するために、以下のデモを試してみます。
-
アーキテクトで Patients キューブを開きます。
-
PatGrpD ディメンジョンの Patient Group レベルを編集します。[依存] を以下のように指定します。
[HomeD].[H1].[ZIP]
-
キューブを保存して、コンパイルします。
-
ターミナルで、BI.Populate の ReassignPatients() メソッドを実行します。
d ##class(BI.Populate).ReassignPatients()
このメソッドは、Patient Group レベルと ZIP code レベルの間に仮想依存関係が存在するように、このサンプルのデータを変更します。特定の郵便番号の患者は、患者グループ A に属するか、どのグループにも属さないかのどちらかであり、別の郵便番号の患者は、患者グループ B に属するか、どのグループにも属さないかのどちらかです。
このメソッドはキューブを同期するので、その実行後にこのキューブを再構築する必要はありません。
Basic Dashboard Demo を開き、Home ZIP Code フィルタと Patient Group フィルタを試します。郵便番号を選択すると、Patient Group フィルタのリストに影響します。
ファクト・テーブル内のフィールド名の指定
キューブ・クラスのコンパイル時に、システムは 1 つのファクト・テーブル・クラスと、いくつかの関連クラスを生成します。キューブの構築時に、これらのテーブルに値が入力されます。詳細は、"ファクト・テーブルおよびディメンジョン・テーブルの詳細" を参照してください。
既定では、システムによってファクト・テーブルのフィールド名が生成されますが、その代わりに使用するフィールド名を指定することもできます。これを実行するには、各アプリケーション・レベルの [ファクト・テーブルのフィールド名] オプションに値を指定します。一意の名前を使用するように注意してください。このオプションは、時間レベルおよび NLP レベルには使用できません。
Important:
[ファクト・テーブルのフィールド名] には、SQL の予約語を使用しないでください。SQL 予約語のリストは、"InterSystems SQL リファレンス" の "予約語" を参照してください。名前は、英字かパーセント記号 (%) で始まる必要があります。最初の文字が % である場合、2 番目の文字は Z または z である必要があります。制約の詳細は、"サーバ側プログラミングの入門ガイド" の "クラス・メンバ" を参照してください。また、fact または listing という語は、どのような大文字と小文字の組み合わせであっても使用しないでください。