Adabas の呼び出し

ここではアプリケーションプログラムをリンクするのに使用する手順および Adabas コマンドを実行するために、Adabas をコールするのに使用する手順について説明します。

Adabas でサポートされているコントロールブロックインターフェイスごとに 1 つ、合計 2 種類の Adabas ダイレクトコールがあります。

  • ACB ダイレクトコールインターフェイスは、Adabas バージョン 6.1 より前の Adabas リリースで使用されている従来のダイレクトコールインターフェイスです。このフォーマットのダイレクトコールには、従来の Adabas コントロールブロック(ACB)を使用する必要があります。Adabas バージョン 6.1 より前の Adabas リリースを使用している場合は、アプリケーションによるダイレクトコールで ACB ダイレクトコールインターフェイスが使用されます。

  • ACBX ダイレクトコールインターフェイスは、Adabas 6.1 以降の Adabas リリースから使用されている拡張ダイレクトコールインターフェイスです。この形式のダイレクトコールでは、拡張版の Adabas コントロールブロック(ACBX)を使用する必要があります。Adabas バージョン 6.1(以降)をインストールしている場合は、アプリケーションでこの形式のダイレクトコールを使用できます。それ以外の場合は、使用できません。

Adabas バージョン 6.1 以降では、ACB ダイレクトコールインターフェイスと ACBX ダイレクトコールインターフェイスの両方が完全にサポートされています。

  • ACB ダイレクトコールインターフェイスを使用する既存のアプリケーションプログラムは、変更せずに、従来と同じ方法で実行できます。

  • さらに、ACBX ベースまたは ACB ベースのどちらのダイレクトコールインターフェイスをアプリケーションプログラムで使用するのかを、コールごとに決めることができます。1 つのプログラムが両方のインターフェイスを使用できます。

コントロールブロックおよび関連バッファには、実行する Adabas コマンド、そのコマンドに必要な付加情報(パラメータまたはオペランド)を指定します。該当するコントロールブロック(ACB または ACBX)へのポインタが常に、Adabas コールに指定する最初のオペランドである必要があります。

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


アプリケーションプログラムのリンク

すべてのアプリケーションプログラムが Adabas インターフェイスにリンクされている必要があります。利用できるインターフェイスは次のとおりです。

インターフェイス名 UNIX での共有ライブラリ名 Windows での DLL 名
adalnkx libadalnkx.s[ol] adalnkx.dll
adalnk libadalnk.s[ol] adalnk32.dll
adalnknc libadalnknc.s[ol] adalnknc.dll

インターフェイスごとの使用対象について、次の表に示します。

  adalnkx adalnk adalnknc
マルチスレッドアプリケーション x    
シングルスレッドアプリケーション x x x
Net-work 2 サポート   x x
Net-work 7 サポート x x  
XA サポート x x x
ACB ダイレクトコールインターフェイス x x x
ACBX ダイレクトコールインターフェイス x    

注意:

  1. Adabas バージョン 5.1 から adalnkx と adalnk の両方で XA がサポートされるため、adalnknc を使用する必要はなくなりました。adalnknc は Adabas バージョン 3.3 との互換性を保つためにのみ提供されています。
  2. クライアントアプリケーションにリンクするには、adalnk または adalnkx のいずれかを使用する必要があります(両方を同時に使用することはできません)。

UNIX プラットフォームでのリンク

アプリケーションは、いくつかの方法で Adabas インターフェイスにリンクできます。

動的リンク

アプリケーションは、Adabas インターフェイスに必要な共有ライブラリとリンクされます。共有ライブラリが実行時に検出されるように、LD_LIBRARY_PATH に $ACLDIR/lib を含める必要があります。

Adabas のインストール時に提案されたとおりに環境を設定した場合は、実行時に共有ライブラリが検出される場所である $ACLDIR/lib がライブラリパスに含まれます。

スタブを介したロード

アプリケーションは、ディレクトリ $ACLDIR/lib 内の Adabas スタブオブジェクト adabasx.o(adalnkx のロード用)または adabas.o(adalnk のロード用)とリンクされます。次に、実行時の $ADALNK 環境変数の参照先として、使用する共有ライブラリを指定する必要があります。スタブ adabasx.o とリンクする場合、環境変数 $ADALNKX は共有ライブラリ libadalnkx.so をポイントしている必要があります。Adabas インターフェイスは $ACLDIR/lib ディレクトリから別の共有ライブラリを呼び出すので、LD_LIBRARY_PATH に $ACLDIR/lib を含める必要があります。

dlopen を介したロード

dlopen を介して Adabas インターフェイスをロードすることもできます。Adabas のインストール時に提案されたとおりに環境を設定した場合は、dlopen コールでフルパスを指定する必要はありません。ライブラリパスには、Adabas インターフェイスが格納されている $ACLDIR/lib が含まれています。

注意:
Adabas インターフェイスが一度しかロードされない場合があります。dlclose を使用して Adabas インターフェイスを閉じて再ロードすると、エラーが発生する可能性があります。

注意:
アプリケーションに S ビットが設定されているときに Adabas インターフェイスを使用する場合は、インストールのルートディレクトリーを /opt/softwareag にする必要があります。その場合、/opt/softwareag/AdabasClient/lib に含まれている現在の Adabas インターフェイスを使用して、S ビットが設定されているアプリケーションから Adabas インターフェイスをロードすることができます。

重要:
adalnk/adalnkx には、シグナル SIGUSR1 後にスタックバックトレースを表示することなどを目的としたシグナルハンドラが含まれています。このシグナルハンドラは、環境変数 SMP_SIGNAL_HANDLING を 0 に設定すると、停止することができます。アプリケーションで独自のシグナル処理を行う場合は停止する必要があります。停止しないと、adalnk/adalnkx シグナルハンドラと競合するため、シグナルがアプリケーションのシグナルハンドラで予想どおりに処理されなくなる可能性があります。例えば Natural では、このシグナルを出力に使用します。Adabas のインストール時に提供される環境変数設定を使用している場合は、すでに SMP_SIGNAL_HANDLING が 0 に設定されています。

graphics/linkunix.png

64 ビット UNIX プラットフォームでの 32 ビットモードアプリケーションのリンク

Adabas バージョン 3 では、64 ビット UNIX プラットフォームで 32 ビットモードアプリケーションをリンクするために別のインターフェイス(adalnk32)が提供されていましたが、Adabas バージョン 5.1 以降では、前述のインターフェイスと同じインターフェイスの 32 ビットモードバージョンが別々のディレクトリに用意されています。Adabas Version 6.1 以降では、32 ビットモード用のインターフェイスが、$ACLDIR/$ACLVERS/lib_32 に格納されています。

注意:
インストール時に環境変数 $LD_LIBRARY_PATH の設定が指定されますが、これは 64 ビットモード用であり、32 ビットモード用ではありません。64 ビットプラットフォームで 32 ビットモードのアプリケーションを実行するユーザーは、アプリケーションを起動する前に $LD_LIBRARY_PATH が正しく設定されているかどうか注意する必要があります。

Windows でのリンク

動的リンク

adankx.lib、adalnk32.lib、または adalnknc.lib とリンクされます。この方法では、実行時に対応する DLL が %PATH% から動的にリンクされます。Adabas のインストール後に %PATH% を変更していない場合、DLL は %ACLDIR%(32 ビット版)または %ACL64DIR%(64 ビット版)からロードされます。

注意:

  1. 64 ビット版では、インターフェイス adalnkx のみがサポートされています。
  2. 64 ビット版のインターフェイスは、Adabas が 64 ビット版でインストールされているプラットフォームでのみ使用できます。

コンパイルやリンクのオプションなどの詳細については、%ACLDIR%\..\examples\client 内の makefile および C コードのサンプルを参照してください。

graphics/linkwind.png

LoadLibrary または LoadLibraryEx を介したロード

LoadLibrary または LoadLibraryEx を使用して Adabas インターフェイスをロードすることもできます。DLL のフルパスを指定しないことをお勧めします。これは、正しい Adabas インターフェイスが格納されているフォルダは、インストールされている Adabas バージョン、および Windows オペレーティングシステムとモード(32 ビットまたは 64 ビット)によって異なるためです。Adabas のインストール時に、正しい Adabas インターフェイスが検出されるように PATH が設定されます。

注意:
Adabas インターフェイスが一度しかロードされない場合があります。Adabas インターフェイスを Freelibrary または FreeLibraryAndExitThread で解放し、再ロードするとエラーが発生する可能性があります。

コーリング手順

ユーザーは、使用しているプログラミング言語(VAX–11:MACRO、COBOL、PL/I、FORTRAN、PASCAL、BASIC、C)で提供される標準コール手順を使用して Adabas を呼び出します。

USER PROGRAM
.
.
CALL ADABAS USING . . .
.
.
.
CALL ADABAS USING . . .
.
.

ACB インターフェイスダイレクトコールの指定

ACB インターフェイスを使用してダイレクトコールを行う場合は、次のような構文を使用します(これは COBOL の例です)。

CALL 'ADABAS' USING acb-control-block-name
                    [format-buffer]
                    [record-buffer]
                    [search-buffer]
                    [value-buffer]
                    [ISN-buffer]

ACB ダイレクトコールの場合、Adabas はこの構文に示されている順にバッファが指定されているものと見なします。コールに必要なバッファがない場合は、バッファを指定する必要はありません。ただし、フォーマットバッファは必要ないものの、他のバッファのいずれか(例えば、レコードバッファ)が必要な場合は、レコードバッファより前にダミー(または空白)のフォーマットバッファを指定する必要があります。同じく、コールで ISN バッファのみが必要な場合は、ダミーのフォーマットバッファ、レコードバッファ、サーチバッファ、およびバリューバッファも指定する必要があります。

次の表に示す斜体の文字は、実際の構文では置き換えられる項目です。ACB コントロールブロックのフォーマットおよび Adabas バッファの詳細については、「Adabas コントロールブロック(ACB)」および「バッファの定義」を参照してください。異なる ABD タイプ間の関係の詳細については、「バッファタイプ間の関係」を参照してください。

置き換えられる文字 実際に割り当てられる内容
acb-control-block-name コールに使用する Adabas コントロールブロック(ACB)へのポインタ。
format-buffer コールに使用するフォーマットバッファの名前またはポインタ。単一の ACB ダイレクトコールには、フォーマットバッファを 1 つのみ指定できます。
ISN-buffer コールに使用する ISN バッファの名前またはポインタ。単一の ACB ダイレクトコールには、ISN バッファを 1 つのみ指定できます。
record-buffer コールに使用するレコードバッファの名前またはポインタ。単一の ACB ダイレクトコールには、レコードバッファを 1 つのみ指定できます。
search-buffer コールに使用するサーチバッファの名前またはポインタ。単一の ACB ダイレクトコールには、サーチバッファを 1 つのみ指定できます。
value-buffer コールに使用するバリューバッファの名前またはポインタ。単一の ACB ダイレクトコールには、バリューバッファを 1 つのみ指定できます。

ACBX インターフェイスダイレクトコールの指定

アプリケーションにダイレクトコールを指定する方法は、新しい ACBX インターフェイスを使用している場合、従来の ACB インターフェイスとは異なります。また、コールはメインフレームアプリケーションおよびオープンシステムアプリケーションによってさまざまに異なります。このセクションでは、次のトピックについて説明します。

ACBX インターフェイスダイレクトコールの C インターフェイス

アプリケーションにダイレクトコールを指定する方法は、新しい ACBX インターフェイスを使用している場合、従来の ACB インターフェイスとは異なります。オープンシステムアプリケーションで ACBX インターフェイスを使用してダイレクトコールを行う場合は、次のような構文を使用します(これは C の例です)。

adabasx(ACBX_pointer, ABD-count, ABD-list-pointer)

各 ABD は、関連するバッファより前に直接記述するか、または各 ABD にそのバッファへのポインタを含めます。これでバッファを効率的に表現できます。

ABD は、ACBX インターフェイスダイレクトコールのどの場所にも指定できますが、異なるタイプの ABD 同士を対にする必要がある場合には、ABD の対が順番になるように指定します。例えば、コールの中にフォーマットバッファの ABD とレコードバッファの ABD がそれぞれ 3 つずつ存在する場合、最初のフォーマットバッファの ABD とレコードバッファ ABD が対になり、続いて 2 番目、3 番目の ABD 同士が対になります。

指定した ABD の対の数が一致しない場合は、不足分のダミーの ABD(バッファ長はゼロ)が生成されます。例えば、フォーマットバッファの ABD を 3 つ指定し、レコードバッファの ABD を 2 つ指定した場合、3 番目のフォーマットバッファの ABD と対になるように、ダミーのレコードバッファの ABD が 1 つ生成されます。ダミーのレコードバッファの ABD と 2 番目のフォーマットバッファの ABD を対にする必要がある場合は、3 番目のフォーマットバッファと対になるレコードバッファの ABD の前にダミーのレコードバッファの ABD を指定する必要があります。

レコードバッファ内のデータを、フォーマットバッファ内のフォーマット指定では記述していないコマンドの場合は、フォーマットバッファセグメントの指定は必要ありません。指定した場合は無視されます。このような指定が可能なコマンドは、OP コマンドの他に数種類しかありません。

次の表に示す斜体の文字は、実際の構文では置き換えられる項目です。拡張 Adabas コントロールブロック(ACBX)のフォーマット、Adabas バッファ記述(ABD)、および Adabas バッファの詳細については、「拡張 Adabas コントロールブロック(ACBX)」、「Adabas バッファ記述(ABD)」、および「バッファの定義」を参照してください。異なるバッファタイプ間の関係の詳細については、「バッファタイプ間の関係」を参照してください。

パラメータ 説明
ACBX_pointer コールに使用する拡張 Adabas コントロールブロック(ACBX)に対するポインタ。
ABD-count ダイレクトコールの ABD リストに含まれている ABD ポインタの数。
ABD-list-pointer ダイレクトコールの ABD リストへのポインタ。ABD リストには、ACBX ダイレクトコールが使用するすべての ABD へのポインタ参照が含まれています。ABD リストの詳細については、「ABD リスト」を参帯してください。

これらの adabasx パラメータは次の図で示されています。

graphics/adabasxparms.png

重要:
ACBX および ABD は、最初の Adabas コールの前に、それぞれ SETACBX(ACBX_pointer) および SETABD(ABD_pointer) のコールによって初期化する必要があります。

ACBX インターフェイスダイレクトコールのメインフレームインターフェイス

アプリケーションにダイレクトコールを指定する方法は、新しい ACBX インターフェイスを使用している場合、従来の ACB インターフェイスとは異なります。メインフレームアプリケーションで ACBX インターフェイスを使用してダイレクトコールを行う場合は、次のような構文を使用します(これは COBOL の例です)。

CALL 'ADABAS' USING acbx-control-block-name
                    reserved-fullword
                    reentrancy-token
                    [format-buffer-ABD record-buffer-ABD [multifetch-buffer-ABD]]...
                    [search-buffer-ABD]
                    [value-buffer-ABD]
                    [ISN-buffer-ABD]
                    [performance-buffer-ABD]
                    [user-buffer-ABD]

各 ABD は、関連するバッファより前に直接記述するか、または各 ABD にそのバッファへのポインタを含めます。これでバッファを効率的に表現できます。

ABD は、ACBX インターフェイスダイレクトコールのどの場所にも指定できますが、異なるタイプの ABD 同士を対にする必要がある場合には、ABD の対が順番になるように指定します。例えば、コールの中にフォーマットバッファの ABD とレコードバッファの ABD がそれぞれ 3 つずつ存在する場合、最初のフォーマットバッファの ABD とレコードバッファ ABD が対になり、続いて 2 番目、3 番目の ABD 同士が対になります。

指定した ABD の対の数が一致しない場合は、不足分のダミーの ABD(バッファ長はゼロ)が生成されます。例えば、フォーマットバッファの ABD を 3 つ指定し、レコードバッファの ABD を 2 つ指定した場合、3 番目のフォーマットバッファの ABD と対になるように、ダミーのレコードバッファの ABD が 1 つ生成されます。ダミーのレコードバッファの ABD と 2 番目のフォーマットバッファの ABD を対にする必要がある場合は、3 番目のフォーマットバッファと対になるレコードバッファの ABD の前にダミーのレコードバッファの ABD を指定する必要があります。

レコードバッファ内のデータを、フォーマットバッファ内のフォーマット指定では記述していないコマンドの場合は、フォーマットバッファセグメントの指定は必要ありません。指定した場合は無視されます。このような指定が可能なコマンドは、OP コマンドの他に数種類しかありません。

次の表に示す斜体の文字は、実際の構文では置き換えられる項目です。拡張 Adabas コントロールブロック(ACBX)のフォーマット、Adabas バッファ記述(ABD)、および Adabas バッファの詳細については、「拡張 Adabas コントロールブロック(ACBX)」、「Adabas バッファ記述(ABD)」、および「バッファの定義」を参照してください。異なるバッファタイプ間の関係の詳細については、「バッファタイプ間の関係」を参照してください。

置き換えられる文字 実際に割り当てられる内容
acbx-control-block-name コールに使用する拡張 Adabas コントロールブロック(ACBX)に対するポインタ。
format-buffer-ABD コールに使用するフォーマットバッファセグメントを定義するフォーマットバッファ ABD の名前またはポインタ。各フォーマットバッファセグメントは、ピリオドで終了し、単独のフォーマットバッファとして完結した有効なものである必要があります。単一の ACBX ダイレクトコールには、複数のフォーマットバッファ ABD を指定できます。
ISN-buffer-ABD コールに使用する ISN バッファセグメントを定義する ISN バッファ ABD の名前またはポインタ。単一の ACBX ダイレクトコールには、ISN バッファ ABD を 1 つのみ指定できます。
multifetch-buffer-ABD コールに使用するマルチフェッチバッファセグメントを定義するマルチフェッチバッファ ABD の名前またはポインタ。単一の ACBX ダイレクトコールには、複数のマルチフェッチバッファ ABD を指定できます。現在、オープンシステム上の Adabas ではサポートされていません。
performance-buffer-ABD パフォーマンスバッファセグメントを定義するパフォーマンスバッファ ABD の名前またはポインタ。現在、オープンシステム上の Adabas ではサポートされていません。
record-buffer-ABD コールに使用するレコードバッファセグメントを定義するレコードバッファ ABD の名前またはポインタ。単一の ACBX ダイレクトコールには、複数のレコードバッファ ABD を指定できます。
reentrancy-token ADALNK リエントランシートークン。これは、ADALNK がスタティックなデータエリアのアドレスを格納するコール元プログラムのストレージのフルワードです。このフルワードは、最初の Adabas コールの前にゼロに設定しておく必要があります。フルワードの値は、プログラムの実行中、どのダイレクトコールでも変わりません。
reserved-fullword バイナリのゼロが含まれているフルワード。このフルワードは、Adabas 用に予約されており、最初の Adabas コールの前にバイナリのゼロに設定しておく必要があります。
search-buffer-ABD コールに使用するサーチバッファセグメントを定義するサーチバッファ ABD の名前またはポインタ。単一の ACBX ダイレクトコールには、サーチバッファ ABD を 1 つのみ指定できます。
user-buffer-ABD コールに使用するユーザーバッファセグメント(拡張)を定義するユーザーバッファ ABD の名前またはポインタ。ACBX ダイレクトコールには、単一のユーザーバッファ ABD を指定できます。
value-buffer-ABD コールに使用するバリューバッファセグメントを定義するバリューバッファ ABD の名前またはポインタ。単一の ACBX ダイレクトコールには、バリューバッファ ABD を 1 つのみ指定できます。

