バージョン 8.1.3
 —  Adabas 8 の導入計画  —

コマンドの変更点

このドキュメントでは、Adabas 8 になって、コマンド、ACB、および Adabas ダイレクトコールインターフェイスがどのように変更されたかについて説明します。 本書には、次のトピックが含まれています。


ダイレクトコールの拡張

Adabas 8 では、新しい Adabas 8 拡張 Adabas コントロールブロック(ACBX)構造と Adabas バッファ記述(ABD)構造に基づくダイレクトコールインターフェイスが導入されました。

注意:

  1. この機能拡張はすべて、従来の Adabas ACB ベースのダイレクトコールインターフェイスと互換性があります。
  2. ACB ベースのダイレクトコールインターフェイスを使用する既存のアプリケーションプログラムは、変更なしで従来と同じ方法で実行できます。
  3. さらに、ACBX ベースまたは ACB ベースのどちらのダイレクトコールインターフェイスをアプリケーションプログラムで使用するのかを、コールごとに決めることができます。 1 つのプログラムが両方のインターフェイスを使用できます。

一部の Adabas 8 の新機能では、アプリケーションプログラムが ACBX ベースのダイレクトコールインターフェイスを使用する必要があります。 例えば、アプリケーションプログラムで大きな(32K を超える)バッファを使用すること、またはセグメント化したバッファ(複数のフォーマットバッファとレコードバッファ)を使用することは、Adabas 8 でサポートされている機能であり、ACBX ベースのダイレクトコールインターフェイスを使用する必要があります。

新しい ACBX ダイレクトコールの詳細については、「Adabas の呼び出し」を参照してください。 ACBX 構造および ABD の詳細については、「Adabas コントロールブロックの構造(ACB および ACBX)」および「Adabas バッファ記述(ABD)」を参照してください。

Top of page

拡張 Adabas コントロールブロック(ACBX)のサポート

新しく拡張 Adabas コントロールブロック(ACBX)が導入され、Adabas コマンドのバッファサイズを大きくできるようになりました。 従来の拡張型でない Adabas コントロールブロック(ACB)も今までどおりサポートされており、現行のアプリケーションもそのままで動作しますが、Adabas 8 の拡張機能を使用する場合には、ACBX に切り替える必要があります。 特に、Adabas 8 の長い(32K を超える)バッファまたはセグメント化されたバッファ(フォーマットバッファとレコードバッファの複数ペア、またはフォーマット、レコードおよびマルチフェッチの 3 つのバッファの複数セット)機能を使用している場合、ACBX を使用する必要があります。

ACBX を使用しない場合は、お使いのアプリケーションプログラムは既存のダイレクトコールインターフェイス(ACB)を使用した Adabas コールと新しいインターフェイス(ACBX)を使用したコールを自由に切り替ることができます。

このセクションでは、次のトピックについて説明します。

Adabas でサポートされているコントロールブロック(構造と DSECT も含む)の詳細については、「Adabas コントロールブロックの構造(ACB および ACBX)」を参照してください。

Adabas 8 が ACB と ACBX のどちらを使用するかを区別する方法

すべてのアプリケーションプログラムは、ACB および ACBX のどちらのダイレクトコールも行えます。 コントロールブロック(ACB または ACBX)は、ACB または ACBX インターフェイスのどちらを使用しても、Adabas コールの最初のパラメータです。 Adabas 8 では、コントロールブロックのオフセット 2 に "F" という文字で始まる値があるかどうかによって、コール時にどちらのコントロールブロックが使用されるかが決まります。 ACB のオフセット 2 は、コマンドコードフィールド(ACBCMD)ですが、F という文字で始まる Adabas コマンドはないため、ACB を使用するダイレクトコールでは、オフセット 2 に "F" で始まる値は含まれません。 ACBX 内のオフセット 2 は、新しい ACBX を識別する新しいバージョンのフィールド(ACBXVER)です。

オフセット 2 上の "F" の有無により、Adabas 8 がダイレクトコールを解釈する方法が異なります。 オフセット 2 に "F" が指定されている場合、Adabas は、コントロールブロックと残りのダイレクトコールパラメータを ACBX コールとして解釈します。オフセット 2 に "F" が指定されていない場合、Adabas は、コントロールブロックと残りのダイレクトコールパラメータを ACB コールとして解釈します。 何らかの理由で残りのコントロールブロックフィールドおよびダイレクトコールパラメータが、オフセット 2 の "F" の有無により示されたコールのタイプに正しく指定されない場合は(ACB パラメータが ACBX コールに指定された場合など)、エラーとなるかコールの結果が予想どおりにならない場合があります。 新しい ACBX を使用してダイレクトコールを指定する方法については、「ダイレクトコールの変更点」を参照してください。

