A1 コマンド(レコードの更新)

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


機能および使用

A1 コマンドは、レコード内の 1 つ以上のフィールド値を変更する場合に使用します。更新対象のフィールドがあるレコードは、ファイル番号と ISN 番号で識別されます。更新フィールドはフォーマットバッファに指定し、更新する値をレコードバッファに指定します。指定されたフィールド、およびオプション CR なしで定義されたシステム生成フィールドのみが変更されます。レコード内のそれ以外のフィールドは変更されません。

アソシエータおよびデータストレージへの必要な更新は、Adabas によって行われます。1 つ以上のディスクリプタが更新されると、変更を反映してインバーテッドリストが更新されます。サブディスクリプタまたはスーパーディスクリプタの生成に使用されたフィールドが更新されると、変更を反映して対応するサブディスクリプタまたはスーパーディスクリプタの値が更新されます。

ET ユーザーの場合は、更新対象レコードがユーザーに対してホールド状態か、またはコマンドオプション 1 に H、L、U、R が指定されているときにのみ、A1 コマンドが実行されます。

ユーザーは ADAM(Adabas ダイレクトアクセスメソッド)キーを通じてレコードに位置づけることもできます。この場合、コマンドオプション 2 を V にセットする必要があり、サーチバッファおよびバリューバッファには ADAM ディスクリプタ名および ADAM キーがそれぞれ格納される必要があります。この方法を使用する場合、コントロールブロックの ISN フィールドが出力フィールドになります。

ET ユーザーの場合、A1 コマンドが実行されるのは、更新対象のレコードをそのユーザーがホールドしている場合、コマンドオプション 1 = H の場合、またはコマンドオプション 2 = H の場合だけです。更新対象のレコードを別のユーザーがすでにホールドしているときに応答 145 が必要な場合は、コマンドオプション 1 を「R」、コマンドオプション 2 を「H」に設定する必要があります。

graphics/a1_1.png

A1 Command, Procedure Flow

graphics/a1_2.png

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

バッファエリア

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

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

コントロールブロック

コマンドコード

A1

コマンド ID

一連の A1 コマンドを使用して複数レコードを更新し、かつフォーマットバッファに同一フィールドを指定する場合(FIND コマンドで選択されたレコード群に対し更新する場合)には、このフィールドに、空白またはゼロ以外の値をセットします。A1 コマンドを L1/L4、L2/L5、または L3/L6 コマンドと組み合わせて使用し、各レコードの同一フィールドを読み込み/更新する場合には、READ コマンドで使用したものと同じコマンド ID を A1 コールにも使用します。これにより、連続する各 A1 コールの処理に必要な時間を削減できます。

1 回の A1 コールで、1 レコードだけを更新する、または A1 コール間でフォーマットバッファを変更する場合は、このフィールドに空白またはバイナリの 0 をセットする必要があります。

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

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

File Number

更新対象レコードを持つファイルの番号。

Response Code

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

ISN

更新するレコードの ISN を示します。

ADAM オプションを使用する場合は、このバッファで見つかったレコードの ISN が返されます。

ISN 下限

コマンドオプション「L」を使用する場合は、フォーマットバッファに *-position のセグメントが含まれている必要があります。入力値には、セグメントの現在の位置が含まれています。値は、セグメントに対して指定された長さだけ増加します。

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

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

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

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

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

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

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

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

コマンドオプション 1

このフィールドに「H」を指定すると、更新コマンドの実行前に、レコードが排他的ホールド状態になります。

このフィールドに「R」を指定すると、更新コマンドの実行前に、レコードが排他的ホールド状態になります。別のユーザーがその ISN をホールドしている場合、レスポンス 145 が返ります。

このフィールドに L を指定すると、現在の更新レコードがレコードバッファに返ります。現在のフォーマットバッファの展開に使用します。このオプションを指定すると H オプションも暗黙的に指定されます。

このフィールドに「U」を指定すると、Adabas はレコードを排他的ホールド状態にしようと試みます。ISN の競合が検出された場合は(ISN が別のユーザー用にホールド状態になっている)、コマンドは待機状態にならず、レスポンス 145 が返されます。その時点までの更新レコードは、レコードバッファに返されます。

「L」オプションと「U」オプションは、フォーマットバッファの追加オプションまたはシステム生成フィールド(CR なし)と組み合わせて使用したときにのみ有効です。

このフィールドに「X」を指定すると、A1 コマンドは、ISN が指定された E1 コマンドに続けて、フォーマットとレコードバッファが指定された ISN を指定した N2 コマンドを実行した場合と同等になります(ただし、より効率的です)。ただし、フィールドオプション SY および CR のフィールドが変更されないという例外があります。

注意:
「X」オプションは、レコード内の MU 値や PE グループの数の低減に役立ちます。

