N1/N2 コマンド(レコード追加)

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


機能および使用

N1 コマンドは、ファイルに新しいレコードを追加する場合に使用します。

レコードを追加するファイルと値を与えるフィールドを指定します。追加レコード内で指定のないフィールドには空値が入ります。

Adabas は レコードに ISN を割り当て、レコードをデータストレージに追加し、必要に応じてアソシエータの更新を行います。

N2 コマンドは、ADAFDUにREUSE=ISN を指定しているかどうかにかかわらず、レコードに割り当てる ISN をユーザーが指定する場合に使用します。

ユーザーが ET ロジックユーザーの場合、追加レコードは排他的ホールド状態になります。

graphics/n1n2.png

N1/N2 Command, Procedure Flow

コントロールブロック

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 *
フォーマットバッファ長(ACB のみ) B F/U
レコードバッファ長(ACB のみ) B F/U
アディション 2 A、B -/A
アディション 3 A F/A
アディション 5 A F/U
コマンドタイム B -/A
ユーザーエリア   F/U

バッファエリア

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

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

コントロールブロック

コマンドコード

N1/N2

コマンド ID

複数のレコードを一連の N1/N2 コールで追加し、各コールで同一フィールドをフォーマットバッファに指定する場合は、このフィールドに空白またはゼロ以外の値をセットすべきです。これにより、各 N1/N2 コール処理に必要な時間を削減できます。

1 レコードだけを追加する、または N1/N2 コール間にフォーマットバッファを変更する場合は、コマンド ID に空白またはバイナリのゼロをセットすべきです。

このフィールドの上位バイトには 16 進数の FF を設定できません。これは、自動コマンド ID 生成を使用するときは除きます(詳細については、「コマンド ID の使用」を参照してください)。

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

File Number

レコードを追加するファイルの番号。

Response Code

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

ISN

N1 コマンドを使用する場合は、Adabas が、このフィールドにレコードに割り当てた ISN を返します。

N2 コマンドを使用する場合は、レコードに割り当てる ISN を、このフィールドに指定しなければなりません。与える ISN は、ファイル中のレコードにすでに割り当てられた ISN であってはならず、当ファイルに対する ISN の制限(MAXISN)内になければなりません。MAXISN は、ファイルのロード時に DBA が指定します。

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

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

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

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

アディション 2

レスポンスコード 0 が返る場合は、Adabas が、このフィールドに追加されたレコードの圧縮レコード長を返します。この長さは先頭 2 バイトにバイナリ形式で入ります。

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

アディション 3

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

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

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

アディション 5

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

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

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

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

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

フォーマットバッファ

このバッファには、レコードバッファに指定する値と対応するフィールドを指定します。

フォーマットバッファ構成の構文および例については、「Adabas の呼び出し」の「フォーマットバッファとレコードバッファ」を参照してください。

指定しなかったフィールドは、追加レコード内で空値として扱われます。

フォーマットバッファに指定されていないすべての非 NU ディスクリプタは、インバーテッドリストに空値を持ちます。

バージョン 3.2 以前でロードされたファイルについては、N1/N2 コマンドで使用するフォーマットバッファで指定されていない非 NU ディスクリプタに次のルールが適用されます。

  • フォーマットバッファで指定されたフィールドより(フィールド定義テーブル内で)前にあり、フィールド定義テーブルの先頭から最も遠い省略された非 NU ディスクリプタは、そのディスクリプタのインバーテッドリストに入力されたレコードに空値を持つことになります。

  • フォーマットバッファで指定されたフィールドより(フィールド定義テーブル内で)後にあり、フィールド定義テーブルの先頭から最も遠い省略された非 NU ディスクリプタは、そのディスクリプタのインバーテッドリストに入力されたレコードに空値を持ちません。

したがって、フォーマットバッファは、すべての非 NU ディスクリプタが参照されるように、または参照されるすべての非 NU ディスクリプタより(フィールド定義テーブル内で)後にある少なくとも 1 つのフィールドが参照されるように構築する必要があります。これにより、非 NU ディスクリプタのインバーテッドリストに、空値が正しく挿入されます。