Adabas が ACB ダイレクトコールと ACBX ダイレクトコールを区別する方法

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

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

ACB ダイレクトコールと ACBX ダイレクトコールの混在

同じアプリケーションに ACB ダイレクトコールと ACBX ダイレクトコールを自由に混在させることができます。

Adabas コントロールブロックの構造(ACB および ACBX)

Adabas では 2 種類のコントロールブロックがサポートされています。

  • Adabas コントロールブロック(ACB)は、Adabas バージョン 6.1 より前の Adabas リリースで使用されている従来のコントロールブロックです。Adabas バージョン 6.1 より前の Adabas リリースを使用している場合、アプリケーションによるダイレクトコールには ACB が使用されます。Adabas バージョン 6.1(以降)でも ACB が完全にサポートされている点に注意してください。Adabas バージョン 6.1 をインストールしても既存のアプリケーションを更新する必要はありません。

  • Adabas バージョン 6.1 以降のリリースでは、拡張 Adabas コントロールブロック(ACBX)を使用できます。ACBX は、Adabas 6.1 から増量されたバッファサイズと、Adabas 8 で導入されたセグメントバッファに対応しています。Adabas バージョン 6.1(以降)がインストールされている場合、アプリケーションからのダイレクトコールに ACBX を使用できます。それ以外の場合は、使用できません。

今後の Adabas リリースとユーザープログラムとの互換性を確保するため、特定のコマンドによって使用されていないすべてのコントロールブロックフィールドは、そのフィールドタイプに応じてゼロまたは空白に設定する必要があります。

コントロールブロック内の各フィールドの位置は固定です。また、コントロールブロックの値はすべて、フィールドに定義されているデータタイプで入力する必要があります。例えば、ISN フィールドはバイナリ形式であるため、このフィールドの値はバイナリ形式で入力する必要があります。

注意:

  1. Adabas など Software AG プログラム製品は一部のコントロールブロックフィールドを内部で使用しており、ユーザーには意味のないフィールド値を返すことがあります。このようなフィールドの使用法および値は、リリースに応じて異なるため、ユーザープログラムでは使用しないでください。このマニュアルで説明しているフィールドおよび値のみを使用することをお勧めします。また、未使用のコントロールブロックフィールドは、それぞれのフィールドタイプに応じてゼロまたは空白で初期化しておく必要があります。
  2. Adabas 依存の Software AG 製品の中には、レスポンスコードやサブコードなどのコントロールブロック値を返すものがあります。製品固有のコントロールブロック値の説明については、該当する製品のマニュアルを参照してください。

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

Adabas コントロールブロック(ACB)

Adabas コントロールブロック(ACB)の長さは 80 バイトです。このセクションでは、次のトピックについて説明します。

ACB フォーマット

次の表は、ACB のフォーマットの説明です。ダイレクトコールが開始される前に、未使用の ACB フィールドにバイナリのゼロを設定することをお勧めします。

名前 Field コントロールブロックの位置 オフセット 長さ(バイト) フォーマット
ACBTYPE コールタイプ 1 00 1 バイナリ
予約 (予約) 2 01 1 バイナリ
ACBCMD コマンドコード 3-4 02 2 英数字
ACBCID コマンド ID 5-8 04 4 バイナリ
ACBFNR File Number 9-10 08 2 バイナリ
ACBRSP Response Code 11-12 0A 2 バイナリ
ACBISN ISN 13-16 0C 4 バイナリ
ACBISL ISN 下限 17-20 10 4 バイナリ
ACBISQ ISN 数 21-24 14 4 バイナリ
ACBFBL フォーマットバッファ長 25-26 18 2 バイナリ
ACBRBL レコードバッファ長 27-28 1A 2 バイナリ
ACBSBL サーチバッファ長 29~30 1C 2 バイナリ
ACBVBL バリューバッファ長 31~32 1E 2 バイナリ
ACBIBL ISN バッファ長 33-34 20 2 バイナリ
ACBCOP1 コマンドオプション 1 35 22 1 英数字
ACBCOP2 コマンドオプション 2 36 23 1 英数字
ACBADD1 アディション 1 37-44 24 8 英数字/バイナリ
ACBADD2 アディション 2 45-48 2C 4 英数字/バイナリ
ACBADD3 アディション 3 49-56 30 8 英数字
ACBADD4 アディション 4 57-64 38 8 英数字
ACBADD5 アディション 5 65-72 40 8 英数字/バイナリ
ACBCMDT コマンドタイム 73-76 48 4 バイナリ
ACBUSER ユーザーエリア 77-80 4C 4 該当なし

ACB フィールド

コントロールブロックフィールドおよびバッファの内容は、Adabas コマンド(コール)を発行する前にセットしておく必要があります。また、Adabas は各コマンドの実行後、特定のフィールドおよびバッファに 1 つ以上の値またはコードを返します。

ダイレクトコールが開始される前に、未使用の ACB フィールドにバイナリのゼロを設定することをお勧めします。

ACB の各フィールドについては、このセクションで説明します。ACB フォーマットの表示順に記載されています。この説明は、ほとんどの Adabas コマンドに当てはまりますが、一部の Adabas コマンドでは、この説明とは異なる目的でコントロールブロックフィールドが使用されます。これらのフィールドが各 Adabas コマンドによってどのように使用されるかの詳細については、「コマンド」を参照してください。

コールタイプ(ACBTYPE)

Adabas コントロールブロック(ADACB)の先頭バイトは、Adabas API がどの処理を実行するかを判断するのに使用されます。

論理要求の値は次のとおりです。

16 進数 説明
00 1 バイトファイル番号(ファイル番号 1~255)または DBID
30 2 バイトファイル番号(ファイル番号 1~65535)または DBID

ADACB の先頭バイトのうち、上記以外の値はすべて、Software AG 用に予約されています。

アプリケーションでは ADACB の先頭バイトの値を各コールでリセットできるため、単一のアプリケーションに 1 バイトファイル番号と 2 バイトファイル番号(DBID)要求を混在させることができます。この場合、コールタイプごとに ADACB のファイル番号(ACBFNR)とレスポンスコード(ACBRSP)のフィールドを適切に構成する必要があります。詳細については、これらのフィールドの説明を参照してください。

2 バイトファイル番号を使用するアプリケーションでは、ADACB の先頭バイトに 16 進の 30、ACBRSP フィールドに論理データベース ID、ACBFNR フィールドにファイル番号を設定することをお勧めします。そうすることによって、アプリケーションは、使用中のファイル番号の値に関係なく、2 バイトのバイナリ整数としてデータベース ID とファイル番号の両方を処理することができます。

Software AG の Natural 言語でアプリケーションを作成すると、Natural が適切な値を指定するため、Adabas ACB の 1 バイト目にこの値を指定する必要はありません。

コマンドコード(ACBCMD)

コマンドコードは、実行するコマンドを定義し、OP、A1、BT のように 2 文字の英数字で構成されます。

コマンド ID(ACBCID)

コマンド ID フィールドは、後続のコマンドで使用する論理読み込み順序、検索結果、およびデコードされたフォーマットバッファ(オプション)を識別するために、多くの Adabas コマンドによって使用されます。用途に応じて英数字またはバイナリのコマンド ID を使い分けたり、新しいバイナリコマンド ID が生成されるように Adabas に要求することができます。コマンド ID の詳細については、「コマンド ID の使用」を参照してください。ET、CL および一部の OP コマンドの場合、バイナリのトランザクションシーケンス番号がコマンド ID フィールドに返されます。

注意:
多くの場合、コマンド ID フィールドには英数字の値が格納されますが、内部的には、このフィールドはバイナリとして扱われます。プラットフォーム間のコールの場合、これは、EBCDIC - ASCII 変換がないこと、およびクライアントプラットフォームとニュークリアスプラットフォームで整数の計算が異なる場合にバイトがスワップされることを意味します。しかし、ユーザーが英数字値を指定する場合、4 バイトの空白値もバイナリ 0 値と同様に空白のコマンド ID とみなされます。これは、ASCII と EBCDIC の両方の空白で有効です。以下では、ASCII の空白(0x20202020)と EBCDIC の空白(0x40404040)の両方が空白の ID 値とみなされます。

ファイル番号(ACBFNR)

ファイル番号は 1 または 2 バイトです。

1~255(1 バイト)のファイル番号に対応するアプリケーションプログラムから Adabas コマンドを発行する場合は、コントロールブロックを次のように作成します。

位置 対処
1 ADACB の先頭バイトに 16 進の 30 を配置します。
9 ADACB の ACBFNR フィールドの下位バイトにファイル番号を配置します。ACBFNR フィールドの上位バイトは、論理(データベース)ID または番号を格納するために使用します。

Adabas は、論理要求で 255 より大きなファイル番号を使用できます。256~5000(2 バイト)のファイル番号に対応するアプリケーションプログラムから Adabas コマンドを発行する場合は、コントロールブロックを次のように作成します。

位置 対処
1 ADACB の先頭バイトに 16 進の 30 を配置します。
9 ファイル番号に ACBFNR の 2 バイトを使用し、データベース(論理)ID に ACBRSP の 2 バイトを使用します。
レスポンスコード(ACBRSP)

レスポンスコードフィールドには、2 バイトのデータベース ID が使用されます。

また、Adabas コマンドの完了時に必ず値が設定されます。通常、正常終了はゼロのレスポンスコードで示されます。レコードシーケンスまたは ISN シーケンスを処理する繰り返し可能なコマンドの場合には、レスポンスコードはエンドオブファイルまたはエンドオブ ISN リストを示します。ゼロ以外のレスポンスコードは、『Adabas メッセージおよびコードマニュアル』に定義されています。

ISN(ACBISN)

フィールドコマンドに応じて 4 バイトの ISN 値を指定します。Adabas は、該当する場合に、コマンドが生成した ISN リストの先頭 ISN か、またはコマンドが読み込んだレコードの ISN を返します。

ISN 下限(ACBISL)

ISN 下限には、処理の開始位置となる ISN リストの開始点または範囲を指定します。OP コマンドでは、オプションとしてユーザー指定の非アクテビティタイムアウトの値を、このフィールドに指定できます。また、OP コマンドはこのフィールドに Adabas リリース情報も返します(アディション 5 フィールドの説明を参照)。

ISN 数(ACBISQ)

コマンドから返される ISN のカウントです。カウントは、ISN リストの ISN 数を合計した値、またはこの操作で大規模な ISN プールから ISN バッファ内に入る ISN 数の合計値です。OP コマンドは、このフィールドを使用してオプションのユーザー指定トランザクションタイムリミットを指定し、ISN 数フィールドにシステム情報やコールタイプ情報のフラグを返します(アディション 5 フィールドの説明を参照)。

バッファ長:フォーマット、レコード、サーチ、バリュー、および ISN(ACBFBL、ACBRBL、ACBSBL、ACBVBL、および ACBIBL)

フォーマット、レコード、サーチ、バリュー、ISN の各バッファ長フィールドには、関連するバッファのサイズを指定します。バッファサイズは通常、トランザクション全体で同じサイズに維持されます。一部の ISN 関連操作では、ISN バッファサイズの値によって、コマンドによる ISN の処理方法が決まります。例えば、ISN バッファ長をゼロにすると、ISN 結果リストが Adabas ワークエリアに格納されます。バッファが不要な Adabas コマンドの場合は、対応するバッファ長の値にゼロを設定する必要があります。また、バッファ長が制限されている場合もあります(例えば、マルチフェッチオプション)。詳細については、それぞれのコマンドの説明を参照してください。

コマンドオプション 1 およびコマンドオプション 2(ACBCOP1 および ACBCOP2)

コマンドオプション 1 フィールドおよびコマンドオプション 2 フィールドには、処理オプションを指定できます(ISN ホールド、コマンドレベルのプリフェッチ制御、返される ISN など)。

アディション 1(ACBADD1)

ISN リストを作成するディスクリプタの分類など、その他のコマンド関連パラメータをアディション 1 フィールドに指定することが必要な場合があります。

アディション 2(ACBADD2)

アディション 2 フィールドは、An、Ln、Nn、S1/2/4 のどのコマンドに対しても、最後の 2 バイトに圧縮レコード長を返し、先頭の 2 バイトにレコードバッファで選択されたフィールドの非圧縮長を返します。OP(オープン)および RE(ET データの読み込み)コマンドでは、このフィールドにトランザクションシーケンス番号が返されます。Entire Net-Work がインストールされている場合は、一部のレスポンスコードで、アディション 2 フィールドの最後の 2 バイトに、障害が発生した Entire Net-Work ノードのノード ID が返されます。

コマンドの結果がニュークリアスレスポンスコードである場合は、アディション 2 フィールドの先頭の 2 バイト(47 と 48)にレスポンスコードの原因を識別する 16 進のサブコードが返されることがあります。レスポンスコードとサブコードについては、『Adabas メッセージおよびコードマニュアル』を参照してください。

アディション 3(ACBADD3)

アディション 3 フィールドには、パスワードで保護されたファイルにアクセスするのに必要なユーザーのパスワードを設定します。ファイルが実際にパスワードで保護されている場合、コマンドの実行中にフィールド内のパスワードがスペース(空白)に置き換えられた後、ユーザープログラムに制御が戻されます。

アディション 4(ACBADD4)

メインフレームでは、コマンドが暗号化された(サイファー) Adabas ファイルのレコードを読み込むか書き込む場合、アディション 4 フィールドは、ファイルのサイファーコードに設定される必要があります。UNIX および Windows プラットフォームでは、このフィールドは使用されません。

アディション 5(ACBADD5)

フォーマットバッファ ID としてコマンド ID を使用する代わりに、アディション 5 を使用してコマンドのフォーマットバッファ ID を個別に格納することができます。詳細については、「フォーマットバッファ ID の使用」を参照してください。

コマンドタイム(ACBCMDT)

コマンドタイムフィールドは、ニュークリアスがコマンドを処理するのに要した経過時間を返すために、Adabas が使用します。メインフレームとは異なり、このフィールドには常に、Adabas がデータを入力します。オープンシステムプラットフォームでは、コマンドロギングがオンになっている場合、または環境変数 ADA_CMD_TIME が設定された状態で(値は無関係)ニュークリアスが開始された場合にのみ、このフィールドが使用されます。

ユーザーエリア(ACBUSER)

ユーザーエリアフィールドは、ユーザープログラムで使用できるように予約されています。論理ユーザーコールを発行しても、Adabas はユーザーエリアを読み書きしません。

今後の Adabas リリースとの互換性のため、未使用のコントロールブロックフィールドには、フィールドデータタイプに合わせた空値を設定しておくことをお勧めします。

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

拡張 Adabas コントロールブロック ACBX は、Adabas コマンドのバッファサイズの増量に対応しています。ACB では 80 バイトでしたが、192 バイトに増えています。既存の非拡張 Adabas コントロールブロック(ACB)も引き続きサポートされ、既存のアプリケーションも機能しますが、Adabas バージョン 6.1(以降)で導入された拡張機能を活用する場合には、新しい ACBX を使用する必要があります。特に、Adabas バージョン 6.1 で導入された長い(32K を超える)バッファまたはセグメント化されたバッファ(フォーマットバッファとレコードバッファの複数ペア、またはフォーマット、レコードおよびマルチフェッチの 3 つのバッファの複数セット)機能を使用している場合、ACBX を使用する必要があります。

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

ACBX フォーマット

次の表は、ACBX のフォーマットの説明です。ダイレクトコールが開始される前に、未使用の ACBX フィールドにバイナリのゼロを設定することをお勧めします。

名前 Field コントロールブロックの位置 オフセット 長さ(バイト) フォーマット
ACBXTYP コールタイプ 1 00 1 バイナリ
ACBXRSV1 予約 1 2 01 1 バイナリ
ACBXVER バージョンインジケータ 3-4 02 2 バイナリ
ACBXLEN ACBX 長 5-6 04 2 バイナリ
ACBXCMD コマンドコード 7-8 06 2 英数字
ACBXRSV2 予約 2 9-10 08 2 バイナリ
ACBXRSP Response Code 11-12 0A 2 バイナリ
ACBXCID コマンド ID 13-16 0C 4 バイナリ
ACBXDBID データベース ID 17-20 10 4 数値
ACBXFNR File Number 21-24 14 4 数値
ACBXISN ISN 25~32 18 8 バイナリ
ACBXISL ISN 下限 33-40 20 8 バイナリ
ACBXISQ ISN 数 41-48 28 8 バイナリ
ACBXCOP1 コマンドオプション 1 49 30 1 英数字
ACBXCOP2 コマンドオプション 2 50 31 1 英数字
ACBXCOP3 コマンドオプション 3 51 32 1 英数字
ACBXCOP4 コマンドオプション 4 52 33 1 英数字
ACBXCOP5 コマンドオプション 5 53 34 1 英数字
ACBXCOP6 コマンドオプション 6 54 35 1 英数字
ACBXCOP7 コマンドオプション 7 55 36 1 英数字
ACBXCOP8 コマンドオプション 8 56 37 1 英数字
ACBXADD1 アディション 1 57-64 38 8 英数字/バイナリ
ACBXADD2 アディション 2 65-68 40 4 バイナリ
ACBXADD3 アディション 3 69-76 44 8 英数字/バイナリ
ACBXADD4 アディション 4 77-84 4C 8 英数字
ACBXADD5 アディション 5 85-92 54 8 英数字/バイナリ
ACBXADD6 アディション 6 93~100 5C 8 英数字/バイナリ
ACBXRSV3 予約 3 101~104 64 4 バイナリ
ACBXERRA バッファ内のエラーオフセット 105~112 68 8 バイナリ
ACBXERRB エラー文字フィールド 113-114 70 2 英数字
ACBXERRC エラーサブコード 115-116 72 2 バイナリ
ACBXERRD エラーバッファ ID 117 74 1 英数字
ACBXERRE 予約済み 118 75 1 バイナリ
ACBXERRF エラーバッファシーケンス番号 119~120 76 2 バイナリ
ACBXSUBR サブコンポーネントレスポンスコード 121~122 78 2 バイナリ
ACBXSUBS サブコンポーネントレスポンスサブコード 123~124 7A 2 バイナリ
ACBXSUBT サブコンポーネントエラーテキスト 125~128 7C 4 英数字
ACBXLCMP 圧縮レコード長 129~136 80 8 バイナリ
ACBXLDEC 非圧縮レコード長 137-144 88 8 バイナリ
ACBXCMDT コマンドタイム 145-152 90 8 バイナリ
ACBXUSER ユーザーエリア 153~168 98 16 該当なし
ACBXRSV4 予約 4 169~193 A8 24 操作不可

ACBX フィールド

コントロールブロックフィールドおよびバッファの内容は、Adabas コマンド(コール)を発行する前にセットしておく必要があります。また、Adabas は各コマンドの実行後、特定のフィールドおよびバッファに 1 つ以上の値またはコードを返します。

ダイレクトコールが開始される前に、未使用の ACBX フィールドにバイナリのゼロを設定することをお勧めします。

ACBX の各フィールドについては、このセクションで説明します。ACBX フォーマットの表示順に記載されています。この説明は、ほとんどの Adabas コマンドに当てはまりますが、一部の Adabas コマンドでは、この説明とは異なる目的でコントロールブロックフィールドが使用されます。

コールタイプ(ACBXTYP)

Adabas コントロールブロック(ADACBX)の先頭バイトは、Adabas API がどの処理を実行するかを判断するのに使用されます。

Adabas コマンドを発行するときに、このフィールドをバイナリのゼロに設定します。これは、論理ユーザーコールが実行されることを示します(ACBXUSER EQU 文)。

