ここでは、プログラムでファイル ハンドラーとソート モジュールを明示的に呼び出す方法を説明します。
ファイル ハンドラーを呼び出すと、ファイルを開いたり、レコードを読み取ったりするといった一般的なアクションを効率的で一貫性のある方法で実行できます。
次の構文を使用すると、プログラムで呼び出し可能ファイル ハンドラーを明示的に呼び出せます。
call "EXTFH" using opcode fcd
パラメーターの内容は、次のとおりです。
パラメーター | 説明 |
---|---|
"EXTFH" | ファイル ハンドラーインターフェイスのモジュール名です。 |
opcode | ファイル ハンドラーの操作コードです。後述の『操作コード』の項を参照してください。 |
fcd | ファイル ハンドラーがアクセスするファイルの詳細を保持する FCD (ファイル制御記述) と呼ばれるデータ領域です。後述の『データ構造体』の項を参照してください。 |
最初の呼び出しの前に、次の手順を行う必要があります。
その後で、各ファイル ハンドラー操作に対して次の手順を行います。
ファイル ハンドラーでは、ファイルの入出力操作中に次の 4 つのデータ構造体を使用します。
データ構造体 | 説明 |
---|---|
ファイル制御記述 (FCD) | 100 バイトのデータ領域で、使用中のファイルに関する情報が記述されます。 |
レコード領域 | レコード領域は、レコードの読み取りや書き出しを行うデータ領域です。 |
ファイル名領域 | ファイル名領域は、使用中のファイルの名前を記述するデータ領域で、オペレーティング システムにより認識されます。 |
キー定義ブロック | ファイル ハンドラーが索引ファイルでの操作中に索引キー情報を記述します。 |
ファイル制御記述 (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 コンパイラ指令を使用すると、数値の型に従ってキーを順序付けることができます (デフォルトでは、キーは英数字順に並びます)。
構成要素定義領域の詳細なレイアウトについては、ヘルプトピック 『構成要素定義領域』を参照してください。
プログラムで通常の 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 (順) 操作を行っている場合に、次の手順を使用すると、現在のレコードの最初の副キーにより読み取りを開始できます。
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 に設定する必要があります。
特殊操作コードを使用すると、次のように、既存の索引ファイルのデータファイル部から索引ファイルを再作成できます。
次の例では、既存のデータファイルから新しい索引ファイルを作成する方法を示しています。
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 の機能コードの詳細なリストと詳細な記述を含む詳細情報については、ヘルプトピック 『呼び出し可能ソート モジュール』を参照してください。