ピリオディックグループ内の非 NU ディスクリプタについては、フォーマットバッファに指定された最高オカレンス番号の前に位置する空値オカレンスについてのみ、インバーテッドリストに空値がエントリされます。

レコードバッファ

フォーマットバッファに指定した各フィールドの値を、このバッファに指定しなければなりません。

各値は、フォーマットバッファに標準長以外の長さやフォーマットを指定する場合を除いて、該当フィールドの標準長および標準フォーマットに従って指定する必要があります。

フィールドが可変長フィールド(標準長なし)として定義されている場合、フィールドの長さ(長さバイトも含む)を持つ 1 バイトのバイナリフィールドを値の直前に指定する必要があります。

値が入るフィールドが、ユニークディスクリプタとして定義されている場合は、指定値がディスクリプタに存在することはできません。そうでないと、コマンドはレスポンスコード 98 を受け取ります。

その他の考慮事項

N1/N2 コマンドを使用するときは、以下の事項を考慮しなければなりません。

  1. サブディスクリプタ、スーパーディスクリプタ、およびフォネティックディスクリプタをフォーマットバッファに指定できません。サブディスクリプタ、スーパーディスクリプタ、およびフォネティックディスクリプタの親フィールドをフォーマットバッファに指定した場合、Adabas は自動的にこれらのディスクリプタ値を正しく作成します。

  2. 圧縮後の最大レコード長(レコード ISN を含む)は、使用可能な最大データストレージブロックサイズ - 4 です。

  3. 圧縮前の最大レコード長は 32,767 バイトです。ただし、Adabas セッションの LU パラメータに指定された値によっては、この値より小さくなります(最大レコード長 = LU 値 – フォーマットバッファ長 – 108)。圧縮後の最大レコード長は、データストレージブロックサイズ - 4 バイトまたは WORK ブロックサイズ - 55 バイトのどちらか小さい方です。

  4. ディスクリプタが TR オプション付きで定義されていない限り、ディスクリプタ値が 1144 バイトを超えることはできません。

  5. フィールドに、標準長を超える長さを指定した場合(フィールドが FI オプションで定義されている場合には許されない)、このフィールドを後で参照するときにはここで指定した長さを指定すべきです。後でそれを標準長で参照すると、英数字フィールド(OPTIONS=TRUNCATION が指定されている場合)では値の桁落ちが発生し、数値フィールドでは、0 以外のレスポンスコードが返されます。

  6. インデックスなしのフィールド名は、それがマルチプルバリューフィールドの場合にのみ複数回指定できます。マルチプルバリューフィールドと、インデックスが同じピリオディックグループ内のフィールドは、複数指定できません。グループとそのグループ内のフィールドを同時に指定することも禁止されています。

  7. 数値編集マスクはフォーマットバッファに指定できません。

  8. フォーマットバッファに指定したマルチプルバリューカウントフィールド、またはピリオディックグループカウントフィールドは、無視されます。レコードバッファの対応する値も無視されます。フォーマットバッファのリテラルやレコードバッファの対応する位置も無視されます。

  9. マルチプルバリューフィールドをフォーマットバッファに指定する場合、Adabas は次のルールに従って、マルチプルバリューフィールドカウントを設定します。

    • NU オプション付で定義したマルチプルバリューフィールドに対するカウントフィールドは、現在空値でない値の個数になります。空白値は完全に削除されます。

    フィールド定義

    フォーマットバッファ
    レコードバッファ
    追加後の結果
    01,MF,5,A,MU,NU

    MF1-3
    XXXXXYYYYYZZZZZ
    XXXXX,YYYYY,ZZZZZ
    MF カウント = 3
    フォーマットバッファ
    レコードバッファ
    追加後の結果
    MF1-3
    XXXXXbbbbbZZZZZ
    XXXXX,ZZZZZ
    MF カウント = 2
    フォーマットバッファ
    レコードバッファ
    追加後の結果
    MF1-3
    bbbbbbbbbbbbbbb(空白)
    値は省略
    MF カウント = 0
    • NU オプションなしで定義したマルチプルバリューフィールドに対するカウントフィールドは、存在する値(空値も含めた)の個数になります。

    フィールド定義

    フォーマットバッファ
    レコードバッファ
    追加後の結果
    01,MF,5,A,MU

    MF1-3
    XXXXXYYYYYbbbbb
    XXXXX,YYYYY,b(空白)
    MF カウント = 3
    フォーマットバッファ
    レコードバッファ
    追加後の結果
    MF1
    bbbbb(空白)
    b(空白)
    MF カウント = 1
  10. ピリオディックグループまたはピリオディックグループ内のフィールドをフォーマットバッファに指定すると、ピリオディックグループカウントはフォーマットバッファに指定された最大オカレンス番号に等しくなります。最高オカレンス値が空値で削除される場合は、カウントはそれに応じて調整されます。

    フィールド定義 01,GB,PE
    02,BA,1,B,DE,NU
    02,BB,5,P,NU
    フォーマットバッファ
    レコードバッファ
    GB1-2
    0x08000000500C09000000600C
    (または ^X08000000500C09000000600C)
    フォーマットバッファ
    レコードバッファ
    GB1-2.
    ^X08000000500C09000000600C
    追加後の状態 GB(第 1 オカレンス)
    BA = 8 BB = 500
    GB(第 2 オカレンス)
    BA = 9 BB = 600
    GB カウント = 2
    フォーマットバッファ
    レコードバッファ
    GB1-2
    0x00000000000C00000000000C
    (または ^X00000000000C00000000000C)
    フォーマットバッファ
    レコードバッファ
    GB1-2.
    ^X00000000000C00000000000C
    追加後の状態 GB(第 1 オカレンス)
    値は省略
    GB(第 2 オカレンス)
    値は省略
    GB カウント = 0
  11. 可変長(標準長がない)に定義されたフィールドをフォーマットバッファに指定する場合、対応するレコードバッファ内の値の前に、値の長さを示す 1 バイトの 2 進数(長さバイトを含む)を指定する必要があります。

    フィールド定義 01,AA,3,A
    01,AB,0,A
    フォーマットバッファ
    レコードバッファ
    AA,AB
    0x313233063132333435
    (または ^X3132330631323334350)
    フォーマットバッファ
    レコードバッファ
    AA,AB.
    ^X313233063132333435

    フィールド AA と AB が更新されます。AA の値は 123 です。AB(可変長フィールド)の値は 12345 です。