Natural が適切な値を指定するため、Software AG の Natural 言語で作成されたアプリケーションは、Adabas ACBX の 1 バイト目にこの値を指定する必要はありません。

予約 1(ACBXRSV1)

このフィールドは予約されています。このフィールドにはゼロを設定します。

バージョンインジケータ(ACBXVER)

バージョンインジケータは、Adabas コントロールブロックが新しい ACBX フォーマットを使用するのか、または従来の ACB フォーマットを使用するのかを示します。このフィールドを文字 "F" で始まる値(例えば "F2")に設定すると、Adabas コントロールブロックは ACBX フォーマットで指定されているものとして扱われます。このフィールドをそれ以外の値に設定すると、Adabas コントロールブロックは従来の ACB フォーマットで指定されているものとして扱われます。

ACBX 長(ACBXLEN)

ACBX 長フィールドは、Adabas に渡される ACBX 構造の長さ(ACBXQLL と同じく現時点では 192)にセットする必要があります。

コマンドコード(ACBXCMD)

コマンドコードは、実行するコマンドを定義し、OP、A1、BT のように 2 文字の英数字で構成されます。

予約 2(ACBXRSV2)

このフィールドは予約されています。このフィールドにはゼロを設定します。

レスポンスコード(ACBXRSP)

このフィールドには、Adabas コマンドの完了時に値が設定されます。通常、正常終了はゼロのレスポンスコードで示されます。レコードシーケンスまたは ISN シーケンスを処理する繰り返し可能なコマンドの場合には、レスポンスコードはエンドオブファイルまたはエンドオブ ISN リストを示します。ゼロ以外のレスポンスコードは、『Adabas メッセージおよびコードマニュアル』に定義されています。

コマンド ID(ACBXCID)

コマンド ID フィールドは、後続のコマンドで使用する論理読み込み順序、検索結果、およびデコードされたフォーマットバッファ(オプション)を識別するために、多くの Adabas コマンドによって使用されます。用途に応じて英数字またはバイナリのコマンド ID を使い分けたり、新しいバイナリコマンド ID が生成されるように Adabas に要求することができます。コマンド ID の詳細については、「コマンド ID の使用」を参照してください。ET、CL および一部の OP コマンドの場合、バイナリのトランザクションシーケンス番号がコマンド ID フィールドに返されます。

注意:
多くの場合、コマンド ID フィールドには英数字の値が格納されますが、内部的には、このフィールドはバイナリとして扱われます。プラットフォーム間のコールの場合、これは、EBCDIC - ASCII 変換がないこと、およびクライアントプラットフォームとニュークリアスプラットフォームで整数の計算が異なる場合にバイトがスワップされることを意味します。しかし、ユーザーが英数字値を指定する場合、4 バイトの空白値もバイナリ 0 値と同様に空白のコマンド ID とみなされます。これは、ASCII と EBCDIC の両方の空白で有効です。以下では、ASCII の空白(0x20202020)と EBCDIC の空白(0x40404040)の両方が空白の ID 値とみなされます。

データベース ID(ACBXDBID)

このフィールドを使用して、データベース ID を指定します。Adabas コールは、ここで指定されたデータベースに送られます。

このフィールドは 4 バイトのバイナリフィールドですが、現時点では 2 バイトのデータベース ID のみがサポートされています。したがって、データベース ID はフィールドの下位部分に指定し、その前にバイナリのゼロを付加する必要があります。

ファイル番号(ACBXFNR)

このフィールドを使用して、Adabas コールの対象となるファイル番号を指定します。

このフィールドは 4 バイトのバイナリフィールドですが、ファイル番号はフィールドの下位部分に指定し、先頭にバイナリのゼロを付加する必要があります。

ISN(ACBXISN)

ISN フィールドにはコマンドで必要な Adabas ISN 値を指定し、必要に応じてコマンドが読み込んだレコードの ISN か、またはコマンドが生成した ISN リストの最初の ISN が返されます。

ACBXISN フィールドは未使用の 8 バイトのフィールドです。ただし、4 バイト値のみ使用可能です。ACBXISN フィールドの上位部分には、バイナリのゼロが含まれている必要があります。

ISN 下限(ACBXISL)

ISN 下限フィールドには、処理の開始位置となる ISN リストの開始点または範囲を指定します。

OP コマンドでは、オプションとしてユーザー指定の非アクテビティタイムアウトの値を、このフィールドに指定できます。また、OP コマンドはこのフィールドに Adabas リリース情報を返します。

ACBXISL フィールドは未使用の 8 バイトのフィールドです。ただし、4 バイト値のみ使用可能です。ACBXISL フィールドの上位部分には、バイナリのゼロを設定します。

ISN 数(ACBXISQ)

ISN 数フィールドは、検索(Sx))コマンドが返した ISN のカウントです。このカウントは、ISN リストの ISN 数を合計した値、またはこの操作で大規模な ISN プールから ISN バッファセグメントに入る ISN 数の合計値です。

OP コマンドの場合、オプションとしてユーザー固有のトランザクションタイムリミットをこのフィールドに指定できます。OP コマンドは、このフィールドにシステム情報およびコールタイプ情報を返します。

ACBXISQ フィールドは未使用の 8 バイトのフィールドです。ただし、4 バイト値のみ使用可能です。ACBXISQ フィールドの上位部分には、バイナリのゼロを設定します。

1 から 8 までのコマンドオプション(ACBXCOP1~ACBXCOP8)

コマンドオプション 1 からコマンドオプション 8 までのフィールドには、処理オプションを指定できます(ISN ホールド、コマンドレベルのプリフェッチ制御、返される ISN など)。Adabas バージョン 6.1 では、コマンドオプション 1 フィールドとコマンドオプション 2 フィールドのみがサポートされています。それ以外のコマンドオプションフィールドは、今後の Adabas リリースでの拡張のために用意されています。

アディション 1(ACBXADD1)

ISN リストを作成するディスクリプタの分類、またはカップリングした対のファイルの 2 番目のファイル番号など、その他のコマンド関連パラメータをアディション 1 フィールドに指定することが必要な場合があります。

アディション 2(ACBXADD2)

OP(オープン)および RE(ET データの読み込み)コマンドでは、このフィールドにトランザクションシーケンス番号が返されます。

ACB のアディション 2 の説明で記述されているように、アディション 2 はその他の値を含むこともできますが、ACBX の場合は、それらの値に使用するためのフィールドが用意されています。ACBX インターフェイスでこれらの値にアクセスする場合は、新しいフィールドを使用することをお勧めします。

アディション 3(ACBXADD3)

アディション 3 フィールドには、パスワードで保護されたファイルにアクセスするのに必要なユーザーのパスワードを設定します。このフィールドは、コマンドの実行中、常に空白にリセットされます。

アディション 4(ACBXADD4)

メインフレームでは、コマンドが暗号化された(サイファー) Adabas ファイルのレコードを読み込むか書き込む場合、アディション 4 フィールドは、ファイルのサイファーコードに設定される必要があります。UNIX および Windows プラットフォームでは、このフィールドは使用されません。

アディション 5(ACBXADD5)

フォーマットバッファ ID としてコマンド ID を使用する代わりに、アディション 5 を使用してコマンドのフォーマットバッファ ID を個別に格納することができます。詳細については、「フォーマットバッファ ID の使用」を参照してください。

アディション 6(ACBXADD6)

このフィールドは現時点では使用されません。バイナリのゼロに設定する必要があります。

予約 3(ACBXRSV3)

このフィールドは予約されています。このフィールドはバイナリのゼロに設定する必要があります。

バッファ内のエラーオフセット(ACBXERRA)

バッファ内のエラーオフセットが存在する場合は、これが、ダイレクトコール中にエラーが検出されたバッファのオフセットを示します。

ACBXERRx フィールドは、レスポンスコードがダイレクトコールから返されたときにのみ設定されます。ACBXERRA、ACBXERRD、および ACBXERRE フィールドは、レスポンスコードがバッファ処理に関連しているときにのみ設定されます。

エラー文字フィールド(ACBXERRB)

このフィールドは、エラー検出時に処理されていたフィールドがあれば、そのフィールドの 2 バイトの Adabas ショートネームを示します。

ACBXERRx フィールドは、レスポンスコードがダイレクトコールから返されたときにのみ設定されます。

エラーサブコード(ACBXERRC)

このフィールドには、ダイレクトコール処理中に発生したエラーのサブコードが格納されます。

ACBXERRx フィールドは、レスポンスコードがダイレクトコールから返されたときにのみ設定されます。Entire Net-Work がインストールされている場合、レスポンスコードによってはこのフィールドに障害が発生したノードのノード ID が返されます。

エラーバッファ ID(ACBXERRD)

このフィールドには、ACBXERRA フィールドが参照するバッファの ID(ABDID フィールドから取得したもの)が格納されるため、複数のバッファが関与している場合にも、エラーが発生しているバッファを特定できます。

ACBXERRx フィールドは、レスポンスコードがダイレクトコールから返されたときにのみ設定されます。ACBXERRA、ACBXERRD、および ACBXERRE フィールドは、レスポンスコードがバッファ処理に関連しているときにのみ設定されます。

エラーバッファシーケンス番号(ACBXERRF)

このフィールドには、ACBXERRA および ACBXERRD フィールドによって参照されるバッファのシーケンス番号が含まれます。

ACBXERRx フィールドは、レスポンスコードがダイレクトコールから返されたときにのみ設定されます。ACBXERRA、ACBXERRD、および ACBXERRE フィールドは、レスポンスコードがバッファ処理に関連しているときにのみ設定されます。

サブコンポーネントレスポンスコード(ACBXSUBR)

このフィールドには、Adabas アドオン製品が Adabas コマンドをインターセプトしたときに発生したエラーからのレスポンスコードが入ります。

サブコンポーネントレスポンスサブコード(ACBXSUBS)

このフィールドには、Adabas アドオン製品が Adabas コマンドをインターセプトしたときに発生したエラーからのレスポンスサブコードが入ります。

サブコンポーネントエラーテキスト(ACBXSUBT)

このフィールドには、Adabas アドオン製品が Adabas コマンドをインターセプトしたときに発生したエラーのエラーテキストが入ります。

圧縮レコード長(ACBXLCMP)

このフィールドには、レコード読み書き時の圧縮レコード長が返されます。

これは、正常に完了した Adabas コールが処理した圧縮データの長さです。論理データストレージレコードが複数の物理データレコードにスパンしている場合、関連する物理レコードをすべて結合した長さがわからなくなることがあります。この場合、Adabas はこのフィールドの下位ワードに高い値を返します。

非圧縮レコード長(ACBXLDEC)

このフィールドには、非圧縮レコード長が返されます。これは、正常に完了したコールが処理した非圧縮データの長さです。複数のレコードバッファセグメントを指定した場合は、バッファセグメントをすべて合計した長さになります。

コマンドタイム(ACBXCMDT)

コマンドタイムフィールドは、ニュークリアスがコマンドを処理するのに要した経過時間を返すために、Adabas が使用します。メインフレームとは異なり、このフィールドには常に、Adabas がデータを入力します。オープンシステムプラットフォームでは、コマンドロギングがオンになっている場合、または環境変数 ADA_CMD_TIME が設定された状態で(値は無関係)ニュークリアスが開始された場合にのみ、このフィールドが使用されます。

ユーザーエリア(ACBXUSER)

ユーザーエリアフィールドは、ユーザープログラムで使用できるように予約されています。論理ユーザーコールを発行しても、Adabas はユーザーエリアを読み書きしません。

予約 4(ACBXRSV4)

このフィールドは、Adabas での使用のために予約されています。ユーザープログラムでは、この ACBX を使用して、最初の Adabas コールを実行する前にこのフィールドをバイナリのゼロに設定し、その後は同じ値のままにしておく必要があります。

ACB と ACBX の相違点

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

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

コントロールブロック長

ACBX の長さは 192 バイト、ACB の長さは 80 バイトです。

バッファ長フィールド

バッファ長フィールドは ACB に含まれていますが ACBX には含まれていません。ACBX ダイレクトコールインターフェイスを使用している場合は、このフィールドは個々の Adabas バッファ記述(ABD)に用意されます。したがって、ACBX には、ACB に含まれる ACBFBL、ACBIBL、ACBRBL、ACBSBL および ACBVBL に対応するバッファフィールドが含まれません。コールに関連付けられた ABD が代わりに使用されます。1 つの ABD は、単独の Adabas バッファセグメントを表します。詳細については、「Adabas バッファ記述」を参照してください。

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

ACBX の方が、コマンドオプション、アディション、予約済みコントロールブロックのフィールドの数が多くなっています。

  • ACBX には、8 個のコマンドオプションフィールドが含まれていますが、ACB では 2 個です。

  • ACBX には、6 個のアディションフィールドが含まれていますが、ACB では 5 個です。

  • ACBX には、4 個の予約フィールドが含まれていますが、ACB では 1 個です。

    予約された ACBX フィールドはバイナリのゼロに設定する必要があります。予約された 4 フィールド(ACBXRSV4)は、バイナリのゼロに初期化する必要があり、常にその状態を保つようにします。

フィールド長の相違

多くのコントロールブロックフィールドの長さは、ACB より ACBX の方が長くなっていますが、サポートされている値の長さは実際のフィールドの長さより短い点に注意してください。これは、インターフェイスを変更せずに将来の Adabas バージョンで大きな値を扱えるようにするためです。次の表は、これらの変更点を要約したものです。

フィールドタイトル Length
ACB ACBX
Field
File Number 2(コールタイプ 0x30 の場合はファイル番号フィールド) 4 2
データベース ID 2(コールタイプ 0x30 の場合はレスポンスコードフィールド) 4 2
ISN 4 8 4
ISN 下限 4 8 4
ISN 数 4 8 4
圧縮レコード長 2(アディション 2 内) 8 2
非圧縮レコード長 2(アディション 2 内) 8 4
コマンドタイム 4 8 8
フォーマットバッファ長 2 8(ABD 内) 4
レコードバッファ長 2 8(ABD 内) 4
サーチバッファ長 2 8(ABD 内) 4
バリューバッファ長 2 8(ABD 内) 4

ACBX に追加されたフィールド

ACBX には次のフィールドが追加されています。

ACBX 名 説明
ACBXADD6 アディション 6
ACBXCOP3 コマンドオプション 3
ACBXCOP4 コマンドオプション 4
ACBXCOP5 コマンドオプション 5
ACBXCOP6 コマンドオプション 6
ACBXCOP7 コマンドオプション 7
ACBXCOP8 コマンドオプション 8
ACBXDBID データベース ID です。ACB では、データベース ID は 16 進 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 F2 にセットした場合、このフィールドは新しい拡張 ACB(ACBX)が使用されていることを Adabas に示します。

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

複数の用途を持つ ACB フィールドが、ACBX の追加のフィールドに分割されているケースが多く見られます。

  • ACB では、16 進 30 コールのデータベース ID を格納するためにレスポンスコードフィールド(ACBRSP)が使用されます。その他の論理コールの場合、1 バイトのデータベース ID は、ファイル番号フィールド(ACBFNR)の 1 バイト目に格納されていました。ACBX では、この目的のためにデータベース ID フィールド(ACBXDBID)が提供されています。

  • ACB では、特定の Adabas レスポンスコードのエラー情報を保持するために ACBADD2 フィールドが使用されます。ACBX では、この目的でエラー情報フィールド(ACBXERR* の一連のフィールド)が用意されています。

  • ACB では正常にコールを行うために、処理されたデータの圧縮および非圧縮レコード長を返すために ACBADD2 フィールドが使用されます。ACBX では正常にコールを行うために、圧縮レコードフィールド(ACBXLCMP)に、Adabas により処理された圧縮データの長さが含まれます。また非圧縮レコードフィールド(ACBXLDEC)には、非圧縮データの長さが含まれます。

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

次の表に示すように、ACBX フィールドのオフセットおよびシーケンスは、対応する ACB フィールドとは全般的に異なります。

オフセット ACB フィールド名 ACBX フィールド名
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(フォーマットバッファ長) ACBXISN(8 バイト ISN)
1A ACBRBL(レコードバッファ長)
1C ACBSBL(サーチバッファ長)
1E ACBVBL(バリューバッファ長)
20 ACBIBL(ISN バッファ長) ACBXISL(8 バイト ISN 下限)
22 ACBCOP1(コマンドオプション 1)
23 ACBCOP2(コマンドオプション 2)
24 ACBADD1(アディション 1)
28 (ACBADD1 の続き) ACBXISQ(8 バイト ISN 数)
2C ACBADD2(アディション 2)
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)

Adabas バッファ記述(ABD)

ACBX インターフェイスを使用して、バッファ指定を必要とする Adabas コールを行う場合は、Adabas バッファ記述(ABD)の使用が必須です。従来の ACB インターフェイスを使用して Adabas コールを指定する場合は、ABD を使用しないでください。ACB インターフェイスを使用して、バッファ指定が必要な Adabas コールを行う場合は、Adabas コール自体に直接バッファまたはバッファへのポインタを指定します。ACBX と ACB のインターフェイスダイレクトコールの詳細については、「Adabas の呼び出し」を参照してください。

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

UNIX および Windows アプリケーションでは、ABD のアドレスを、コールに関連付けられた ABD リストで指定します。メインフレームアプリケーションでは、ABD のアドレスを Adabas コール内で直接指定します。

このセクションでは、ABD および ABD リストの構造について説明します。

使用可能な ABD タイプ

ACBX インターフェイスダイレクトコールで ABD を使用すると、ダイレクトコールで連続したバッファおよび連続していないバッファを使用できます。次の種類のバッファについて ABD を定義できます。

  • フォーマットバッファ

  • レコードバッファ

  • マルチフェッチバッファ

  • サーチバッファ

  • バリューバッファ

  • ISN バッファ

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

ACBX インターフェイスコールでは、ABD とバッファ指定とが 1 対 1 で対応します。つまり、指定するバッファごとに対応する ABD が必要です。バッファは、ABD 自体に指定したり、間接参照で参照したりできます。

ABD は、ACBX インターフェイスダイレクトコールのどの場所にも指定できますが、異なるタイプの ABD 同士を対にする必要がある場合には、ABD の対が順番になるように指定します。例えば、コールの中にフォーマットバッファの ABD とレコードバッファの ABD がそれぞれ 3 つずつ存在する場合、最初のフォーマットバッファの ABD とレコードバッファ ABD が対になり、続いて 2 番目、3 番目の ABD 同士が対になります。

指定した ABD の対の数が一致しない場合は、不足分のダミーの ABD(バッファ長はゼロ)が生成されます。例えば、フォーマットバッファの ABD を 3 つ指定し、レコードバッファの ABD を 2 つ指定した場合、3 番目のフォーマットバッファの ABD と対になるように、ダミーのレコードバッファの ABD が 1 つ生成されます。ダミーのレコードバッファの ABD と 2 番目のフォーマットバッファの ABD を対にする必要がある場合は、3 番目のフォーマットバッファと対になるレコードバッファの ABD の前にダミーのレコードバッファの ABD を指定する必要があります。

レコードバッファ内のデータを、フォーマットバッファ内のフォーマット指定では記述していないコマンドの場合は、フォーマットバッファセグメントの指定は必要ありません。指定した場合は無視されます。このような指定が可能なコマンドは、OP コマンドの他に数種類しかありません。

異なるバッファタイプ間の関係の詳細については、「バッファタイプ間の関係」を参照してください。

ABD の構造

次の表は、ABD の構造の説明です。

