ファイルハンドラおよびソート API

ここでは、プログラムでファイルハンドラとソートモジュールを明示的に呼び出す方法を説明します。

ファイルハンドラの呼び出し

ファイルハンドラを呼び出すと、ファイルを開いたり、レコードを読み取ったりするといった一般的なアクションを効率的で一貫性のある方法で実行できます。

概要

次の構文を使用すると、プログラムで呼び出し可能ファイルハンドラを明示的に呼び出せます。

call "EXTFH" using opcode fcd
        

パラメータの内容は、次のとおりです。

パラメータ 説明 
"EXTFH" ファイルハンドラインターフェイスのモジュール名です。
opcode ファイルハンドラの操作コードです。後述の『操作コード』の項を参照してください。
fcd ファイルハンドラがアクセスするファイルの詳細を保持する FCD (ファイル制御記述) と呼ばれるデータ領域です。後述の『データ構造体』の項を参照してください。

最初の呼び出しの前に、次の手順を行う必要があります。

  1. ファイル制御記述 (FCD)、レコード領域、ファイル名領域、キー定義ブロック (索引ファイルの場合) にデータ領域を割り当てます。
  2. ファイルハンドラが無効な値を受け取らないように、すべてのデータ領域をバイナリのゼロに初期化します。
  3. FCD に次の領域へのポインタを設定します。
    • レコード領域
    • ファイル名領域
    • キー定義ブロック (索引ファイルの場合のみ)

その後で、各ファイルハンドラ操作に対して次の手順を行います。

  1. 選択した操作コードに対応する FCD のフィールドに入力を行います。
  2. ファイルハンドラを呼び出します。
  3. ファイル状態を確認して、ファイルの入出力操作が正常に行われたかどうかを判断します。
  4. FCD フィールドやレコード領域のデータを処理します。

データ構造体

ファイルハンドラでは、ファイルの入出力操作中に次の 4 つのデータ構造体を使用します。

データ構造体 説明 
ファイル制御記述 (FCD) 100 バイトのデータ領域で、使用中のファイルに関する情報が記述されます。
レコード領域 レコード領域は、レコードの読み取りや書き出しを行うデータ領域です。
ファイル名領域 ファイル名領域は、使用中のファイルの名前を記述するデータ領域で、オペレーティングシステムにより認識されます。
キー定義ブロック ファイルハンドラが索引ファイルでの操作中に索引キー情報を記述します。

ファイル制御記述 (FCD)

ファイル制御記述 (FCD:File Control Description) は、使用中のファイルに関する情報を記述するデータ領域です。FCD には 2 つのバージョンがあり、どちらを使用するかは COBOL 開発システムを 32 ビットと 64 ビットのどちらのオペレーティングシステムで実行するかによって決まります。これを次の表に示します。

COBOL 開発システム 使用する FCD
メインフレームの Express FCD2
32 ビット Net Express FCD2
64 ビット Net Express FCD3
.NET サポートおよび .NET 対応 Net Express FCD3
32 ビット Visual COBOL FCD2 または FCD3
64 ビット Visual COBOL FCD3

FCD2 フォーマットと FCD3 フォーマットは、どちらも 32 ビットコンパイルで使用できます。 プログラムをコンパイラ指令 P64 でコンパイルすると、コピーファイル XFHFCD.CPY で、FCD3 レコードが定義されます。 プログラムを P64 指令でコンパイルしない場合には、XFHFCD.CPY で FCD2 レコードが定義されます。 FCD3 レコードは xfhfcd3.cpy ファイルで直接、無条件に定義され、FCD2 レコードは xfhfcd2.cpy ファイルで直接、無条件に定義されます。

ファイルハンドラを使用するには、プログラムで FCD を設定し、該当するフィールドへの入力 (操作コードによってフィールドが異なります) とファイルハンドラの呼び出しを行います。 FCD の該当フィールドに入力を行うと、ファイルハンドラがプログラムに情報を返します。

FCD で未使用の領域や予約済みの領域は、バイナリゼロに設定する必要があります。

