Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

レベルの定義の詳細

この章では、レベルの定義について詳しく説明します。以下のトピックについて説明します。

ソース値の指定に関する情報を含む基本情報については、前の章を参照してください。

メンバ・キーの一意性の保証

レベルに親レベルが存在する場合、メンバ・キーが一意でない 可能性があります。詳細は、このドキュメントで前述した “メンバ・キーおよび名前の適切な定義” を参照してください。どのメンバにも容易に直接アクセスできるようにするため、必ずメンバ・キーを各レベルで一意にすることをお勧めします。また、メンバ・キーは最初の 113 文字内で一意である必要があります。

ソース値と階層を考慮し、重複メンバ・キーが存在する可能性がある場合は、以下の操作を実行します。

  • ソース値のみを単独で使用する代わりに、ソース値と、親メンバに対して一意の他の値を連結します。例えば、CityName と呼ばれるソース・プロパティをレベルの基にし、異なる国に同名の市区町村が存在する可能性があるとします。[プロパティ] を指定するのではなく、[式] を指定します。以下のような式を使用します。

    %source.CountryName_%source.CityName
    
  • このような連結文字列をメンバ名として使用しない場合は、ソース値として一意の値 (ID など) を使用します。次にレベルにプロパティを追加して、そのプロパティ値をメンバ名として使用します。このドキュメント内で後述の “プロパティ値をメンバ名として使用する方法” を参照してください。

レベルに対するヌル置換文字列の指定

レベルの [ヌル置換文字列] オプションは、NULL 値の代わりに使用する文字列を指定します。この文字列は、キューブで指定したヌル置換文字列より優先されます。

リスト・ベースのレベルの定義

リスト、配列、または Caché クラス・リレーションシップに基づくレベルを定義できます。それぞれの個別リスト項目は、そのレベルの別個のメンバとしてインデックスが作成されます (このようなレベルの詳細は、必ずこのドキュメント内で前述の “リスト・ベースのレベルの使用に関する注意” を参照してください)。

DeepSee では、データ型 %ListOpens in a new tab のソース値を直接使用できます。これは、$List 関数から返される形式か、文字区切りリストです。その他の形式については、ソース値を変換してから使用する必要があります。

Note:

リスト・ベースのレベルは、独自の階層に含める必要があります。この階層内に他のレベルが存在することはできません。

ソース値が標準形式の場合のレベルの定義

ソース値が、$List 形式、%ListOpens in a new tab 形式、または文字区切りリストで使用できる場合、前述のように、以下の追加手順を使用してレベルを定義します。

  1. [ソース値リスト・タイプ] で、以下のいずれかを選択します。

    • [$List 構造] — ソース値が $List 関数で返される形式であるか、データ型 %ListOpens in a new tab である場合に使用します。

    • [コンマ区切り] — ソース値がコンマ区切りリストの場合に使用します。

    • [その他の区切り] — ソース値が別の文字を区切り文字として使用するリストの場合に使用します。

  2. [その他の区切り] を選択した場合は、[リスト区切り文字] でリストの区切りに使用する文字を指定します。

ソース値が他の形式の場合のレベルの定義

ソース値が、$List 形式で、または文字区切りリストとして使用できない場合は、以下の方法を使用します。

  1. 要求されるいずれかの形式に変換するユーティリティ・メソッドを作成します。以下はその例です。

    ClassMethod GetAllergies(ID As %Numeric) As %List
    {
        Set allergies=##class(DeepSee.Study.Patient).%OpenId(ID,0).Allergies
        If (allergies.Count()=0) {Quit $LISTFROMSTRING("No Data Available")}
        Set list=""
        For i=1:1:allergies.Count() {
            Set $LI(list,i)=allergies.GetAt(i).Allergen.Description
            }
        Quit list
    }
    

    以下の点に注意します。

    • %ListOpens in a new tab クラスは、$List 形式と同等です。

    • %OpenId() に対する 2 番目の引数によって、同時処理ロックが指定されます。この引数がゼロの場合、速度の確保のため、オブジェクトの他のユーザをチェックすることなくオブジェクトを開いています。オブジェクトから値を読み取るのみの場合は、複数ユーザの環境であってもこの方法が安全です。

    • アレルギーがない場合、このメソッドは文字列 No Data Available を返します。これは、返されるその他の文字列と同様にレベルのメンバになります。

    Tip:

    このユーティリティ・メソッドは、キューブ・クラスに配置できます。また、このメソッドはターミナル内で簡単にテストできます。

  2. レベルを定義するときは、アーキテクト内で以下のように操作します。

    1. [式] で、ユーティリティ・メソッドを起動し、引数として %source.%ID を渡します。以下はその例です。

      ##class(Cubes.StudyPatients).GetAllergies(%source.%ID)
      
    2. [リスト] を選択します。

    3. ソース値が文字区切りリストの場合は、[リスト区切り文字] でリストの区切りに使用する文字を指定します。

      これが NULL の場合、ソース値は $List 形式であるとみなされます。