名前 Field コントロールブロックの位置 オフセット 長さ(バイト) フォーマット
ABDLEN ABD の長さ 1-2 00 2 バイナリ
ABDVER バージョンインジケータ 3-4 02 2 バイナリ
ABDID バッファタイプ ID 5 04 1 英数字
ABDRSV1 予約 1 6 05 1 バイナリ
ABDLOC バッファロケーションフラグ 7 06 1 英数字/バイナリ
ABDRSV2 予約 2 8 07 1 バイナリ
ABDRSV3 予約 3 9 08 4 バイナリ
ABDRSV4 予約 4 13 0C 4 バイナリ
ABDSIZE バッファサイズ(割り当てられた長さ) 17-24 10 8 バイナリ
ABDSEND 送信データ長 25~32 18 8 バイナリ
ABDRECV 受信データ長 33-40 20 8 バイナリ
ABDRSV5 予約 5 41-44 28 4 バイナリ
ABDADR 間接アドレスポインタ(ABDLOC= C'I' の場合) 45-48 2C 4 英数字
--- バッファ(ABDLOC=C' ' または X'00' の場合) 49~n 30 ユーザー定義 該当なし

ABD フィールドの説明

ABD の各フィールドについては、このセクションで説明します。ABD 構造に表示される順に記載されています。

ABD 長(ABDLEN)

必須。このフィールドは、ABD の長さを指定するのに使用します。現時点では、このフィールドの値は 48 にする必要があります。

バージョンインジケータ(ABDVER)

必須。このフィールドは、ABD 構造のバージョンを表します。このフィールドの値が C'G2' の場合、バッファ定義が新しい拡張 ABD 構造であることを示します。

バッファタイプ ID(ABDID)

必須。このフィールドは、次の表に示すように、ABD で記述されるバッファのタイプを表すのに使用します。

ID 設定 バッファのタイプ
C'F' フォーマット
C'I' ISN
C'M' マルチフェッチ
C'R' レコード
C'S' サーチ
C'V'

予約 1(ABDRSV1)

このフィールドは予約フィールドで、バイナリの 0 に設定されている必要があります。

バッファロケーションフラグ(ABDLOC)

必須。このフィールドは、バッファの位置を間接アドレスで定義するか、または ABD 自体の末尾に定義するかを表すのに使用します。このフィールドを "I" (C'I') に設定した場合、間接アドレスが指定され、間接アドレスポインタフィールドに指定されているアドレス(ABDADDR)が使用されると見なされます。この場合、バッファはプライマリアドレススペース内の 31 ビットアドレス可能ストレージに存在する必要があります。

このフィールドを空白(C' ')にするか、またはこのフィールドに 16 進数の 0 を含める場合は、バッファを ABD の直後に置く必要があります。

予約 2(ABDRSV2)

このフィールドは予約フィールドで、バイナリの 0 に設定されている必要があります。

予約 3(ABDRSV3)

このフィールドは予約フィールドで、バイナリの 0 に設定されている必要があります。

予約 4(ABDRSV4)

このフィールドは予約フィールドで、バイナリの 0 に設定されている必要があります。

バッファサイズ(ABDSIZE)

必須。このフィールドは、割り当てられているとおりに、バッファのサイズ(バイト単位)を指定するのに使用します。サイズを 0 にすると、ダミーバッファとなり、バッファを指定しなかった場合と同じように扱われます。

送信データ長(ABDSEND)

必須。このフィールドは、Adabas に送信するデータの長さ(バイト単位)を指定するのに使用します。このフィールドには、バッファサイズフィールド(ABDSIZE)を超える値を設定することはできません。バッファが Adabas に送信されるのは、そのバッファが、発行されるコマンドのタイプに合った入力バッファである場合のみです。

注意:
現時点では、このフィールドには最大バッファサイズ(ABDXSIZE フィールド)に指定するのと同じ値を指定する必要があります。このことは Adabas バージョン 6.1 での一時的な制限であり、将来のリリースで解決される予定です。

受信データ長(ABDRECV)

このフィールドには、Adabas に返すデータの長さ(バイト単位)を指定します。Adabas ルーターは、コール処理の最後にこの値を設定します。このフィールドには、バッファサイズフィールド(ABDSIZE)を超える値を設定することはできません。Adabas からバッファを受信するのは、そのバッファが、発行されるコマンドのタイプに合った出力バッファである場合のみです。

予約 5(ABDRSV5)

このフィールドは予約フィールドで、バイナリの 0 に設定されている必要があります。

間接アドレスポインタ(ABDADR)

バッファロケーションフラグフィールド(ABDLOC)を C'I'(間接バッファ)に設定した場合は、このフィールドに実際のバッファのアドレスを指定します。現在、32KB を超えるデータを Adabas バッファに指定できます。

実際のバッファ

バッファロケーションフラグフィールド(ABDLOC)を C' '(空白)に設定した場合は、このフィールドに実際のバッファが含まれている必要があります。ACBX インターフェイスを使用すると、32KB を超えるデータを Adabas バッファに指定できます。バッファの定義の詳細については、「バッファの定義」を参照してください。

ABD リスト

ABD リストは、ダイレクトコールに使用する Adabas バッファ記述(ABD)へのポインタ参照が記載されているファイルです。ABD リストは、オープンシステム ACBX ダイレクトコールにのみ使用されます。ABD リストでは、ダイレクトコールに必要なバッファセグメントごとに ABD ポインタが 1 つ必要です。

ABD リストには、フォーマット、レコード、マルチフェッチ、サーチ、バリュー、ISN の各タイプのバッファの ABD を指すポインタを含めることができます。ABD リストに同じタイプの ABD を複数指定できます。

リストに指定する ABD の順番には、特に決まりはありません。異なるタイプの ABD 同士を対にする必要がある場合には、ABD の対が順番になるように指定します。例えば、3 つのフォーマット ABD と 3 つのレコード ABD をリストに記載した場合、リストの最初のフォーマット ABD はリストの最初のレコード ABD に、2 番目のフォーマット ABD は 2 番目のレコード ABD に、3 番目のフォーマット ABD は 3 番目のレコード ABD に対応します。リストで対応関係にある ABD の数が等しくない場合(例えば、フォーマット ABD が 3 つあるのにレコード ABD が 2 つしかない場合)、Adabas は、欠如している ABD についてダミーの ABD を生成します(この例の場合、ダミーのレコード ABD が生成されます)。

それぞれのタイプの ABD またはバッファ間の関係については、「バッファタイプ間の関係」を参照してください。

バッファの定義

ダイレクトコールで ACB ダイレクトコールインターフェイスを使用する場合、フォーマット、レコード、サーチ、バリュー、ISN の計 5 種類のバッファを定義できます。これらのバッファはそれぞれアプリケーションの別の場所で指定され、ACB ダイレクトコールで(ポインタ参照により)間接的に参照されます。

ダイレクトコールで ACBX ダイレクトコールインターフェイスを使用する場合、Adabas バッファ記述(ABD)を使用してフォーマット、レコード、マルチフェッチ、サーチ、バリュー、および ISN の各タイプのバッファセグメントと、それに関連付けるバッファ定義を定義できます。各 Adabas バッファセグメントは単一の ABD で表されますが、ABD のタイプによっては同じプログラム内に複数の ABD を定義できます(例えば、同じプログラムで使用する複数のフォーマット ABD を定義できます)。各 ABD には、単一のバッファ定義が関連付けられます。この場合、ポインタ参照によって間接的に関連付けられるか、または ABD 自体で直接関連付けられます。ABD(構造も含む)の詳細については、「Adabas バッファ記述(ABD)」を参照してください。

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

バッファタイプ間の関係 さまざまなバッファタイプおよび各バッファ間の関係、および関連する ABD 間の関係について説明します(ACBX インターフェイスダイレクトコールを行う場合)。
フォーマットバッファとレコードバッファ フォーマットバッファとレコードバッファ、およびそれらの構文について、例を交えて説明します。
マルチフェッチバッファ マルチフェッチバッファおよびその構文について説明します。
サーチバッファとバリューバッファ サーチバッファとバリューバッファ、およびそれらの構文について、例を交えて説明します。
ISN バッファ ISN バッファおよびその構文について説明します。

バッファタイプ間の関係

次の構文は、ダイレクトコールに指定できる各種バッファ間の関係を表しています。この構文は、どのバッファ指定が他のバッファ指定の存在に依存しているかを把握するのに役立ちます。

注意:

  1. ACBX インターフェイスダイレクトコールを指定している場合は、対応する Adabas バッファ記述(ABD)も指定する必要があります。また、ACBX インターフェイスダイレクトコールで、あるバッファ指定に他のバッファ指定が必要になる場合(例えば、フォーマットバッファにはレコードバッファが必要です)、バッファは指定した順番でペアになります(例えば、最初に指定したフォーマットバッファ ABD は最初に指定したレコードバッファ ABD とペアになります)。次の構文は、コールまたは ABD リストに ABD をどの順番で指定するか判断するのに役立ちます。
  2. ACB インターフェイスダイレクトコールを指定している場合、この構文のマルチフェッチバッファは適用されません。また、フォーマット、レコード、サーチ、バリュー、ISN の順にバッファを指定する必要があります。この順番の中で前に位置するバッファが必要でなく、後に位置するバッファが必要である場合、必要なバッファの前にあるバッファは、たとえ空白であっても、指定する必要があります。例えば、ACB インターフェイスダイレクトコールで ISN バッファが必要であり、それ以外のバッファは必要でない場合は、ISN バッファの前にフォーマット、レコード、サーチ、バリューのダミーバッファをそれぞれ指定する必要があります。
[format-buffer record-buffer... [multifetch-buffer]]...
[search-buffer value-buffer]
[ISN-buffer]

次の表では、この構文のエレメントについて説明します。

エレメント 説明 条件
format-buffer コールに使用するフォーマットバッファセグメントです。各フォーマットバッファセグメントは、ピリオドで終了し、単独のフォーマットバッファとして完結した有効なものである必要があります。 Adabas 読み込みコマンドまたは更新コマンドの実行中に処理するフィールドを指定する必要がある場合にのみ必須です。

必須の場合、ACBX インターフェイスダイレクトコールに複数のフォーマットバッファを指定できます。ACB インターフェイスダイレクトコールには、1 つのフォーマットバッファのみ指定できます。

コールにフォーマットバッファを指定する場合は、対応するレコードバッファも指定する必要があります。

ACBX インターフェイスダイレクトコールの場合は、対応するマルチフェッチバッファを指定することもできます。

ISN-buffer コールに使用する ISN バッファセグメントです。 ストレージ内に ISN を格納するためのエリアを確保する必要がある場合、または(ACB インターフェイスダイレクトコールでは)マルチフェッチしたレコードのレコードディスクリプタエレメント(RDE)を格納するためのエリアを確保する必要がある場合にのみ必須です。

必須の場合、コールに ISN バッファを 1 つのみ指定します。

multifetch-buffer ACBX インターフェイスコールに使用するマルチフェッチバッファセグメント。このバッファは、ACBX インターフェイスダイレクトコールにのみ使用できます。

ACBX インターフェイスダイレクトコールでのみ使用されます。また、マルチフェッチしたレコードのレコードディスクリプタエレメント(RDE)を格納するためのエリアをストレージ内に確保する必要がある場合にのみ必須です。

必須の場合、ACBX インターフェイスダイレクトコールに複数のマルチフェッチバッファを指定できます。

マルチフェッチバッファを指定した場合は、対応するフォーマットバッファおよびレコードバッファも指定する必要があります。

record-buffer コールに使用するレコードバッファセグメントです。 コールに必要なレコードデータまたはコール用に収集したレコードデータを格納するためのエリアをストレージに確保する場合にのみ必須です。

必須の場合、ACBX インターフェイスダイレクトコールに複数のレコードバッファを指定できます。ACB インターフェイスダイレクトコールには、1 つのレコードバッファのみ指定できます。

コールにレコードバッファを指定する場合は、対応するフォーマットバッファも指定する必要があります。

ACBX インターフェイスダイレクトコールの場合は、対応するマルチフェッチバッファを指定することもできます。

search-buffer コールに使用するサーチバッファセグメントです。 コール対象レコードの選択時に検索条件が必要な場合にのみ必須です。

コールにサーチバッファを指定する場合は、対応するバリューバッファも指定する必要があります。単一のダイレクトコールに指定可能なサーチバッファとバリューバッファのペアの数は 1 つだけです。

value-buffer コールに使用するバリューバッファセグメントです。 コール対象レコードの選択時に検索条件が必要な場合にのみ必須です。

コールにバリューバッファを指定する場合は、対応するサーチバッファも指定する必要があります。単一のダイレクトコールに指定可能なサーチバッファとバリューバッファのペアの数は 1 つだけです。

フォーマットバッファとレコードバッファ

フォーマットバッファは、Adabas 読み込み/更新コマンドの実行中に読み込み/更新するフィールドを指定します。

読み込みコマンドの場合、フォーマットバッファに指定したフィールドの値がレコードバッファに返されます。

Format Buffer  AA,BB.               names of the fields to be read
Record Buffer  value(AA) value(BB)  field values returned by Adabas

追加/更新コマンドの場合、フォーマットバッファに指定したフィールドの新しい値は、ユーザーがレコードバッファに指定します。

Format Buffer  XX,YY.               names of the fields to be updated
Record Buffer  value(XX) value(YY)  field values provided by user

フォーマットバッファ構文

このセクションでは、フォーマットバッファの構成に使用する構文について説明します。

このセクションのすべての例は、このマニュアルの付録 A にあるファイル定義に基づいています。

注意:
フォーマットバッファにはいくつかの制限があります。詳細については、『メッセージおよびコードマニュアル』の「ニュークリアスレスポンスコード」の「RESPONSE 41」を参照してください。

基本フォーマットバッファ形式

