L9 コマンド(ディスクリプタ順読み込み)

このドキュメントでは、次のトピックについて説明します。


機能および使用

L9 コマンドは、ディスクリプタの値の範囲とその各値を持つレコード数を求めるのに使用します。マルチフェッチ機能を使用すると、L9 コマンドの単一コールで 2 つ以上のディスクリプタ値の情報を返すことも可能です。

Adabas は、アソシエータ内のインバーテッドリストを読み込んでこの情報を求めます。データストレージへのアクセスは必要ありません。

マルチフェッチ機能を使用しない

ディスクリプタを持つファイル、値を求めたいディスクリプタ、および処理の開始値を指定します。Adabas は、コントロールブロックの ISN 数フィールドに含まれるレコード数とともに、レコードバッファにディスクリプタの次の値を(L9 コールごとに)返します。値は昇順または降順で返されます。空値省略(NU)と定義されたディスクリプタの場合、空値は返されません。

マルチフェッチ機能の使用

L9 コマンドはマルチフェッチ機能をサポートします。マルチフェッチ機能は、コマンドオプション 1 フィールドの M の値によって表します(詳細については、コマンドオプション 1 フィールドの説明参照)。

マルチフェッチ機能を使用するときは、1 つの L9 コールで処理できるディスクリプタ値の最大数が次の要因によって制限されます。

  • ISN 下限フィールドを使用して処理するディスクリプタ値の最大数を指定できます。したがって、必要なディスクリプタ数が限定されているときだけ、内部オーバヘッドを避けることができます。

  • ISN 下限フィールドの値が 0 の場合、返されるレコードの数は、ISN/マルチフェッチバッファおよびレコードバッファのサイズによってのみ制限されます。

graphics/l9_1.png

L9 Command, Procedure Flow

graphics/l9_2.png

L9 Command, Procedure Flow (continued)

コントロールブロック

Field フォーマット  
コールタイプ B F/U
予約(内部使用)   -/-
コマンドコード A F/U
コマンド ID B F/U
File Number B F/U (1)
Response Code B F/A (1)
ISN B -/A
ISN 下限 B F/U
ISN 数 B -/A
フォーマットバッファ長(ACB のみ) B F/U
レコードバッファ長(ACB のみ) B F/U
サーチバッファ長(ACB のみ) B F/U
バリューバッファ長(ACB のみ) B F/U
ISN バッファ長(ACB のみ) B F/U
コマンドオプション 1 A F/U
コマンドオプション 2 A F/U
アディション 1 A * F/U
アディション 2 A、B -/A
アディション 3 A F/A
アディション 5 A F/U
コマンドタイム B -/A
ユーザーエリア   F/U

バッファエリア

バッファ  
フォーマットバッファ F/U
レコードバッファ –/A
サーチバッファ * F/U
バリューバッファ * F/U
ISN バッファ –/A
フォーマット:
A 英数字
B 2 進数
x/y Adabasコール前/後 - xとyは、値を取ることができます。
A Adabas によって設定
F ユーザーによって設定
U Adabas コール後も変更なし
- 使用しません
*任意

(1)このフィールドの意味は、Call タイプに指定された値によって異なります。詳細については、「Adabas の呼び出し」の「コントロールブロック」を参照してください。

コントロールブロック

コマンドコード

L9

コマンド ID

順次読み込み処理が必要な場合、このフィールドには、空白以外でゼロ以外の値を指定する必要があります。この値は、Adabas が正しい順序で値を返し、フォーマットバッファを繰り返し解釈するのを避けるために使用されます。

コマンド ID の自動生成を使用するとき以外、このフィールドの上位バイトを 16 進数の FF に設定しないでください(詳細については、「プログラミングの考慮事項」の「コマンド ID の使用」を参照)。

このフィールドの上位バイトには 16 進数 "FF" をセットしないでください。

このフィールドは、ファイルの順次読み込み中に変更しないでください。

インデックス値を 1 つだけ読む場合は、このフィールドを空白またはバイナリの 0 にセットできます。

File Number

読み込むファイルの番号です。

Response Code

このフィールドには、コマンドに対するレスポンスコードが返されます。レスポンスコード 0 は、このコマンドが正しく実行されたことを示します。