ACB と ACBX の相違点

ACBX は多くの点で ACB と異なります。 ACBX に含まれているフィールドには ACB にない新しいものもあり、また一部の ACBX フィールドのサイズは ACB の該当フィールドよりも大きくなっています。 ACBX におけるこれらの拡張は、基本的な構造を長期間にわたって変更することなく将来行われる予定の Adabas への機能強化に対応できるように、ACBX 構造に十分な柔軟性を持たせるために行われました。

このセクションでは、ACB と ACBX の相違点について説明します。

コントロールブロック長

新しい ACBX は長さが 192(X'C0')バイトですが、ACB の長さは 80 バイトです。

バッファ長フィールド

バッファ長フィールドは ACB に含まれていますが ACBX には含まれていません。 Adabas 8 では、バッファ長フィールドを各 Adabas バッファ記述(ABD)に指定します。 したがって ACBX には、ACB に含まれる ACBFBL、ACBIBL、ACBRBL、ACBSBL および ACBVBL に対応するバッファフィールドが含まれません。コールに関連付けられた ABD が代わりに使用されます。 1 つの ABD は、単独の Adabas バッファセグメントを表します。 詳細は、「Adabas バッファ記述」で説明しています。

コマンドオプションフィールド、アディションフィールド、および予約フィールド

ACBX では、コントロールブロックのコマンドオプションフィールド、アディションフィールド、および予約フィールドの数が次のように増えています。

単位の相違

コマンドタイム(スレッドタイム)を計測する単位は ACB と ACBX で異なります。 ACB では、コマンドタイム(ACBCMDT)を 16 マイクロ秒単位で計測します。ACBX では、コマンドタイム(ACBXCMDT)を 1/4096 マイクロ秒単位で計測します。

フィールド長の相違

ACBX では、多数のコントロールブロックフィールドが従来よりも長くなっています。 次の表は、これらの変更点を要約したものです。

フィールドタイトル 長さ
ACB ACBX
ファイル番号 2 4
データベース ID 2 4
ISN 4 4
ISN 下限 4 4
ISN 数 4 4
圧縮レコード長 4 8
非圧縮レコード長 4 8
コマンドタイム 4 8
ユーザーエリア 4 16
フォーマットバッファ長 2 4(ABD 内)
レコードバッファ長 2 4(ABD 内)
サーチバッファ長 2 4(ABD 内)
バリューバッファ長 2 4(ABD 内)

ACBX の新規フィールド

ACBX に次のフィールドが新しく導入されました。

ACBX DSECT 名 説明
ACBXADD6 アディション 6
ACBXCOP3 コマンドオプション 3
ACBXCOP4 コマンドオプション 4
ACBXCOP5 コマンドオプション 5
ACBXCOP6 コマンドオプション 6
ACBXCOP7 コマンドオプション 7
ACBXCOP8 コマンドオプション 8
ACBXDBID データベース ID です。 ACB では、データベース ID は X'30' コールではレスポンスコードフィールド(ACBRSP)内、その他の論理コールでは ACBFNR の 1 バイト目に格納されます。
ACBXERRA バッファ内へのエラーオフセット(32 ビット)です。
ACBXERRB エラー文字フィールド(フィールド名)です。
ACBXERRC エラーサブコードです。
ACBXERRD 複数のバッファが関連する場合のエラーバッファ ID です。
ACBXERRE 複数のバッファが関連する場合のエラーバッファシーケンス番号です。
ACBXERRG バッファ内へのエラーオフセット(64 ビット)です。このフィールドは現在サポートされていません。
ACBXLCMP 圧縮レコード長(レコード全体が読み込まれていない場合はレコードの一部)です。 ACB では、圧縮レコード長はアディション 2 フィールド(ACBADD2)に格納されます。
ACBXLDEC 非圧縮レコード長です。 ACB では、非圧縮レコード長はアディション 2 フィールド(ACBADD2)に格納されます。
ACBXLEN ACBX の長さ(現在 192)です。
ACBXRSV2 予約済みです。 このフィールドの値はゼロに設定されている必要があります。
ACBXRSV3 予約済みです。 このフィールドの値はゼロに設定されている必要があります。
ACBXRSV4 Adabas が使用するように予約済みです。
ACBXSUBR Adabas アドオン製品により使用されるサブコンポーネントレスポンスコードです。
ACBXSUBS Adabas アドオン製品により使用されるサブコンポーネントレスポンスサブコードです。
ACBXSUBT Adabas アドオン製品により使用されるサブコンポーネントエラーテキストです。
ACBXVER C'F2' に設定した場合、このフィールドは Adabas に新しい拡張 ACB(ACBX)が使用されていることを示します。

