その最初の引数で指定された配列のレベル内で、照合順序内の、次または前のローカルまたはグローバル変数名の添字を返します。そうすることで、それは2番目の引数で指定された方向に移動します。GT.Mでは、$ORDER() が添字のない引数を持つとき、それは、照合順序内の添字なしのローカルまたはグローバル変数の次または前の名前を返します。
$ORDER関数のフォーマット:
$O[RDER](glvn[,expr])
添字のあるグローバルまたはローカル変数名は、データおよび/または下位ノードを持つ次または前のノードを$ORDER() の検索からのノードを指定します。引数に含まれている添字の数は、暗黙的に配列のレベルを定義します。
オプションの式(2番目の引数)は、$ORDER() のための方向を指定します; 1は前方方向の操作を指定し、-1 は逆向きの操作を指定します。式のいかなる他の値は、エラーが発生します。
GT.Mは、添字なしの名前を許可するようにM標準規格を拡張します。この場合、$ORDER() は、次または前の添字なしの名前を返します。
もし$ORDER() がグローバルまたはローカル変数の後に(または前に)指定されたレベルでノード(または名前)が見つからない場合、それは空文字列("")を返します。
もし添字付きグローバルまたはローカル変数名の最後の添字が null の場合で、かつ、対応する指定された添字付きグローバルまたはローカル変数が null と一致する添字を持つ場合、$ORDER() は指定されたレベルで次のノード とそれに続くnull 添字 を返します。
添字付のグローバル変数の最後の添字またはローカル変数名がNULLで、対応する添字付のグローバル変数またはローカル変数に一致するNULL添字がない場合、$ORDER() は指定されたレベルの最初のノードを返します。もし添字付きグローバルまたはローカル変数名の最後の添字が null の場合で、かつ、2番目の引数が -1 である場合、$ORDER() は、指定されたレベルに存在する null 添字に関係ない指定されたレベルで、常に最後のノードを返します。しかし、グローバルまたはローカルの変数レベルにnull添字が含まれ、$ORDER(glvn,-1) が空の文字列の結果を返す場合は、null添字を持つノードが存在するかどうかを個別にテストする必要があります。
$ORDER() は、配列が入力された順序に依存しない順序の方法でMの多次元散在配列からデータを取得するためのツールとして使用できます。Mでは、適切な添字を持つ配列にデータをSETしその後に $ORDER() で情報を取得することにより、ルーチンは一般的にソートします。
$ORDER() は、データ値ではなく添字を返し、そして、データ値を持つノードと下位ノードを持つノードとを区別しません。いったん$ORDER() が添字を提供すると、可能ならば、ルーチンはデータ値にアクセスする添字を使用しなければなりません。$ORDER() が null を返す場合でさえも、$ORDER() を使用すると、ネイキッド参考の指標を維持します。
GT.Mは、オプションで null 添字の使用を許可します。この機能は、グローバル変数用のGDEのREGION修飾とローカル変数とのための VIEWコマンドを介して有効になります。アプリケーションが null 添字を使用している時、おそらく$DATAを使用して、アプリケーションが特殊なケースとしてそれらのためにテストする必要があるので、それらは $ORDER() ループで "目に見えない:invisible" のです。
$ORDER() は、文字列として、数字の値を持つローカのル配列の添字を返しますが、しかし、非正規(数字18 以上)です。
注意 | |
---|---|
拡張参照で使用すると、名前レベルの$ORDER() は常に空文字列を返します。 |
例:
GTM>zwrite lcl(1)=3 lcl("x")=4 GTM>write $order(lcl("")) 1
引数の指定された最後の添字がnullであるので、この例では、1である最初のノードを返し、lcl は null 添字を持ちません。
例:
GTM>write $order(lcl(1)) x
lcl がnull 添字を持たないので、この例では、lcl(1)の後の最初のノードを返します、すなわち x 。
例:
GTM>write $order(lcl(""),-1) x
最初の引数の最後の添字がNULLであったり、2番目の引数に -1が あるので、この例では、最後のノードを返します、すなわち x 。
GTM>set lcl("")=2 GTM>zwrite lcl("")=2 lcl(1)=3 lcl("x")=4 GTM>write $order(lcl("")) 1
この例では、引数の末尾で null 添字があいまいであるので(それは最初から開始か、または、null 添字を持つ実ノードから開始かを指定するのでしょうか?)、指定されたレベルで2番目のノードを返し、そして、最初のノード(空文字列)の添字を返すことが、無限ループを作成する傾向があるでしょう。
例:
GTM>write $order(lcl(""),-1) x GTM>write $order(lcl("x"),-1) 1
例:
GTM>kill set (a(1),a(2000),a("CAT"),a("cat"),a("ALF"),a(12))=1 GTM>set x="" for set x=$order(a(x)) quit:x="" write !,x 1 12 2000 ALF CAT cat GTM>kill a("CAT") set a(5,10)="woolworths",a("cat")="last" GTM>set x="" for set x=$order(a(x),-1) quit:x="" write !,x cat ALF 2000 12 5 1 GTM>
この例では、ローカル変数 a の最初のレベルですべての添字を表示するために $ORDER() ループを使用し、a のいくつかの変更を行い、次に逆の順序ですべての添字を表示します。$ORDER() は、多次元散在配列で既存の添字のみを返し、そして、それらが入力された順序に関係なく、Mの照合順序でそれらを返すことに注意してください。また、$ORDER() は、下位ノード(データ値でない)だけを持つ A(5) のノードとデータの値を持つ他のノードとを区別しません。
例:
GTM>kill set (%(1),tiva(2),A(3),tiv(4),Q(5),%a(6))="" GTM>set x="%" GTM>write:$data(@x) !,x for set x=$order(@x) quit:x="" write !,x % %a A Q tiv tiva x GTM>set $piece(x,"z",32)="" GTM>write:$data(@x) !,x for set x=$order(@x,-1) quit:x="" write !,x x tiva tiv Q A %a % GTM>
この例では、順方向および逆方向の両方の順序で、現在のローカル変数名を表示するために、$ORDER() を使用しています。最初 ([^]%) と最後 ([^]zzzzzzzz) 名前は、特別なケースとして扱う必要があり、$DATA()関数を必要とすることに、注意してください。
例:
set acct="",cntt="" for fet acct=$order(^acct(acct)) quit:acct="" do . for set cntt=$order(^acct(acct,cntt)) do WORK quit
これは、^acct のグローバル配列を循環的に $ORDER() ループを2つのネストで使用し、それぞれの2番目のレベルのノードに対して何らかのアクションを実行します。