SAMPLES ネームスペースの Patients キューブには、以下のリスト・ベースのレベルの例があります。

  • Allergies レベルは、ユーティリティ・メソッドを使用してリストを返すソース式に基づいています。

  • Allergy Severities レベルは、ユーティリティ・メソッドを使用してリストを返すソース式に基づいています。

  • Diagnoses レベルは、$List 形式のプロパティを使用します。

時間レベルの定義

時間レベルは、データ内の日付/時間値 (生年月日、注文日、回答日など) に従ってデータをグループ化します。ここでは、このタイプのレベルの作成方法について説明します。以下のトピックについて説明します。

概要

時間レベルは、時刻ディメンジョン内で定義されるレベルです。時間レベルのセットの例については、Patients キューブの BirthD ディメンジョンを参照してください。BirthD ディメンジョンは、ソース・クラスの BirthDate プロパティに基づきます。このプロパティには、患者の生年月日が含まれています。

このディメンジョンの各レベルは、[時間関数] と呼ばれるオプションを使用して、生年月日の特定の部分を抽出します。例えば、Year レベルは、生年月日の年の部分のみを抽出します。

結果 :

  • Decade レベルには、2010s2000s1990s などのメンバがあります。

  • Year レベルには、20092008 などのメンバがあります。

  • Quarter Year レベルには、Q1 2009Q2 2009 などのメンバがあります。

  • Period レベルには、2009-012009-02 などのメンバがあります。

  • Date レベルには、Jan 1 2009Jan 2 2009 などのメンバがあります。

  • 階層 H1 内のレベルの順序によって、Decade レベルが Year レベルの親となるように設定されます。例えば、メンバ 1990s は、メンバ 199019911992 などの親になります。

    同様に、Year レベルは Quarter Year レベルの親です。例えば、メンバ 2009 は、メンバ Q1 2009Q2 2009 などの親になります。

時間のレベルでは、NOW と呼ばれる特殊なメンバを使用できます。このメンバは現在の日付 (実行時) を使用して、そのレベルの適切なメンバにアクセスします。

Note:

既定では、DeepSee ではグレゴリオ暦が使用されます。代わりに、ヒジュラ暦を使用することもできます。その場合は、メンバ名はここに示したものとは異なります (レコードはヒジュラ暦に適した形でメンバに割り当てられます)。

ロケールを使用した時間メンバ名の制御

キューブを構築する際は、DeepSee は現在のサーバ・ロケールを使用して時間ディメンジョンのメンバの名前を決定できます。以下のようにして、関連するオプションを確認することをお勧めします。

  1. 管理ポータルで、[システム管理][構成][各国語の設定][ロケール定義] の順に選択します。

    このページには現在のサーバ・ロケールが表示されます。

  2. [ロケールの日付/時刻/数値の形式を使用する] オプションの設定を確認して、必要に応じて変更します。

    このオプションが [はい] に設定されている場合は、DeepSee はこのページに表示されるロケールに基づいて、時間ディメンジョンのメンバを構築または同期します。

後でロケールを変更した場合は、キューブをリコンパイルおよび再構築する必要があります。

"Caché 追加構成設定リファレンス" の “ロケール定義” も参照してください。

時間レベルの定義