コマンドオプション 2

このフィールドに H を指定すると、ISN がホールドキューに置き換えられてから、更新コマンドが実行されます。R オプションが指定されないときに別のユーザーがその ISN をホールドしている場合、コマンドは待機し、レスポンス 145 が返されます。

このフィールドに「L」を指定した場合は、フォーマットバッファに *-position のセグメントが含まれているときにのみ、フォーマットバッファを使用できます。次に、ISN 下限フィールドが使用されて、*-position のセグメントの現在の位置が判断されます。オプション「L」を指定していない場合、*-position のあるセグメントの現在の位置は、フィールド値の最初の(左端の)バイトになります。

このフィールドに「T」を指定すると、「プログラミングの考慮事項」の「システム生成フィールド」で説明されている規則に従ってレコードが処理されます。

このフィールドが V のときは、ADAM オプションを使用していることを示します。値(ADAM キー)は、ADAM ディスクリプタファイルにのみ指定できます。キーの値はバリューバッファで指定され、ディスクリプタ名はサーチバッファで指定されます。ADAM オプションを使用する場合、ISN フィールドが出力フィールドになります。

指定された ADAM キーを持つレコードが見つからない場合は、レスポンスコード 52 が返されます。

コマンドオプション 1 と 2 の可能な組み合わせ、および要求されるホールド状態と競合に関する情報について、次の表に示します。

CO1 CO2 ホールド状態 競合 特殊情報
' ' ' ' ホールドを要求    
'H' ' ' ホールドを設定 ISN を待機  
' ' 'H' ホールドを設定 ISN を待機  
'L' ' ' ホールドを設定 ISN を待機 レコードの読み込み
'U' ' ' ホールドを設定 レスポンス 145 レコードの読み込み
'R' ' ' ホールドを設定 Rsp145  
'R' 'H' ホールドを設定 レスポンス 145  
'R' 'V' ホールドを設定 レスポンス 145 ADAM
' ' 'V' ホールドを要求   ADAM
'H' 'V' ホールドを設定 ISN を待機 ADAM、レコードの読み込み
'L' 'V' ホールドを設定 ISN を待機 ADAM、レコードの読み込み
'U' 'V' ホールドを設定 レスポンス 145 ADAM、レコードの読み込み
アディション 2

レスポンスコードが 0 の場合、Adabas は、このフィールドに更新されたレコードの圧縮レコード長を返します。この長さは先頭 2 バイトにバイナリ形式で入ります。L または U オプションを使用する場合、最後の 2 バイトには、フォーマットバッファによって選択された圧縮フィールドの長さがバイナリ形式で含まれます。

アディション 3

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

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

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

アディション 5

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

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

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

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

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

フォーマットバッファ

このバッファには、更新するフィールドを指定する必要があります。

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

レコードバッファ

このバッファには、フォーマットバッファに指定した長さとフォーマットに従って、更新する値が入ります。

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

サーチバッファ

ADAM オプション(コマンドオプション 2 = V)が使用される場合、サーチバッファには、ADAM ディスクリプタのフィールド指定が格納されます。フィールド名が ADAM キーでない場合は、レスポンス 61 が返されます。

バリューバッファ

ADAM オプション(コマンドオプション 2 に V をセットする)を使用する場合、バリューバッファには ADAM キーの値が含まれます。

