モード -5 の使用法
表示バッファの現在のブロックにグローバルの一部が含まれている場合、mode に -5 を指定すると、グローバル参照とブロックに含まれている値が返されます。length 引数は、mode -5 では有効ではありません。
-5 の mode を使用した場合、offset 値は、ベース・アドレスのバイト・オフセットではなく、ブロックにあるグローバル・ノードを指定します。奇数値は、グローバル参照全体を返し、偶数値はポインタあるいはデータを返します。
例えば、表示バッファの n 番目のノードのグローバル参照全体を返すには、offset に n*2-1 を指定します。n 番目のノードの値を返すには、n *2 を指定します。ブロックの最終ノードのグローバル参照を返すには、offset に -1 を指定します。
$VIEW は、照合順 (つまり数値) でノードを返します。これは $ORDER 関数が使用するものと同じ順序です。この順序を想定したコードを記述することにより、表示バッファでグローバルを使用してすばやく順次スキャンを実行できるようになります (ObjectScript ユーティリティの一部は、この方法を使用します)。$VIEW は、offset が表示バッファの最後のノードを過ぎて位置を指定するとき、NULL 文字列 ("") を返します。コードの中にこの値についてのテストを含むようにしてください。
現在のブロックがポインタ・ブロックのときは、返り値はポインタである InterSystems IRIS ブロック数です。ブロックがデータ・ブロックのときは、返り値はノードに対応したデータ値です。
現在のブロックがデータ・ブロックで、$VIEW から <VALUE OUT OF RANGE> エラーが返される場合、そのオフセット位置に格納されている情報が長すぎる文字列であることを意味しています。そのオフセット位置に格納されているデータを取得するには、エラーをトラップし、その前のオフセット位置に格納されているグローバル参照を基準とした間接指定による $GET を使用します。例えば、x = $VIEW(offset, -5) の代わりに、x = $GET(@$VIEW(offset-1,-5)) を使用します。
$VIEW が <DATABASE> エラーもしくは <FUNCTION> エラーを出した場合は、ブロックでの情報は有効なグローバル参照でも有効なデータでもないという意味になります。
以下の例は、表示バッファのコンテンツを検査するための、汎用コードを示しています。コードは最初に表示バッファを開いてから、読み取るためのブロック数を入力できるようにします。FOR ループは、現在のブロックすべてのオフセットを繰り返します。$VIEW 関数は、-5 のモードを使用して、各オフセットで値を返します。WRITE コマンドは、結果の 1 組みのオフセット値を出力します。
ブロックの最後まで行くと、$VIEW は NULL 文字列 ("") を返します。IF コマンドは、この値をテストをして、“End of block” メッセージを書き込みます。その後、QUIT コマンドは、ループを終了して制御をプロンプトに戻し、ユーザが他のブロックで読み取りできるようにします。
Start OPEN 63
WRITE !,"Opening view buffer."
READ !!,"Number of block to read in: ",block QUIT:block=""
VIEW block
FOR i=1:1 {
SET x=$VIEW(i,-5)
IF x="",i#2 {
WRITE !!,"End of block: ",block
QUIT }
WRITE !,"Offset = ",i
WRITE !,"Value = ",x
}
GOTO Start+2
CLOSE 63
QUIT
グローバル・ブロックについて、通常このルーチンによって作成される出力は、以下のとおりです。
Opening view buffer.
Number of block to read in:3720
Offset = 1
Value = ^client(5)
Offset = 2
Value = John Jones
Offset = 3
Value = ^client(5,1)
Offset = 4
Value = 23 Bay Rd./Boston/MA 02049
.
.
.
Offset = 126
Value = ^client(18,1,1)
Offset = 127
Value = Checking/45673/1248.00
End of block: 3720
Number of block to read in:
逆の順序のバイト値 (ビッグ・エンディアンのみ)
ビッグ・エンディアン・システムでは、length 引数の一部として文字 “O” 接尾語を使用することにより、逆順序でバイト値を返すことができます。length に文字 O を含めて指定すると、$VIEW は逆順序でバイト値を返します (length は二重引用符で囲まなければなりません)。詳細は、以下の例を参照してください。
USE IO
FOR Z=0:0 {
WRITE *-6
SET NEXTBN=$VIEW(LINKA,0,"3O")
QUIT:NEXTBN=0 }
前述の例では、$VIEW の length 引数は "3O" です (3 と 文字 O)。ビッグ・エンディアン・システムで実行される場合、これは、逆の順序 (O) の次の 3 バイト (3) の長さを示しています。そのため、$VIEW はメモリにある位置 (表示バッファ — 0 の mode で示されるように) で開始し、最上位バイト、2 番目の上位バイト、および 3 番目の上位バイトを返します。
リトル・エンディアン・システムでは、文字 “O” は空命令です。“3O” の length 値は、“3” の length 値と同じです。
IsBigEndian()Opens in a new tab クラス・メソッドを使用して、オペレーティング・システム・プラットフォームでどのビット順序を使用するかを決定できます (1 = ビッグ・エンディアン・ビット順、0 = リトル・エンディアン・ビット順)。
WRITE $SYSTEM.Version.IsBigEndian()