ファイルオープン呼び出しに使用した FCD は、その後このファイルに対してアクセスするときに必ず使用する必要があります。 1 つのファイルに対して複数のオープン操作を実行できますが、オープン操作ごとに別の FCD を使用する必要があります。

FCD には、レコード領域、ファイル名領域、キー定義ブロックへのポインタ (USAGE POINTER データ項目) を記述します。

FCD 構造体の詳細については、ヘルプトピック 『ファイル制御記述 (FCD)』を参照してください。

レコード領域

レコード領域は、レコードの読み取りと書き出しを行うデータ領域です。

レコード領域のサイズは、ファイルの最大レコードよりも 4 バイト大きい必要があります。

レコード領域を指す FCD の設定例を次に示します。

 01 RECORD-AREA      PIC X(85).
   ...
     SET FCD-RECORD-ADDRESS TO ADDRESS OF RECORD-AREA
       ...

ファイル名領域

ファイル名領域は、使用中のファイルの名前を含むデータ領域で、オペレーティングシステムにより認識されます。

ドライブやパスの情報のみではなく、ファイルの実際の名前も記述できます。 名前の最後は空白文字でなければなりません。

このファイル名領域は、ファイルに対する最初の操作より前に記述する必要があります。

ファイル名領域を指す FCD の設定例を次に示します。

 01 FILENAME-AREA PIC X(65) VALUE "master.dat".
   ...
     MOVE 65 TO FCD-NAME-LENGTH
     SET FCD-FILENAME-ADDRESS TO ADDRESS OF FILENAME-AREA
       ...

キー定義ブロック

キー定義ブロックは、索引ファイルを開くときに、ファイルハンドラに索引キー情報を渡すために使用します。 キー定義ブロックは、次に示す 3 つのデータ領域で構成されます。

グローバル情報領域

グローバル情報領域には、キー定義領域のサイズとファイルに含むキーの数を記述します。 詳細なレイアウトについては、ヘルプトピック 『グローバル情報領域』を参照してください。

キー定義領域

キー定義領域には、索引ファイルで使用するキーを記述します。

キー定義領域は、グローバル情報領域の次に配置され、ファイルにある各キーにつきキー定義を 1 つ記述します。

すべてのキーは、構成要素より前に定義する必要があります。

キー位置の順序に基づいてキーを識別するため、キーを定義する順序は重要です。 たとえば、1 つの主キーと 2 つの副キーを持つ索引ファイルの場合、キー定義領域には、3 つのキー定義が記述されます。つまり、主キーはキー 0、1 つ目の副キーはキー 1、2 つ目の副キーはキー 2 となります。

キー定義領域の詳細なレイアウトについては、ヘルプトピック 『キー定義領域』を参照してください。

構成要素定義領域

構成要素定義領域は、キー定義領域の後にあります。

この領域では、各キーの構成要素を定義します。分割キー以外の各キーは、1 つの構成要素から成り立ち、各構成要素をそれぞれ定義する必要があります。

構成要素の定義では、キー構成要素の位置と長さを指定します。

数字キーの場合は、構成要素定義領域を使用して、数値の型を指定できます。 その後で、IXNUMKEY コンパイラ指令を使用すると、数値の型に従ってキーを順序付けることができます (デフォルトでは、キーは英数字順に並びます)。

構成要素定義領域の詳細なレイアウトについては、ヘルプトピック 『構成要素定義領域』を参照してください。

FCD へのアクセス

プログラムで通常の COBOL 構文を使用してファイルの入出力操作を行う場合は、各ファイルに対してファイル制御記述 (FCD) が自動的に作成されます。 この自動的に作成された FCD にアクセスするには、FCDREG コンパイラ指令でプログラムをコンパイルします。 これにより、FCD の読み取りや変更、FCD を使用したファイルハンドラの明示的な呼び出しなどが可能になります。

FCD にアクセスするには、プログラムの連絡節に FCD 定義を設定する必要があります。 FCD 定義の例は、コピーブックの XFHFCD.CPYに保存されています。 プログラムで次の SET 文を使用すると、読み取りや変更を行う FCD にこの定義をマップできます。

     set address of fcd to address of fh--fcd of file
        