時間レベルを定義する手順は以下のとおりです。

  1. 前述のようにディメンジョンを定義します。ただし、2 つ変更点があります。

    • [ディメンジョン・タイプ] で、[時間] を選択します。

    • [暦] で、[グレゴリオ] (既定値)、[ヒジュラ (表形式)]、または [ヒジュラ (観測)] を選択します。

      このオプションでは、このディメンジョンのレベルのメンバにソース・レコードを割り当てる際に使用する暦を指定します。

    • [プロパティ] または [式] を指定します。

      [プロパティ] を指定する場合、そのプロパティは %DateOpens in a new tab%MV.DateOpens in a new tab%TimeOpens in a new tab%TimeStampOpens in a new tab%FilemanDateOpens in a new tab、または %FilemanTimeStampOpens in a new tab のいずれかのタイプであるか、2 番目のサブセクションに示した要件を満たすカスタムのデータ型である必要があります。

      [式] を指定した場合、ソース式が $Horolog 形式のデータを返す必要があります。値を NULL にすることはできますが、0 にすることはできません (値を 0 にすると、キューブの構築時に評価エラーが発生します)。

    ディメンジョンを定義すると、ディメンジョンと階層が作成されます。

  2. この階層内でレベルを定義します。

    この場合、データ・ディメンジョンとは異なるオプションが表示されます。

  3. [関数で値を抽出] で、日付/時間値の必要な部分を抽出する関数を選択します。以下のテーブルのいずれかの値を使用します。ヒジュラ暦の場合は、すべての関数がサポートされるわけではないことに注意してください。

    時間関数 格納される値 表示される値 ヒジュラ時間ディメンジョンでの使用可否
    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 (日曜日) 不可
  4. [時刻形式] には、オプションで、日付の表示方法を説明する形式文字列を指定します。詳細は、最初のサブセクションを参照してください。

  5. [ヒジュラ (観測)] 暦を使用している場合は、%Calendar.HijriOpens in a new tab クラスを使用して太陰観測値を追加します。

    詳細は、%Calendar.HijriOpens in a new tab のクラスリファレンスを参照してください。

WeekYear 関数と WeekNumber 関数は、ISO 8601Opens in a new tab 標準 (1 ~ 53 の週番号を 1 年のすべての日付に割り当てる) に準拠しています。365 または 366 は 7 で割り切れないので、週数が 53 になる年があります。年の第 1 週は、その年の最初の木曜日が含まれる週として定義されています。これは、1 月 1 日が前年最終週に含まれる年があることを意味します。同様に、12 月 31 日が翌年第 1 週に含まれる場合もあります。

時刻形式の指定

時間タイプのディメンジョン内のレベルでは、Time Format でそのレベルのメンバの表示名の形式を指定します。この形式は、クエリ実行時に適用されます。値の格納方法およびインデックスの作成方法には影響しません。

Time Format 属性では、以下の日付部分 (大文字と小文字が区別される) とその他の部分で構成される文字列を指定します。

Piece 変換値
y 年番号
q 四半期番号
mmmm 完全な月名
mmm 月の略称
mm 月の数値表記、必要に応じて先頭の 0 を表記
m 月の数値表記、先頭のゼロなし
dddd 完全な曜日名
ddd 曜日の略称
dd 日付の表記、必要に応じて先頭の 0 を表記
d 日付の表記、先頭の 0 なし
\x x
ピリオド (.)、スラッシュ (/)、ハイフン (-)、およびスペース文字 変更なし
その他の文字 無視

名前はすべて、現在のサーバ・ロケールに基づきます。この章で前述した “ロケールを使用した時間メンバ名の制御” を参照してください。

Important:

時間レベルでは、メンバの表示名は一意である必要があります。また、メンバに設定できる表示名は 1 つに限られます。これらのルールは、前述の日付部分のすべてが、すべての時間レベルに適合するわけではないことを意味します。

以下のテーブルは、各時間レベルに適合する日付部分を示しています。

レベルの種類 ([関数で値を抽出] の設定) 適合する日付部分 既定の timeFormat その他の例
Year y y (2004) \F\Y y (FY 2004)

\F\Y (FY2004)

QuarterYear yq \Qq y

(Q3 2004)

\Qq \F\Y y (Q1 FY 2004)

\Qq \F\yy (Q1 FY2004)

QuarterNumber q \Qq (Q3)  
MonthYear ymmmmmmmmmm mmmm y (February 2004) mmm y (Feb 2004)

y-mm (2004–02)

mm/y (02/2004)

m/y (2/2004)

\F\Yy-mm (FY2004-02)

MonthNumber mmmmmmmmmm mmmm (February) mmm (Feb)

mm (02)

m (2)

DayMonthYear ymmmmmmmmmmdddddddddd mmm dd y

(Feb 1 2004)

mmmm dd y (February 03 2010)

y-mm-dd (2010-02-03)

mm/dd/y (02/03/2010)

m/d/y (2/3/2010)

dddd, mmmm dd y (Wednesday, February 03 2010)

ddd, mmm dd y (Wed, Feb 03 2010)

DayNumber ddd d (1) dd (01)
DayOfWeek dddddddddd dddd (Tuesday)

dd (03)

d (3)

カスタムのデータ型の使用