レスポンスコード 3 は、指定したディスクリプタのすべてのエントリが処理されたこと、または終了ディスクリプタ値条件が真になったことを示します。

マルチフェッチ機能を使用しているとき、先頭レコードの処理前または処理中にエラーが発生した場合は、このフィールドにレスポンスコードが返されます。この場合、ISN/マルチフェッチバッファおよびレコードバッファの内容は未定義です。

マルチフェッチ機能の処理ループ中に 2 番目以降の ISN でエラーが検出された場合、最初のゼロ以外のレスポンスコードによってマルチフェッチ処理が終了します。この場合、レスポンスコードは、コントロールブロックのレスポンスコードフィールドではなく、ISN/マルチフェッチバッファ自体の追加エントリとして格納されます。レスポンスコードは 2 ヵ所にあります。そのため、アプリケーションプログラムでは、最初にコントロールブロックのレスポンスコードフィールドで一般的な内容のエラーをチェックしてから、各 ISN/マルチフェッチバッファエントリのレスポンスコードフィールドを個々にチェックする必要があります。

ISN

値を求めたいディスクリプタがピリオディックグループ内に含まれるときは、以下の場合にこのフィールドを使用します。

  • サーチバッファおよびバリューバッファを指定しないときは、求めるオカレンス数を指定する最初のコールで使用します。サーチバッファおよびバリューバッファを指定する場合は、サーチバッファを使用してオカレンス数が決定され、ISN フィールドの内容は無視されます。ゼロ値は、全オカレンスを求めることを示します。ゼロ以外の値は、指定したオカレンスの値だけを求めることを示します。

  • レコードバッファに返される値のオカレンス番号を、4 バイトの整数値として求めるために Adabas が使用します。

マルチフェッチ機能を使用すると、ISN フィールドは、L9 コマンドで処理される最初のディスクリプタ値を参照します。

ISN 下限

マルチフェッチ機能を使用すると、求めるレコード数をこのフィールドに指定したレコード数に制限します。このフィールドをゼロに設定した場合、返されるレコードの最大数は、レコードバッファや ISN バッファのサイズによって異なります。

ISN 数

このフィールドには、レコードバッファに返された値を持つレコード数が返されます。マルチフェッチ機能を使用すると、このフィールドは最初のディスクリプタ値を参照します。

フォーマットバッファ長(ACB のみ)

フォーマットバッファ長(バイト単位)を示します。ユーザープログラムで定義するフォーマットバッファエリアは、ここに指定する長さ以上である必要があります。

レコードバッファ長(ACB のみ)

レコードバッファ長(バイト単位)を示します。ユーザープログラムで定義するレコードバッファエリアは、ここに指定する長さ以上である必要があります。

サーチバッファ長(ACB のみ)

開始値、終了値、または範囲値が指定された場合のサーチバッファ長(バイト数)を示します。

指定のない場合、コマンドは最小値から開始します。

バリューバッファ長(ACB のみ)

開始値、終了値、または範囲値が指定された場合のバリューバッファ長(バイト数)を示します。

サーチバッファが指定されない場合、バリューバッファ長は無視されます。

ISN バッファ長(ACB のみ)

ISN バッファ長(バイト単位)。マルチフェッチ機能を使用するときは必ず指定しなければなりません。長さの計算方法については、ISN バッファの説明を参照してください。

マルチフェッチ機能を使用すると、複数のディスクリプタ値を持つデータをレコードバッファに入れることができます。返されたディスクリプタ値の数、および各ディスクリプタに対して返されたデータのバイト数が、ISN バッファの対応するエントリに格納されます。

コマンドオプション 1

このフィールドに M を指定すると、マルチフェッチ機能を呼び出します。マルチフェッチ機能に関する詳細については、「プログラミングの考察事項」の「マルチフェッチ機能の使用」を参照してください。

コマンドオプション 2

このフィールドが A のときは、ディスクリプタ値が昇順で読まれることを示します。必要に応じて開始値、終了値、または範囲値を指定できます。サーチバッファかバリューバッファを省略すると、指定のディスクリプタのすべてのエントリが処理されます。