その他の考慮事項

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

  1. サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、およびフォネティックディスクリプタは、直接更新することはできません。これらを更新するためには、サブディスクリプタ、スーパーディスクリプタ、またはフォネティックディスクリプタの親フィールドを更新しなければなりません。対応するサブディスクリプタ、スーパーディスクリプタ、またはフォネティックディスクリプタの値は、Adabas によって自動的に更新されます。

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

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

  4. 標準長を超える長さをフォーマットバッファに指定して(フィールドが FI オプションで定義されている場合には許可されません)フィールドを更新する場合、その後のそのフィールドへの参照では、更新された長さを指定する必要があります。標準長を使用すると、英数字フィールドでは桁落ちが発生し、数値フィールドではレスポンスコード 55 が返されることになります。

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

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

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

  8. マルチプルバリューフィールドを更新する場合は、Adabas が、必要であれば以下のルールに従って、マルチプルバリューカウントフィールドを更新します。

    • NU オプションで定義したマルチプルバリューフィールドについては、カウントフィールドは現在、空値でない値の数に調整されます。空値はすべて削除されます。

      Field Definition            01,MF,5,A,MU,NU
      
      MF values before update     XXXXX,YYYYY
      Format Buffer               MF4
      Record Buffer               ZZZZZ
      Result after update         XXXXX,YYYYY,ZZZZZ
                                  MF count = 3
      
      MF values before update     XXXXX,YYYYY,ZZZZZ
      Format Buffer               MF2
      Record Buffer               bbbbb (blanks)
      Result after update         XXXXX,ZZZZZ
                                  MF count = 2
      
      MF values before update     XXXXX,ZZZZZ
      Format Buffer               MF1-2
      Record Buffer               bbbbbbbbbb (blanks)
      Result after update         Values suppressed
                                  MF count = 0
      
    • NU オプションなしで定義されたマルチプルバリューフィールドの場合、カウントは現在存在する値の数(空値を含む)を反映するように調整されます。

      Field Definition            01,MF,5,A,MU
      
      MF values before update     XXXXX,YYYYY
      Format Buffer               MF4
      Record Buffer               DDDDD
      Result after update         XXXXX,YYYYY,b(blank),DDDDD
                                  MF count = 4
      
      MF values before update     XXXXX,YYYYY,ZZZZZ
      Format Buffer               MF3
      Record Buffer               bbbbb (blanks)
      Result after update         XXXXX,YYYYY,b (blank)
                                  MF count = 3
      
  9. インデックスなしで MU フィールドを指定した場合は、レコードバッファに含まれる値のみがデータベースに保存され、古いレコードに含まれている他のすべての MU 値は削除されます。現在のレコードバッファに空値が含まれていて、かつ MU フィールドが NU オプションで定義されている場合、空値は抑制されます。カウントフィールドが適宜調整されます。

    Field Definition            01,MF,5,A,MU,NU
    
    MF values before update     XXXXX,YYYYY
    Format Buffer               MF
    Record Buffer               AAAAA
    Result after update         AAAAA
                                MF count = 1
        
    MF values before update     XXXXX,YYYYY
    Format Buffer               MF1
    Record Buffer               AAAAA
    Result after update         AAAAA,YYYYY
                                MF count = 2
    
    MF values before update     XXXXX,YYYYY,ZZZZZ
    Format Buffer               MF
    Record Buffer               bbbbb (blanks)
    Result after update         value suppressed
                                MF count = 0
  10. ピリオディックグループに属する 1 つ以上のフィールドを更新する場合は、Adabas が、必要であれば以下のルールに従って、ピリオディックグループカウントを更新します。

    • カウントは、フォーマットバッファに指定した最高オカレンス番号に合わせて調整されます(指定したオカレンス番号が現在の最高オカレンス番号よりも大きい場合)。

      Field Definitions           01,GB,PE
                                  02,BA,1,B,DE,NU
                                  02,BB,5,P,NU
      
      GB values before update     GB (1st occurrence)
                                  BA = 5   BB = 20
                                  GB (2nd occurrence)
                                  BA = 6   BB = 25
                                  GB count = 2
      
      
      Format Buffer               GB4
      Record Buffer               0x08000000500C
      
      Format Buffer               GB4
      Record Buffer               ^X08000000500C
      
      
      Result after update         GB (1st occurrence)
                                  BA = 5   BB = 20
                                  GB (2nd occurrence)
                                  BA = 6   BB = 25
                                  GB (3rd occurrence)
                                  BA = 0   BB = 0
                                  GB (4th occurrence)
                                  BA = 8   BB = 500
                                  GB count = 4
      
      GB values before update     GB (1st occurrence)
                                  BA = 5   BB = 20
                                  GB (2nd occurrence)
                                  BA = 6   BB = 25
                                  GB count = 2
      
      
      Format Buffer               GB1
      Record Buffer               0x00000000000C
      
      Format Buffer               GB1
      Record Buffer               ^X00000000000C
      
      
      Result after update         GB (1st occurrence)
                                  BA = 0   BB = 0
                                  GB (2nd occurrence)
                                  BA = 6   BB = 25
                                  GB count = 2
      
  11. 可変長(標準長がない)に定義されたフィールドをフォーマットバッファに指定する場合、対応するレコードバッファ内の値の前に、値の長さを示す 1 バイトの 2 進数(長さバイトを含む)を指定する必要があります。

    Field Definitions           01,AA,3,A
                                01,AB,0,A
    
    Format Buffer               AA,AB.
    Record Buffer               "313233063132333435"
    

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

注意:
ここで記述するすべての例では、付録 A の Adabas ファイル定義を使用しています。

ファイル 1 の ISN 4 が次の値で更新されます。

Field AA            1234
Field AB            20

コントロールブロック:

Command Code          A1
Command ID            bbbb (blanks; only 1 record is to be updated)
File Number           1
ISN                   4
Format Buffer Length  10 (or larger)
Record Buffer Length  10 (or larger)
Additions 3           bbbbbbbb (blanks; file is not security protected)

バッファエリア:

Format Buffer         AA,AB,2,U.
Record Buffer         0x21323334202020203230
Record Buffer         ^X21323334202020203230