ACB 多目的フィールドの変化

ACB フィールドはいろいろな用途で使用できましたが、次に示すように、ACBX では用途に応じて新しいフィールドに分割されました。

構造およびオフセットの相違点

次の表に示すように、ACBX フィールドのオフセットおよびシーケンスは、対応する ACB フィールドとは全般的に異なります。 ACBX 構造の詳細については、「Adabas コントロールブロックの構造(ACB および ACBX)」を参照してください。

オフセット ACB DSECT フィールド名 ACBX DSECT フィールド名
00 ACBTYPE(コールタイプ) ACBXTYPE(コールタイプ)
01 予約 ACBXRSV1(予約 1)
02 ACBCMD(コマンドコード) ACBXVER(ACBX バージョンインジケータ)
04 ACBCID(コマンド ID) ACBXLEN(ACBX 長)
06 (ACBCID の続き) ACBXCMD(コマンドコード)
08 ACBFNR(ファイル番号) ACBXRSV2(予約 2)
0A ACBRSP(レスポンスコード -- X'30' コールでデータベース ID に使用される) ACBXRSP(レスポンスコード)
0C ACBISN(ISN) ACBXCID(コマンド ID)
10 ACBISL(ISN 下限) ACBXDBID(データベース ID)
14 ACBISQ(ISN 数) ACBXFNR(ファイル番号)
18 ACBFBL(フォーマットバッファ長) ACBXISNG(8 バイト ISN)
1A ACBRBL(レコードバッファ長) (ACBXISNG の続き)
1C ACBSBL(サーチバッファ長) ACBXISN(ISN -- ACBXISNG に含まれる
1E ACBVBL(バリューバッファ長) (ACBXISN および ACBXISNG の続き)
20 ACBIBL(ISN バッファ長) ACBXISLG(8 バイト ISN 下限)
22 ACBCOP1(コマンドオプション 1) (ACBXISLG の続き)
23 ACBCOP2(コマンドオプション 2) (ACBXISLG の続き)
24 ACBADD1(アディション 1) ACBXISL(ISN 下限 -- ACBXISLG に含まれる
28 (ACBADD1 の続き) ACBXISQG(8 バイト ISN 数)
2C ACBADD2(アディション 2) ACBXISQ(ISN 数 -- ACBXISQG に含まれる
30 ACBADD3(アディション 3) ACBXCOP1(コマンドオプション 1)
31 (ACBADD3 の続き) ACBXCOP2(コマンドオプション 2)
32 (ACBADD3 の続き) ACBXCOP3(コマンドオプション 3)
33 (ACBADD3 の続き) ACBXCOP4(コマンドオプション 4)
34 (ACBADD3 の続き) ACBXCOP5(コマンドオプション 5)
35 (ACBADD3 の続き) ACBXCOP6(コマンドオプション 6)
36 (ACBADD3 の続き) ACBXCOP7(コマンドオプション 7)
37 (ACBADD3 の続き) ACBXCOP8(コマンドオプション 8)
38 ACBADD4(アディション 4) ACBXADD1(アディション 1)
40 ACBADD5(アディション 5) ACBXADD2(アディション 2)
44 (ACBADD5 の続き) ACBXADD3(アディション 3)
48 ACBCMDT(コマンドタイム) (ACBXADD3 の続き)
4C ACBUSER(ユーザーエリア) ACBXADD4(アディション 4)
54 --- ACBXADD5(アディション 5)
5C --- ACBXADD6(アディション 6)
64 --- ACBXRSV3(予約 3)
68 --- ACBXERRG(バッファ内のエラーオフセット、64 ビット -- 現在サポートされていません)
6C --- ACBXERRA(バッファ内のエラーオフセット、32 ビット)
70 --- ACBXERRB(エラー文字フィールド)
72 --- ACBXERRC(エラーサブコード)
74 --- ACBXERRD(エラーバッファ ID)
75 --- ACBXERRE(エラーバッファシーケンス番号)
78 --- ACBXSUBR(サブコンポーネントレスポンスコード)
7A --- ACBXSUBS(サブコンポーネントレスポンスサブコード)
7C --- ACBXSUBT(サブコンポーネントエラーテキスト)
80 --- ACBXLCMP(圧縮レコード長)
88 --- ACBXLDEC(非圧縮レコード長)
90 --- ACBXCMDT(コマンドタイム)
98 --- ACBXUSER(ユーザーエリア)
A8 --- ACBXRSV4(予約 4)

Top of page

Adabas バッファ記述(ABD)のサポート

Adabas 8 では ACBX インターフェイスを使用すると、バッファのセグメント化(フォーマットバッファとレコードバッファの複数ペア、またはフォーマット、レコードおよびマルチフェッチの 3 つのバッファの複数セット)できるため、バッファの総数は固定ではなくなり、制限もなくなりました。 個別のバッファは ACBX のフィールド自身により記述されなくなりました(ACB ではバッファ長は ACB で定義されます)。その代わり、各バッファは独自の Adabas バッファ記述(ABD)構造を持ちます。ABD には、バッファの種類、場所、サイズ、およびその他の関連情報が記述されます。

ACBX を使用して ABD のアドレスを Adabas へのダイレクトコールに指定することができます。 このセクションでは、ABD の構造について説明します。

Adabas 8 では、次の 8 種類のバッファについて ABD を定義できます。

各 Adabas バッファセグメントは単一の ABD で表されますが、同一のプログラムで 1 つの種類に対して複数の ADB を定義できます。 各 ABD のオフセット 4(ABDID)は、ABD で定義されたバッファの種類を識別します。

ABD(構造も含む)の詳細については、「Adabas バッファ記述(ABD)」を参照してください。

Top of page

フォーマットバッファの変更点

Adabas 8 では、フォーマットバッファとフォーマットバッファ指定が次のように変更されました。

このセクションでは、次のトピックについて説明します。

長さインジケータ(L)

新しいフォーマットバッファインジータ(L)を使用して、LA または LB フィールド値の実際の長さを取得したり、指定したりできるようになりました。 このフォーマットバッファエレメントは、長さインジケータと呼ばれます。

注意:
現在、長さインジケータは、LA または LB フィールドのフォーマットバッファ指定にのみ使用できます。 他のフィールドにおける長さインジケータの使用のサポートは、Adabas の今後のリリースで導入される予定です。

長さインジケータは、フィールド名に続いて文字 L を使用して指定します。例えば、FB='ACL,4,B.' と指定すると、AC フィールドの長さが返されます。 フィールドがマルチプルバリューフィールドであるか、ピリオディックグループ内にある場合は、フィールド名および文字 L の後に関連するオカレンスインデックスが続きます。例えば、FB='ACL2,4,B.' と指定すると、マルチプルバリューフィールド AC の 2 番目の値が返されます。 圧縮フィールド長は、4 バイトのバイナリ形式で返されます。 他の長さおよび形式は指定できません。

このセクションでは、次のトピックについて説明します。

MU/PE フィールドにおける長さインジケータの使用

長さインジケータを MU または PE フィールドで使用する場合、オカレンスインデックスを指定する必要があります。オカレンスインデックスの範囲を指定することもできます。 ただし、1-N オカレンスインデックスは指定できません。 以下に例を示します。

  1. 次の例では、ピリオディックグループフィールド AC の 2 番目のオカレンスの 5 個目の値の長さが返されます。

    FB='ACL2(5).'
  2. 次の例では、マルチプルバリューフィールド AC の最初の 10 個の値の長さが返されます。

    FB='ACL1-10.'
  3. 1-N 表記は MU または PE フィールドの長さインジケータでは許可されていないため、次の例は正しくありません。

    FB='ACL1-N.'
  4. 長さインジケータはオカレンスインデックスを持たない MU フィールドをサポートしないため、次の例も正しくありません。

    FB='MCL.'

また、MU または PE フィールドの同一のフォーマットバッファ内で、長さインジケータとアスタリスク長さ表記による値の要求を組み合わせる場合、値の要求には長さの要求に対応する範囲を使用する必要があります。 長さの要求と値の要求は同一のフォーマットバッファセグメントでも、異なるフォーマットバッファセグメントのどちらで指定しても構いません。 例として、XX が、MU オプション付きの LA または LB フィールドである場合を以下に示します。

  1. 次の有効な例では、XX フィールドの最初の 2 個の値の長さと実際の値を要求しています。

    FB='XXL1-2,XX1-2,*.'
    FB='XXL1,XXL2,XX1,*,XX2,*.'
  2. 次の無効な例では、XX フィールドの最初の 2 個の値の長さと実際の値を要求しようとしています。 ただしこの例では、MU フィールドに対して長さの要求に指定した範囲と、値の要求に指定した範囲が、対応する形式で指定されて異なため、無効となります。

    FB='XXL1,XXL2,XX1-2,*.'
    FB='XXL1-2,XX1,*,XX2,*.'
  3. 次の 2 つのフォーマットバッファは、XX フィールドの 3 番目および 4 番目の値の長さとその実際の値を要求しています。

    FB='XXL3,XXL4.'
    FB='XX3,*,XX4,*.'
  4. 次の無効なフォーマットバッファは、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 値を含んでいる場合を次の例に示します。

  1. L1 のフォーマットバッファ指定が次のようであると仮定します。

    FB='L1L,4,B.'

    レコードバッファには、4 バイトバイナリ長の L1 フィールドの値が含まれます。

    X'00009C40'
  2. L1 のフォーマットバッファ指定が次のようであると仮定します。

    FB='L1L,4,B,L1,*,A.'

    レコードバッファには 4 バイトバイナリ長の L1 フィールドの値がレコードバッファエリアの先頭に含まれ、次に、40,000 文字の実際の L1 データが含まれます。

読み込み操作、長さインジケータ、および NB(空白圧縮なし)オプション

フォーマットバッファ内のフィールドが、対応する長さインジケータを使用して指定されていて(例えば FB='L1L, 4,B,L1.' など)、フィールドが空白圧縮の対象外(NB オプションが FDT 内のフィールドに指定されている)の場合、返される長さは、値が格納されたときに指定されたバイト数となります。 ただし、フィールドが空白圧縮の対象となっている場合、返される長さは左端から意味を持つバイト数のみが返され、それ以上の値は空白で埋められます。

読み込み操作、長さインジケータ、および NU(空値省略)オプション

フォーマットバッファ内のフィールドが、対応する長さインジケータを使用して指定されていて(例えば FB='L1L, 4,B,L1.' など)、フィールドが空値省略(FDT 内でこのフィールドに NB オプションが指定されている)でフィールド値が完全に空白の場合、返されるフィールド値の長さはゼロになります。フィールドが空値省略ではない場合、返されるフィールド値の長さは、1 つの空白の長さ(英数字フィールドで 1 バイト、ワイド文字フィールドで 2 バイト)になります。

更新コマンドにおける長さインジケータの使用

更新コマンドのフォーマットバッファに長さインジケータが指定されている場合、レコードバッファの対応する値がレコードバッファ内のフィールドの実際の値の長さを表します。 基本フィールドの長さインジケータ 1 個のみが指定でき、このインジケータはフォーマットバッファでアスタリスク(*)表記を伴う必要があります。

長さインジケータは、レコードバッファに可変長を指定するどのフォーマット要素(アスタリスク表記または長さゼロ表記による)より先にフォーマットバッファセグメント内で出現する必要があります。 つまり、長さインジケータの場所は常に同じで、このフォーマットで指定されるどのフィールドの値からも影響を受けません。

複数の Adabas バッファセグメントを指定する際のルール

ACBX インターフェイスを使用して Adabas のフォーマットバッファ、レコードバッファ、およびマルチフェッチバッファを Adabas ダイレクトコールに指定すると、これらのバッファは複数のセグメントに分割されるため、ストレージ内に確保される領域が連続している必要はなくなりました。 サーチバッファ、バリューバッファ、ISN バッファ、モニタバッファ、ユーザー情報バッファはそれぞれ、旧リリースと同様に個別のセグメントに指定する必要があります。

ACBX の Adabas ダイレクトコールでは、複数セグメントのフォーマットバッファに次のルールが適用されます。

Top of page

LF コマンドの変更点

コマンドオプション 2 に "S" を設定して LF コマンドを実行したときに、ラージオブジェクト(LB)フィールドが検出されると、LB フィールドの状態が F タイプのフィールドエレメントに返されます。 第 2 フォーマットバイト(エレメントのオフセット 7 またはバイト 8)のビット 6 が、このフィールドに LB(ラージオブジェクト)オプションが設定されたことを示すために設定されました。 さらに、第 2 フォーマットバイトのビット 1 は、LB フィールドが、NB オプション付きで定義されているかどうかを示します。 詳細については、『Adabas コマンドリファレンス』の LF コマンドに関する記述を参照してください。

Top of page