このフィールドが D のときは、ディスクリプタ値が降順で読まれることを示します。必要に応じて開始値、終了値、または範囲値を指定できます。サーチバッファかバリューバッファを省略すると、指定のディスクリプタのすべてのエントリが処理されます。

値に A または D を使用すると、コマンドオプション 2 フィールドの内容を変更するだけで処理を逆順にすることができます。

アプリケーションを新規に作成するときは、このフィールドを A および D にすることを強くお勧めします。他の値は上位互換性を保証するためにサポートしています。

このフィールドが空白か、A または D 以外の値のときは、A が指定されたとみなされ、ディスクリプタ値が昇順で処理されます。

アディション 1

サーチバッファまたはバリューバッファの指定がない場合は、アディション 1 に、読み込む順序を制御するために使用するディスクリプタの名前が含まれていなければなりません。ディスクリプタ名は、このフィールドの先頭 2 桁に指定します。残りの桁は空白にしなければなりません。アディション 1 に指定したディスクリプタ名は、フォーマットバッファに指定したディスクリプタ名と同じでなければなりません。

フォネティックディスクリプタは指定しないでください。

アディション 2

このフィールドには、一部のレスポンスコードについて詳細情報が返されます。詳細については、『Adabas メッセージおよびコードマニュアル』を参照してください。

アディション 3

セキュリティ保護のためのパスワードを指定します。

使用するファイルがセキュリティ保護されていない場合、このフィールドは空白にしておきます。ファイルがセキュリティ保護されている場合は、ユーザーは該当するパスワードを指定する必要があります。

指定したパスワードを保護するため、このフィールドはコマンド処理時に空白にセットされます。

アディション 5

このフィールドには、このコマンド用の内部フォーマットバッファを識別する別のフォーマットバッファ ID を指定するか、グローバルフォーマットバッファ ID を指定します。

アディション 5 フィールドの先頭バイトが英数字でなければ、コマンド ID フィールドに指定された値をフォーマットバッファ ID としても使用できます。

先頭バイトが小文字の場合は、アディション 5 フィールドの 5 バイト目から 8 バイト目までが別のローカルフォーマットバッファ ID として使用されます。

先頭バイトが数字または大文字の場合は、アディション 5 フィールド(8 バイト)が別のグローバルフォーマットバッファ ID として使用されます。つまり、フォーマットバッファ ID は、複数のユーザーが同時に使用できます。

詳細および例については、「プログラミングの考慮事項」の「コマンド ID の使用」を参照してください。

フォーマットバッファ

取得する値を返すときの形式をこのバッファに指定しなければなりません。

フォーマットバッファの構文形式は以下のとおりです。

name[,length][,format].
名前

値を求めるディスクリプタの名前。フォネティックディスクリプタは指定できません。

長さ

取得する値の長さを指定します。長さを指定しない場合は、値が FDT で指定されているディスクリプタのデフォルト長で返されます。

format

取得する値のフォーマットを指定します。ディスクリプタの標準フォーマットと変換可能なフォーマットを指定する必要があります。フォーマットを指定しない場合は、値が FDT で指定されているディスクリプタのデフォルトフォーマットで返されます。

レコードバッファ

Adabas は、フォーマットバッファで要求された値をこのバッファに返します。L9 コールごとに別の値が返されます。値は昇順または降順で返されます。ディスクリプタに空値省略(NU)オプションが定義されていると、ディスクリプタ値が空値の場合は返されません。

マルチフェッチ機能を使用すると、複数のディスクリプタ値を持つデータをレコードバッファに入れることができます。処理されたディスクリプタ値の数、および各ディスクリプタ値に関係する情報が、ISN/マルチフェッチバッファに格納されます。

サーチバッファ

取得するディスクリプタの数を制限するために開始値、終了値、またはその両方がバリューバッファで指定された場合のみ、サーチバッファが必要です。

サーチバッファまたはバリューバッファのいずれかを指定しない場合は、指定したディスクリプタのすべての値(または、指定したオカレンスのすべての値)が処理されます。この場合、アディション 1 フィールドにはディスクリプタ名が含まれていなければなりません。

サーチバッファの構文形式については、「Adabas の呼び出し」の「サーチバッファとバリューバッファ」を参照してください。

バリューバッファ

サーチバッファに格納される指定内容に応じて、バリューバッファには開始値または終了値、または範囲の上限と下限が格納されます。