{[{nX|'literal'}, ...] field_definition [segment | {,length}] [,format] [,edit_mask][,#'char_set']}, ... .

隣接するエントリは、コンマを使用して区切らなければなりません。各エントリ間に 1 つ以上の空白があってもかまいません。最後のエントリの後には、コンマを付けないでください。フォーマットバッファはピリオドで終了する必要があります。

次のオプションが可能です。値に C. を含むフォーマットバッファは、レコードバッファに圧縮レコードを返します。

フォーマットバッファの構文に使用できる項目は、nX、literal、field_definition、segment、length、format、edit_mask、#'char_set' です。それぞれについて、以下に説明します。

nX

読み込みコマンドに対して、nX は、次のフィールド値の直前に Adabas が n 個のスペースをレコードバッファに挿入することを指定します。使用できる n の最大値は 253 です。

Format Buffer  AA,5X,BB.  5 blanks are to be inserted between
                          values for fields AA and BB

更新コマンドで nX を使用すると、レコードバッファの n バイトが Adabas で無視されます。

Format Buffer  AA,5X,BB.  5 positions between values for fields
                          AA and BB are to be ignored
Record Buffer  value(AA) 5 bytes value(BB)

'literal'

読み込みコマンドに対して、引用符内に含まれる文字列が、次のフィールド値の直前にレコードバッファに挿入されます。指定可能な文字列は、1 から 254 バイトの長さであり、引用符を除く任意の英数字です。

Format Buffer  AA,'text',BB.  'text' is to be inserted between
                              values for AA and BB
Record Buffer  value(AA)text value(BB)

field_definition

field_definition フィールドは、使用するエレメンタリフィールド、マルチバリューフィールド、ピリオディックグループを表します。隣接するエレメンタリフィールドの範囲も指定できます。マルチバリューフィールド(MU)およびピリオディックグループ(PE)においては、インデックス範囲を指定できます。使用できる組み合わせを以下に示します。フィールド名は name で表されます。

name [mu_pe_index]	
name A [mu_pe_index]	
name [pe_index]C	
name S	
name-name
name L[mu_pe_index]
name D[mu_pe_index]

ここで、mu_pe_index は次のいずれかです。

mu_index
pe_index
pe_and_mu_index

mu_index は、MU フィールドの MU インデックスまたは MU インデックスの範囲を指定します。pe_index は PE の PE インデックスまたは PE インデックスの範囲を指定します。mu_index と pe_index には、次の値を指定できます。

i

MU フィールドの MU インデックスまたは PE の PE インデックス

i-j

MU インデックスまたは PE インデックスの範囲

X

MU フィールドの最高 MU インデックスまたは PE の PE インデックス

1-N

すべての MU インデックスまたは PE インデックスの範囲(更新コマンドでは使用できません)

注意:
1-N を指定し、値が存在しない場合、ピリオディックグループまたはマルチプルバリューフィールドが空になり、オカレンスは表示されません。これはメインフレームと矛盾する点であり、メインフレームでは少なくとも 1 つのオカレンスが表示されます。

pe_and_mu_index は、PE インデックスまたは PE インデックスの範囲と、PE の MU フィールドの MU インデックスまたは MU インデックスの範囲を指定します。次の値を指定できます。

i(m)

i = PE インデックス、m = PE の MU フィールドの MU インデックス

i(m-n)

i = PE インデックス、m-n = PE の MU フィールドの MU 値の範囲

i(N)

i = PE インデックス、N = PE の MU フィールドの最高 MU インデックス

i(1-N)

i = PE インデックス、PE の MU フィールドのすべての MU インデックスの範囲(更新コマンドでは使用できません)

N(m)

N = 最高 PE インデックス、M = PE の MU フィールドの MU インデックス

N(m-n)

N = 最高 PE インデックス、m-n = PE の MU フィールドの MU インデックスの範囲

N(N)

PE の MU フィールドの最高 PE インデックスと最高 MU インデックス

N(1-N)

最高 PE インデックス、PE の MU フィールドのすべての MU 値の範囲(更新コマンドでは使用できません)

i-j(m)

i-j = PE インデックスの範囲、m = PE の MU フィールドの MU インデックス

i-j(m-n)

i-j = PE インデックスの範囲、m-n = PE の MU フィールドの MU インデックスの範囲

i-j(N)

i-j = PE インデックスの範囲、N = PE の MU フィールドの最大 MU インデックス

i-j(1-N)

i-j = PE インデックスの範囲、1-N = PE の MU フィールドのすべての MU 値の範囲(更新コマンドでは使用できません)

MU インデックスと PE インデックスの両方に範囲を指定すると、レコードバッファエレメントの対応するシーケンスは、最も低い PE インデックスが指定されたすべてのエレメントから始まり、最も高い PE インデックスが指定されたすべてのエレメントで終了します。

例:

AA1-2(3-4)
AA1(3),AA1(4),AA2(3),AA2(4) と同等です。

これらの組み合わせについては、以下で詳しく説明します。

name [mu_pe_index]

name [mu_pe_index] では、次の組み合わせが許可されています。

  • name
    

    値(複数指定も可)の要求先、または新規の値(複数指定も可)の設定先にするフィールド(またはグループ)の名前。

    指定する名前は、長さが 2 文字で、読み込む/更新するファイルのフィールド定義テーブルになければなりません。

    この名前でエレメンタリフィールド、グループまたはマルチプルバリューフィールドを参照できます。フィールドまたはグループは、ピリオディックグループに属していてはいけません。MU インデックスなしのマルチプルバリューフィールドの最初のオカレンスは、マルチプルバリューフィールドの最初の値を参照します。2 番目のオカレンスはマルチプルバリューフィールドの 2 番目の値を参照します。同一マルチプルバリューフィールドは、MU インデックスがない状態や、同一フォーマットバッファ内に MU インデックスがある状態では指定しないようにする必要があります。このようなフォーマットバッファを使用した場合、コマンドの結果は未定義になります。

    ディスクリプタの親フィールドがマルチプルフィールドまたはピリオディックグループ内のフィールドでない場合は、サブディスクリプタ名またはスーパーディスクリプタ名を読み込み、コマンドに指定できます。フォネティックまたはハイパーディスクリプタは使用しないでください。L9 コマンドでは、フォネティックディスクリプタ以外のすべてのディスクリプタを使用できます。

    この名前でエレメンタリフィールド、マルチプルバリューフィールド、グループ、またはピリオディックグループを参照できます。

    ここで注意すべき点は、MU がマルチプルバリューフィールドの場合の MU,MU です。この場合、MU,MU は MU1,MU2 を意味します。

    サブディスクリプタ、スーパーディスクリプタ、またはフォネティックディスクリプタを参照する名前は使用できません。例外については、L9 コマンドを参照してください。

    更新コマンドでは、(以下の例と同じマルチプルバリューフィールドの場合を除く)同一の名前を 2 回以上は使用できません。

    グループを名前に指定すると、グループ内の全フィールドが参照されます。

    GA
    グループ GA を表します(AA,AB と指定したことと同じ)。

    グループにマルチプルバリューフィールドが含まれている場合、そのグループ名を使用することはできません。

    グループ名を使用すると、コマンドを処理するのに必要な時間を大幅に短縮できます。

    インデックスなしの UPDATE コマンドでマルチプルバリューフィールドを指定すると、すべての古いマルチプルバリューフィールド値を、フォーマットバッファに指定されたフィールドの数だけ置き換えることができます。このようにして、NU オプションのない MU フィールドのマルチプルバリューフィールド数を再び減らすことができます。

  • name mu_or_pe_index
    

    次のいずれかを参照する場合、どのオカレンスを参照するかを指定する必要があります。

    • ピリオディックグループ

    • ピリオディックグループ内の、マルチプルバリューフィールドではないフィールド

    • マルチプルバリューフィールド

    • ピリオディックグループ内のフィールドを親フィールドとするサブディスクリプタまたはスーパーディスクリプタ。これらは、マルチプルバリューフィールドを親フィールドとして持ちません。

    • マルチプルバリューフィールドを親フィールドとするサブディスクリプタまたはスーパーディスクリプタ。これらは、ピリオディックグループ内のフィールドを親フィールドとして持ちません。

    これは、名前に数値の添え字(先行ゼロは指定可)を付加して行われます。

    注意:
    Adabas バージョン 5.1 未満では、ピリオディックグループ内のフィールドまたはフォーマットバッファ内の親フィールドとしてのマルチプルバリューフィールドを持つサブディスクリプタまたはスーパーディスクリプタはサポートされていません。

    GB3
    ピリオディックグループ GB の 3 番目のオカレンスが参照されます(フィールド BA3、BB3、BC3)。
    BB6
    ピリオディックグループ GB の 6 番目のオカレンスのフィールド BB が参照されます。
    MF02
    マルチプルバリューフィールド MF の 2 番目のオカレンスが処理されます。

    N は、読み込みコマンドの場合はピリオディックグループの最後のオカレンス、ピリオディックグループの最後のオカレンス内のフィールド、またはマルチプルバリューフィールドを参照し、更新コマンドの場合は新規オカレンスが追加加されます。ピリオディックグループにマルチプルバリューフィールドが含まれている場合は、そのピリオディックグループ名を使用しないでください。

    ピリオディックグループ(またはピリオディックグループ内のフィールド)のオカレンスの範囲は、名前の後に処理対象の最初と最後のオカレンス番号を(ハイフンで結んで)指定すれば処理できます。マルチプルバリューフィールドも参照できます。下限の方が上限よりも大きい範囲の指定はできません。ピリオディックグループにマルチプルバリューフィールドが含まれている場合は、そのピリオディックグループ名を使用しないでください。

    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)。
    MF1-3
    マルチプルバリューフィールドの最初の 3 つの値が参照されます。
    GB2-GB4
    無効で正しくない構文です。
    GB4-2
    誤り、降順の範囲

    名前 1-N は、フィールドに存在する最初から最後までのオカレンスを意味します。

  • name mu_and_pe_index
    

    ピリオディックグループ内に含まれるマルチプルバリューフィールド、または親フィールドがピリオディックグループ内のフィールドで、親フィールドがマルチプルバリューフィールドであるサブディスクリプタまたはスーパーディスクリプタ(これらは同じ可能性があります - ピリオディックグループ内のマルチプルバリューフィールド)を参照する場合は、ピリオディックグループのオカレンス番号 (i) に続けて、目的のマルチプルバリューフィールド値 (m) または値の範囲 (m-n) を指定する必要があります。

    注意:
    Adabas バージョン 5.1 未満では、ピリオディックグループ内のフィールドまたはフォーマットバッファ内の親フィールドとしてのマルチプルバリューフィールドを持つサブディスクリプタまたはスーパーディスクリプタはサポートされていません。

    CB2(5)
    ピリオディックグループ GC の 2 番目のオカレンスにあるマルチプルバリューフィールド CB の 5 番目のオカレンスが処理されます。
    CB2(1-5)
    ピリオディックグループ GC の 2 番目のオカレンスにあるマルチプルバリューフィールド CB の最初から 5 つのオカレンスが処理されます。

    N は、ピリオディックグループ内のエレメントの最後のオカレンス、またはマルチプルバリューフィールドの最後のオカレンス、あるいはその両方を意味します。更新コマンドでは、オカレンスの付加を意味します。

    ピリオディックグループのオカレンスの一定範囲内にあるマルチプルバリューフィールドのオカレンスの一定範囲を処理する場合は、ピリオディックグループのオカレンスの範囲 (i-j)、その後にマルチプルバリューフィールドのオカレンスの範囲 (m-n) を指定しなければなりません。

    CB1-2(1-4)
    ピリオディックグループ GC の最初のオカレンスにあるマルチプルバリューフィールド CB の最初から 4 つのオカレンスが処理され、その後で、GC の 2 番目のオカレンスで CB の最初から 4 つのオカレンスが処理されます。

name A [mu_pe_index]

エレメンタリフィールド、マルチプルバリューフィールド、ピリオディックグループ内のフィールド、またはピリオディックグループ内のマルチプルバリューフィールドの名前に A を付加して、追加オプションを指定します。許可されている組み合わせは、name [mu_pe_index] の場合と同じです。

このオプションを使用すると、フィールド内の値をオーバーレイする代わりに、その値をフィールドに追加できます。これによって、Adabas コールを節約できます。例えば、シーケンス L4-A1 を 1 つの A1 コールに削減できます。

フォーマットはアンパック(U)、パック(P)、固定小数点(F)、浮動小数点(G)をサポートします。

A1 以外のすべてのコマンドでは、末尾の A が無視されます。

name [pe_index]C

ピリオディックグループの最大オカレンス番号、マルチプルバリューフィールドの既存の値の数、または PE の単一オカレンスやオカレンス範囲での PE のマルチプルバリューフィールドの既存の値の数は、ピリオディックグループ名またはマルチプルバリューフィールド名にリテラル C を追加して取得できます。

GBC
ピリオディックグループ GB の最大オカレンス番号が返されます。
MFC
マルチプルバリューフィールド MF の既存の値の数が参照されます。

UPDATE コマンドでは C 要素が無視され、レコードバッファ内で対応するカウントがスキップされます。

ユーザーが明示的に長さ、形式のいずれかまたは両方を指定しないかぎり、カウントは 1 バイトの 2 進数(長さおよび形式パラメータを参照)としてレコードバッファに返されます。

ピリオディックグループ内のマルチプルバリューフィールドの既存の値の数は、1~2 桁のインデックスでピリオディックグループのオカレンスを指定して、マルチプルバリューフィールド名の直後にリテラル C を指定することで取得できます。

CB4C
ピリオディックグループ GC の 4 番目のオカレンスにあるマルチプルバリューフィールド CB のオカレンス数が返されます。

UPDATE コマンドでは C 要素が無視され、レコードバッファ内で対応するカウントがスキップされます。これは、長さの変更なしで指定したカウントフィールドの 1 バイトです。

ユーザーはマルチプルバリューフィールドおよびピリオディックグループカウントフィールドの内容を直接更新できません。これらカウントフィールドは、マルチプルバリューフィールドおよびピリオディックグループのオカレンスが追加または更新されたときに、Adabas によって更新されます。

MFNC
ピリオディックグループの最大オカレンスにあるマルチプルバリューフィールドの最後のオカレンスカウントが返されることを指定します。

name S

SQL 空値をサポートするフィールドの SQL 空値属性を読み込んだり、更新したりするときに、S エレメント を使用します。S エレメントは、フィールド名にリテラル S を付けて作成します。

このエレメントは、NC オプション(SQL 空値)が指定された、ピリオディックグループ内にないエレメンタリフィールドにのみ適用できます。上書きが指定されない場合、このエレメントの長さは 2 バイトで、固定小数点形式です。

UPDATE コマンドにおいて、SQL 空値は、レコードバッファの対応する値が -1 である場合にフィールドに格納されます。これ以外の負の値はすべてレスポンス 52 になります。正の値および 0 は無視されます。

エレメンタリフィールドが空値に変わる場合に、S は UPDATE コマンドに対してだけ必要です。これ以外の場合には S エレメントは不要ですが、使用してもかまいません。S エレメントと名前は、フォーマットバッファ内のどこにでも指定できます。S エレメントがフィールドの値を空値に更新するときは、後に続く名前が無視されます。

同じフィールドを参照するフォーマットバッファのいくつかのエレメントは、UPDATE コマンドのフォーマットバッファに入れることはできません。

READ コマンドの場合、次の情報が S エレメントに返されます。

S エレメントの値 説明
-1 フィールドに SQL 空値が含まれています。
0 フィールドは有効で、値は切り捨てられていません。
1 フィールドは有効で、値が切り捨てられています。値の長さが S エレメントに収まりません(例えば、デフォルトフォーマット F、デフォルト長 2:値の長さが 32767 超)。
>1 フィールドは有効で、値が切り捨てられています:値の長さ。

読み込みコマンドの場合、NC オプションフィールドの名前エレメントを含むフォーマットバッファは、対応する S エレメントも含む必要があります。

注意:
次の例では、フィールド ZZ が NC オプションで定義されていることを前提にしています。フィールド ZZ は、付録 A のサンプルリストには含まれていません。

ZZS. 読み込み/更新に有効
ZZS,ZZ. 読み込み/更新に有効
ZZS,ZZ,ZZS. 読み込みにのみ有効
ZZ. 更新にのみ有効
ZZ,ZZS,ZZ. レスポンスコード 44
ZZ,ZZ. レスポンスコード 44

name-name

フィールド定義テーブルの並び順どおりに、連続したフィールドをまとめて指定する場合には、name-name という表記を使用することができます。この場合、最初と最後のフィールド名をハイフンでつなぎます。この範囲内には、マルチプルバリューフィールドおよびピリオディックグループが含まれないようにする必要があります。また、長さもフォーマットも指定することはできません。

グループ名は最初または最後の名前としては指定できませんが、指定範囲内にグループが含まれていてもかまいません。

この範囲内の全フィールドに、標準の長さとフォーマットが適用されます。

AA-AC
フィールド AA、AB、および AC が参照されます。
AA-GC
マルチプルバリューフィールドまたはピリオディックグループを含むことはできません。
GA-AC
グループで開始/終了できません。
AA,5,U,-AD
長さや形式の上書きは、この表記法では許可されません。

name L[mu_pe_index]

フォーマットバッファインジケータ L を使用すると、マルチプルバリューフィールドまたはピリオディックグループ内のフィールドである任意の英数字または Unicode フィールド値の実際の長さを取得または指定できます。このフォーマットバッファエレメントは、長さインジケータと呼ばれます。

長さインジケータは、フィールド名に続いて文字 L を使用して指定します。例えば、FB='ACL.' と指定すると、AC フィールドの長さが返されます。デフォルトでは、圧縮フィールド長は、4 バイトのバイナリフォーマットで返されます。

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

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

以下に例を示します。

  1. 次の例では、ピリオディックグループの 2 番目のオカレンスにあるマルチプルバリューフィールド CB の 5 番目の値の長さが返されます。

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

    FB='MFL1-10.'
  3. 次のマルチプルバリューフィールド MF の例は正しくありません。長さインジケータはオカレンスインデックスのない MU フィールドをサポートしません。

    FB='MFL.'

name D[mu_pe_index]

フォーマットバッファでの D エレメント(夏時間インジケータ)の使用は、DT および TZ オプションが指定されたフィールドでのみ許可されます。これは、日付/時刻の値に対して夏時間が有効であったかどうかを示します。D エレメントのデフォルトのフォーマットは F で、長さは 2 バイトです。この値は、現在のローカルタイムを取得するために標準時間に追加される秒数です。通常、夏時間が有効でない場合は 0、夏時間が有効な場合は 3600 です。更新フォーマットバッファの場合、標準時間を取得するために、レコードバッファのフィールドに指定された値から D エレメントの値が減算されます。D エレメントを使用して、夏時間を再度オフにする時間の時間値を指定することもできます。この時間(D エレメントのない追加/更新コマンドで 2 回発生する)に日付/時刻の値を指定すると、標準時刻に属する値だと見なされます。各 D エレメントの追加/更新コマンドでは、D エレメントと、対応する日付/時刻の編集マスクエレメントは 1:1 の関係になっている必要があります。フォーマットバッファに D エレメントが含まれている場合、その値は、指定された時間に対して有効な、正しい夏時間インジケータ値となっている必要があります。そうでない場合は、サブコード 31 が付いたレスポンスコード 55 が返されます。

追加および更新コマンドでは、標準時間または夏時間が終了するタイミングを、標準時間と夏時間の両方の値として指定できますが、そのような値を再度読み込むと、常に新しい期間の始まりとして表示されます。

次の例では、ローカルタイムゾーンは MET(中央ヨーロッパ時間)であり、編集マスク E(DATETIME) で定義されたフィールドのフィールド値が読み取られます。

内部値(UTC) 編集マスク E(DATETIME) のフィールド値 D エレメントの値
20080121135000 20080121145000 0
20091025003000 20091025023000 3600
20091025013000 20091025023000(1) 0

(1)追加または更新コマンドでは、D エレメント 3600 で 20091025030000 を指定することもできます。

長さ、フォーマット

長さパラメータとフォーマットパラメータは、フィールドの標準とは異なる長さやフォーマットでフィールド値を返したり、指定したりする場合に使用します。

指定する長さは、そのフォーマットで値が入るだけの大きさで、かつ許容最大長を超えない値にする必要があります(次の図を参照)。

アスタリスク(*)を使った長さ表記

英数字および Unicode フィールドでは、フォーマット要素に長さではなくアスタリスク(*)を指定できます。アスタリスクは、レコードバッファのフィールド値に使用できるスペースが可変となり、フィールドの実際の値によって異なることを示します。ただし、長さゼロの指定とは異なり、レコードバッファではフィールド値の前に 4 バイト長フィールドは存在しません。フォーマット要素に対応するレコードバッファエリアには、フィールドの値のみが含まれます。実際のフィールド値の長さは、読み込みコマンドで取得する必要があり、新しいフォーマットバッファ長インジケータ 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 ユーティリティは、アスタリスク表記が指定された値を切り落としません。

指定する形式は、フィールドの標準形式と互換性がなければなりません(次の図を参照)。フォーマット変換の処理ルールはこのセクションで後述します。

これらのパラメータは、エレメンタリフィールドまたはマルチプルバリューフィールドにのみ指定できます。

長さパラメータまたはフォーマットパラメータを省略した場合、フィールドの標準の長さやフォーマットに従ってフィールド値が返されます。また、標準の長さやフォーマットに従ってフィールド値を指定する必要があります。長さゼロを指定するか、名前が可変長フィールド(標準長がない)として定義されているフィールドを参照すると、Adabas によって返される値の先頭には、(長さインジケータを含めた)その値の長さを持つバイナリフィールドが付きます。更新コマンドでは、ユーザーがこの長さインジケータを指定しなければなりません。長さインジケータの長さは以下のようになります。

  • 4 バイト(フィールドに L4 オプションがある場合)

  • 2 バイト(フィールドに LA オプションがある場合)

  • 1 バイト(フィールドに上記のどのオプションもない場合)

ソース
フォーマット
最大長
説明
変換後の
フォーマット
A 16381(フィールドにオプション L4 または LA があり、フィールドがディスクリプタではない場合)、または 1114(フィールドに L4 または LA オプションがあり、フィールドがディスクリプタの場合)、その他の場合は 253。 英数字 A
B 126 2 進数(符号なし) A、F、P、U
F 8 固定小数点(符号あり) A、B、P、U
G 8 浮動小数点 G
P 15 パック 10 進数。
符号あり。+ = nA, nC, nE, nF
– = nB または nD(最下位バイト)。
nは、与えられた値の最下位桁の数字
A、B、F、U
U 29 アンパック 10 進数。
符号あり。+ = 3n(最下位バイト)。
– = 7n(最下位バイト)。
nは、与えられた値の最下位桁の数字(ゾーン形式)
A、B、F、P
W UTF-8 で格納される内部値の場合:16381(フィールドにオプション L4 または LA があり、かつフィールドがディスクリプタではない場合)、1114(フィールドにオプション L4 または LA があり、かつフィールドがディスクリプタの場合)、その他の場合は 253。フィールドにオプション LA または L4 がある場合は、異なるエンコーディングを使用できる外部値はより大きいこともありますが、これらのオプションのいずれも使わない外部値も 253 バイトに制限されます。 Unicode W

すべての長さはバイト単位です。P および U 形式の符号は、ニブルまたはバイトの 16 進数です。

バイナリからの変換は 0 から 2**64 - 1 までの値に限定されます。バイナリへの変換は 0 から 2**80 -1 までの値に限定されます。

固定小数点形式から、または固定小数点形式への変換は、-(2**63) から 2**63-1 までの値に限定されます。

バイナリからまたはバイナリへの変換は 0 から 2**63 – 1
(9,223,372,036,854,775,807)までの値に限定されます。

数値形式から英数字への変換は、リーディングゼロではなく、空白を含んだ左詰のアンパック値になります。例えば、3 バイトのパック値 10043F は 3130303433202020 に変換されます。変換のときに、値の桁落ちが発生する場合があります。浮動小数点フィールド(G フォーマット)を別のフォーマットに変換することはできません。4 バイトの G フォーマットと 8 バイトの G フォーマットを相互に変換することはできません。

注意:
Adabas バージョン 6.3 SP2 以降では、ソースフォーマット U の場合、ASCII に変換された EBCDIC マシンの符号バイトも、符号バイトの入力として許可されています(次の表を参照)。

EBCDIC、16 進数 表示 ASCII、16 進数
+0 C0 { 7B
+1 C1 A 41
+2 C2 B 42
+3 C3 C 43
+4 C4 D 44
+5 C5 E 45
+6 C6 F 46
+7 C7 G 47
+8 C8 H 48
+9 C9 I 49
-0 D0 } 7D
-1 D1 J 4A
-2 D2 K 4B
-3 D3 L 4C
-4 D4 M 4D
-5 D5 X 4E
-6 D6 O 4F
-7 D7 P 50
-8 D8 Q 51
-9 D9 R 52

読み込みコマンドにおける長さインジケータおよびアスタリスクインジケータの使用

読み込みコマンドのフォーマットバッファ内のフィールドに長さインジケータを指定する場合、レコードバッファにフィールド値を格納するために必要なバイト数(パディングがなく、長さに関する情報を含まないバイト数)が、レコードバッファ内の対応するフィールド位置に返されます。レコードバッファに必要なスペースは、フィールドフォーマット、データベース、ファイルおよびユーザーの UES に関連する定義により異なります。

Unicode フィールドの場合、現在の仕様では長さインジケータは常に内部的な長さ、つまり UTF-8 エンコードにおける値の長さを返します。これは将来のバージョンの Adabas では、他のエンコードでの値の長さが返されるように変更される可能性があります。したがって、現在 W フィールドの読み込みに長さインジケータを使用するのは、Adabas セッションのデフォルトエンコードが UTF-8 で、対応するアスタリスク長さを含むフォーマットバッファ要素にエンコードが指定されていない場合のみに限定することを強くお勧めします。それ以外の場合、将来のバージョンの Adabas で結果が変わってしまう可能性があります。

文字 LB フィールド L1(フォーマット A)が 40,000 バイトの値を含んでいる場合を次の例に示します。

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

    FB='L1L,4,B.'

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

    0x00009C40
  2. 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 つの空白の長さ(英数字フィールドおよび UTF-8 Unicode フィールドで 1 バイト)になります。

格納/更新コマンドにおける長さインジケータおよびアスタリスク長さインジケータの使用

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

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

また、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,*.'

フォーマットバッファ:セグメント

長さの代わりにセグメントを指定すると、フィールドの一部のみを処理できます。これは、LOB フィールドに特に有用です。セグメントは、フォーマット A で定義されたフィールドに対してのみ指定できます。セグメントの構文は次のとおりです。

(byte_number, length [, length2])

PE の MU フィールドでは、PE インデックスと MU インデックスの両方が指定されている場合にのみセグメントを指定できます。セグメントが指定されていない場合は、フィールド全体が処理されます。

byte_number は、処理するフィールドセグメントの最初のバイトのバイト番号を指定します。byte_number は、数字または ‘*’ のいずれかです。

数字を指定した場合、処理するセグメントの開始場所となる、値内のバイトの位置を示します。値の最初(左端)にあるバイトのバイト番号は 1 です。

byte_number = ‘*’ を指定した場合、それは *-position と呼ばれます。*-position を指定した場合は、セグメントが現在位置から開始されることを意味します。コマンドオプション 2=‘L’ が指定された L1、L4、または A1 コマンドの場合、現在位置は、処理するセグメントの前のバイト数として、コントロールブロックの ISN LOWER LIMIT フィールドに指定します。*-position を指定することで、同じフォーマットバッファを使用してフィールドの異なるセグメントを処理できます。他のコマンドの場合、現在位置は常にフィールド値の最初(左端)のバイトです。読み込みコマンドでは、*-position で処理できるフィールド値は 1 つだけです。そのため、*-position を指定した複数のフォーマットバッファエレメントをフォーマットバッファに指定してはいけません。

注意:

  1. 現在位置が値の末尾を超えている場合は、L オプションが指定された L1 および L4 コマンドに対して、レスポンスコード 3 が返されます。それ以外の場合は、ISN LOWER LIMIT フィールドに古い現在位置と長さが返されます。これは、コントロールブロックとフォーマットバッファを変更することなく、レスポンスコード 3 が返されるまで、一連の L1 または L4 コマンドで値全体を処理できることを意味します。
  2. ISN LOWER LIMIT フィールドに指定する現在位置は、同一セグメントのフォーマットバッファに指定する明示的なバイト数よりも 1 つ小さい値です。例:L1(1,1000) は、ISN LOWER LIMIT 0 を指定した L1(*,1000) と同等で、L1(1001,1000) は、ISN LOWER LIMIT 1000 を指定した L1(*,1000) と同等です。

length は、処理するフィールドセグメントのバイト単位の長さです。指定したバイト数を、レコードバッファの対応する位置に指定する必要があります。

length2 はオプションであり、更新(A1)コマンドにのみ関係します。他のコマンドの場合、length2 は無視されます。これは新しいセグメントで置き換えられる古い値のエリアの長さを指定します。指定する場合、現時点では、length 2 の値は length の値と等しくなければなりません。指定しない場合、位置 byte_number から始まる古いフィールド値の残りのすべてのデータが、レコードバッファ内のデータで置き換えられます。

注意:

  1. 読み込まれたセグメントにフィールド値の終わりを超えるバイトが含まれている場合、これらのバイトは空白で埋められます。
  2. セグメントが N1/N2 コマンドの最初のバイトで開始されていない場合、フィールド値はセグメントの前に空白が付けられて構成されます。フィールドに NB オプションがない場合、結果の値は圧縮されます。
  3. セグメントが A1 コマンドの古い値の終わりを超えて開始されている場合、新しい値は、古い値を空白で埋め、レコードバッファからセグメントを追加することによって構成されます。フィールドに NB オプションがない場合、結果の値は圧縮されます。
  4. A1 コマンドのセグメントの開始が古い値の終わりを超えておらず、古い値の終わりを超えて終了する場合、セグメントの前の古い値の部分の後にセグメントを追加して値が作成されます。フィールドに NB オプションがない場合、結果の値は圧縮されます。
  5. A1 コマンドのセグメントが古い値の終わりの前に終了する場合、結果の値は length2 に応じて異なります。指定した場合、古い値の length2 バイトがセグメントによって置き換えられます。指定しない場合、古い値の残りの部分が削除され、フィールドに NB オプションがない場合は、結果の値が圧縮されます。

フォーマットバッファ:edit_mask

edit_mask は次のいずれかです。

numeric_edit_mask
E(date_time_edit_mask_name)

フォーマットバッファ:numeric_edit_mask

数値編集マスクは、COBOL プログラミング言語の標準編集マスク規則に従って使用します。

数値編集マスクは、数値として定義されたフィールドに対してのみ指定できます。Adabas が編集してフィールドに入れる値は、フィールドの標準形式にかかわらず、すべてアンパック 10 進数に変換されます。編集フィールドに返せる最大桁数(編集文字以外)は 15 桁です。

編集を指定するフィールドの長さパラメータは、フィールド値と編集文字全部が入るだけの大きさを持っていなければなりません。十分な大きさがないと、Adabas はレスポンスコードを返します。

フォーマット デフォルト長 生成される数値編集マスク最大長
E1 15 ZZZZZZZZZZZZZZZ
E2 16 zzzzzzzzzzzzzz9-
E3 17 zzzzzzzzz99.99.99
E4 17 zzzzzzzzz99/99/99
E5 20 z.zzz.zzz.zzz.zzz,zz
E6 20 z,zzz,zzz,zzz,zzz,zz
E7 21 z,zzz,zzz,zzz,zz9.99-
E8 21 z.zzz.zzz.zzz.zz9.99-
E9 21 *,***,***,***,**9.99-
E10 21 *.***.***.***.**9.99-
E11 - 予約済み
E12 - 予約済み
E13 - 予約済み
E14 - 予約済み
E15 - 予約済み

数値編集マスク使用例:

Format Buffer  Field Value    Edited Value

XC,15,E1.      009877         bbbbbbbbbbb9877
XC,8,E4.       301177         30/11/77
XB,5,E7.       -366           3.66-
XB,7,E9.       542            **5.42b

フォーマットバッファ:E(date_time_edit_mask_name)

日付/時刻編集マスクで定義された日付/時刻フィールドの場合、日付/時刻編集マスクを指定できます。数値編集マスクは読み込みコマンドでのみ使用できるのに対して、日付/時刻編集マスクは更新コマンドでも使用できます。この編集マスクは、ファイル定義で使用される編集マスクと同じです。フィールド定義での編集マスクとフォーマットバッファでの編集マスクの次の組み合わせが許可されています(列 = フォーマットバッファ、行 = FDT)。

  DATE TIME DATETIME TIMESTAMP NATTIME NATDATE UNIXTIME XTIMESTAMP
DATE A/A -/- F/T F/T F/T C/C F/T F/T
TIME -/- A/A -/- -/- -/- -/- -/- -/-
DATETIME T/F X/- A/A F/T F/T T/F C/C F/T
TIMESTAMP T/F X/- T/F A/A T/F T/F T/F C/C
NATTIME T/F X/- T/F F/T A/A T/F T/F F/T
NATDATE C/C -/- F/T F/T F/T A/A F/T F/T
UNIXTIME T/F X/- C/C F/T F/T T/F A/A F/T
XTIMESTAMP T/F X/- T/F C/C T/F T/F T/F A/A

最初の値は読み込みコマンドでの動作を指定し、2 番目の値は更新コマンドでの動作を指定します。

説明
-/- 許可されていません。
A 許可されています。変換は必要ありません。
C 変換が必要です。ソースとターゲットの値は同じ精度です。
F 値を 0 で埋めます。ターゲット値がより高い精度になります。編集マークによっては、追加の変換が必要な場合があります。
T 値を切り捨てます。ターゲット値がより低い精度になります。編集マークによっては、追加の変換が必要な場合があります。
X/- 読み込み処理の値から時間コンポーネントを抽出します。ターゲット値には日付情報が含まれません。編集マークによっては、追加の変換が必要な場合があります。読み込み処理にのみ許可されます。

注:

  • Adabas では、フォーマット B、F、P、および U の既存フィールドのフィールド定義に、日付/時刻編集マスクを追加できます。これにより、データベース内の値が、この日付/時刻編集マスクに対して適切でない値になる可能性があります。

  • フォーマットバッファでの日付/時刻編集マスクの使用には、次の規則が適用されます。

    • フォーマットバッファで、TZ オプションなしのフィールドに日付/時刻編集マスクを指定しなかった場合、日付/時刻変換およびそのチェックは実行されません。

    • フォーマットバッファで、TZ オプションありのフィールドに日付/時刻編集マスクを指定しなかった場合、フォーマットバッファは、指定したフィールド定義の日付/時刻編集マスクとして扱われます。

    • フォーマットバッファで、日付/時刻編集マスクとともに長さまたはフォーマットを指定しなかった場合は、フィールドのデフォルトのフォーマットまたは長さが使用されます。デフォルトの値が、指定した日付/時刻編集マスクと一致しない場合は、長さまたはフォーマットを指定してください。

    • 指定した日付/時刻編集マスクが、フィールド定義の日付/時刻編集マスクと互換性がない場合は、レスポンスコード 41 が返されます。

    • DT オプションなしで定義されているフィールドの日付/時刻編集マスクを指定した場合は、値がこの編集マスクに対して有効かどうかがチェックされます。有効でない場合は、レスポンスコード 55 が返されます。

    • 更新または追加コマンドのフォーマットバッファに、読み込みコマンドにのみ許可される日付/時刻編集マスクを指定した場合は、レスポンスコード 44 が返されます。

    • 更新または追加コマンドのフォーマットバッファに日付/時刻編集マスクを指定した場合は、値が正しい日付/時刻値かどうかを確認するチェックが行われます。編集マスクと互換性がない値の場合は、レスポンスコード 55 が返されます。

    • 読み込みコマンドのフォーマットバッファに日付/時刻編集マスクを指定し、かつフィールドに無効な日付/時刻値が含まれているか、フィールドの長さが値を格納するのに十分でない場合は、レスポンスコード 55 が返されます。

#'char_set'

このフォーマットバッファ要素は、W フィールドにのみ指定可能で、レコードバッファ内の対応するフィールドの文字セットを指定するために使用されます。http://www.iana.org/assignments/character-sets にリストされるエンコーディング名を指定しなければなりません。そのリストにある文字セットのほとんどは ICU によってサポートされており、Adabas は、これを使用して国際化をサポートします。

文字セット指定例

#'UTF-16BE'

フォーマットバッファ例

ここでは、フォーマットバッファおよびレコードバッファの例を示します。ここでの例はすべて、付録 A のサンプル Adabas ファイルを参照しています。

例 1:エレメンタリフィールドを使用(標準長および標準フォーマット)

Format Buffer : AA,5X,AB.
Record Buffer : AA value(8 bytes alphanumeric)
                5 spaces
                AB value(2 bytes packed)

例 2:エレメンタリフィールドを使用(長さとフォーマットは変更)

Format Buffer :  AA,4,5X,AB,3,U,W1,50,#'UTF-16BE'.
Record Buffer :  AA value (4 bytes alphanumeric)
                 5 spaces
                 AB value (3 bytes unpacked)
                 W1 value (50 bytes = 25 characters in UTF-16BE encoding)

例 3:ピリオディックグループを参照

Format Buffer : GB1.
Record Buffer : BA1 value (1 byte binary)
                BB1 value (5 bytes packed)
                BC1 value (10 bytes alphanumeric)

例 4:ピリオディックグループ GB の最初の 2 つのオカレンスを参照

Format Buffer : GB1-2.
Record Buffer : BA1 value (1 byte binary)
                BB1 value (5 bytes packed)        GB1
                BC1 value (10 bytes alphanumeric)
                BA2 value (1 byte binary)
                BB2 value (5 bytes packed)        GB2
                BC2 value (10 bytes alphanumeric)  

例 5:マルチプルバリューフィールド MF の 6 番目の値を参照

Format Buffer : MF6.
Record Buffer : MF value 6 (3 bytes alphanumeric)

例 6:マルチプルバリューフィールド MF の最初から 2 つの値を参照

Format Buffer : MF01-02.
Record Buffer : MF value 1 (3 bytes alphanumeric)
                MF value 2 (3 bytes alphanumeric)

例 7:ピリオディックグループ GC の最高オカレンス番号と、マルチプルバリューフィールド MF に存在する値の数を参照

Format Buffer : GCC,MFC.
Record Buffer : Highest occurrence count for GC (1 byte binary)
                Value count for MF (1 byte binary)

例 8:SQL 空値対応フィールドからデータを読み込み

注意:
次の例では、フィールド ZZ が NC オプション付きの 5 バイト長の英数字フィールドであることを前提にしています。フィールド ZZ は、付録 A のサンプルリストには含まれていません。

Data Storage:  Contains null value
Format Buffer: ZZS, ZZ, 3.

Data returned in Record Buffer:
The first two bytes contain the value –1, and the contents of the next three bytes are undefined.
Data Storage:  "ABCDE"
Format Buffer: ZZS, ZZ, 3.

Data returned in Record Buffer:
The first two bytes contain the value 5 (=length of untruncated field), and the next three bytes are "ABC".
Data Storage:  "ABCDE"
Format Buffer: ZZS, 4, U, ZZ.

Data returned in Record Buffer:
The first four bytes contain the value 0 in unpacked format (=field is non–null and is not truncated), and the next 5 bytes are "ABCDE".

例 9:SQL 空値対応フィールドを空値に更新

注意:
次の例では、例 8 に示されている ZZ フィールドを使用しています。

Format Buffer: ZZS, ZZ.
Record Buffer: Contains the value –1 in the first two bytes, followed by a 5 byte character string. The character string will be ignored, since the field is being updated to contain the null value.

Data Storage:  The field ZZ will be updated to contain the null value.

フォーマットバッファのパフォーマンスに関する考慮事項

フォーマットバッファの作成時、次の事項を考慮すると、効率を上げることができます。

  • 基本フィールドを個別に参照するのではなく、できる限りグループ名を使用します。グループ名を使うと、Adabas がフォーマットバッファを解釈するために必要な時間が削減されます。フィールド範囲指定を使用するとパフォーマンスが向上されません。フィールド範囲指定は、Adabas により一連の基本フィールドに変換されるためです。

  • 長さとフォーマットは必要な場合にのみ指定します。オーバーライドを実行すると、フォーマットバッファ解釈時およびフィールド処理時に余分な処理時間が必要になります。

  • レコード内の同一フィールドを読み込んで更新する場合は、読み込みおよび更新コマンドで同一フォーマットバッファを使用します。

レコードバッファ

レコードバッファは、主に読み込みコマンド(L1-L6、L9 および読み込みオプション付 S1/S2/S4)と更新コマンド(A1、N1/N2)で使用します。

読み込みコマンドでは、Adabas はこのバッファに要求フィールドの値を返します。フィールド値は、フォーマットバッファに指定された順で返されます。値はフォーマットバッファにユーザーが長さおよび/またはフォーマットを指定しない限り、標準の長さとフォーマットで返されます。値が空値である場合は、フィールドのフォーマットに応じて次のように返されます。

フォーマット 空値フォーマット
ALPHANUMERIC 空白
BINARY バイナリのゼロ
FIXED POINT バイナリのゼロ
浮動小数点 バイナリのゼロ
UNPACKED DECIMAL アンパック 10 進数のゼロ
PACKED DECIMAL パック 10 進数のゼロ

Adabas は、要求されたすべてのフィールドの合計長(標準長または指定された長さ)に等しいバイト数を返します。

レコードを更新するときは、レコードバッファに新しい値を指定しなければなりません。空値を提供する場合には、上記のフィールドフォーマットに応じて提供しなければなりません。

レコードバッファは、以下に示されているコマンドでのユーザープログラムと、Adabas 間の情報転送にも使用されます。

  • エンドトランザクション(ET)、またはユーザーセッションのクローズ(CL)。ユーザーは、Adabas システムファイルに格納するデータを提供します。上記コマンドでのユーザーデータの格納はオプションです。

  • ET データの読み込み(RE)。Adabas は、Adabas システムファイルに格納されているユーザーデータを返します。

  • プロテクションログへのユーザーデータの書き込み(C5)。ユーザーは、Adabas データプロテクションログに書き込むデータを提供します。

  • ユーザーセッションのオープン(OP)。ユーザーは、実行する更新タイプ(排他制御または ET ロジック)をアクセス/更新するファイルとともに指定します。Adabas システムファイルに格納されているユーザーデータが Adabas によって返されます(オプション)。

  • フィールド定義の読み込み(LF)。Adabas はファイルのフィールド定義を返します。

サーチバッファとバリューバッファ

サーチバッファとバリューバッファは、FIND コマンド(S1、S2、S4)でレコードの集合を選択するための検索条件を定義する際に、対で使用します。これらは、ファイルの順次読み込みの開始値を示すために、論理順に読み込む(L3/L6)コマンド、ディスクリプタ値を読み込む(L9)コマンドとともに使用します。

ユーザーは、サーチバッファに検索式(複数可)を、バリューバッファには複数の検索式に対応する値を指定します。

サーチバッファとバリューバッファは、レコードの更新(A1)およびレコードの削除(E1)コマンドでも使用されます。これらのコマンドのサーチバッファ構文については、「Adabas コマンド」を参照してください。

サーチバッファとバリューバッファは、ファイルの順次読み込みの開始値を示すために、論理順に読み込み(L3/L6)コマンド、ディスクリプタ値の読み込み(L9)コマンドとともに使用します。コマンドのサーチバッファ構文については「Adabas コマンド」を参照してください。

S1/S2/S4 コマンドのサーチバッファ構文

S1、S2 および S4 コマンドで使用するサーチバッファは、以下の形式に従います。

search expression [,connecting operator, search expression]... .

サーチバッファエントリはすべて、コンマで区切らなければなりません。各エントリ間に 1 つ以上の空白があってもかまいません。最後のエントリの後にコンマがあってもかまいません。サーチバッファはピリオドで終了しなければなりません。

検索式

{[name[i]D[,length][,format],] name[i][,length] [,format] [,E(date_time_edit_mask_name)] [,C]
 [,#'char_set'][,comparator]} | {nameS[,length] [,format]} | (command_id) 

この構文に使用する項目は、次のセクションで説明します。

name[i|S]

検索式で使用するフィールドまたは派生したディスクリプタの名前です。名前は、フィールド、サブディスクリプタ、スーパーディスクリプタ、照合ディスクリプタ、ハイパーディスクリプタ、またはフォネティックディスクリプタです。

ピリオディックグループ内のフィールド、ピリオディックグループ内のフィールドから派生したスーパーディスクリプタや照合ディスクリプタ、または PE オプション付きのハイパーディスクリプタを検索する場合は、特定オカレンスの値だけを検索するために、名前に添字(先行ゼロ可)をつけることが可能です。添字をつけないと、全オカレンスの値が検索されます。

マルチプルバリューフィールド、マルチプルバリューフィールドから構成されるサブディスクリプタ、スーパーディスクリプタ、照合ディスクリプタを検索する場合、フィールドのすべての値が検索の対象となります。このフィールドには添字は付けられません。

フィールドが NU オプション(空値省略)と定義されている場合は、空値はインバーテッドリストに格納されません。したがって、空値を持つレコードを検索すると、(データストレージの中には空値のフィールドを持つレコードがある場合でも)結果は検出レコードなしとなります。このルールは、サブディスクリプタまたは照合ディスクリプタについても適用されます。スーパーディスクリプタの場合は、スーパーディスクリプタを構成するフィールドのうち少なくとも 1 つのフィールドが NU オプションと定義され、そのフィールドが空値である場合、スーパーディスクリプタ値は格納されません。

フィールドが、NC オプション(SQL 空値)または NU オプション(空値省略、Adabas 空値を SQL 空値として解釈)付きで定義されている場合は、フィールド名に大文字 S を付加することによって、SQL 空値を持つすべてのレコードを検索対象にできます。

length
format

バリューバッファに指定するディスクリプタ値の長さとフォーマットは、このパラメータで明示できます。長さおよび/またはフォーマットを省略した場合は、そのフィールドの標準長と標準フォーマットで値を指定しなければなりません。

注意:
スーパーディスクリプタの場合は一般的に、全長を明示的に指定するか、デフォルトの長さを使用する必要があります。この例外は、例えば、英数字の親フィールドだけを持つスーパーディスクリプタです。

注意:
スーパーディスクリプタの場合は一般的に、全長を明示的に指定するか、デフォルトの長さを使用する必要があります。デフォルト長より短い長さを指定した場合はレスポンス 61 が返されます。この例外は、例えば、英数字の親フィールドだけを持つスーパーディスクリプタです。

使用可能なフォーマットおよび各フォーマットに適用する処理ルールを示す 2 つの図が、このセッションの最後にあります。

E(date_time_edit_mask_name)

日付/時刻編集マスクは、フォーマットバッファでの日付/時刻編集マスクと同じ方法で使用できます。詳細については、フォーマットバッファでの日付/時刻編集マスクの説明を参照してください。

name[i]D

夏時間インジケータを使用して日付/時刻の値を指定する場合は、夏時間インジケータを最初に指定し、その後に日付/時刻の編集マスクを含むフィールド指定を指定する必要があります。名前と夏時間インジケータの PE インデックス(指定する場合)は、次の日付/時刻フィールド仕様と同じである必要があります。夏時間インジケータのデフォルトの長さとフォーマットは 2,F です。

C

C オプションは、照合ディスクリプタ で HE オプションを使用していない場合にのみ指定できます。オプションが指定されると、バリューバッファ内の対応する値は照合キーではなく、親フィールドの値となります。

ICU を使用して自分で作成した照合キーを指定するため、HE オプションなしの照合ディスクリプタに C オプションを指定しない場合は、Adabas が使用する ICU のバージョンが 3.2 である点に注意してください。他の ICU バージョンで作成した ICU キーは、Adabas が使用する照合キーと互換性がない場合があります。

#'char_set'

このサーチバッファ要素は、Wフィールドにのみ指定可能で、バリューバッファ内の対応するフィールドの文字セットを指定するために使用されます。http://www.iana.org/assignments/character-sets にリストされるエンコーディング名を指定しなければなりません。そのリストにある文字セットのほとんどは ICU によってサポートされており、Adabas は、これを使用して国際化をサポートします。

文字セット指定例

#'UTF-16BE'
comparator

値演算子は、手前に指定するディスクリプタとバリューバッファ内の対応する値との間に行う論理演算を示すために検索式の最後に用います。

次の演算子が指定できます。

値演算子 説明
EQ 等しい
NE 等しくない
GE より大きいまたは等しい
GT より大きい
LE より小さいまたは等しい
LT より小さい

S 演算子の第 1 オペランドには、値演算子 GE と GT だけを指定できます。EQ も GE と同様に受け入れられ、処理されます。S 演算子の第 2 オペランドには、値演算子 LE と LT だけを指定できます。EQ も LE と同様に受け入れられ、処理されます。

値演算子を指定しない場合は、EQUAL TO 演算とみなされます。

例:

AA.
AA がバリューバッファ内の指定値と等しい。
AA,LT.
AA がバリューバッファ内の指定値より小さい。
AA,GE.
AA がバリューバッファ内の指定値より大きいか等しい。
Command_id

検索式は、SAVE ISN LIST オプション指定の直前にある Sx コマンドの実行結果である ISN リストを示すコマンド ID(カッコで囲む)を指定できます。S8 または S9 コマンドによって作成された ISN リストも使用することができます。

結合演算子

結合演算子は、検索式を結合するのに使用します。以下のような結合演算子を使用できます。

結合演算子 説明
R

2 つの検索式の結果を論理和(OR)演算で結合することを示します。

AA,R,AB.
D

2 つの検索式の結果を論理積(AND)演算で結合します。

AA,D,AB.
O

2 つの検索式の結果を論理和(OR)演算で結合することを示します。O 演算子は、同一ディスクリプタ使用の検索式を結合するときのみ使用できます。

AA,O,AA.  Valid
AA,O,AB.  Invalid
S

2 つの検索式の FROM/TO 範囲(初めと終わりも含めて)を示します。この 2 つの検索式は、同一ディスクリプタでなければなりません。オペランドに定義された値演算子に依存して、フィールド値が下限または上限と等しいレコードは、検索結果に含めるか、除外することができます。

AA,S,AA.      
AA,GE,S,AA,LE.

Range including start and end values
AA,GT,S,AA,LT.

Range excluding start and end values
X

直前の FROM/TO 範囲からある値または値の範囲を除外します。この演算子は必ず、S 演算子とともに指定します。

AA,S,AA,N,AA.        Valid
AA,S,AA,N,AB.        Invalid
AA,S,AA,N,AA,S,AA.   Valid
AA,S,AA,N,AA,N,AB.   Invalid

範囲指定

A から Z までの NAME のような範囲を指定するには、次の 2 つの方法があります。

  1. NAME は A より大きいか等しい、かつ(AND)、NAME は Z より小さいか等しい。

    SB := NA,1,GE,D,NA,1,LE.
    VB := AZ
    
  2. NAME は A から Z

    SB := NA,1,S,NA,1.
    VB := AZ
    

結合演算子の優先順位

1 つのサーチバッファ内に異なる結合演算子が複数あると、演算子は(ある場合は)次の順で処理されます。

  • すべての O/S/N 演算子を評価する

  • D 演算子を評価する

  • R 演算子を評価する

例:サーチバッファ:AA,S,AA,N,AA,O,AA,D,BB,R,CC,D,FF

次のように評価されます:(((((AA,S,AA),N,AA),O,AA),D,BB),R,(CC,D,FF))

サーチバッファの形式(ソフトカップリング使用)

ソフトカップリングを使用して検索を行うサーチバッファは、以下の形式に従います。

(mfile, mfield, sfile, sfield [,mfile, mfield, sfile, sfield],...)
/file/search expression [,operator, search-expression],... .
mfile

主ファイル。このファイルは、Adabas コントロールブロックのファイル番号フィールドに指定されている必要があります。最終的に返される ISN リストは、主ファイルに存在する ISN リストです。

mfield

ソフトカップリングのリンクフィールドとして使用される主ファイルのフィールド。このフィールドは、ディスクリプタ、サブディスクリプタ、スーパーディスクリプタまたはハイパーディスクリプタでなければなりません。ピリオディックグループ内のフィールドを含むディスクリプタは指定できません。

sfile, sfield

(検索条件に従って)s ファイルから選択された各 ISN に関して、s フィールドに指定したフィールドが読み込まれます。このフィールド値を使用すると、主ファイルのどの ISN に一致する値があるかを特定できます。

sfield は、非ディスクリプタまたはディスクリプタのいずれかのフィールドになっている必要があります。サブディスクリプタ、スーパーディスクリプタ、ハイパーディスクリプタ、照合ディスクリプタまたはフォネティックディスクリプタであってはいけません。m フィールドのフォーマットと同じでなければなりません。標準長は異なっていてもかまいません。

ピリオディックグループ内のフィールドは指定できません。

最高 42 までのソフトカップリング条件が指定できます。

ソフトカップリング検索条件の例については、「サーチ/バリューバッファの例」を参照してください。

L3/L6/L9 コマンドのサーチバッファ構文

L3、L6 および L9 コマンドで使用するサーチバッファは、以下のフォーマットに従って構成します。

{L3_SB_element [,comparator].} | {L3_SB_element,S, L3_SB_element.}

バリューバッファに処理順序の開始値または終了値のみが含まれる場合は、サーチバッファの 1 番目の形式が使用されます。コマンドオプション 2 のエントリと比較演算子を使用して、バリューバッファに指定した値が開始ディスクリプタ値になるのか、または終了ディスクリプタ値になるのかを決定します。

バリューバッファに処理順序の開始値と終了値の両方が含まれる場合は、サーチバッファの 2 番目の形式が使用されます。バリューバッファの最初の値は範囲の下限を指定し、2 番目の値は範囲の上限を指定します。開始値を指定する下限値と終了値を指定する上限値のどちらであるかによって、昇順と降順のどちらが指定されたかが決まります。これによりアプリケーションプログラムでは、コントロールブロックのコマンドオプション 2 フィールドのエントリを変更するだけで、処理の方向を変更できるようになります。

L3_SB_element の構文形式は以下のとおりです。

[name [i] D [,length] [,format] ,] name [i]  [,length] [,format] , [,C] 

上記式内の各項目の意味は次のとおりです。

名前 D

夏時間インジケータを使用して日付/時刻の値を指定する場合は、夏時間インジケータを最初に指定し、その後に日付/時刻の編集マスクを含むフィールド指定を指定する必要があります。

名前

順序制御に使用するディスクリプタの名前。指定名はアディション 1 フィールドに指定した名前と同じである必要があります。

i

値を求めたいディスクリプタがピリオディックグループに属する場合は、特定のオカレンス数を指定できます。コントロールブロックの ISN フィールドに指定した値は、サーチバッファおよびバリューバッファともに指定されている場合には無視されます。インデックスの指定がない場合は、指定した値のすべてのオカレンスが返ります。

注意:
このオプションは L9 コマンドでのみ使用できます。

長さ

バリューバッファに指定した値の長さ。長さを指定しない場合、FDT で指定されたディスクリプタのデフォルト長に応じて値が指定されます。

format

バリューバッファに指定した値のフォーマット。フォーマットを指定しない場合、FDT で指定されたディスクリプタのデフォルトフォーマットに応じて値が指定されます。

comparator

比較演算子 GE(同等かより大きい)、GT(より大きい)、LE(同等かより小さい)、LT(より小さい)を使用できます。比較演算子を指定しない場合、GE が指定されます。

C

C オプションは、照合ディスクリプタ で HE オプションを使用していない場合にのみ指定できます。このオプションを指定すると、バリューバッファ内の対応する値は照合キーではなく、親フィールドの値になります。

ICU を使用して自分で作成した照合キーを指定するため、HE オプションなしの照合ディスクリプタに C オプションを指定しない場合は、Adabas が使用する ICU のバージョンが 3.2 である点に注意してください。他の ICU バージョンで作成した ICU キーは、Adabas が使用する照合キーと互換性がない場合があります。

バリューバッファ

サーチバッファに指定した各ディスクリプタの値をバリューバッファに指定します。

指定する各値は、サーチバッファに指定した各検索式と同じ順序にする必要があります。

指定するすべての値は、サーチバッファの標準長と標準フォーマットを明示的に指定していない限り、サーチバッファ内の関連するディスクリプタの標準長と標準フォーマットに一致していなければなりません。

フォネティックディスクリプタと HE オプションを指定したハイパーディスクリプタについては、内部サーチバッファではなく、対応する親フィールドを指定しなければなりません。

検索式がコマンド ID から成っている場合は、バリューバッファにその対応値が作成されません。ただし、0 でないバリューバッファ長は指定しなければなりません。

検索式にフィールド名 FN が含まれ、その後に S オプションが指定されている場合、バリューバッファには 16 進数の FFFF(フィールド FN 内の空値を持つ全レコードを選択)または 16 進数の 0000(フィールド FN 内の空値以外の値を持つ全レコードを選択)のいずれかの値が含まれていなければなりません。

間に空白を入れたり、他のコンマなどの文字をバリューバッファ内の値の間に挿入したりしないでください。バリューバッファの終わりにピリオドは不要です。

サーチ/バリューバッファの例

ここでは、サーチバッファとバリューバッファの構成例を示します。すべての例は、付録 A のサンプル Adabas ファイルを参照しています。バリューバッファの値は、文字および/または 16 進数で表示します。

例:単一の検索式を使用する検索。

Search Buffer : AA.
Value Buffer  : 12345bbb
                0x3132333435202020
Search Buffer : AA.
Value Buffer  : 12345bbb
                ^X3132333435202020

結果:この検索により、フィールド AA の値が 12345 であるファイル 1 内のすべての ISN が返されます。サーチバッファに「AA,5.」と指定し、バリューバッファに値「12345」(末尾の空白なし)を指定しても、同じ検索が実行されます。


例:2 つの検索式を AND(論理積)演算子で結合して検索します。

Search Buffer : AA,D,AB.
Value  Buffer : 0x3132333435363738002C
Search Buffer : AA,D,AB.
Value  Buffer : ^X3132333435363738002C

結果:この検索により、フィールド AA の値が 12345678 で、かつフィールド AB の値が +2 であるファイル 1 内の全レコードの ISN が返ります。

Search Buffer : AA,D,AB,3,U.
Value Buffer  : 12345678002
                0x3132333435363738303032
Search Buffer : AA,D,AB,3,U.
Value Buffer  : 12345678002
                ^X3132333435363738303032

結果:この検索は、上記の検索と同じ結果となります。これは、サーチバッファに長さとフォーマットを指定した例です。

例:3 つの検索式を OR(論理和)演算子で結合して検索します。

Search Buffer : XB,3,U,O,XB,3,U,O,XB,3,U.
Value Buffer  : 284285290
                0x323834323835323930
Search Buffer : XB,3,U,O,XB,3,U,O,XB,3,U.
Value Buffer  : 284285290
                ^X323834323835323930

結果:この検索により、フィールド XB の値が 284、285、または 290 であるファイル 2 内の全レコードの ISN が返ります。また長さとフォーマットが標準長を変更しています。

例:2 つの検索式を FROM/TO(範囲)演算子で結合して検索します。

Search Buffer : XB,S,XB.
Value Buffer  : 0x020C030C
Search Buffer : XB,S,XB.
Value Buffer  : ^X020C030C

結果:この検索により、フィールドXBの値が +20 から +30 の範囲にあるファイル 2 内の全レコードの ISN が返ります。

例:3 つの検索式を FROM-TO(範囲)演算子と BUT-NOT(除外)演算子で結合して検索します。

Search Buffer : XB,S,XB,N,XB.
Value Buffer  : 0x020C030C027C
Search Buffer : XB,S,XB,N,XB.
Value Buffer  : ^X020C030C027C

結果:この検索により、フィールド XB の値が、+27 を除く +20 から +30 の範囲にあるファイル 2 内の全レコードの ISN を返します。

例:OR 演算子によってディスクリプタ値の 2 つの範囲が結合されている検索。

Search Buffer : XB,S,XB,O,XB,S,XB.
Value Buffer  : 0x001C200C500C600C
Search Buffer : XB,S,XB,O,XB,S,XB.
Value Buffer  : ^X001C200C500C600C

結果:この検索により、フィールド XB の値が、+1 から +200 または +500 から +600 までの範囲にあるファイル 2 内の全レコードの ISN を返します。

例:マルチプルバリューディスクリプタを使用して検索します。

Search Buffer : MF.
Value Buffer  : ABC
                0x414243
Search Buffer : MF.
Value Buffer  : ABC
                ^X414243

結果:この検索によって、マルチプルバリューフィールド MF のいずれかの値が「ABC」であるファイル 1 内の全レコードの ISN が返ります。

Search Buffer : MF2.  Invalid.

例:ピリオディックグループ内のディスクリプタを使用して検索します。

Search Buffer : BA.
Value Buffer  : 0x04
Search Buffer : BA.
Value Buffer  : ^X04

結果:この検索により、ディスクリプタ BA(ピリオディックグループに属している)のいずれかのオカレンスの値が 4 であるファイル 1 内の全レコードの ISN を返します。

Search Buffer : BA3.
Value Buffer  : 0x04
Search Buffer : BA3.
Value Buffer  : ^X04

結果:この検索により、ディスクリプタ BA(ピリオディックグループに属する)の第 3 オカレンスの値が value4 であるファイル 1 内の全レコードの ISN を返します。

例:サブディスクリプタを使用した検索。SA は、フィールド RA の先頭 4 バイトから生成したサブディスクリプタです。

Search Buffer : SA.
Value Buffer  : 0x41424344
Search Buffer : SA.
Value Buffer  : ^X41424344

結果:この検索により、サブディスクリプタ SA の値が ABCD であるファイル 2 内の全レコードの ISN が返ります。

例:英数字フォーマットのスーパーディスクリプタを使用して検索します。SB は、フィールド RA の先頭 8 バイトとフィールド RB の先頭 4 バイトから生成したスーパーディスクリプタです。

Search Buffer : SB.
Value Buffer  : 0x414243444546474831323334
Search Buffer : SB.
Value Buffer  : ^X414243444546474831323334

結果:この検索により、スーパーディスクリプタ SB の値が ABCDEFGH1234 であるファイル 2 内の全レコードの ISN が返ります。

例:バイナリフォーマットのスーパーディスクリプタを使用した検索。SC は、フィールド XB と XC から生成したスーパーディスクリプタです。

Search Buffer :  SC.
Value Buffer  :  0x020F313233343536
Search Buffer :  SC.
Value Buffer  :  ^X020F313233343536

結果:この検索により、フィールド XB の値が +20 でフィールド XC の値が 123456 であるファイル 2 内の全レコードの ISN が返ります。

例:以前に生成した ISN リスト(コマンド ID で識別されたもの)を使用した検索。

Search Buffer :  (CID1),D,(CID2).
Value Buffer  :   not used

結果:この検索により、CID1 および CID2 のコマンド ID に対応する 2 つの ISN リスト中に共通に存在する ISN が返ります。

Search Buffer : (CID1),D,AB,3,U.
Value Buffer  : 123
                0x313233
Search Buffer : (CID1),D,AB,3,U.
Value Buffer  : 123
                ^X313233

結果:この検索により、CID1 に対応する ISN リスト中に存在し、かつフィールド AB の値が +123 であるファイル 1 内の全レコードの ISN が返ります。

例:値演算子を使用して検索します。

Search Buffer : AB,3,U,GT.
Value Buffer  : 100
                0x313030
Search Buffer : AB,3,U,GT.
Value Buffer  : 100
                ^X313030

結果:この検索により、フィールド AB の値が +100 より大きい値をもつファイル 1 内の全レコードの ISN が返ります。

例:値演算子および結合演算子を使して検索します。

Search Buffer : AB,3,U,GT,D,AA,1,GT.
Value Buffer  : 100A
                0x31303041
Search Buffer : AB,3,U,GT,D,AA,1,GT.
Value Buffer  : 100A
                ^X31303041

結果:この検索により、フィールド AB の値が +100 より大きく、かつフィールド AA の値が A より大きいファイル 1 内の全レコードの ISN が返されます。

例:ディスクリプタフィールドと非ディスクリプタフィールドの両方を使用する検索。

Search Buffer : AA,4,A,D,BC,3,A.
Value Buffer  : ABCD300
                ^X41424344333030

結果:AA(ディスクリプタ)が "ABCD" に等しく、BC(非ディスクリプタ)が "300" に等しいすべてのレコードが選択されます。

例:OR で結合された 2 つの異なるディスクリプタの 2 つの検索式を使用した検索。検索式の 1 つは AND 演算子を使用する複合式です。

Search Buffer : AB,R,AC,3,NE,D,MF.
Value Buffer  : 0x001C414243414243
Search Buffer : AB,R,AC,3,NE,D,MF.
Value Buffer  : ^X001C414243414243

結果:この検索で、フィールド AB の値が X'001C'、またはフィールド AC の先頭 3 バイトの値が X'414243' でないが、フィールド MF の値が X'414243' である、ファイル 1 の全レコードの ISN が返されます。

例:SQL 空値による検索。

注意:
次の例で、フィールド ZZ は NC オプション付きの英数字フィールドであるとします。フィールド ZZ は、付録 A のサンプルリストには含まれていません。

Search Buffer : AA,4,A,D,ZZS. 
Value Buffer : 0x41424344FFFF
Search Buffer : AA,4,A,D,ZZS. 
Value Buffer : ^X41424344FFFF

結果:レコードは、フィールド AA="ABCD" とフィールド ZZ が空値で選択されます。

Search Buffer : AA,4,A,D,ZZS. 
Value Buffer : 0x414243440000
Search Buffer : AA,4,A,D,ZZS. 
Value Buffer : ^X414243440000

結果:レコードは、フィールド AA="ABCD" とフィールド ZZ が空値以外の値で選択されます。

例:単一ソフトカップリング条件と単一検索条件を使用。

File Number  :  4
Search Buffer:  (4,AB,1,AC)/1/AB,S,AB.
Value Buffer :  ...........
  1. ファイル 1 で、AB がバリューバッファにある値の範囲のレコードを検索します。

  2. 1 で求められたファイル 1 内の各 ISN に関し、フィールド AC を読み込み、さらにファイル 4 の対応値リスト(AB)と内部的に照合します。

  3. ファイル 4 の ISN 結果リストが、ISN バッファに返されます。

例:単一ソフトカップリング条件および複数検索条件を使用。

File Number  :  1
Search Buffer:  (1,AA,2,AB)/1/AC,D,AE,D,/2/AF,S,AF.
Value Buffer :  ...........
  1. AF= のサーチファイル 2... ~ ...(バリューバッファで提供される値)

  2. ファイル 2 の結果として得られる各 ISN についてフィールド AB を読み込み、さらにファイル 1 の値リスト(AA)と内部的に照合します。

  3. ファイル 1 で AC=... および AE=... を検索します(バリューバッファで提供される値)

  4. ステップ 2 と 3 の結果である ISN リストを照合します。

  5. ステップ 4 から得られる ISN が ISN バッファに返されます。

例:複数ソフトカップリング条件と複数検索条件を使用。

File Number  :  1
Search Buffer:  (1,AA,2,AB;1,AA,5,BA)
                /1/AC,D,AE,D,/2/AF,S,AF,D,/5/BC,S,BC.
  1. AF= のサーチファイル 2... ~ ...(バリューバッファで提供される値)

  2. ファイル 2 の結果として得られる各 ISN についてフィールド AB を読み込み、さらにファイル 1 の値リスト(AA)と内部的に照合します。

  3. ファイル 5 で BC=... ~... を検索します(バリューバッファで提供される値)

  4. ファイル 5 の結果として得られる各 ISN についてフィールド BA を読み込み、さらにファイル 1 の値リストに(AA)と内部的に照合します。

  5. ファイル 1 で AC=... ~ ... を検索します(バリューバッファで提供される値)

  6. ステップ 2、4、5 から得られる ISN リストを照合します。

  7. ステップ 6 から得られる ISN が ISN バッファに返されます。

例:NOT EQUAL 演算記号を使用した検索

Search Buffer : AA,4,A,NE. 
Value Buffer  : ABCD
                0x41424344
Search Buffer : AA,4,A,NE. 
Value Buffer  : ABCD
                ^X41424344

結果:フィールド AA が "ABCD" と等しくない、すべてのレコードを選択します。

例:R 演算記号(異なるフィールド名を使用した OR)を使用した検索

Search Buffer : AA,4,A,R,BB,LT. 
Value Buffer  : ABCD3000
                0x4142434433303030
Search Buffer : AA,4,A,R,BB,LT. 
Value Buffer  : ABCD3000
                ^X4142434433303030

結果:フィールド AA が "ABCD" と等しいか、フィールド BB が 3000 未満のすべてのレコードを選択します。

Search Buffer : AA,4,A,R,(TEST). 
Value Buffer  : ABCD
                0x41424344
Search Buffer : AA,4,A,R,(TEST). 
Value Buffer  : ABCD
                ^X41424344

結果:フィールド AA が "ABCD" と等しいか、ISN リスト TEST のメンバである、すべてのレコードを選択します。

マルチフェッチバッファ

マルチフェッチバッファは、ACBX ダイレクトコールインターフェイスを使用して実行される一部の Adabas コマンドでのみ必要になります。ACB インターフェイスダイレクトコールには必要ありません。

マルチフェッチバッファは、Adabas がマルチフェッチしたレコードのレコードディスクリプタエレメント(RDE)を返すことができるストレージ内のエリアです。このバッファは、(コマンドオプション 1 を "M" に設定して)マルチフェッチオプションをアクティブにした Adabas コマンドでのみ必要になります。RDE の長さはどれも 16 バイトです。

ACBX コマンドのコマンドオプション 1 フィールドにマルチフェッチオプション M を設定すると、対応するフォーマットバッファセグメントのフォーマット指定に基づいて、読み込み中のレコードがすべて指定のレコードバッファセグメントに返されます。レコードバッファセグメントごとに、対応するマルチフェッチバッファセグメントには、レコードバッファセグメントのレコードについて説明したマルチフェッチヘッダーが含まれています。

BT コマンドまたは ET コマンドの場合、コマンドオプション 1 を "M" に設定したときには、マルチフェッチバッファは必要ありません。この場合、ISN バッファはホールドキューから削除する必要がある ISN を格納するのに使用されます。

マルチフェッチバッファが必要になる場合、対応するフォーマットバッファとレコードバッファも必要になると見なされます。対応するバッファを指定しないと、マルチフェッチバッファのペアとなるダミーのフォーマットバッファおよびレコードバッファ(長さゼロ)が作成されます。それぞれのタイプの ABD またはバッファ間の関係については、「バッファタイプ間の関係」を参照してください。

ISN バッファ

Adabas は ISN バッファに検索条件を満足するレコードの ISN 群を返します。

各 ISN は 4 バイトの 2 進数で返されます。また、ISN は昇順で返されます。S2 または S9 コマンドでは、ISN はユーザー指定のソート順で返されます。

ISN バッファが、実行結果の ISN リストを入れるのに充分な大きさでない場合は、Adabas が、あふれた ISN を Adabas 一時ワークスペースに(要求があれば)格納します。これらのあふれた ISN は後で読み込むことができます(詳細については、「プログラミングの考慮事項」の「ISN リスト処理」を参照してください)。

注意:
ACB インターフェイスはマルチフェッチバッファをサポートしていないため、ACB インターフェイスを使用するコールでは、マルチフェッチオプションが設定されている場合、マルチフェッチバッファの代わりに ISN バッファが使用されます。

Adabas フォーマット変換の要約

次の表に、レコード/バリューバッファの値がどのように更新(追加を含む)/検索コマンド用に変換されるか、およびデータレコードの値がどのように読み込みコマンド用に変換されるかを示します。

ターゲットフォーマット
- 更新/検索コマンド用に指定されたフィールドの標準フォーマット*
- 読み込みコマンド用のフォーマットバッファに指定されたフォーマット
ソースフォーマット
- 更新/検索コマンド用のフォーマット/サーチバッファに指定されたフォーマット
- 読み込みコマンド用に指定されたフィールドの標準フォーマット
Adabas 処理
ALPHANUMERIC ALPHANUMERIC 長さだけを適合させます。
  バイナリ、
パック、
アンパック
値はアンパックに変換され、先行するゼロは削除され、必要であれば、後続の空白値を追加して左詰めとなります。
バイナリ/固定小数点 バイナリ/固定小数点 長さだけを適合させます。
  パック、
アンパック
値はバイナリ/固定小数点に変換されます。
浮動小数点 浮動小数点 変換は必要ありません。長さが異なると、レスポンスコード 41/61 が発生します。
パック パック 長さだけを適合させます。
  バイナリ、
アンパック、
固定小数点
値はパック形式に変換されます。
アンパック アンパック 長さだけを適合させます。
  バイナリ、
パック、
固定小数点
値はアンパック形式に変換されます。
Unicode Unicode フォーマット/バリューバッファまたは OP コマンドの文字セットとして指定されたエンコーディングの値は UTF-8 に変換されます。

他のすべてのフォーマットの組み合わせの場合は、レスポンスコード 41(フォーマットバッファ)または 61(サーチバッファ)が返ります。

* サブディスクリプタのフォーマットは、親フィールドのフォーマットと同じです。
スーパーディスクリプタの親フィールドがすべてアンパックの場合、スーパーディスクリプタのフォーマットは、英数字、アンパックまたはバイナリで、これはスーパーディスクリプタの定義によって変わります。一部の親フィールドがアンパックではなく、少なくとも 1 つの親フィールドが英数字の場合、スーパーディスクリプタのデフォルトのフォーマットは英数字で、それ以外の場合はバイナリフォーマットです。

符号の取り扱い

バイナリ値は符号なしの数として扱います。固定小数点、浮動小数点アンパックおよびパックの値は符号付数値として扱います。

指定可能な正しい符号は次のとおりです。

Fixed point

符号はビット 0(上位のビット)にあります。

0 = 正
1 = 負(2 の補数)

0x00000005 = +5
0xFFFFFFFB = -5

Floating point

符号は、4 または 8 バイトの最も有効なビットにあります。

Unpacked

符号は、下位バイトの高位 4 ビットにあります(ゾーン形式)。

0x313233 = +123
0x313273 = -123

Packed

符号は下位バイトの下位 4 ビットにあります。

Input          Output
-----          ------
A,C,E,F        C=positive
B,D            D=negative

0x123C = +123
0x123D = -123

パックフィールドから作られたスーパーディスクリプタに対する検索では、値として正の場合には A、C、E、F を、負の場合には B、D を最終バイトの下位 4 ビットに指定しなければなりません。

アプリケーションサーバーから Adabas コーリング

アプリケーションサーバーでは、複数のクライアントが 1 つのサーバーを通じてデータベースにアクセスします。

サーバーは、クライアントに代わって Adabas コールを発行するため、サーバーだけがニュークリアスから認識される仮想 Adabas ユーザーとなります。コールはサーバーからのみ発行されますが、ニュークリアスは各ユーザーを識別する必要があります。

Adabas のユーザー識別情報は、ノード名、ユーザー名、環境固有の ID(プロセス ID)およびタイムスタンプで構成されます。

このユーザー識別情報は、クライアント上で設定されてサーバーに提供されるか、サーバー上で生成されます。

ユーザーの識別情報を取得するために、アプリケーションは lnk_get_adabas_id() コールを発行しなければなりません。このルーチンのインターフェイスは次のとおりです。

#include "adabas.h"

int lnk_get_adabas_id (int buffer_length, unsigned char *buf);

最初の引数 buffer_length は、2 番目の引数 buf によりアドレスされるバッファの長さを示します。lnk_get_adabas_id(...) により、ユーザー識別がこのバッファに入れられます。指定されるバッファ長は、返されるすべての情報を格納するのに十分な長さが必要です。返される構造は次のとおりです。

struct adaid {
    unsigned short s_level;     //security: equivalent structure level: 3
    unsigned short s_size;      //size of the data structure
    unsigned char s_node[8];    //Adabas node name
    unsigned char s_user[8];    //Adabas user name
    unsigned int s_pid;         //process identification, 4 bytes
    long long s_timestamp       //microseconds since 1970
}; 

現在のバージョンでは、構造レベルは 3 であり、返されるバッファ長は 32 バイトです。このユーザー識別情報はサーバーに送信される必要があります。サーバーは、Adabas がユーザー識別を利用できるようにするために、lnk_set_adabas_id() 関数コールを発行しなければなりません。このルーチンのインターフェイスは次のとおりです。

#include "adabas.h"

int lnk_set_adabas_id (unsigned char *buf);

引数は、ユーザー識別構造を含むバッファに対するポインタです。ユーザー識別構造は、クライアント上の lnk_get_adabas_id(...) から返されるか、サーバー上で生成されます。ADALNK は、長さフィールドおよび構造レベルを使用して入力構造をチェックし、その情報を Adabas が利用できるようにします。ユーザー識別情報は、クライアントが変更されるごとにサーバーに書き込まれる必要があります。

サーバー上で生成されたユーザー識別情報には、ASCII ノード名、ASCII ユーザー名、およびプロセス ID のいずれもバイナリの 0 で埋められていてはならないという要件があります。

注意:

  1. lnk_set_adabas_id をコールしない場合、デフォルトでコール元のノード名、ユーザー名、およびプロセス識別情報がユーザー識別構造に使用されます。lnk_set_adabas_id をコールする場合は、これらのフィールドを任意の値に設定できます。
  2. Adabas のユーザー識別情報がユーティリティで表示される場合(ADADBM DISPLAY=UQ など)、ノード名とユーザー名は 8 文字で表示されます。そのため、ノード名とユーザー名には印刷可能な文字のみを指定することを強くお勧めします。空値終端文字列として指定する、文字列の長さが 8 バイト未満の値には、空白を埋め込む必要があります。
  3. 以前のバージョンの Adabas との互換性を保つために、構造レベル 2 もサポートしています。構造レベル 2 は、adaaid 構造にタイムスタンプが含まれていないことを意味します。これにより、adaaid 構造のサイズが 24 バイトに縮小されます。そのため、lnk_get-adabas_id がパラメータ buffer_length = 24 で呼び出されると、構造レベル 2 が lnk_get_adabas_id で使用されます。構造レベル 2 は、lnk_get_adabas_id または lnk_set_adabas_id への最初のコールの前に Adabas コールが実行されていない場合にのみ使用できます。プログラムでは、構造レベル 2 と 3 のコールを混在させることはできません。ただし、プログラムで受信した構造レベル 2 の Adabas のユーザー識別情報は、別のプログラムの構造レベル 3 の lnk_set_adabas_id で使用できます。この場合は、タイムスタンプを 0 に設定する必要があります。

注意:
Adabas バージョン 6.1 SP 10 以前、Adabas バージョン 6.2、または Net-Work バージョン 7.3 を使用している場合、これらのバージョンを使用した Adabas セッションでは、タイムスタンプが使用されません。このような場合は、次の点を考慮する必要があります。lnk_set_adabas_id で新しい Adabas セッションを作成する場合は、指定した adaid 構造の組み合わせ(ノード、ユーザー、PID)が別の Adabas セッションで使用されないことを確認するのはユーザーの責任です。タイムスタンプ情報はまだユーザー識別情報の一部として使用されていないので、adaid 構造に異なるタイムスタンプがあるだけでは不十分です。タイムスタンプのない既存のユーザー識別情報を使用すると、予期しないエラーが発生します。これは、両方のクライアントが同じ Adabas セッションを共有するためで、意図された動作ではありません。このような場合の一般的なエラーは、Adabas レスポンスコード 153 で、両方のクライアントが Adabas コールを同時に発行した場合に返されます。

注意:
アプリケーションが lnk_set_adabas_id を使用する場合、Adabas では、Adabas コールが Adabas セッションの最初のコールかどうかを認識できなくなります。そのため、ニュークリアスが OPEN_REQUIRED オプション付きで起動される場合にのみ、Adabas ニュークリアスの再起動に続くトランザクションの一貫性が保障されます。

注意:
Entire Net-Workでもlnk_set_adabas_id を使用するため、Entire Net-Work を使用する場合は、OPEN_REQUIRED オプションを常に使用する必要があります。

マルチスレッドアプリケーション

マルチスレッドアプリケーションを書く場合は、adalnkx を使用する必要があります。

マルチスレッドアプリケーション内で Adabas にコールする標準的な方法は、各スレッド自身が Adabas セッションを持って Adabas コールを実行することです。各スレッドは、最初にオープンコマンドを発行し、次にデータベースにアクセスする Adabas コール、最後にクローズコマンドを発行します。

lnk_get_adabas_id および lnk_set_adabas_id 関数を使用する場合は、異なるスレッドの中で 1 つの Adabas セッションを使用することもできます。スレッド 1 の中にアクティブな Adabas セッションがある場合、スレッド 2 の中でそれを継続したいならば、最初にスレッド 1 で lnk_get_adabas_id をコールし、それからスレッド 2 で lnk_set_adabas_id をコールしてください。

注意:
adalnkx が利用可能になる前に開発された古いマルチスレッドアプリケーションは、旧インターフェイス adalnk を呼び出す可能性があります。これは、次のルールを使用すると可能です。

  • その adalnk コールは、同期される必要があります。

  • 1 度に 1 つのスレッドのみ adalnk をコールするようにしてください。adalnkx はデフォルトで、各スレッドに個別の Adabas セッションを作成しますが、adalnk はデフォルトで、プロセス全体に対して単一の Adabas セッションのみを作成します。より多くのセッションを持ちたい場合は、lnk_set_adabas_id を使用しなければなりません。

認証を使用した Adabas の呼び出し

アプリケーションが、データベースセッションのオープン前にユーザーの資格情報を設定します。

クライアントセッションを管理し、資格情報を設定するために次の Adabas クライアント機能が提供されます:

手順 機能 説明
1(オプション) lnk_set_adabas_id() セッション ID を設定します。
2 lnk_set_uid_pw() 特定のデータベースの認証資格情報を設定します。

手順 1 は任意です。この手順は、複数のクライアントが 1 台のサーバーを通じてデータベースにアクセスするアプリケーションサーバーでのみ実行する必要があります。その後、資格情報を設定するに、Adabas セッション ID を設定する必要があります。

セキュリティで保護されたデータベースにアクセスする場合は、各 Adabas セッションの開始に必ず資格情報を設定する必要があります。また、アクセスするデータベース ID ごとに資格情報を設定する必要があります。

この資格情報は、データベースセッションの間有効です。オープンデータベースセッション中に認証情報を設定しようとすると、ニュークリアスレスポンス 9 “SE”:セキュリティ違反が返されます。オープンデータベーストランザクションがバックアウトされます。

無効な資格情報でのデータベースセッション、または資格情報なしで開始されたデータベースセッションでは、「セキュリティ違反」:ニュークリアスレスポンス 200 とサブコード 31 が返されます。

詳細については、「付録 D - Adabas キットのサンプルファイル」の「security_example.c」を参照してください。

#include "adabasx.h"


int           dbid;
static char  *uid;
static char  *passwd;

/*
** Set database-specific credentials
**
** This must be done -
** a) for each Adabas Session (Prior to start of session)
** b) for each dbid, which is to be accessed
** 
*/

lnk_set_uid_pw(dbid, uid, passwd);

移行モード

Adabas ニュークリアスユーザー出口 21 を使用して認証資格情報を設定できます。

このルーチンの目的は、アプリケーションを Adabas 認証に移行する手順を容易にすることです。このルーチンは、アプリケーションでの資格情報設定の代替手段とすることを意図してはいません。使用は可能な限り短期間に留めてください。