例 1:

1 つのレコードをファイル 1 に追加します。レコードの ISN は Adabas によって割り当てられます。指定するフィールド値は、以下のとおりです。

フィールド
AA ABCD
MF(値 1) AAA
MF(値 2) BBB
BA(第 1 オカレンス) 5
BA(第 2 オカレンス) 6

コントロールブロック:

Command Code          N1
Command ID            bbbb (only 1 record being added)
File Number           1
Format Buffer Length  15 (or larger)
Record Buffer Length  16 (or larger)
Additions 3           bbbbbbbb (file 1 not security protected)

バッファエリア:

Format Buffer         AA,MF1-2,BA1-2.
Record Buffer         0x61626364202020206161616262620506
                      (or ^X61626364202020206161616262620506)
Record Buffer         ^X61626364202020206161616262620506

例 2:

1 つのレコードをファイル 2 に追加します。レコードの ISN はユーザーが指定します。指定するフィールド値は以下のとおりです。

フィールド
RA 12345678
RB ABCD

コントロールブロック:

Command Code          N2
Command ID            bbbb (only 1 record is to be added)
File Number           2
ISN                   20 (ISN  20  is  to  be  assigned  to  the
                          record)
Format Buffer Length  6 (or larger)
Record Buffer Length  18 (or larger)
Additions 3           Password (file 2 is security protected)

バッファエリア:

Format Buffer         RA,RB.
Record Buffer         0x313233343536373861626364202020202020
                      (or ^X313233343536373861626364202020202020)
Record Buffer         ^X313233343536373861626364202020202020