以下のシナリオでは、タイムレベルのベースに、カスタムのデータ型を使用するプロパティを直接使用できます。

  • 最初のシナリオでは、このデータ型はデータを $Horolog 日付 ($Horolog 文字列の最初の部分) として格納します。結果はデータ型クラスのClientDataTypeによって異なります。

    • ClientDataType が DATE であるか指定されていない場合、DeepSee では値が変換されません。

    • ClientDataType が MVDATE である場合、DeepSee では値が MV 日付として処理され、$Horolog 日付 (時刻なし) に変換されます。

    • ClientDataType が FDATE である場合、DeepSee では値が Fileman 日付 (%Library.FilemanDateOpens in a new tab) として処理され、完全な $Horolog 日付に変換されます。

    • ClientDataType が FTIMESTAMP である場合、DeepSee では値が Fileman タイムスタンプ (%Library.FilemanTimeStampOpens in a new tab) として処理され、完全な $Horolog 日付に変換されます。

  • 2 番目のシナリオでは、このデータ型はデータを ODBC 日付形式で格納します。データ型クラスの ClientDataType は TIMESTAMP である必要があります。DeepSee では値が完全な $Horolog 日付に変換されます。

  • 3 番目のシナリオでは、このデータ型はデータを $Horolog 時刻 ($Horolog 文字列の 2 番目の部分) として格納します。データ型クラスの ClientDataType は TIME である必要があります。DeepSee では値が完全な $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 YearQuarterYearMonthYear、または DayMonthYear これらのレベルは、日付のすべての部分を使用します。
Year 2007 QuarterYearMonthYear、または 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 日に開始します。以下のピボット・テーブルで考えてみましょう。

generated description: fiscal year example

最も内側のグループ化では、このピボット・テーブルは実際の期間 (年と月の結合) によってレコードをグループ化します。例えば、実際の期間 2001 年 10 月に 14 レコードが関連付けられています。この期間は会計四半期にグループ化され、会計四半期は会計年度にグループ化されます。四半期 FY 2002–Q1 には、2001 年 10 月、11 月、12 月が含まれることに注意してください。

このような時間レベルの場合、スタジオでキューブ・クラスを編集し、<level> 要素の timeOffset プロパティと timeFormat プロパティを指定します。ここで示した例の場合は以下のようになります。

  • 最初の 2 つのレベル (FY 2002、FY 2002–Q1 などのメンバのあるレベル) では、timeOffset"-3m" になります (これらのレベルで使用される日付値から 3 か月減算します)。

  • 3 番目のレベル (Oct-2001 などのメンバのあるレベル) では、timeOffset が指定されず、このレベルでは実際の日付値が使用されます。

詳細は、付録 “キューブ・クラスのリファレンス情報” の “日付オフセットの指定” を参照してください。

SAMPLES ネームスペースには、以下の時間レベルの例があります。

  • Patients キューブで、BirthDBirthQD、および BirthTD の各ディメンジョンを参照してください。

  • HoleFoods Sales キューブで、DateOfSale レベルを参照してください。

カスタム時間レベルの定義

時間を他の方法で使用するカスタム・レベルを定義できます。そのためには、以下の操作を実行します。

  • [タイプ] が ([時間] ではなく) [データ] であるディメンジョンを作成します。

  • レベルごとに、目的の値を返すように [式] に値を指定します。

  • この章で後述する “メンバの並べ替え順序の指定” を参照してください。

    既定では、メンバはアルファベット順に並べ替えられます。

SAMPLES ネームスペースの Patients キューブでは、BirthWeekdayD ディメンジョンを参照してください。このディメンジョンの場合、は以下のようになります。

$system.SQL.DAYNAME(%source.BirthDate)

このメソッドは、%SYSTEM.SQLOpens in a new tab クラスの DAYNAME() メソッドを実行します。このクラスには、データ値を処理するメソッドが大量に用意されています。

このディメンジョンを使用すると、以下のようにピボット・テーブルを作成できます。

generated description: weekday demo

このサンプル・ディメンジョンは、1 つのレベルのみ定義しています。適切なロジックを使用すると、例えば 4-4-5 カレンダーOpens in a new tabの週、月、および四半期を使用する階層を定義できます。

年齢レベルの定義

年齢レベルは、データ内のキューブの構築日付を基準にした年齢値に従ってレコードをグループ化します。例えば、(キューブの構築日付を基準に計算した) 年齢で患者をグループ化することができます。

Note:

