classmethod %OnProcessFact(pID As %String, ByRef pFacts As %String, Output pSkip As %Boolean, pInsert As %Boolean) as %Status
システムは、ファクト・テーブルの構築または更新時に、ベース・テーブル内の各行へのアクセスの直後にこのメソッドを呼び出します。このメソッドには以下の値が渡されます。
このレコードをスキップする場合はメソッドで pSkip を True に設定し、スキップしない場合は pSkip を False に設定します。
例えば、以下のコールバックでは、キューブは好きな色が青であるすべての患者を無視します。
ClassMethod %OnProcessFact(pID As %String, ByRef pFacts As %String,
Output pSkip As %Boolean, pInsert As %Boolean) As %Status
{
if pFacts("DxColor")="Blue"
{
set pSkip=1
} else {
set pSkip=0
}
quit $$$OK
}
この例では、キューブが [ファクト・テーブルのフィールド名] オプションで好きな色のレベルとして DxColor を定義していると想定しています。
Note:
%OnProcessFact() によるレコードの評価が、pFacts 配列を使用して指定するレベルまたはメジャーに基づいている場合、キューブに対して選択的構築を実行する際には常に、対応するキューブ要素を含める必要があります。前述の例では、キューブに対するあらゆる選択的構築に DxColor を含める必要があります。そうしないと、pFacts(“DxColor”) の値が未定義になるため、すべてのレコードでエラーが生じます。
別の例として、以下のコールバックでは、キューブは ID が 1000000 未満であるすべてのレコードを無視します。
ClassMethod %OnProcessFact(pID As %String, ByRef pFacts As %String,
Output pSkip As %Boolean, pInsert As %Boolean) As %Status
{
if pID<1000000
{
set pSkip=1
} else {
set pSkip=0
}
quit $$$OK
}
レベルのメンバの手動指定
アーキテクトでレベルを定義した後に、メンバおよびその順序を手動で指定できます。そのためには、以下のように、スタジオでキューブ・クラスを変更します。
-
スタジオでキューブ・クラスを開きます。
-
レベルを定義するセクションを見つけます。
<level name="MyLevel" displayName="MyLevel" ... >
</level>
-
</level> 行の直前で、以下のように一連の <member> 要素を追加します。
<level name="MyLevel" displayName="MyLevel" ... >
<member name="first" displayName="first" spec="1" />
<member name="second" displayName="second" spec="2" />
<member name="third" displayName="third" spec="3" />
<member name="fourth" displayName="fourth" spec="4" />
<member name="fifth" displayName="fifth" spec="5" />
</level>
各 <member> 要素によって 1 つのメンバが識別されます。<member> 内では、name はそのメンバの名前を指定し、displayName はそのメンバのオプションのローカライズ表示名を指定し、spec はそのメンバのオプションのキー仕様を指定します。
name と spec のルールは以下のとおりです。
シナリオ |
必要な権限 |
結果 |
name のみを指定する場合 |
name の値は、大文字と小文字の区別も含めて、ソース・プロパティまたはソース式の値と完全に一致している必要があります。 |
name の値がキーになります。 |
name と spec の両方を指定する場合 |
spec の値は、大文字と小文字の区別も含めて、ソース・プロパティまたはソース式の値と完全に一致している必要があります。 |
spec の値がキーになります。 |
その他の注意事項 :
-
これらの属性で XML 予約文字を使用することはできません。この後のサブセクションを参照してください。
-
<member> 要素を必要な数だけ組み込みます。
-
これらの要素の順序によって、対応するメンバの既定の並べ替え順序が決まります。
-
レベルのすべてのメンバを組み込みます (ワイルドカード・オプションはありません)。
-
クラスを保存し、リコンパイルします。
-
キューブを再構築するか、レベルの選択的構築を実行します。
Note:
このオプションは、メンバのセットに変更が発生しないと予測される場合にのみ有益です。新規レコードを受信し、そのレコードに <member> 要素のいずれかで指定される値が含まれない場合、そのレコードはこのレベルに表示されません。
XML 予約文字
スタジオでキューブ・クラスを編集する際は、name や displayName などの属性の値に XML 予約文字を使用することはできません。代わりに、以下のように置き換えます。
予約文字 |
代わりに使用する文字 |
< |
< |
& |
& |
" |
" |
' |
' |
> を使用してもエラーにはなりませんが、この文字の代わりに > を使用できます。
これらの文字をアーキテクトの入力フィールドに入力すると、上記の置換が自動的に行われます。スタジオでキューブ・クラスを検証すると、アーキテクトで他の置き換えも行われる場合があります。前述のテーブルは、必須の置換のみを示しています。
ファクト・テーブルへのカスタム・インデックスの追加
必要なすべてのインデックスが自動的に定義されます。ただし、ファクト・テーブルは独自の用途に直接的に使用でき、このように使用する際は追加のインデックスが必要となる場合があります。このようなインデックスを追加するには、スタジオでキューブ・クラスを編集し、必要に応じて <index> 要素を追加します。
"InterSystems Business Intelligence のモデルの定義" の "キューブ・クラスのリファレンス情報" を参照してください。
その他のキューブ・コールバックのカスタマイズ
クラス %DeepSee.CubeDefinitionOpens in a new tab には、オーバーライドしてキューブの動作をさらにカスタマイズできるコールバック・メソッドがあります。このセクションでは、一般的にオーバーライドされるいくつかのメソッドについて説明します。
また、このページの "%OnProcessFact() コールバック" および "キューブまたはサブジェクト領域の動的フィルタ処理" も参照してください。
その他のオプションの詳細は、%DeepSee.CubeDefinitionOpens in a new tab のクラスリファレンスを参照してください。
%OnAfterProcessFact() コールバック
%OnAfterProcessFact() コールバックを使用すると、任意の指定されたレコードがキューブのファクト・テーブルで追加または更新された後に実行されるカスタム・コードを追加できます。
ClassMethod %OnAfterProcessFact(pID As %String, ByRef pFactArray As %String, pUpdateStatus As %Status) as %Status
システムは、このコールバックに以下の情報を渡します。
-
pID : 処理対象のソース・データにおける行の ID。
-
pFacts : ファクト名を添え字とした、行で使用される値を含む配列。
-
pUpdateStatus : %ProcessFact() によって返されようとしている状態。エラーが渡されると、このエラーは Business Intelligence ログおよび ^DeepSee.BuildErrors グローバルにすぐに記録されます。
%ProcessFact() メソッドは、このメソッドによって返される値を無視します。
%OnGetDefaultListing() コールバック
%OnGetDefaultListing() コールバックを使用すると、システムで既定のリストが使用されている場合に、使用するリストの名前をプログラムで指定できます。このメソッドのシグニチャは、以下のとおりです。
ClassMethod %OnGetDefaultListing() as %String
このコールバックは、ユーザが既定のリストを要求したときに呼び出され、特定のリストが要求されたときには効果を示しません。以下に例を示します。
ClassMethod %OnGetDefaultListing() As %String { Quit "Listing By Product" }
例えば、これを使用すると、ユーザが属するロールをチェックし、そのロールで適切なリストを表示できます。
%OnExecuteListing() コールバック
リスト・クエリを実行するために追加の設定作業が必要になる場合もあります。
そのためには、キューブ定義クラスに %OnExecuteListing() メソッドを実装します。
ClassMethod %OnExecuteListing(pSQL As %String) as %Status
システムは、リスト・クエリを実行する直前にこのメソッドを呼び出します。システムはこのメソッドを呼び出すときに、実行対象のリスト・クエリである値 pSQL を渡します。
%OnAfterBuildCube() コールバック
%OnAfterBuildCube() コールバックは、定義されている場合、キューブの構築後に呼び出されます。
ClassMethod %OnAfterBuildCube(pBuildStatus As %Status, pBuildErrors As %Boolean = 0) As %Status
システムは、%DeepSee.UtilsOpens in a new tab の %BuildCube メソッドの最後のステップとしてこれを呼び出します。システムは、このコールバックに以下の情報を渡します。
お使いの実装は、%StatusOpens in a new tab のインスタンスを返す必要があります。
このメソッドは、キューブ構築のロックが解放される前に呼び出されるため、一度に 1 つのプロセスのみがこのコールバックを実行できます。
キューブまたはサブジェクト領域の動的フィルタ処理
サブジェクト領域に対してハードコードされたフィルタを指定する代わりに (またはこの指定に加えて)、%OnGetFilterSpec() コールバックを実装できます。これによって、実行時にフィルタのコンテンツを指定できます。このコールバックは、キューブ・クラスでも使用できます。したがって、キューブおよびサブジェクト領域の両方を動的にフィルタ処理できます。
このメソッドのシグニチャは、以下のとおりです。
classmethod %OnGetFilterSpec(pFilterSpec As %String) as %String
pFilterSpec は <subjectArea> の filterSpec 属性の値です。このメソッドは、有効な MDX セット式を返す必要があります。以下に例を示します。
ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
Quit "AgeD.H1.[20 to 29]"
}
以下に簡単な例をもう 1 つ示します。この例では、メソッドが $ROLES 特殊変数をチェックして、ユーザが %All ロールに属する場合は、フィルタ処理を解除します。
ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
if $ROLES["%All" {
//remove any filtering
set pFilterSpec=""
}
Quit pFilterSpec
}
別の例では、以下のコールバックが元の値と追加のフィルタの交差結合を実行することにより、元のフィルタ値を変更します。
ClassMethod %OnGetFilterSpec(pFilterSpec As %String) As %String
{
//test to see if $ROLES special variable includes TestRole
if $ROLES["%DB_SAMPLE" {
//a member expression like the following is a simple set expression
set colorrestrict="colord.h1.[favorite color].red"
//create a tuple that intersects the old filter with the new filter
//this syntax assumes original is just a member
set newfilter="CROSSJOIN("_pFilterSpec_","_colorrestrict_")"
set pFilterSpec=newfilter
}
Quit pFilterSpec
}
FeedbackOpens in a new tab