フォーマットバッファには、Adabas 読み込みコマンドまたは更新コマンドの実行中に処理するフィールドを指定します。 フォーマットバッファには、バッファ自体の末尾の(.)も含め、関連プログラムに含まれている最長のフィールド定義を保持できるだけの十分な長さが必要です。
フォーマットバッファはレコードバッファとペアで使用され、さらに ACBX インターフェイスダイレクトコールではマルチフェッチバッファともペアで使用されます。 フォーマットバッファを指定する場合は、レコードバッファも指定する必要があります。 レコードバッファを指定しないと、フォーマットバッファのペアとなるダミーのレコードバッファ(長さゼロ)が作成されます。
ACBX ダイレクトコールインタフェースを使用する場合、Adabas ダイレクトコールに複数のフォーマットバッファを指定できます。
ACBX インターフェイスダイレクトコールでは、マルチフェッチバッファセグメントも指定できます。 詳細については、「レコードバッファ」および「マルチフェッチバッファ」を参照してください。
それぞれのタイプの ABD またはバッファ間の関係については、「バッファタイプ間の関係」を参照してください。
このドキュメントでは、次のトピックについて説明します。
フォーマットバッファは 2 つの部分に分かれています。バッファのオプションフィールド選択条件と、想定されるレコードフォーマットです。
多様なレコードフォーマットをもつファイルに対しては、フォーマットバッファに複数のレコードフォーマットを指定できます。 どのレコードフォーマットを使用するかは、ファイルのフィールド値によって決まります(例えば、レコードタイプ)。 複数のレコードフォーマットを指定する場合、各レコードフォーマットの前にフォーマット選択条件を指定する必要があります。
フォーマットバッファの構文は次のとおりです。
{[field-selection-criteria1] record-format1}[,{[field-selection-criteria2] record-format2}]... .
各フォーマットバッファエントリは、コンマ(,)で区切る必要があります。 各エントリ間に 1 つ以上の空白があってもかまいません。 最後のエントリの後には、コンマを付けないでください。
フォーマットバッファはピリオドで終了する必要があります。
次のセクションでは、この構文のコンポーネントについて説明します。
フィールド選択条件は、フォーマットバッファではオプションです。 フィールド選択条件を使用すると、レコードフォーマットをフィールドの特定の値に制限できます。 フィールド選択条件の構文は次のとおりです。
(field-name operator value1 [, value2]...)
フィールド選択条件に使用するフィールド名は、読み込まれる Adabas ファイルの FDT にあるフィールドの有効な名前である必要があります。 次の値を指定することはできません。
グループまたはピリオディックグループの名前
MU、PE、LA、LB のいずれかのオプションを使用しているフィールド
サブフィールド、スーパーフィールド、サブディスクリプタ、またはスーパーディスクリプタ
照合ディスクリプタ
ハイパーディスクリプタ
フォネティックディスクリプタ
また、NU または NC/NN オプションで指定したフィールドは空値以外の値である必要があります。空値であると、選択条件が偽になります。
次の表は、フォーマットバッファフィールド選択条件に使用できる演算子のリストです。
演算子 | 説明 |
---|---|
EQ | 等しい |
= | 等しい |
NE | 等しくない |
LT | より小さい |
< | より小さい |
GT | より大きい |
> | より大きい |
LE | より小さいまたは等しい |
GE | より大きいまたは等しい |
値は、整数または英数字にする必要があります。
EQ または = 演算子を使用する場合は、一連の値をコンマで区切って指定できます。 英数字は引用符で囲みます(例えば
'value'
)。
次に例を示します。
(SA = 1) record-format-1, (SA = 2,3,4) record-format-2, (SA GE 4) record-format-3.
フィールド選択条件は次のとおりです。
SA フィールドの値が "1" の場合、レコードフォーマット 1 が使用されます。
SA フィールドの値が "2"、"3"、または "4" の場合、レコードフォーマット 2 が使用されます。
SA フィールドの値が "4" 以上の場合、レコードフォーマット 3 が使用されます。
最初に一致した条件が使用されます。 いずれの条件も一致しない場合、レスポンスコードが返されます。 上記の例では、SA フィールドの値が "4" の場合、フィールド選択条件の最後の 2 つが一致します。 ただし、レコードフォーマット 2 が最初に一致する条件であるため、レコードフォーマット 3 ではなくレコードフォーマット 2 が常に使用されます。 同じく、SA フィールドの値が "0" の場合、レスポンスコードが返されます。
レコードフォーマットは必須であり、Adabas ダイレクトコールでどのフィールドを読み込むか、または更新するかを示すのに使用します。
レコードフォーマットの構文は次のとおりです。
この構文の各エレメントについては、次の表に示すセクション(このセクション内)を参照してください。
構文要素 | 参照先 |
---|---|
field | field 構文 |
length | 長さおよびデータフォーマット |
data-format | 長さおよびデータフォーマット |
field-name - field-name | フィールドの連続表記 |
nX | スペース表記(nX) |
'text' | テキスト挿入表記 |
レコードフォーマット構文の field の構文は次のとおりです。
このセクションでは、このフィールド構文に関連する次のトピックを取り上げています。
field-name は値、範囲、またはカウントを要求したり、新しい値を提供したりするフィールドまたはグループの名前です。 指定した名前は 2 文字で、Adabas ダイレクトコールで読み込むかまたは更新されるファイルの FDT に存在している必要があります。 この名前でエレメンタリフィールド、サブフィールド、スーパーフィールド、マルチプルバリューフィールド、グループ、またはピリオディックグループを参照できます。
フィールド名でグループを参照すると、グループ内の全フィールドが参照されます。 グループ名を使用すると、コマンド処理に必要な時間を短縮できます。 グループ名は、グループにマルチプルバリューフィールドまたは可変長フィールド(標準長なし)が含まれている場合には指定できません。
読み込みコマンドで同一名を複数指定すると、 フィールド値が複数回返されます。
更新コマンドでは同一名を複数指定できません(ただし以降で説明するようにマルチプルバリューフィールドの場合は除く)。
サブフィールド、スーパーフィールド、サブディスクリプタ、またはスーパーディスクリプタの名前は読み込みコマンドには指定できますが、更新コマンドには指定できません。
次の表は、指定可能な単一値のフィールドタイプとコマンドタイプとの関係を示しています。
コマンドタイプ | フィールド | サブフィールド | スーパーフィールド | DE | SUBDE | SUPERDE | COLDE |
---|---|---|---|---|---|---|---|
読み込み(Ln) 1 | ○ | ○ | ○ | ○ | ○ | ○ | ○ 3 |
追加(Nn) | ○ | × | × | ○ | × | × | × |
検索(Sn) | ○ | ○ | ○ | ○ | ○ | ○ | ○ |
更新(A1/4) 2 | ○ | × | × | ○ | × | × | × |
注意:
以下は、マルチプルバリューフィールドまたはピリオディックグループのオカレンスを選択するフィールド名形式です。
field-name i[-j]
上記の意味は次に示すとおりです。
i | ピリオディックグループまたはマルチプルバリューのオカレンス。 |
i-j | ピリオディックグループまたはマルチプルバリューのオカレンス範囲。 |
ピリオディックグループ名には、数字など適切な接尾辞を付ける必要があります(詳細については、「カウントインジケータ(C)」および「最高オカレンス/値インジケータ(N)」参照)。 ピリオディックグループ名をフィールド名のみで指定することはできません。
マルチプルバリューフィールドを指定するには、特定の値(インデックス)を明示的に指定するか、または各値を順番に参照して Adabas がその順番に基づいてインデックスを割り当てることができるようにします。 詳細については、「マルチプルバリューフィールド」を参照してください。
例 | 選択される内容 |
---|---|
ZZ3 | マルチプルバリューフィールド ZZ の 3 番目の値。ピリオディックグループ ZZ の第 3 オカレンスの値。ピリオディックグループの第 3 のオカレンス内に存在する(単一またはマルチプルバリューフィールド)ZZ の最初のオカレンスの値。 |
ZZ3-6 | マルチプルバリューフィールド ZZ の 3~6 番目の値。ピリオディックグループ ZZ の第 3~6 のオカレンスの値。ピリオディックグループの第 3~6 のオカレンス内に存在する(単一またはマルチプルバリュー)フィールド ZZ の最初のオカレンスの値。 |
ピリオディックグループ(またはピリオディックグループ内のフィールド)を参照する場合、どのオカレンスを参照するかを指定する必要があります。 これは、1~3 桁のインデックス(値 1~191、先行のゼロ可)を名前に付けて表示します。
以下に例を示します。
注意:
このセクションで説明する例では、「例で使用されているファイル定義」に記載した Adabas
ファイル定義を引用しています。
ピリオディックグループのオカレンスはすべて、グループ名とオカレンス番号で識別できます。
例 | 選択される内容 |
---|---|
GB3 | ピリオディックグループ GB の 3 番目のオカレンス(フィールド BA3、BB3、BC3)。 |
1 つ以上のピリオディックグループ内のフィールドを選択すると、フィールド名とオカレンス(値)が使用されます。グループ名は暗黙のうちに使用されます。
例 | 選択される内容 |
---|---|
BB06 | フィールド BB の 6 番目のオカレンス。 |
ピリオディックグループ(またはピリオディックグループ内のフィールド)のある範囲のオカレンスを参照するには、ピリオディックグループまたはフィールド名を入力し、その後に最初と最後のオカレンス番号をハイフンでつないで入力します。 オカレンス番号は昇順にする必要があります。降順の範囲は許可されていません。
例 | 選択される内容 |
---|---|
GB2-4 | ピリオディックグループ GB の第 2 から第 4 オカレンスおよびこれらのオカレンス内のすべてのフィールドを参照します(BA2、BB2、BC2、BA3、BB3、BC3、BA4、BB4、BC4)。 |
BA2-4,BC2-4 | BA と BC の第 2 から第 4 オカレンスを参照します(BA2、BA3、BA4、BC2、BC3、BC4)。 |
フォーマットバッファにマルチプルバリューフィールドを指定するには、特定の値(インデックス)を明示的に指定するか、または各値を順番に参照して Adabas がその順番に基づいてインデックスを割り当てることができるようにします。 この 2 つの方法は、マルチプルバリューフィールドから得られたサブディスクリプタまたはスーパーディスクリプタにも適用されます。
注意:
このセクションで説明する例では、「例で使用されているファイル定義」に記載した Adabas
ファイル定義を引用しています。
インデックス:マルチプルバリューフィールドの特定の値を参照するには、フィールド名の後に 1~3 桁のインデックス(値 1~191、先行のゼロ可)を入力します。
例 | 選択される内容 |
---|---|
MF2 | マルチプルバリューフィールド MF の 2 番目の値を参照します。 |
MF1,MF10 | マルチプルバリューフィールド MF の 1 番目の値と 10 番目の値を参照します。 |
マルチプルバリューフィールドのある範囲の値を参照するには、最初と最後の値をハイフンでつなぎ、フィールド名の直後に指定します。 降順範囲は指定できません。
例 | 選択される内容 |
---|---|
MF1-3 | マルチプルバリューフィールド MF の 1 番目から 3 番目までの値を参照します。 |
順番:フィールド名を繰り返してマルチプルバリューフィールドを参照するには、まず最初の値を指定し、次に 2 番目の値を指定します。以後、同じように指定します。
例 | 選択される内容 |
---|---|
MF,MF | マルチプルバリューフィールド MF の 1 番目の値と 10 番目の値を参照します。 |
AA,MF,AB,MF,AC,MF | フィールド AA、AB、AC とともにマルチプルバリューフィールド MF の 1 番目から 3 番目の値が参照されます。 |
マルチプルバリューフィールド値を参照するのに、同一フォーマットバッファで上記 2 つの方法を両方とも使用できます。 オカレンスインデックスを指定しない場合は、最終オカレンスより 1 つ大きく、左から右に進むオカレンスが割り当てられます。 最後のインデックスとして、"N" または "N-1" が指定されており、このインデックスが現在の最高オカレンスを参照している場合、インデックスを明示的に指定しない新しいフィールド指定では、最後の指定として同一オカレンスを参照します。 最高オカレンス/値インジケータ N/1-N/NC の詳細については、「最高オカレンス/値インジケータ(N)」を参照してください。
更新コマンドで、マルチプルバリューフィールドへのすべてのフォーマットバッファ参照をインデックスではなく順番で指定した場合、指定したオカレンスのみがレコードに残り、それ以外のオカレンスは削除されます。 マルチプルバリューフィールドへのいずれかの参照をインデックスで指定した場合は、指定したオカレンスのみが変更され、それ以外のオカレンスは変わりません。
マルチプルバリューフィールドがピリオディックグループ内に存在している場合、マルチプルバリューフィールド名を指定すると、ピリオディックグループ名が暗黙的に使用されます。 このため、グループ名を指定する必要はなく、グループオカレンスまたはオカレンス範囲のみを指定できます。 1 つのピリオディックグループオカレンスまたはオカレンス範囲内のマルチプルバリューフィールドまたはフィールド範囲を選択するための一般形式は次のとおりです。
field-name i[-j] (i[- j])
上記の意味は次に示すとおりです。
i | ピリオディックグループのオカレンス |
i-j | ピリオディックグループのオカレンス範囲 |
( i ) | マルチプルバリューフィールド値 |
( i-j ) | マルチプルバリューフィールド値の範囲 |
以下に例を示します。
注意:
このセクションで説明する例では、「例で使用されているファイル定義」に記載した Adabas
ファイル定義を引用しています。
ピリオディックグループ内のマルチプルバリューフィールドを参照する場合、フィールド名の後にピリオディックグループのオカレンス番号を入力し、その後に求めるマルチプルバリューフィールド値または値の範囲をカッコで囲んで指定します。
例 | 選択される内容 |
---|---|
CB2(5) | フィールド CB を含むピリオディックグループの第 2 オカレンス内のマルチプルバリューフィールド CB の 5 番目の値を参照します。 |
CB2(1-5) | フィールド CB を含むピリオディックグループの第 2 オカレンス内のマルチプルバリューフィールド CB の 1 番目から 5 番目の値を参照します。 |
ある範囲のピリオディックグループオカレンス内の同じマルチプルバリューフィールド、または同じ範囲のマルチプルバリューフィールドを参照する場合、フィールド名の後にピリオディックグループオカレンスの範囲を入力し、その後にマルチプルバリューフィールド値の範囲をカッコで囲んで指定します。
例 | 選択される内容 |
---|---|
CB3-5(2) | フィールド CB を含むピリオディックグループの第 3 から第 5 までの各オカレンスに存在するマルチプルバリューフィールド CB の 2 番目の値を選択します。 |
CB1-2(1-4) | フィールド CB を含むピリオディックグループの第 1、第 2 オカレンス内のマルチプルバリューフィールド CB の 1 番目から 4 番目の値を参照します。 |
ピリオディックグループのオカレンス数、またはピリオディックグループに含まれていないマルチプルバリューフィールドの値の個数は、ピリオディックグループまたはマルチプルバリューフィールド名に文字 C を付けて参照できます。
field-name C count for multiple-value field or periodic group "field-name"
例 | 選択される内容 |
---|---|
GBC | ピリオディックグループ GB の最高オカレンスカウントを参照します。 |
MFC | ピリオディックグループに含まれないマルチプルバリューフィールド MF に存在する値の個数を参照します。 |
個数は、ユーザーが特に長さやフォーマットを指定(「長さおよびデータフォーマット」を参照)しなければ、1 バイトのバイナリ数としてレコードバッファに返されます。
Adabas ファイルで Adabas 8 拡張 MU/PE の制限を使用する場合は、2 バイトのオカレンスカウント値(例えば、FB='MUC,2,B')を処理できるように、プログラムが 2 バイト以上のレコードバッファフィールドにオカレンスカウントを読み込むことを確認してください。 拡張 MU/PE が制限されたファイルの MU フィールドまたは PE グループのオカレンスカウント用のレコードバッファに 1 バイトフィールドのみを指定した場合、Adabas はレスポンスコード 55、サブコード 9 を返します。
ピリオディックグループ内のマルチプルバリューフィールドに値がいくつあるか確認するには、マルチプルバリューフィールド名の直後にピリオディックグループオカレンスと文字 C を入力します。
field-name i C count for multiple-value field "field-name" within a group occurrence
例 | 選択される内容 |
---|---|
CB4C | ピリオディックグループの第 4 オカレンス内マルチプルバリューフィールド CB の値の個数を参照します。 |
更新コマンドに対して C 指定をすると、カウントは無視され、カウントフィールドがレコードバッファに占める桁数がスキップされます。
ユーザーは、マルチプルバリューフィールドまたはピリオディックグループのカウントフィールドを直接更新できません。 これらのカウントフィールドは、マルチプルバリューフィールド値およびピリオディックグループオカレンスを追加または削除するときに、Adabas によって自動的に更新されます。
フォーマットバッファインジケータ L を使用すると、LA または LB 英数字フィールド値またはワイド文字フィールド値の実際の長さを取得または指定できます。 このフォーマットバッファエレメントは、長さインジケータと呼ばれます。
注意:
現在、長さインジケータは、LA または LB フィールドのフォーマットバッファ指定にのみ使用できます。
他のフィールドにおける長さインジケータの使用のサポートは、Adabas の今後のリリースで導入される予定です。
長さインジケータは、フィールド名に続いて文字 L
を使用して指定します。例えば、FB='ACL,4,B.'
と指定すると、AC フィールドの長さが返されます。
フィールドがマルチプルバリューフィールドであるか、ピリオディックグループ内にある場合は、フィールド名および文字 L
の後に関連するオカレンスインデックスが続きます。例えば、FB='ACL2,4,B.'
と指定すると、マルチプルバリューフィールド
AC の 2 番目の値が返されます。 圧縮フィールド長は、4 バイトのバイナリ形式で返されます。
他の長さおよび形式は指定できません。
長さインジケータを MU または PE フィールドで使用する場合、オカレンスインデックスを指定する必要があります。オカレンスインデックスの範囲を指定することもできます。 ただし、1-N オカレンスインデックスは指定できません。 以下に例を示します。
次の例では、ピリオディックグループフィールド AC の 2 番目のオカレンスの 5 個目の値の長さが返されます。
FB='ACL2(5).'
次の例では、マルチプルバリューフィールド AC の最初の 10 個の値の長さが返されます。
FB='ACL1-10.'
1-N 表記は MU または PE フィールドの長さインジケータでは許可されていないため、次の例は正しくありません。
FB='ACL1-N.'
長さインジケータはオカレンスインデックスを持たない MU フィールドをサポートしないため、次の例も正しくありません。
FB='MCL.'
また、MU または PE フィールドの同一のフォーマットバッファ内で、長さインジケータとアスタリスク長さ表記による値の要求を組み合わせる場合、値の要求には長さの要求に対応する範囲を使用する必要があります。 長さの要求と値の要求は同一のフォーマットバッファセグメントでも、異なるフォーマットバッファセグメントのどちらで指定しても構いません。 例として、XX が、MU オプション付きの LA または LB フィールドである場合を以下に示します。
次の有効な例では、XX フィールドの最初の 2 個の値の長さと実際の値を要求しています。
FB='XXL1-2,XX1-2,*.'
FB='XXL1,XXL2,XX1,*,XX2,*.'
次の無効な例では、XX フィールドの最初の 2 個の値の長さと実際の値を要求しようとしています。 ただしこの例では、MU フィールドに対して長さの要求に指定した範囲と、値の要求に指定した範囲が、対応する形式で指定されて異なため、無効となります。
FB='XXL1,XXL2,XX1-2,*.'
FB='XXL1-2,XX1,*,XX2,*.'
次の 2 つのフォーマットバッファは、XX フィールドの 3 番目および 4 番目の値の長さとその実際の値を要求しています。
FB='XXL3,XXL4.'
FB='XX3,*,XX4,*.'
次の無効なフォーマットバッファは、XX フィールドの 3 番目および 4 番目の値の長さとその実際の値を要求していますが、長さの要求に指定した範囲と、対応する形式で指定されていないため、エラーになります。
FB='XXL3,XXL4.'
FB='XX3-4,*.'
読み込みコマンドのフォーマットバッファ内のフィールドに長さインジケータを指定する場合、レコードバッファにフィールド値を格納するために必要なバイト数(パディングがなく、長さに関する情報を含まないバイト数)が、レコードバッファ内の対応するフィールド位置に返されます。 レコードバッファに必要なスペースは、フィールドフォーマット、データベース、ファイルおよびユーザーの UES に関連する定義により異なります。
同一のフォーマットバッファ内で、LA または LB
フィールドの長さを取得する長さインジケータを指定する際に、そのフィールドの基本フォーマットと異なる(変換された)フォーマットで、実際のフィールド値を要求することはできません。
例えば、文字の LB フィールド L1 がフォーマット A で格納されている場合、フォーマットバッファ指定
FB='L1L,4,B,L1,*,W.'
は、L1 フィールドの長さの要求に加え、Unicode(フォーマット W)に変換された
L1 フィールドの値を要求しているため、正しくありません。
長さ要素はフィールドの長さをフィールド固有のフォーマットで指定しますが、要求されたフォーマット(Unicode)で返される値の長さが変換により異なるため、このような制限があります。
文字 LB フィールド L1(フォーマット A)が 40,000 バイトの EBCDIC 値を含んでいる場合を次の例に示します。
L1 のフォーマットバッファ指定が次のようであると仮定します。
FB='L1L,4,B.'
レコードバッファには、4 バイトバイナリ長の L1 フィールドの値が含まれます。
X'00009C40'
L1 のフォーマットバッファ指定が次のようであると仮定します。
FB='L1L,4,B,L1,*,A.'
レコードバッファには 4 バイトバイナリ長の L1 フィールドの値がレコードバッファエリアの先頭に含まれ、次に、40,000 文字の実際の L1 データが含まれます。
フォーマットバッファ内のフィールドが、対応する長さインジケータを使用して指定されていて(例えば FB='L1L,
4,B,L1.'
など)、フィールドが空白圧縮の対象外(NB オプションが FDT
内のフィールドに指定されている)の場合、返される長さは、値が格納されたときに指定されたバイト数となります。
ただし、フィールドが空白圧縮の対象となっている場合、返される長さは左端から意味を持つバイト数のみが返され、それ以上の値は空白で埋められます。
フォーマットバッファ内のフィールドが、対応する長さインジケータを使用して指定されていて(例えば FB='L1L,
4,B,L1.'
など)、フィールドが空値省略(FDT 内でこのフィールドに NB
オプションが指定されている)でフィールド値が完全に空白の場合、返されるフィールド値の長さはゼロになります。フィールドが空値省略ではない場合、返されるフィールド値の長さは、1
つの空白の長さ(英数字フィールドで 1 バイト、ワイド文字フィールドで 2 バイト)になります。
更新コマンドのフォーマットバッファに長さインジケータが指定されている場合、レコードバッファの対応する値がレコードバッファ内のフィールドの実際の値の長さを表します。 基本フィールドの長さインジケータ 1 個のみが指定でき、このインジケータはフォーマットバッファでアスタリスク(*)表記を伴う必要があります。
長さインジケータは、レコードバッファに可変長を指定するどのフォーマット要素(アスタリスク表記または長さゼロ表記による)より先にフォーマットバッファセグメント内で出現する必要があります。 つまり、長さインジケータの場所は常に同じで、このフォーマットで指定されるどのフィールドの値からも影響を受けません。
文字 N を使用すると、最高値または最高オカレンスの番号がわからなくても、マルチプルバリューフィールドを構成している複数の値から最高値を選択したり、ピリオディックグループの最高オカレンスを選択できます。
注意:
1-N 表記は、LB フィールドではサポートされません。
1-N を使用すると、マルチプルバリューフィールドを構成している値をすべて選択したり、ピリオディックグループのオカレンスをすべて選択できます。 ピリオディックグループ内のマルチプルバリューフィールドの場合、グループオカレンスを示す 1-N という指定をフィールドオカレンスの指定を組み合わせることはできません。
NC は、そのフィールドを含むピリオディックグループの最高オカレンス内の現存するマルチプルバリューフィールドの値の数を選択します。
field-name N |
ピリオディックグループ field-name の最高オカレンスまたはマルチプルバリューフィールド field-name の最高値 |
field-name NC |
field-name を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド field-name の値の数 |
field-name NC |
マルチプルバリューフィールド field-name の値をすべて選択するか、またはピリオディックグループ field-name のオカレンスをすべて選択します。 |
field-name N (N) |
field-name を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド field-name の最高値 |
field-name N(1-N) |
field-name を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド field-name のすべての値 |
field-name N( i [- j ] ) |
field-name
を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド field-name
の値または値の範囲
マルチプルバリュー LB フィールドおよびピリオディックグループ内の LB フィールドでは、フィールドの特定のオカレンスを指定する必要があります。 次の例では、マルチプルバリュー LB フィールド L2 の最初の値が選択されます。 FB='L21.' オカレンスインデックスのない基本フィールドを指定することはできません。 例えば、次のフォーマットバッファ指定は有効ではありません。 FB='L2.' |
field-name i [- j ] (N) |
field-name
を含むピリオディックグループのオカレンスまたはオカレンスの範囲内にあるマルチプルバリューフィールド
field-name の最高値
マルチプルバリュー LB フィールドおよびピリオディックグループ内の LB フィールドでは、フィールドの特定のオカレンスを指定する必要があります。 次の例の場合、2 番目の PE グループインスタンスにある LB フィールド L3 の 5 番目の値が選択されます。 FB='L32(5).' |
field-name i [-j ] (1-N) |
field-name を含むピリオディックグループのオカレンスまたはオカレンスの範囲内にあるマルチプルバリューフィールド field-name の全値。 |
例 | 選択される内容 |
---|---|
MFN | マルチプルバリューフィールド MF の最高(最後)の値。 マルチプルバリューフィールド MF に 4 つの値がある場合は、4 番目の(最後に入力された)値が選択されます。 |
GBN | ピリオディックグループ GB の最高オカレンス番号。 |
MFNC | MF を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド MF の値の個数。 |
MF1-N | マルチプルバリューフィールド MF の全値。 |
GB1-N | ピリオディックグループ GB の全オカレンス。 |
MFN(1-N) | ピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド MF の全値。 |
MFN(N) | MF を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド MF の最高値。 |
MFN(4) | MF を含むピリオディックグループの最高オカレンスにあるマルチプルバリューフィールド MF の 4 番目の値。 |
CB3-5(N) | CB を含むピリオディックグループの第 3 から第 5 のオカレンスにあるマルチプルバリューフィールド CB の最高値。 |
CB2(1-N) | CB を含むピリオディックグループの第 2 のオカレンスにあるマルチプルバリューフィールド CB の全値。 |
S または空値インジケータ、およびレコードバッファ内の空値インジケータ値は、フィールドの値(ゼロまたは空白を含む)が有効であるか、または有効でない(未定義)かを示します。 S インジケータは、NC オプションで定義されたエレメンタリフィールドにのみ適用でき、NU オプション付きフィールドには適用できません。
field-name S SQL significance indicator
空値インジケータの説明については、「レコードバッファ」セクションを参照してください。また、SQL 空値フィールドの定義方法については、『Adabas ユーティリティマニュアル』の ADACMP ユーティリティの説明を参照してください。
以下に示したレコードバッファの空値インジケータ値は、長さが 2 バイトの標準長で、フォーマットが固定小数点です。この長さとフォーマットは変更しないでください。
更新タイプのコマンドの場合、対応する空値インジケータ値が X'FFFF' で、かつフィールドに対して NN オプションが指定されていないと、空値がフィールドに格納されます。 それ以外の場合、空値インジケータは X'0000' である必要があります。 この値は、S インジケータと組み合わせることによって、レコードバッファ内の他の場所に格納されたフィールド値が格納されることを示します。
S インジケータは更新タイプのコマンドには不要です。S インジケータが指定されていない場合にも、S インジケータが指定され、対応する空値インジケータ値がゼロに設定されているときと同じように、フィールド値を更新します(フィールド内の空値は値である)。 次の例を参照してください。
読み込みタイプのコマンドでは、NN オプションなしで NC フィールドが定義されたときに、S インジケータが必要です。 READ コマンドが NC 指定されたフィールドを検出し、そのフィールドに実際に空値が含まれていた場合、S インジケータがなければレスポンスコード 55 が返されます。
この例では、"フィールド名 S" インジケータをレコードバッファ内の 2 バイトの空値インジケータとともに使用してレコードを更新または追加し、フィールド AA を SQL 空値に設定し、フィールド AA の値を無視します。
フォーマットバッファ |
AAS , AA , 2 , ... . |
読み込むフィールドの名前 |
---|---|---|
レコードバッファ |
FFFF 123F |
Adabas から返されるフィールド値 |
NC フィールドを含むグループまたはフィールド範囲を指定する場合の SQL 有意性(シグニフィカンス)インジケータの使用例については、「有意性(シグニフィカンス)インジケータおよび連続フィールドの指定」を参照してください。
"フィールド名 S" インジケータは、フォーマットバッファ内の任意の位置に指定できます。つまり、対応するフィールドエレメントより先に置く必要はありません。 更新タイプのコマンドの場合、フォーマットバッファに同じフィールドを参照するエレメントを複数含めることはできません。
AAS. | 読み込み/更新コマンドに有効です。 |
AA. | 読み込み/更新コマンドに有効です。 |
AAS,AA,AAS. | 読み込みコマンドにのみ有効です。 |
つまり、更新タイプのコマンドには、同じフィールドを参照するフォーマットバッファエレメントを複数指定することはできません。
AA,AA. | レスポンスコード 44 が返されます。 |
AA,AAS,AA. | レスポンスコード 44 が返されます。 |
長さおよびフォーマットパラメータは、FDT に定義されている標準値とは異なる長さやフォーマットでフィールド値を指定したり、返したりする場合に使用します。 長さまたはフォーマットパラメータを省略した場合、フィールドの標準の長さおよびフォーマットでフィールド値を指定する必要があります。返されるフィールド値も、標準の長さおよびフォーマットとなります。
[ , length ] [ , data-format ]
「許可されているデータ長とフォーマット」表に変換可能なフォーマットと長さを示します。 サブフィールド、サブディスクリプタ、スーパーフィールド、スーパーディスクリプタ、またはハイパーディスクリプタに対してフォーマット変換は指定できません。
指定する長さは、そのフォーマットで値が入るだけの大きさで、かつ許容最大長を超えない値にする必要があります。
長さを 0 に指定するか、または field-name が可変長フィールド(標準長なし)として定義されているフィールドを参照する場合は、Adabas がレコードバッファ内に返す値の前には、値の長さを含む(長さバイトも含む)1 バイトのバイナリフィールドが付加されます。 更新コマンドの場合、この長さバイトはユーザーがレコードバッファの先頭に指定する必要があります。
フォーマットエレメントに長さゼロを指定すると、レコードバッファの LB フィールド値に使用できるスペースは可変で、かつ実際の LB フィールド値によって異なります。 この場合、レコードバッファの LB フィールド値の先頭 4 バイトは、この 4 バイト自体を含む LB フィールドの実際の長さ(LB フィールド値の長さに 4 を加えた値)を格納するのに使用されます。
指定するフォーマットは、フィールドの標準フォーマットと変換可能なフォーマットでなければなりません。
パック/アンパック 10 進値とバイナリとの変換は、0 から 2,147,483,647 の値の範囲内に限られます。
数字形式から英数字に変換すると、アンパック値は左詰め、先行ゼロなし、末尾の空白付きとなります。 例えば、3 バイトのパック値 10043F は F1F0F0F4F3404040 に変換されます。 変換のときに、値の桁落ちが発生する場合があります。
このセクションでは、さらに次のトピックを取り上げています。
LA および LB フィールドにのみ、フォーマット要素に長さではなくアスタリスク(*)を指定できます。 アスタリスクを標準の英数字フィールドおよびワイド文字フィールドに指定することはできません。 アスタリスクは、レコードバッファの LB フィールド値に使用できるスペースが可変となり、LB フィールドの実際の値によって異なることを示します。 ただし、長さゼロの指定とは異なり、レコードバッファでは LB フィールド値の前に 4 バイト長フィールドは存在しません。LB フォーマット要素に対応するレコードバッファエリアには、LB フィールドの値のみが含まれます。 実際の LB フィールド値の長さは読み込みコマンド用に取得される必要があり、新しいフォーマットバッファ長さインジケータ L を使用する更新コマンド用に指定される必要があります。 長さインジケータの詳細については、このマニュアルの「長さインジケータ(L)」を参照してください。
次の例では、LB フィールド L1 のレコードバッファには L1 フィールドの値のみが含まれます。次に 10 バイトが割り当てられた AA フィールドの値が続きます。
FB='L1,*,AA,10,A.'
次の例では、LB マルチバリューフィールド L2 のレコードバッファには、L2 フィールドの最初の 10 個の値が含まれます。
FB='L21-10,*.'
レコードバッファは、そのフォーマット要素のアスタリスクの長さ設定が含まれている場合は、フィールド全体が使用する十分な空きスペースが確保されるため、必ずしも必要ではありません。 ただし、読み込みコマンドの処理中に次の両方の条件が合致した場合、フィールド値が切り捨てられます。
レコードバッファの空きスペースがフィールド値に対して不十分である。
アスタリスク表記付きのフィールドがフォーマットバッファの最後に指定されている。
これらの条件に合致する場合、エラーは返されません。 上記の 2
番目の例(FB='L21-10,*.'
)でこの条件が合致した場合、Adabas は読み取る 10
個の値を対応するレコードバッファセグメントの長さに合わせて切り落とします
(右から順番に切り落とされます。つまり、最後の値が最初に切り落とされます。まだ残りの空きスペースが不十分な場合、最後から 2
番目が切り落とされ、以下同様に続きます)。極端な場合、このフィールド用にまったく空きスペースがない場合は、値はゼロバイトに切り落とされます。
上記の最初の例では(FB='L1,*,AA,10,A.'
)、レコードバッファセグメントが非常に短い場合、固定長が指定されたフィールドまたは長さがゼロ(0)のフィールドには切り落としが許可されていないため、切り落としは発生しません。
切り落としは発生しませんが、ニュークリアスはレスポンスコード 53(レコードバッファが非常に小さい)を返します。
Adabas ニュークリアスにより実行される読み取りコマンドでのみ、アスタリスク表記が指定された値が切り落とされます。更新コマンドでは切り落としは発生しません。 さらに、ADACMP ユーティリティは、アスタリスク表記が指定された値を切り落としません。
編集マスクは、COBOL プログラミング言語の標準編集マスク規則に従って使用します。
編集マスクは、数字として定義されたフィールドに対してのみ指定できます。 Adabas が編集フィールドに返すデータは、フィールドの標準形式にかかわらず、すべてアンパック 10 進数に変換されます。 編集フィールドに返すことができる最大桁数(編集文字以外)は 15 桁です。
編集フォーマットが指定されたフィールドの場合、長さパラメータはフィールド値と編集文字が入るだけの大きさである必要があります。
フォーマット | 生成される編集マスク |
---|---|
E1 | ZZZZZZZZZZZZZZZ |
E2 | ZZZZZZZZZZZZZ9- |
E3 | ZZZZZZZZZ99.99.99 |
E4 | ZZZZZZZZZ99/99/99 |
E5 | Z.ZZZ.ZZZ.ZZZ.ZZZ,ZZ |
E6 | Z,ZZZ,ZZZ,ZZZ,ZZZ.ZZ |
E7 | Z,ZZZ,ZZZ,ZZZ,ZZ9.99- |
E8 | Z.ZZZ.ZZZ.ZZZ.ZZ9,99- |
E9 | *,***,***,***,**9.99- |
E10 | *.***.***.***.**9,99- |
E11 | ユーザー定義編集マスク |
E12 | ユーザー定義編集マスク |
E13 | ユーザー定義編集マスク |
E14 | ユーザー定義編集マスク |
E15 | ユーザー定義編集マスク |
注意:
年月日編集フォーマット E3 と E4 は、年の上 2 桁をスペースに置き換えますが、2000
年の場合にはこの編集を行いません。
フォーマットバッファ | フィールド値 | 編集後の値 |
---|---|---|
XC,15,E1. | 009877 | bbbbbbbbbbb9877 |
XC,8,E4. | 301177 | 30/11/77 |
XB,5,E7. | -366 | 3.66- |
XB,7,E9. | 542 | **5.42 |
Y2,10,E4. | 20000229 | 2000/02/29 |
「許可されているデータ長とフォーマット」表に変換可能なフォーマットと長さを示します。 サブフィールド、サブディスクリプタ、スーパーフィールド、スーパーディスクリプタ、またはハイパーディスクリプタに対してフォーマット変換は指定できません。
フォーマット | 最大長(バイト) | データタイプ | 変換可能フォーマット |
---|---|---|---|
A | 253 | 英数字。左づめ。 | W |
W | 253 1 | ワイド文字。左づめ。 | A |
A、W | 16,381 1,2 | ロング英数字(LA)オプションが付加されたの英数字またはワイド文字。左づめ。2 バイトのバイナリの長さバイト(長さバイトを含む)が先行します。 | W、A |
B | 126 | バイナリ。右詰め。符号なし。 | A、F、P、U |
F | 4 | 固定小数点。右詰め。符号付。2 または 4 バイト。 | A、B、P、U |
G | 8 | 浮動小数点。4 または 8 バイト。 | なし |
P | 15 | パック 10 進数。正 =A、C、E または F 負=B または D の符号付。 | A、B、F、U |
U | 29 | アンパック 10 進数正 =A、C、E または F 負=B または D の符号付。 | A、B、F、P |
注意:
"field-name - field-name" の形式を使用すると、一連の連続するフィールドを(FDT内での並び順に従って)参照することを指定できます。 最初と最後のフィールド名をハイフンで結合します。
field-name - field-name series notation
この範囲内には、マルチプルバリューフィールドおよびピリオディックグループが含まれないようにする必要があります。
グループ名は、最初または最後の名前として指定できませんが、指定範囲内にグループが含まれていてもかまいません。
この範囲内の全フィールドに、標準の長さとフォーマットが適用されます。 長さやフォーマットの指定もできません。
例 | 選択される内容 |
---|---|
AA-AC フィールド | AA、AB、および AC を参照します。 |
AA-GC | なし。 範囲内にマルチプルバリューフィールドやピリオディックグループを含めることはできません。 |
GA-AC | なし。 範囲の先頭/末尾にはグループフィールドを指定できません。 |
AA,5,U,-AD | なし。 範囲指定では長さやフォーマットは指定できません。 |
NC フィールドを含むグループまたはフィールド範囲を指定する場合は、読み込み(Lx)コマンドの S 演算子は任意指定です。 また、更新(A1)コマンドでは、S 演算子を指定しないでください。 Adabas が、レコードバッファ内のフィールドの直前にフォーマットバッファ内の NC フィールドに対応する空値インジケータが置かれているものと見なすからです。
例えば、FDT に次のフィールド定義があるものとします。
01,GR 02,AA,8,A 02,BB,8,A,NC 02,CC,8,A
更新タイプのコマンドのフォーマットバッファに次のように指定した場合:GR. または AA-CC. このとき、レコードバッファの構造は次のようになります。
AA-value null-indicator-BB BB-value CC-value
つまり、フォーマットバッファに S インジケータを指定していない場合にも(指定できません)、レコードバッファシーケンスに空値インジケータが含まれている必要があります。
READ(Lx)コマンドのフォーマットバッファが次のように指定されていた場合:GR,BBS. または AA-CC,BBS. このとき、レコードバッファの構造は次のようになります。
AA-value null-indicator-BB BB-value CC-value null-indicator-BB
つまり、最初の空値インジケータはレコードバッファ内に暗黙に出現し、2 番目の空値インジケータはフォーマットバッファによって明示的に呼び出されます。
nX 構文は、読み込みコマンドと更新コマンドでは使用法が異なります。
nX
読み込みコマンドの場合、nX は次のフィールド値の直前に Adabas が N 個の空白をレコードバッファに挿入することを意味します。
フォーマットバッファ |
AA , 5X , BB |
読み込むフィールドの名前 |
---|---|---|
レコードバッファ |
value-AA 5-blanks value-BB |
Adabas から返されるフィールド値 |
更新コマンドの場合、nX を指定すると、Adabas がレコードバッファ内の n 桁を無視します。
フォーマットバッファ |
XX , 5X , YY |
更新するフィールドの名前 |
---|---|---|
レコードバッファ |
value-XX ignore-5-bytes value-YY |
ユーザーが指定したフィールド値 |
テキスト構文は、読み込みコマンドと更新コマンドでは使用法が異なります。
'text'
読み込みコマンドの場合、引用符内の文字列をレコードバッファ内で次のフィールド値の直前に挿入します。 指定可能な文字列の長さは 1~255 バイトであり、引用符を除く任意の英数字を含めることができます。
例
フォーマットバッファ |
AA,'here is some text', BB |
読み込むフィールドの名前 |
---|---|---|
レコードバッファ |
value-AA here is some text value-BB |
Adabas から返されるフィールド値 |
更新コマンドの場合、引用符で囲まれた桁数分だけ、レコードバッファ内でその位置に相当する桁が無視されます。
通常、LA オプションは可変長データとともに使用します。 LA オプションを使用する英数字フィールドの長さをフォーマットバッファに指定することもできます。 ただし、長さは 16381 バイトに制限されます。
フォーマットバッファ |
AA,5, ... |
読み込むフィールドの名前 |
---|---|---|
レコードバッファ |
ABC__ |
Adabas から返されるフィールド値 |
LA フィールドは、NU オプション(空値省略)、NC/NN SQL 空値有意性(シグニフィカンス)オプション(ページ )、または MU(マルチブルバリューフィールド)オプションが指定可能であり、PE(ピリオディック)グループのフィールドにすることもできます。
LA フィールドはディスクリプタであってはなりません。また、サブフィールド、スーパーフィールド、サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、フォネティックディスクリプタの親であってもなりません。
Adabas は通常の英字フィールドと同様に LA フィールドを圧縮します。つまり、トレーリング空白は削除されます。 バイナリデータを LA フィールドに格納する場合には、このことを頭に入れておく必要があります。
フォーマットバッファの作成時、次の事項を考慮すると、効率を上げることができます。
基本フィールドを個別に参照するのではなく、できる限りグループ名を使用します。 グループ名を使用すると、Adabas がフォーマットバッファを解釈するのにかかる時間が短くなります。
フィールド範囲指定は効率アップにはなりません。 フィールド範囲指定は、Adabas により一連の基本フィールドに変換されるためです。
長さとフォーマットは必要な場合にのみ指定します。 これらを指定すると、フォーマットバッファ解釈時およびフィールド処理時に余分な処理時間が必要となります。
レコード内の同一フィールドを読み込んで更新する場合は、読み込みおよび更新コマンドで同一フォーマットバッファを使用します。 詳細については、 ページから始まるコマンド ID とフォーマット ID の説明を参照してください。
ピリオディックグループ(PE)およびマルチプルバリュー(MU)フィールドのオカレンスは、アプリケーションの要件に応じて要求します。 つまり、不必要にすべてのオカレンスを要求しないでください。フォーマットバッファの変換に余分な時間がかかり、多数の空オカレンスの圧縮解除処理が発生します。 通常、ピリオディックグループのオカレンスの選択には、AA1-N フィールド名引数が最も効率的です。