パラメータの内容は、次のとおりです。

パラメータ 説明 
fcd プログラムの連絡節に記述する FCD 定義の名前。
fh--fcd ファイルにアクセスするために、この COBOL システムで使用する FCD (ハイフンが 2 つあることに注意してください)。
file ファイルの FD 名

この SET 操作に続けて、連絡節で設定した FCD のデータ項目にアクセスすると、ファイルの FCD へアクセスできます。

同様に、次のように指定すると、キー定義ブロックにアクセスすることができます。

     set address of kdb to address of fh--keydef of file
        

パラメータの内容は、次のとおりです。

パラメータ 説明 
kdb プログラムの連絡節で記述するキー定義ブロックの名前。
fh--keydef ファイルにアクセスするために、この COBOL システムで使用するキー定義 (ハイフンが 2 つあることに注意してください)。
file ファイルの FD 名

操作コード

ファイルハンドラが実行するファイル操作は、2 バイトの操作コードで識別します。

操作コードには 2 つの種類があります。

操作コードの種類 説明 
標準操作コード このコードでは、MSB に x"FA" が格納されます。LSB は、特殊操作を示します。
特殊操作コード このコードでは、MSB に x"00" が格納されます。LSB は、特殊操作を示します。

標準操作コードと特殊操作コードの詳細なリストと詳細情報へのリンクは、ヘルプトピック 『標準の操作コード - 概要』および  『特殊な操作コード - 概要』を参照してください。

相対バイトアドレス指定

レコードの相対バイトアドレスは、その特定のレコードに対するすべてのファイルハンドラの操作で FCD の fcd-reladdr-offset (または fcd-config-flags にビット 4 を設定した場合は fcd-reladdr-big) に格納されます。 レコードの相対バイトアドレスを使用するには、READ 操作の後でこのフィールドの内容を保存するのみです。

相対バイトアドレスを使用すると、高速にレコードへアクセスできます。ただし、次のような制限があります。

相対バイトアドレス操作では、レコードロックもサポートされています。

レコードの相対バイトアドレスを取得すると、それを使用して次の操作を実行できます。

レコードの読み取り

相対バイトアドレスを使用してファイルから具体的なレコードを読み取る方法には 2 種類あります。

READ (直接) 操作も同様に機能しますが、FCD にビットを設定する必要はありません。 READ (直接) 操作では、常に FCD の相対バイトアドレスフィールドで指定されたアドレスのレコードを返し、現在のレコードポインタを更新します。

上記のどちらの方法でも、現在の参照キーを別のキーに切り替えることができます。 たとえば、主キーにより READ (順) 操作を行っている場合に、次の手順を使用すると、現在のレコードの最初の副キーにより読み取りを開始できます。

  1. ファイルの次のレコードを読み取ります (このレコードのアドレスは、FCD の相対バイトアドレスフィールドで指定します)。
  2. FCD の fcd-key-id に新しい参照キーを格納します
  3. READ (直接) 操作を実行して、このアドレスのレコードを返します。これで、参照キーは新しいキーに変更されます。
  4. ファイルの次のレコードを読み取ります。 このレコードは、新しい参照キーの索引にある次のレコードです。

レコードの再書き込み

FCD の fcd-reladdr-offset または fcd-reladdr-big にアドレスを格納し、FCD の fcd-config-flags にビット 6 を設定すると、レコードを特定のアドレスに再度書き込むことができます。

現在のレコードポインタを更新する場合は、FCD の fcd-config-flags にビット 5 を設定します。

次に、REWRITE 操作を実行します。

レコードの削除

FCD の fcd-reladdr-offset または fcd-reladdr-big にアドレスを格納し、FCD の fcd-config-flags にビット 6 を設定すると、特定のアドレスのレコードを削除できます。

次に DELETE 操作を実行します。

ユーザ独自のファイルハンドラの作成

独自のカスタマイズされたファイルハンドラを作成して、COBOL システムで提供されているファイルハンドラの代わりに使用できます。