ISN バッファ/マルチフェッチバッファ

マルチフェッチ機能を ACB インターフェイスで使用すると、ISN バッファには、レコードバッファに返されるディスクリプタエントリの説明が格納されます。マルチフェッチ機能を ACBX インターフェイスで使用する場合は、マルチフェッチバッファが代わりに使用されます。

各バッファの最初の 4 バイトは、そのバッファに続く 16 バイトのエントリ数を指定します。16 バイトの各エントリは、レコードバッファに返されるディスクリプタのエントリと対応し、次の符号なし整数値(4 バイト長)を含みます

  • ディスクリプタ値に対するレコードバッファ内の情報のバイト数

  • ディスクリプタ値のレスポンスコード(コントロールブロックのレスポンスコードフィールドの値とは異なることがあります)
    この値が 0 以外の場合、マルチフェッチ処理終了の原因となるエラーが発生したことを意味します。この場合、対応するディスクリプタ値のエントリはレコードバッファにありません。

  • ディスクリプタがピリオディックグループにある場合の、ピリオディックグループ内のオカレンス番号

  • ディスクリプタに対して見つかった ISN の数

その他の考慮事項

L9 コマンドを使用するときには、次の事項を考慮する必要があります。

  1. L9 コマンドで使用したコマンド ID は、Adabas により内部的に保存され、使用されます。この ID は、エンドオブファイル条件にあったとき、RC または CL コマンドが発行されたとき、または Adabas セッションが終了するときに解放されます。解放されるまでは、同一コマンド ID を他のコマンドで使うことはできません。

  2. L9 コマンドで読み込んでいるファイルから、レコードを更新することも削除することもできます。Adabas はユーザーに返した最終値と次に返す値に関する情報を保存し、コール間で更新または削除が行われても、次の値を正しく返します。

  3. L9 コマンドで読み込んでいるファイルを他のユーザーが更新している場合、ファイル内のいくつかの値を受け取らない(読み飛ばしがある)可能性があります。

例 1:

ファイル 2 内のディスクリプタ RB の値が返されます。すべての値が返されます。

コントロールブロック:

Command Code          L9
Command ID            L901 (a non blank CID is required)
File Number           2
Format Buffer Length  3 (or larger)
Record Buffer Length  10 (or larger)
Search Buffer Length  5 (or larger)
Value Buffer Length   1 (or larger)
Command Option 2      A
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RB.  (the values are to be returned using
                            standard length and format)
Search Buffer         RB,1. (the values for descriptor  RB  are
                             to be returned, and the starting value is
                             being provided with standard  format  and
                             length = 1)
Value Buffer          b    (processing is to begin with the first
                             value for RB equal or greater than 'b'

一連の L9 コールで順番に次の値を受け取ります(値は昇順に返されます)。この値を持つレコードの数は ISN 数フィールドに返されます。

例 2:

ファイル 1 内のディスクリプタ AB の値を返します。20 以上の値だけを返すこととします。

コントロールブロック:

Command Code          L9
Command ID            L902 (a non blank CID is required)
File Number           1
Format Buffer Length  7 (or larger)
Record Buffer Length  3 (or larger)
Search Buffer Length  7 (or larger)
Value Buffer Length   2 (or larger)
Command Option 2      A
Additions 3           bbbbbbbb   (file   1   is   not  security
                      protected)

バッファエリア:

Format Buffer         AB,3,U.   (the  values are to be returned
                      with length = 3 and format = unpacked)
Search Buffer         AB,2,U. (the values for the descriptor AB
                      are to be returned and the starting value
                      is to be provided as a  2  byte  unpacked
                      number)
Value Buffer          0x3230 (Processing  is to begin with the
                      first value for AB which is  equal to  or
                      greater than 20)

例 3:ASCENDING/DESCENDING オプションの使用例

次の例は、サーチバッファおよびバリューバッファのいろいろな内容に関連した ASCENDING/DESCENDING オプションの使用例を示しています。次の例は、ファイルが読み込まれている場合を示しています。

  • 値 V1 と V2 はともに存在します。それ以外は、"GE" と "LE" の例が GT と LT の例と同じになります。

graphics/4l9_seq_options.png