年齢レベルを正確に維持するにはキューブを再構築する必要があります。DeepSee のキューブ同期機能は、それらに対して何も作用しません。そのため、年齢レベルは通常お勧めしません。年齢でレコードをグループ化する必要がある場合、代わりに計算メンバを定義することをお勧めします。このドキュメントで後述する “年齢メンバの定義” を参照してください。

年齢レベルを定義する手順は以下のとおりです。

  1. 前述のようにディメンジョンを定義します。ただし、2 つ変更点があります。

    • [タイプ][年齢] を選択します。

    • [プロパティ] または [式] を指定します。

    Important:

    [プロパティ] を指定した場合、そのプロパティは $Horolog 形式であるか、データ型 %TimeStampOpens in a new tab (またはサブクラス) であることが必要です。

    [式] を指定した場合、ソース式が $Horolog 形式のデータを返す必要があります。

    ディメンジョンを定義すると、ディメンジョンと階層が作成されます。

  2. この階層内でレベルを定義します。

    この場合、データ・ディメンジョンとは異なるオプションが表示されます。

  3. [関数で値を抽出] で、時間値の必要な部分を抽出する関数を選択します。以下の値のいずれかを使用します。

    • "Days" – 日単位で年齢を決定します。

    • "Months" – 月単位で年齢を決定します。

    • "Years" – 年単位で年齢を決定します。

Patients サンプルは、このタイプのレベルの説明には対応しないことに注意してください。AgeAge Bucket、および Age Group レベルは、架空の研究の患者を、研究の日付での年齢を基準にしてグループ化しています。これは遡及的な研究では一般的なことです。

範囲式の指定

データ・ディメンジョンのどのレベルでも、[範囲式] オプションを使用できます。このオプションを使用すると、実際のソース値の場所に新しい値を使用できます。数値データの場合、この変換によって、ソース値を個別なビンで置換できます。任意のデータに対して、この変換によって、置換文字列を指定できます。

どちらの場合も、新しい値がそのレベルのメンバの名前になります。この値は、メンバのキーにもなります。

