HIERCHECKは、指定したaggmapの特定のリレーションまたはすべてのリレーションにおける階層に循環構造があるかどうかをチェックするためのファンクションです。階層ディメンションの親リレーションは、ディメンションのそれぞれの値の親を表します。(循環構造が現れるのは、親リレーションの中でディメンション値が誤ってそれ自身の祖先または子孫として指定された場合です。)
またHIERCHECKによるチェックを、階層に関するその他の状況について行うよう指定することもできます。
構文
コマンドとして使用する場合
HIERCHECK parent-relation [STATUS|NOSTATUS|valueset-name] [MULTIPATH] [CONSISTENT]-
[BALANCED levelrelation-name]
または
HIERCHECK aggmap-name [MULTIPATH] [CONSISTENT]levelrelation-name]
パラメータ
チェックする親リレーションの名前を指定するテキスト式。
aggmapの名前を表すテキスト式。HIERCHECKでは、aggmapにおけるすべてのリレーションがチェックされます。
HIERCHECKにおいて、リレーションの現行のディメンション・ステータスが使用されるよう指定します。
ステータスにおいて、HIERCHECKの実行対象となるリレーションのディメンションの値を指定します。
HIERCHECKにおいて、リレーションのデフォルトのディメンション・ステータスが使用されるよう指定します。
HIERCHECKにおいて、それぞれの子からその親へのパスが複数存在するかどうかのチェックが行われるよう指定します。
HIERCHECKにより、階層に整合性があるかどうかのチェックが行われるよう指定します。階層に整合性があるとは、異なる階層のすべてのノードが同じ子を持つことをいいます。
levelrel-nameに指定したレベル・リレーションを使用することにより、HIERCHECKにおいて、次の項目がすべて真かどうかのチェックが行われるよう指定します。
階層内でNAレベルを持つ要素はすべて、リーフを持たないルートであるか、またはリーフであるかのどちらかである。
階層内で同じ(非NA)レベルにある要素はすべて、その階層のルート(複数可)からの深さが同じである。
階層内でレベル(非NA)が異なる要素は互いに深さが異なる。
使用上の注意
HIERCHECKを使用する理由
階層を作成したときに、それが有効であることを確認するための方法としてHIERCHECKを使用することをお薦めします。つまり、変数のデータをロールアップする前に、ディメンションの階層が正しく構成されているかどうかを確認する必要があるということです。たとえば、AGGREGATEコマンドでは、HIERCHECKを使用して、実行時の無限ループの発生を回避します。階層ディメンションのレベルを設定した後は、階層ディメンションによってディメンション化される変数にデータをロードする前、または変数に対して初めてAGGREGATEコマンドを使用する前に、親リレーションでループがあるかどうかをチェックしてください。最初にHIERCHECKを使用してすべての階層ディメンションの親リレーションをチェックしなくても変数をロールアップできますが、最初にHIERCHECKを使用することを習慣にしてください。
AggmapでHIERCHECKを使用する場合のステータス
aggmapにおけるリレーション内に値セットが存在する場合、HIERCHECKではこの値セットを使用して、リレーションのディメンション・ステータスが決定されます。それ以外の場合はすべて、リレーションのデフォルトのディメンション・ステータスが使用されます。
リレーションのディメンションではないすべてのディメンションに対しては、現在のステータスが使用されます。
HIERCHECKによってトリガーされるエラー・メッセージ
HIERCHECKでは、親リレーションの中にループが検出されるとエラーが通知され、実行が停止されます(つまり、HIERCHECKは常に、最初のエラー・メッセージが出た段階で停止します)。エラー・メッセージに示されるのは、ループに含まれるディメンション値、ループが発生する追加ディメンション値と呼ばれる階層の名前(親リレーションに1つ以上の名前付き階層がある場合)、およびループが検出された親リレーションの名前です。親リレーションにループがない場合、メッセージは表示されません。例7-108「ループのチェック」を参照してください。
例
例7-108 ループのチェック
次の例は、親リレーションを作成し、それにループがあるかどうかをチェックする方法を示します。最初に、ディメンションを定義してそれに値を追加します。
DEFINE geography DIMENSION ID MAINTAIN geography ADD 'U.S.' MAINTAIN geography ADD 'East' 'Central' 'West' MAINTAIN geography ADD 'Boston' 'Atlanta' 'Chicago' 'Dallas' 'Denver' 'Seattle'
次に、そのディメンションをそれ自身に関連付けます。次の文は、GEOG.GEOGという名前の親リレーションを定義し、この親リレーションは、GEOGRAPHYディメンションをそれ自身に関連付けます。
define geog.geog RELATION geography <geography>
さらに、ディメンション値の階層を指定します。この例では、階層に3つのレベル(国、地域、都市)があります。階層を指定して、最上位レベルを除くすべてのレベルに対して、親ディメンション値を子ディメンション値に(たとえば、East
をBoston
に)割り当てます。これを行うために、値をリレーションに格納します。最初にLIMITコマンドを使用して子をグループ化し、次に、グループ化した子に親を割り当てます。
LIMIT geography TO 'East' 'Central' 'West' geog.geog = 'U.S.' LIMIT geography TO 'Boston' 'Atlanta' geog.geog = 'East' LIMIT geography TO 'Chicago' 'Dallas' geog.geog = 'Central' LIMIT geography TO 'Denver' 'Seattle' geog.geog = 'West'
これにより、次の文に示すように、親リレーションgeog.geog
でループがあるかどうかをチェックできます。
HIERCHECK geog.geog
この場合、HIERCHECKはエラー・メッセージを生成しないので、geog.geog
にはループがありません。HIERCHK.LOOPFNDがNO
に設定され、HIERCHK.LOOPVALSおよびHIERCHK.XTRADIMSがNA
の設定のままです。
リレーションに格納される値に次の誤りがあったとします。
LIMIT geography TO 'East' 'Central' 'West' geog.geog = 'East'
この文は、East
をそれ自身の親としているのが誤りなので、AGGREGATEコマンドで無限ループが発生します。次に示すように、geog.geog
リレーションでループがあるかどうかをチェックする文を実行するとエラー・メッセージが生成されます。
HIERCHECK geog.geog ERROR: HIERCHECK has detected one or more loops in the hierarchy represented by GEOG.GEOG. The values involved are 'East'.