プログラムでファイルハンドラを使用して COBOL 入出力構文を処理するには、CALLFH コンパイラ指令を使用します。 たとえば、USERFH というファイルハンドラを使用する場合は、次のようなコンパイラ指令でプログラムをコンパイルします。

CALLFH"USERFH"

これにより、すべての COBOL 入出力操作が USERFH の呼び出しにコンパイルされます。

注:CBL_EXIT_PROC を使用する場合は、ファイルハンドラを呼び出しているアプリケーションの終了時に、ファイルハンドラが適切にシャットダウンされるように、優先順位を 200 に設定する必要があります。

新しい索引ファイルの作成

特殊操作コードを使用すると、次のように、既存の索引ファイルのデータファイル部から索引ファイルを再作成できます。

  1. CREATE INDEX FILE (特殊操作コード x"07") を使用して、新しい索引ファイルを作成します。
  2. GET NEXT RECORD (特殊操作コード x"08") を使用して、データファイルから各レコードを読み取ります。
  3. レコードの各キーの値については、ADD KEY VALUE (特殊操作コード x"09") を使用して索引ファイルにキー値を追加します。

次の例では、既存のデータファイルから新しい索引ファイルを作成する方法を示しています。

 78 close-file                  value x"fa80"
 78 open-new-index              value x"0007".
 78 get-next-rec                value x"0008".
 78 add-key-value               value x"0009".
   ...
     move open-new-index to fh-opcode
     perform extfh-op
     move get-next-rec to fh-opcode
     perform extfh-op
     perform until fcd-status (1:1) not = "0"
         perform varying fcd-key-id from 0 by 1
                   until fcd-key-id = key-count
                      or fcd-status (1:1) not = "0"
             move add-key-value to fh-opcode
             perform extfh-op
         end-perform
         move get-next-rec to fh-opcode
         perform extfh-op
     end-perform
     move close-file to fh-opcode
     perform extfh-op
     ...
 extfh-op.
     call "EXTFH" using fh-opcode, fcd
     if fcd-status of fcd (1:1) = "1"
         move 1 to return-code
     end-if.

圧縮ルーチン

ユーザ独自のアプリケーションで、ファイルハンドラがデータとキーを圧縮するために使用する圧縮ルーチンを呼び出すことができます。 詳細については、『データとキーの圧縮』の章の『圧縮ルーチン』の項を参照してください。

ソートモジュール

ソートモジュールは、データファイルのソートとマージを可能にするスタンドアロンのソートモジュールです。 このモジュールは、COBOL プログラムで SORT 文または MERGE 文を使用すると、暗黙的に呼び出されます。

データファイルに SORT 操作を実行すると、重複キーをもつレコードは、SORT 文で DUPLICATES IN ORDER 指定をしたかどうかにかかわらず、元の順番で返されます。

呼び出し可能ソートモジュールを明示的に呼び出してファイルのソートやマージを行うには、プログラムに次の呼び出し文を記述します。

call "EXTSM" using function-code, sort-fcd
        

パラメータの内容は、次のとおりです。

パラメータ 説明 
function-code 実行する操作の種類を示す 2 バイトのコード。詳細については、ヘルプトピック  『呼び出し可能ソートモジュールの機能コード』を参照してください。
sort-fcd プログラムのデータ部で指定したソートファイル制御記述 (Sort FCD) の名前。 FCD には、ファイルのレコード領域、ファイル名、文字の大小順序、キー定義ブロック、およびファイル定義ブロックへのポインタを記述します。 プログラムのデータ部で、SORT 操作に必要な各ファイルに対して Sort FCD を指定する必要があります。詳細については、ヘルプトピック  『ソートファイル制御記述』を参照してください。

Sort FCD の機能コードの詳細なリストと詳細な記述を含む詳細情報については、ヘルプトピック  『呼び出し可能ソートモジュール』を参照してください。

関連情報
はじめに
ファイル編成
ファイル名
ファイル状態
ファイルの共有
ファイルハンドラの構成
データとキーの圧縮
ファイル操作のトレース