範囲式を指定する手順は以下のとおりです。

  1. [範囲式] フィールドの横にある検索ボタン generated description: button search をクリックします。

    アーキテクトに以下のようなページが表示されます。

    generated description: range expr init

  2. [元の値の形式] では、[数値範囲] または [文字列] のどちらかを選択します。

    ここで選択した値は、このページの形式に影響します。

  3. 以下のように、一連の置換を追加します。

    • テーブルの最後に行を追加するには、[置換の追加] をクリックします。

      詳細は、この後のサブセクションの指定に従って入力します。

    • 行を削除するには、その行の [X] ボタンをクリックします。

    行の順序によって、このレベルのメンバの既定の並べ替え順序が決まります。

  4. [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;
    

メンバ名をローカライズ可能にするには、"DeepSee 上級モデリング・ガイド" で “キューブおよびサブジェクト領域の高度な機能の使用” の章の “レベルのメンバの手動指定” を参照してください。

数値ビンの定義

数値ビンを定義する場合、範囲式エディタは以下のように表示されます。

generated description: range expr numeric bins

このテーブルの各行が、以下のように数値ビンを定義します。

  • 行の左端のボタンは、下限の値を含む generated description: range lower inclusive か、含まない generated description: range lower exclusive かを示します。

    下限が存在しない場合は、このオプションは何の効果も持ちません。

    下限の値を含むとは、[下限] に示された値が範囲に含まれることを意味します。下限の値を含まないとは、[下限] の値が範囲に含まれないことを意味します。

  • [下限] は、指定されている場合は、ビンの下限を示します。

  • [上限] は、指定されている場合は、ビンの上限を示します。

  • 行の右端のボタンは、上限の値を含む generated description: range upper inclusive か、含まない generated description: range upper exclusive かを示します。

    上限が存在しない場合は、このオプションは何の効果も持ちません。

  • [置換値] は、このレベルのメンバ名として使用する文字列を指定します。ソース値が定義されている範囲内にあるレコードはすべて、このメンバに割り当てられます。

    この値は、メンバのキーにもなります。

このレベルでは、ソース値が指定されているどのビンにも該当しないレコードは無視されます。

文字列置換の定義

文字列置換を定義する場合、範囲式エディタは以下のように表示されます。

generated description: range strings

このテーブルの各行が、以下のように文字列置換を定義します。

  • [元の値] は、このレベルのソース・プロパティまたはソース式の可能な値を指定します。

  • [置換値] は、このレベルのメンバ名として使用する文字列を指定します。ソース値が [元の値] に指定されている値と一致するレコードはすべて、このメンバに割り当てられます。

    この値は、メンバのキーにもなります。

このレベルでは、ソース値が指定されているどの元の値にも一致しないレコードは無視されます。

SAMPLES ネームスペースには、以下の範囲式の例があります。

  • Patients キューブで、Age Group レベルを参照してください。

  • HoleFoods Sales キューブで、Discount Type レベルを参照してください。

表示値を使用するためのレベルの構成

Caché クラス・プロパティは、VALUELISTDISPLAYLIST のプロパティ・パラメータによって、格納される値と表示される値の両方を保持できます。以下はその例です。

Property Gender As %String(VALUELIST = ",F,M", DISPLAYLIST = ",Female,Male");

このようなプロパティをレベルとして使用すると、既定では、VALUELIST パラメータで指定された値が使用されます。

レベル定義で [DISPLAYLIST の値を使用] オプションを選択すると、DISPLAYLIST パラメータで指定された値が使用されます。以下はその例です。

generated description: genders

SAMPLES ネームスペースには、以下のような [DISPLAYLIST の値を使用] オプションを使用するレベルの例があります。

  • Patients キューブの Gender レベル。

  • HoleFoods Sales キューブの Channel Name レベル。

プロパティ値をメンバ名として使用する方法

既定では、レベルのソース値がそのレベルのメンバの名前になります。

代わりに、このレベルにプロパティを定義し、そのプロパティの値をメンバ名に使用することで、メンバ名を指定することができます。これは、以下のシナリオで役立ちます。

  • 実行時にメンバ名へのアクセスを可能にする — 実行時にプロパティの値へのアクセスを可能にします (レベルの場合は異なります)。

  • メンバにわかりやすい名前を指定する — 場合によっては、わかりにくい一意の値をレベルの基にする必要があります。例えば、患者の一次診療医に基づくレベルがあるとします。人名は必ずしも一意であるとは限りません。このため、代わりに一意の医師 ID をレベルの基にする必要があるとします。この ID はユーザには無意味です。このような状況で、医師の名前にアクセスするプロパティも定義して、そのプロパティをメンバの名前として使用します。

レベルのメンバの名前にプロパティ値を使用する手順は以下のとおりです。

  1. 次の章の説明に従って、このレベルのプロパティを定義します。

    レベルの各メンバにはこのプロパティの値があります。

  2. このプロパティに対して [メンバ名として使用] オプションを選択します。

  3. 必要に応じて、実行時にプロパティ値を取得するには、[実行時に値を取得] オプションを選択します。

    このオプションを使用する場合、以下の要件に注意してください。親レベル (取得するプロパティが含まれるレベル) では、そのレベルのソース・プロパティまたはソース式は ID として評価される必要があります。システムはそのことを想定して (少なくともこのレベルで)、ソース・データを正規化します。すなわち、そのレベルでは、データは別のテーブルに存在し、ソース・テーブルにはそのテーブルへのリンクが格納されます。

SAMPLES ネームスペースには、以下のような、[メンバ名として使用] または [実行時に値を取得]、あるいはその両方で構成されたプロパティを持つレベルの例があります。

  • Patients キューブの DxDoc レベル。このレベルには、Name プロパティがあります。このプロパティは、[メンバ名として使用] で構成されています。DxDoc レベルは、医師の一意の ID に基づいています。生成した患者の数によっては、同名の複数の医師が表示される場合があります。このレベルの定義方法により、これらの医師どうしは結合されません。

  • Patients キューブの City レベル。このレベルには、Name プロパティがあります。このプロパティは、[メンバ名として使用][実行時に値を取得] で構成されています。

  • HoleFoods Sales キューブの City レベルと Channel Name レベル。これらのレベルには、[メンバ名として使用] で構成されるプロパティがあります。

  • HoleFoods Sales キューブの Product Name レベル。このレベルには、[メンバ名として使用][実行時に値を取得] で構成されるプロパティがあります。

メンバのツールのヒントの指定

アナライザでメンバ名の近くにカーソルを置くと、ツールのヒントが表示されます。既定では、ツールのヒントにはメンバ名が表示されます。任意のレベルでツールのヒントに表示する情報を追加できます。そのためには、以下の操作を実行します。

  1. 目的のレベルにプロパティを追加します。ソース値には、目的のツールのヒントを含む値を使用します。

  2. スタジオでキューブ定義を編集し、新しく追加したプロパティを変更します。このプロパティでは、isDescription 属性を "true" に指定します。付録 “キューブ・クラスのリファレンス情報” の <property> を参照してください。

    これでツールのヒントには、メンバ名、その後にハイフン、その後に指定したプロパティの値が表示されるようになります。例えば以下のように出力されます。

    generated description: level tooltip

これは、スペースの関係上メンバ名には短い名前を使用する必要があり、同時に各メンバについて十分な情報を提供する必要がある場合に便利です。

メンバの並べ替え順序の指定

ここでは、レベルのメンバの並べ替え順序を制御する方法を説明します。

データ・レベルの場合

データ・レベルの場合、既定では、メンバは以下のように並べられます。

  • レベルで範囲式を使用しない場合、メンバは名前の昇順に並べ替えられます (名前の形式にかかわらず、アルファベット順の並べ替えを使用)。

  • そのレベルで範囲式を使用する場合、メンバは範囲式で決定される順序で並べ替えられます。すなわち、最初のメンバは範囲式の最初の置換によって決定され、2 番目のメンバは 2 番目の置換によって決定され、以下同様に決定されます。

データ・レベルのメンバの並べ替え順序を変更するには、後続のサブセクションで説明する方法のいずれかを使用します。

レベルのソート・オプションの指定

あるレベルのメンバに対するソート順序を指定する最も簡単な方法は、そのレベルの [ソート] オプションを設定することです。[昇順][昇順数値][降順]、または [降順数値] を選択します。

[昇順][降順] は、メンバをアルファベット順 (昇順または降順) に並べ替えます。[昇順数値][降順数値] は、数値順 (昇順または降順) に並べ替えます。

プロパティ値を基準にしたメンバの並べ替え

プロパティ値を基準にレベルのメンバを並べ替える手順は以下のとおりです。

  1. 次の章の説明に従って、このレベルのプロパティを定義します。

    レベルの各メンバにはこのプロパティの値があります。

  2. このプロパティには、[プロパティ値を基準にしたメンバの並べ替え][昇順][昇順数値][降順]、または [降順数値] のいずれかを選択します。

    [昇順][降順] は、メンバをアルファベット順 (昇順または降順) に並べ替えます。[昇順数値][降順数値] は、数値順 (昇順または降順) に並べ替えます。

    (既定では、いずれの値も選択されていません。また、プロパティはメンバの並べ替え順序に影響しません)。

レベルの複数のプロパティ内で [プロパティ値を基準にしたメンバの並べ替え] を指定すると、これらのプロパティのうち最初のプロパティでメンバが並べ替えられます。その後、これらのプロパティの 2 番目を基準に並べ替えられ、以下同様に実行されます。

例は、SAMPLES ネームスペースの Patients キューブを参照してください。このキューブで、Allergy Severities レベルには、[プロパティ値を基準にしたメンバの並べ替え] で構成されるプロパティがあります。このプロパティは、数値を返すソース式に基づいています。

プロパティ名をメンバ名として使用する方法

前述と同様のもう 1 つの方法として、以下の方法も使用できます。

  1. メンバ名が望ましくなくても、必要な順序でメンバを並べ替える、レベルのソース式を使用します。

  2. 次の章の説明に従って、このレベルのプロパティを定義します。

  3. このプロパティで、それぞれにより適した名前を返すソース値またはソース式を指定します。このプロパティに対して [メンバ名として使用] オプションを選択します。

必要な順序でのメンバのリスト

メンバを必要な順序でリストするには、キューブ・クラスを編集して、レベルに <member> 要素を追加します。詳細は、"DeepSee 上級モデリング・ガイド" で “キューブおよびサブジェクト領域の高度な機能の使用” の章の “レベルのメンバの手動指定” を参照してください。

時間レベルの場合

既定では、時間レベルのメンバは、時間によって昇順に並べ替えられています。

メンバに対して別の並べ替え順序を指定するには、[ソート] オプションを指定します。[昇順] (時間の昇順) または [降順] (時間の降順) のいずれかを選択します。

メンバ名をローカライズ可能にする

ディメンジョン、階層、レベルなどのキューブ要素と同様、キューブにも [表示名] の値を指定できます。この値には、後から別の言語での翻訳を定義できます。レベルのすべてのメンバが既知であり、スタジオでキューブ・クラスを編集する場合は、レベルのメンバにも同じ方法を使用できます。"DeepSee 上級モデリング・ガイド" で “キューブおよびサブジェクト領域の高度な機能の使用” の章の “レベルのメンバの手動指定” を参照してください。

時間ディメンジョンでは、現在のロケールによって時間ディメンジョンのメンバの名前が決まります。(このドキュメントで前述した “ロケールを使用した時間メンバ名の制御” を参照してください。)ロケールを変更した場合は、キューブをリコンパイルおよび再構築する必要があります。

異なる階層に含まれるレベル間での依存関係の定義

場合によっては、相互に異なる階層に含まれるレベル間に、仮想依存関係が存在します。例えば、Country レベルと Product レベルを持つキューブがあるとします。これらのレベルは、論理的に相互に独立しています。理論上は、任意の製品を任意の国で販売できます。これらのレベルを同じディメンジョンの 1 つの階層に含めることは意味がありません。

しかし、特定の製品の販売先が特定の国々に限定される場合は、これらのレベル間に仮想依存関係が存在します。ユーザが国を選択したとき、望ましいのは、その国で販売可能な製品のみが表示されることです。そのような場合、以下のように、レベル間に依存関係を追加できます。

  1. アーキテクトでキューブ・クラスを開きます。

  2. 依存レベルの定義を検索します。

  3. [依存] オプションの値を編集します。以下のような値を使用します。

    [dim].[hier].[level]
    

    dim はもう一方のディメンジョンの名前、hier は階層の名前、level はそのレベルの名前です。[dim].[hier].[level] は、そのレベルの MDX 識別子です。

    以下はその例です。

    [Region].[H1].[Country]
    

    レベルが複数のレベルに依存する場合、コンマ区切りリストを指定します。以下はその例です。

    [dim1].[hier1].[level1],[dim2].[hier2].[level2]
    

    レベルの代わりにリレーションシップを指定することもできます。

このオプション属性はファクト・テーブルにインデックスを 1 つ追加するので、結果的に使用されるディスク容量が増えます。この属性は、控えめに使用してください。また、このオプションは、DependsOn コンパイラ・キーワードとはまったく関係ありません。

この機能の動作を確認するために、以下のデモを試してみます。

  1. アーキテクトで Patients キューブを開きます。

  2. PatGrpD ディメンジョンの Patient Group レベルを編集します。[依存] を以下のように指定します。

    [HomeD].[H1].[ZIP]
    
  3. キューブを保存して、コンパイルします。

  4. SAMPLES ネームスペースで、ターミナルから DeepSee.PopulateOpens in a new tabReassignPatients() メソッドを実行します。

    d ##class(DeepSee.Populate).ReassignPatients()
    

    このメソッドは、Patient Group レベルと ZIP code レベルの間に仮想依存関係が存在するように、このサンプルのデータを変更します。特定の郵便番号の患者は、患者グループ A に属するか、どのグループにも属さないかのどちらかであり、別の郵便番号の患者は、患者グループ B に属するか、どのグループにも属さないかのどちらかです。

    このメソッドはキューブを同期するので、その実行後にこのキューブを再構築する必要はありません。

Basic Dashboard Demo を開き、Home ZIP Code フィルタと Patient Group フィルタを試します。郵便番号を選択すると、Patient Group フィルタのリストに影響します。

ファクト・テーブル内のフィールド名の指定

キューブ・クラスのコンパイル時に、DeepSee は 1 つのファクト・テーブル・クラスと、いくつかの関連クラスを生成します。キューブの構築時に、DeepSee は、これらのテーブルに値を入力します。これについては、“ファクト・テーブルおよびディメンジョン・テーブルの詳細” で説明しています。

既定では、DeepSee がファクト・テーブルのフィールド名を生成しますが、その代わりに使用するフィールド名を指定することもできます。これを実行するには、各アプリケーション・レベルの [ファクト・テーブルのフィールド名] オプションに値を指定します。一意の名前を使用するように注意してください。このオプションは、時間レベルおよび iKnow レベルには使用できません。

Important:

[ファクト・テーブルのフィールド名] には、SQL の予約語を使用しないでください。SQL 予約語のリストは、"Caché SQL リファレンス" の “予約語” を参照してください。名前は、英字かパーセント記号 (%) で始まる必要があります。最初の文字が % である場合、2 番目の文字は Z または z である必要があります。制限事項の詳細は、"Caché プログラミング入門ガイド" の付録 “識別子のルールとガイドライン” で “クラス・メンバ” を参照してください。また、fact または listing という語は、どのような大文字と小文字の組み合わせであっても使用しないでください。

FeedbackOpens in a new tab