第 7 章 ファイルハンドラとソートのAPI

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

7.1.1 概要

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

call "EXTFH" using opcode fcd

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

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

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

  1. ファイル制御記述 (FCD)、レコード領域、ファイル名領域、キー定義ブロック (索引ファイルの場合) にデータ領域を割り当てます。

  2. ファイルハンドラが無効な値を受け取らないように、すべてのデータ領域をバイナリのゼロに初期化します。

  3. FCD に次の領域へのポインタを設定します。

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

  1. 選択したオペレーションコードに対応する FCD のフィールドに入力を行います。

  2. ファイルハンドラを呼び出します。

  3. ファイル状態を確認して、ファイルの入出力操作が正常に行われたかどうかを判断します。

  4. FCD フィールドやレコード領域のデータを処理します。

7.1.2 データ構造体

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

7.1.2.1 ファイル制御記述 (FCD)

ファイル制御記述 (FCD) は、使用中のファイルに関する情報を記述するデータ領域です。Server Express 2.0 では、FCD の形式が FCD2 から FCD3 に変更されました。64 ビットのコンパイルでは、FCD3 形式のみを使用できます。32 ビットのコンパイルでは、FCD2 および FCD3 の両方の形式を使用できます。

コピー ファイル、 XFHFCD.CPY は、プログラムが P64 指令でコンパイルされている場合に FCD3 レコードを定義します。プログラムが P64 指令でコンパイルされていない場合は、XFHFCD.CPY は FCD2 レコードを定義します。FCD3 レコードは、ファイル、 xfhfcd3.cpy で直接、無条件に定義されます。また、 FCD2 レコードは、ファイル、 xfhfcd2.cpy で直接、無条件に定義されます。

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

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

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

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

FCD に含まれているフィールドを次の表に示します。フラグについては、該当のビットが有効な場合について説明しています。ビット 7 が MSB (左端) です。未使用のビットは将来使用するために予約されています。

フィールド名 タイプ フィールドの説明
fcd-file-status
ユーザファイルの状態。このフィールドは、COMMIT または ROLLBACK 操作以外のすべての操作の後に、操作の状態を通知する標準のファイル状態値で更新されます。『fcd-access-mode』および『fcd-status-type』も参照してください。
fcd-status-key-1 pic x
fcd-status-key-2 pic x
fcd-length pic xx comp-x FCD の長さ。FCD3 の場合のみ。
fcd-version pic x comp-x バージョン番号
説明
0 FCD2
1 FCD3
fcd-organization pic x comp-x ファイルの編成
説明
0 行順
1
2 索引
3 相対
fcd-access-mode pic x comp-x ユーザ状態インジケータとアクセスモードインジケータ。

ユーザ状態は、ビット 7 で示されます。ビット 7 は、ファイル状態を定義した場合に設定されます。ファイル状態を定義すると、一部の操作 (RETRYLOCK など) の実行方法に影響する場合があります。このビットは、ファイルハンドラを直接呼び出す場合に設定する必要があります。ただし、ファイル状態は、fcd-file-status から直接取得します。

アクセスモードは、次に示すビット 6~0 で示されます。

説明
0 順アクセスモード
4 ランダムアクセスモード
8 動的アクセスモード
fcd-open-mode pic x comp-x オープンモード
説明
0 入力用のオープン
1 出力用のオープン
2 入力および出力用のオープン
3 EXTEND
128 ファイルの終了

ファイルを開く前にこのフィールドを 128 に設定する必要があります。

fcd-recording-mode pic x comp-x レコードモード
説明
0 固定
1 可変
fcd-file-format pic x comp-x ファイル形式
説明
0 デフォルト形式
1 C-ISAM 形式
3 IDXFORMAT"3" 形式
4 IDXFORMAT"4" 形式
8 IDXFORMAT"8" 形式
11 メインフレーム印刷形式
14 ヒープファイル
15 ESDS ファイル
fcd-device-flag pic x comp-x デバイスフラグ
説明
0 標準
1 デバイス
2 標準入力
3 標準出力
4 標準エラー
5 無効な名前
6 入力パイプ
7 出力パイプ
8 入出力パイプ
9 ライブラリ
10 ディスクファイル
11 ヌル
12 ディスクリダイレクト
13 マップなし
fcd-lock-action pic x comp-x 予約済みフィールド
fcd-data-compress pic x comp-x データ圧縮ルーチンインジケータ
説明
0 圧縮なし
1~127 Micro Focus データ圧縮ルーチン番号 (1=CBLDC001)
128~255 ユーザ定義データ圧縮ルーチン番号 (128=USRDC128)
fcd-blocking pic x comp-x 次の値で示される NODESIZE (バイト数)
説明
0 システムにより決定されるノードの長さ
1 512
2 1024
4 4096
6 16384
fcd-idxcache-size pic x comp-x キャッシュされたメモリに格納されている索引ノードの数。4~64 の数値を指定する必要があります。0 に設定すると、デフォルトの 16 が使用されます。
fcd-percent pic x comp-x パーセントインジケータ
fcd-block-size pic x comp-x データレコードのブロックサイズ (バイト数)
説明
0 ブロックなし
12 4096
13 8192
14 16384
15 32768
16 65536

索引ファイルと相対ファイルについては、ゼロ以外の値を設定するとパフォーマンスが低下する場合があります。

fcd-flags-1 pic x comp-x
ビット 7 メインフレーム互換性ビット。このビットを設定すると、ファイル特性を、プログラムで指定したファイル特性と一致させる必要がなくなります。
ビット 5 READ および START 操作によって、レコード領域にはキーのみが返されます。
ビット 1 TRACE=ON
ビット 0 プログラムには、このファイルの宣言が含まれます。
fcd-flags-2 pic x comp-x
ビット 0 CONVERTDBSPACE=ON
fcd-mvs-flags pic x comp-x メインフレームエミュレーションフラグ
ビット 2 ファイルは暗黙ファイル (ACCEPT または DISPLAY) になります。
ビット 1 Amode = 31 ビット
ビット 0 Amode = 24 ビット
fcd-status-type pic x comp-x 状態の種類
ビット 7 ON = ANSI 85 COBOL、OFF = ANSI 74 COBOL
ビット 6 SPACEFILL=OFF
ビット 5 STRIPSPACE=OFF
ビット 4 EXPANDTAB=OFF
ビット 3 LSRECDELIM=0A
ビット 2 INSERTTAB=ON
ビット 1 INSERTNULL=ON

ビット 1 と 2 は、オープン時にファイルハンドラによって設定されるかまたは設定解除されます。これは、N および T ランタイムシステムスイッチの設定によって決まります。これらのビットは、OPEN 操作の後に設定または設定解除して、N および T ランタイムシステムスイッチをオーバーライドすることができます。

fcd-other-flags pic x comp-x
ビット 7 OPTIONAL ファイル (OPEN INPUT)
ビット 6 IGNORELOCK=ON
ビット 5 OPTIONAL 以外 (OPEN I/O および EXTEND)
ビット 4 ファイル名は EXTERNAL になります。
ビット 2 NODETECTLOCK 指令の有効化
ビット 1 複数のリールファイル (レコード順)
ビット 0 行送りファイル (レコード順)
fcd-trans-log pic x comp-x
ビット 7 OPENINPUTSHARED=ON
ビット 5 READSEMA=OFF
ビット 4 EXPANDPOSITIONING=ON
ビット 1 FASTREAD=OFF
ビット 0 SUPPRESSADV=ON
fcd-locktypes pic x comp-x
ビット 7 言語間ロック (LOCKTYPE 1 または 2)
ビット 6 SHARING WITH READ ONLY
ビット 5 個別のロック ファイル (LOCKTYPE 2)
ビット 4 RUNITLOCKDETECT=OFF
ビット 3 NFS ファイルのロックを使用します。
ビット 2 HP 互換で NFS ファイルロックを使用します。
fcd-fs-flags pic x comp-x Fileshare フラグ
ビット 7 トランザクション ログ処理
fcd-config-flags pic x comp-x
ビット 7 WRITETHRU
ビット 6 相対バイトアドレスを使用します。
ビット 5 現在のレコードを更新します。
ビット 4 FCD2 の場合、相対バイトアドレスの場合は、 fcd-reladdr-offset ではなく fcd-reladdr-big を使用します。
ビット 1 呼び出し状態変換ルーチン
ビット 0 IGNORELOCK が必要な場合は設定
fcd-misc-flags pic x comp-x
ビット 7 HOSTFD オプション (オープン時に割り当てるレコード領域)
ビット 1 EXTERNAL 構文で定義されたファイル
ビット 0 ロックでクローズされたファイル
fcd-config-flags2 pic x comp-x
ビット 7 EBCDIC 文字の大小順序を使用します。
ビット 6 ファイルに WRITE AFTER ADVANCING を指定する場合は設定します。
ビット 5 ファイルに WRITE BEFORE ADVANCING を指定する場合は設定します。
ビット 4 指定された ADV
ビット 3 可変長ファイルでの最小長チェックを無視します。
fcd-lock-mode pic x comp-x 共有可能なファイル用のロックモードフラグ
ビット 7 複数レコードに対するロック
ビット 6 WRITELOCK 指令の有効化
ビット 5 RETRYOPEN=ON
ビット 4 SKIPLOCK =ON
ビット 3 RETRYLOCK=ON
ビット 2 ロックモード MANUAL
ビット 1 ロックモード AUTOMATIC
ビット 0 ロックモード EXCLUSIVE
fcd-shr2 pic x comp-x その他のフラグ
ビット 1 RETRYTIME=ON
ビット 0 STARTUNLOCK=ON
fcd-nls-id pic xx comp-x NLS 識別子
fcd-fs-file-id pic xx comp-x 予約済みフィールド
fcd-retry-open-count pic xx comp-x RETRYOPEN 回数フィールド
fcd-name-length pic xx comp-x ファイル名の長さ
fcd-idxname-length pic xx comp-x 予約済みフィールド
fcd-retry-count pic xx comp-x 再試行回数 (RETRYLOCK がオンの場合に使用)
fcd-key-id pic xx comp-x 参照キー (索引ファイルの場合)。

このフィールドでは、ランダム READ 操作に使用する参照キーを識別します。主キーを指定するには、このフィールドをゼロに設定します。例えば、最初に定義された副キーを指定するには、値 1 を使用します。2 番目に定義された副キーを指定するには、値 2 を使用します。

fcd-line-count pic xx comp-x 行数 (順ファイルの場合)。

このフィールドでは、ファイルの書込み時にスキップする行の数を指定します。例えば、次のようになります。

WRITE AFTER ADVANCING line-count LINES
fcd-use-give pic xx comp-x 予約済みフィールド
fcd-key-length pic xx comp-x 有効なキーの長さ。

索引ファイルで START 操作を使用している場合は、キー全体ではなく、キーの先頭部分のみを指定できます。このフィールドは、比較で使用するバイト数に設定する必要があります。このフィールドには、ゼロよりも大きく、使用中のキーよりも小さい値を指定する必要があります。

fcd-current-rec-len FCD3: pic x(4) comp-x 現在のレコードの長さ (バイト数)
FCD2: pic x(2) comp-x
fcd-min-rec-length pic x(4) comp-x 最小レコード長 (バイト数)
fcd-max-rec-length pic x(4) comp-x 最大レコード長 (バイト数)
fcd-session-id pic x(4) comp-x 予約済みフィールド
fcd-reladdr-offset FCD3: pic x(8) comp-x 相対バイトアドレス (『fcd-config-flags、ビット 4』も参照)。このフィールドの値は、OPEN 文の後には定義されません。
FCD2: pic x(4) comp-x
fcd-reladdr-big pic x(8) comp-x 8 バイトの相対バイトアドレス。FCD2 の場合は、個別フィールドになります。FCD3 の場合は、fcd-reladdr-offset を再定義します。FCD2 と FCD3 の間の互換性のために指定します。
fcd-max-rel-key pic x(8) comp-x 最大相対キー
fcd-relative-key pic x(8) comp-x 相対キー
fcd-handle pointer ファイルハンドル
fcd-record-address pointer レコード領域へのポインタ
fcd-filename-address pointer ファイル名領域へのポインタ
fcd-idxname-address pointer 予約済みフィールド
fcd-key-def-address pointer キー定義ブロックへのポインタ
fcd-col-seq-address pointer 文字の大小順序へのポインタ (何も指定されていない場合はヌル)
fcd-fildef-address pointer 予約済みフィールド
fcd-dfsort-address pointer 予約済みフィールド

7.1.2.2 レコード領域

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

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

次の例は、FCD にレコード領域へのポインタを設定する方法を示しています。

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

7.1.2.3 ファイル名領域

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

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

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

次の例は、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
   ...

7.1.2.4 キー定義ブロック

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

7.1.2.4.1 グローバル情報領域

グローバル情報領域には、キー定義領域のサイズとファイルに含むキーの数を記述します。

未使用の領域や予約済みの領域はバイナリのゼロに初期化する必要があります。

オフセット サイズ フィールドの説明
0 2 キー定義ブロックの長さ
2 4 予約済みフィールド。バイナリのゼロに設定する必要があります。
6 2 キー数
8 6 予約済みフィールド。バイナリのゼロに設定する必要があります。
7.1.2.4.2 キー定義領域

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

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

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

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

次に、キー定義領域のレイアウトを示します。未使用の領域や予約済みの領域はすべてバイナリゼロに初期化する必要があります。

オフセット サイズ フィールドの説明
0 2 構成要素数。

通常のキーの場合、構成要素数は 1 になります。分割キーの場合、構成要素数は分割キーに含まれる構成要素の数になります。

2 2 このキーの最初の構成要素定義領域に対するオフセット。

このオフセットは、グローバル情報領域の開始位置の相対位置になり、0 から開始します。

4 1 キーフラグ
ビット 7 予約済みフィールド。バイナリのゼロに設定する必要があります。
ビット 6 許可される重複
ビット 5 予約済みフィールド。バイナリのゼロに設定する必要があります。
ビット 4 主キーであることを示す場合に設定します。どのキーにも設定しない場合は、ファイルハンドラで最初のキーが主キーとなされます。
ビット 3~2 予約済みフィールド。バイナリのゼロに設定する必要があります。
ビット 1 スパースキー。オフセット、 6 を参照してください。
ビット 0 予約済みフィールド。バイナリのゼロに設定する必要があります。
5 1 圧縮フラグ
ビット 7~4 予約済みフィールド。バイナリのゼロに設定する必要があります。
ビット 3 後続ヌルの圧縮
ビット 2 後続空白の圧縮
ビット 1 先行文字の圧縮
ビット 0 重複の圧縮
6 1 スパース文字。

キーフラグのビット 1 (オフセット 4) を設定すると、この文字で全体が構成されているキーは削除されます。

7 9 予約済みフィールド。バイナリゼロに設定する必要があります。
7.1.2.4.3 構成要素定義領域

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

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

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

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

構成要素定義領域のレイアウトを次に示します。未使用の領域や予約済みの領域はバイナリゼロに初期化する必要があります。

オフセット サイズ 説明
0 1 ビット 7 (x"80") は、順番に返される重複を示します。
ビット 6 (x"40") は DESCENDING キー構成要素を示します。
1 1

ビット 7 (x"80") はこのフィールドが NUMERIC であることを示します。

ビット 7 を設定すると (数値) 、次のようになります。

ビット 6 (x"40") は、フィールドが SIGNED NUMERIC であることを示します。
ビット 5 (x"20") は、フィールドが非表示フィールドであることを示します。
ビット 5 を設定すると (非表示フィールド)、ビット 0 および 1 は次のように使用されます。
0 - フィールドがバイナリ BINARY であることを示します。
1 - フィールドが PACKED-DECIMAL であることを示します。
2 - フィールドが COMP-X 形式であることを示します。
3 - フィールドが COMP-5 形式であることを示します。
ビット 2 (値 x"04") は浮動小数点を示します。

ビット 5 を設定せずに (DISPLAY フィールド) ビット 6 を設定 (SIGNED) を設定する場合は、ビット 0 と 1 は次のように使用されます。

0 - SIGN TRAILING INCLUDED を示します。
1 - SIGN TRAILING SEPARATE を示します。
2 - SIGN LEADING INCLUDED を示します。
3 - SIGN LEADING SEPARATE を示します。
先行文字の圧縮
重複の圧縮
2 4 レコード内の構成要素のオフセット (0 から開始)
6 4 構成要素の長さ (バイト数)

7.1.3 FCD へのアクセス

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

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

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

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

fcd プログラムの連絡節に記述する FCD 定義の名前。
fh--fcd (ハイフンが 2 つ必要です。) ファイルにアクセスするために、この COBOL システムで使用する FCD。
file ファイルの FD 名。

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

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

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

次に、FCD へのアクセス例を示します。

FCD へのアクセス例

次のプログラムでは、ファイルのキー定義ブロックで適切なビットを設定して、ファイルのキー圧縮を有効化します。

$set fcdreg
     select masterfile 
         assign to ... 
         organization is indexed 
         record key is rec-key 
         alternate key is m-alt-key-1 with duplicates 
         alternate key is m-alt-key-2 
         alternate key is m-alt-key-3 with duplicates. 
     select indexfile 
         assign to ... 
         organization is indexed 
         record key is rec-key 
         alternate key is t-alt-key-1 with duplicates. 
   ... 
 working-storage section. 
   ... 
 linkage section. 
 01 key-def-block. 
    03 filler pic x(6). 
    03 key-count pic 9(4) comp-x. 
    03 filler pic x(6). 
    03 key-def occurs 1 to 4 times depending on key-count. 
       05 filler pic x(5). 
       05 key-compression pic 9(2) comp-x. 
       05 filler pic x(10). 
  ... 
 procedure division. 
     set address of key-def-block 
                      to address of fh--keydef of masterfile
     move 6 to key-compression (1) 
     move 7 to key-compression (2) 
     move 6 to key-compression (3) 
     move 7 to key-compression (4) 
     open I-O masterfile 
  ... 
     set address of key-def-block 
                       to address of fh--keydef of indexfile
     move 4 to key-compression (1) 
     move 1 to key-compression (2) 
     open input indexfile

7.1.4 オペレーションコード

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

オペレーションコードには、標準と特殊の 2 種類があります。

7.1.4.1 標準オペレーションコード

標準オペレーションコードでは、MSBに x"FA" が格納されます。LSB は、特定の操作を示します。

オペレーションコードの中には、特定のファイル編成でのみ有効なものがあります。各オペレーションコードの説明では、次のキーを使用して、対応するファイル編成のリストを示します。

L    行順
S    レコード順 (vS を含む)
R    相対 (vR を含む)
I    索引

vS    可変形式の順のみ

vR    可変形式の相対のみ


Close

必要に応じてオプションのリワインドおよびロックを使用し、ファイルおよびリールまたはユニットの処理を終了します。レコード順ファイルの場合は、「リール」および「ユニット」という用語を同じ意味で使用します。順ディスクファイルは、テープまたは似たような順メディアのファイルと同等に扱われます。

オペコード 操作 ファイルタイプ
80 CLOSE L S R I
81 CLOSE WITH LOCK L S R I
82 CLOSE WITH NO REWIND L S
84 CLOSE REEL/UNIT L S
85 CLOSE REEL/UNIT FOR REMOVAL L S
86 CLOSE REEL/UNIT WITH NO REWIND L S
入力フィールド

なし

出力フィールド
fcd-file-status ユーザファイルの状態


Commit

実行ユニットによって保持されているすべてのファイルのレコードロックをすべて解除します。

オペコード 操作 ファイルタイプ
DC COMMIT (すべてのファイルの UNLOCK) L S R I
入力フィールド

ファイルが使用する FCD が常に必要です。

出力フィールド

なし


Delete

レコードをディスクファイルから論理的に削除します。このコードは、相対または索引編成のファイルに対してのみ指定できます。

オペコード 操作 ファイルタイプ
F7 DELETE vS R I
入力フィールド
fcd-relative-key 相対レコード番号への順アクセス以外のアクセス (R)
fcd-record-address レコードポインタへの順アクセス以外のアクセス (I)
出力フィールド
fcd-file-status ユーザファイルの状態


Delete File

指定されたファイルを、そのファイルが常駐している物理デバイスから物理的に削除します。

オペコード 操作 ファイルタイプ
F8 DELETE FILE L S R I
入力フィールド

ファイル名領域

fcd-organization ファイル編成
fcd-name-length ファイル名の長さ
fcd-file-format ファイル形式
fcd-filename-address ファイル名領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態


Open

ファイルの処理を開始します。また、ラベルのチェックまたは書込み (およびその両方) およびその他の入出力操作も実行します。

オペコード 操作 ファイルタイプ
00 OPEN INPUT L S R I
01 OPEN OUTPUT L S R I
02 OPEN I-O L S R I
03 OPEN EXTEND L S R I
04 OPEN INPUT WITH NO REWIND L S
05 OPEN OUTPUT WITH NO REWIND L S
08 OPEN INPUT REVERSED L S
入力フィールド

ファイル名領域

キー定義ブロック (I)

fcd-organization ファイル編成
fcd-access-mode アクセスモード
fcd-open-mode オープンモード
fcd-name-length ファイル名の長さ
fcd-lock-mode ロックモードフラグ
fcd-other-flags その他のフラグ
fcd-file-format ファイル形式
fcd-max-rec-length 最大レコード長
fcd-recording-mode レコードモード
fcd-min-rec-length 最小レコード長
fcd-filename-address ファイル名領域へのポインタ
fcd-key-def-address キー定義ブロックへのポインタ (I)
fcd-data-compress データ圧縮
fcd-locktypes 言語間ロック
出力フィールド
fcd-file-status ユーザファイルの状態
fcd-open-mode オープンモード
fcd-handle このファイルに対するすべての順アクセスに対してこのファイルハンドルを使用します。

ファイルの複数回オープン

同じ物理ファイルにいくつかの FCD を割り当てて、それらのファイルを同時に開くことができます。オペレーティングシステムでは、これを 1 つの開かれたファイルとしてカウントします。物理ファイルは、その物理ファイルに割り当てたすべての論理ファイルが閉じてから、閉じます。


Read

順アクセスの場合は、READ によりファイルから次または前の論理レコードを利用できます。ランダムアクセスの場合は、READ によりディスクファイルから指定したレコードを利用できます。

オペコード 操作 ファイルタイプ
8D READ (順) WITH NO LOCK L S R I
D8 READ (順) WITH LOCK L S R I
D9 READ (順) WITH KEPT LOCK L S R I
F5 READ (順) L S R I
8C READ PREVIOUS WITH NO LOCK R I
DE READ PREVIOUS WITH LOCK R I
DF READ PREVIOUS WITH KEPT LOCK R I
F9 READ PREVIOUS R I
8E READ (ランダム) WITH NO LOCK R I
DA READ (ランダム) WITH LOCK R I
DB READ (ランダム) WITH KEPT LOCK R I
F6 READ (ランダム) R I
8F READ (直接) WITH NO LOCK L S R I
D6 READ (直接) WITH LOCK L S R I
D7 READ (直接) WITH KEPT LOCK L S R I
C9 READ (直接) L S R I
F1 READ (位置) L S R I
入力フィールド
fcd-relative-key READ がランダムまたは直接の場合の相対レコード数 (R)
fcd-key-id キー識別子 (I)
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態
fcd-current-rec-len 現在のレコード長
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 のみ) 相対バイトアドレス

Rollback

実行ユニットで保持されているすべてのファイルのレコードロックをすべて解除します。

オペコード 操作 ファイルタイプ
DD ROLLBACK (すべてのファイルを UNLOCK) L S R I
入力フィールド

なし

出力フィールド

なし


Start

レコードの順検索について、相対ファイルまたは索引ファイルの論理位置決めに対する基礎を提供します。

オペコード 操作 ファイルタイプ
E8 START 完全な長さの主キーと等価 R I
E9 START 任意のキーまたはレコード番号と等価 R I
EA START ~より大きい(>) R I
EB START 以上 (>=) R I
FE START 未満 (<) R I
FF START 以下 (<=) R I
入力フィールド
fcd-relative-key 相対レコード番号 (相対ファイル)
fcd-key-id キー識別子 (索引ファイル)
fcd-key-length 有効なキーの長さ (索引ファイル)
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態


Step

次の物理レコードへ進みます。この操作によって、レコードへのアクセスが大幅に高速化されます。

オペコード 操作 ファイルタイプ
90 STEP NEXT WITH NO LOCK L S R I
D4 STEP NEXT WITH LOCK L S R I
D5 STEP NEXT WITH KEPT LOCK L S R I
CA STEP NEXT L S R I
92 STEP FIRST WITH NO LOCK L S R I
D0 STEP FIRST WITH LOCK L S R I
D1 STEP FIRST WITH KEPT LOCK L S R I
CC STEP FIRST L S R I
入力フィールド
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態
コメント

STEP 操作は、相対ファイルまたは索引ファイルのレコードを順番に検索するための方法です。この操作では、キーまたは相対レコード番号を使用して読み取る必要はありません。通常、この方法を使用するとファイル内のデータへのアクセスが高速化されます。

STEP NEXT 操作によって、 (STEP または READ 操作により) ファイルで最後に検索されたレコードの次に物理的に格納されるレコードが返されます。

相対バイトアドレス指定を使用し、アクセスしたばかりのレコードに対して現在のレコードポインタが更新されるように指定している場合は、STEP 操作がこの新しい位置に対して実行されます。

相対バイトアドレスは、すべての STEP 操作で返されます。そのため、検索したばかりのレコードに対する現在のレコードポインタを更新する必要がある場合は、返されたアドレスを使用して READ (直接) 操作を実行します。


注: 現在のレコードポインタは、STEP 操作に影響されません。


Unlock

指定したファイルに対し実行ユニットで保持されているすべてのレコードロックを解除します。

オペコード 操作 ファイルタイプ
0E UNLOCK L S R I
入力フィールド

なし

出力フィールド
fcd-file-status ユーザファイルの状態

Write

新しいレコードをファイルへ書き込みます。

順ファイルの場合は、論理ページの垂直行の位置決めにも使用できます。

REWRITE 操作は既存のレコードを置き換えます。

オペコード 操作 ファイルタイプ
E1 WRITE BEFORE L S
E2 WRITE AFTER L S
E3 WRITE BEFORE TAB L S
E4 WRITE AFTER TAB L S
E5 WRITE BEFORE PAGE L S
E6 WRITE AFTER PAGE L S
EC WRITE BEFORE mnemonic-name S
ED WRITE AFTER mnemonic-name S
F3 WRITE L S R I
F4 REWRITE L S R I
入力フィールド
fcd-relative-key 相対レコード番号 (R)
fcd-current-rec-len 現在のレコード長
fcd-line-count 行数 (WRITE のみ) (S)
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 のみ) 相対バイトアドレス

7.1.4.2 特殊オペレーションコード

特殊オペレーション コードでは、MSB に x"00" が格納されます。LSB は、特殊操作を示します。


File Information

すべてのファイル編成について一般的なファイル情報を返し、索引ファイルについてファイルキーに関する情報をキー定義ブロックの形式で返します。

オペコード 操作 ファイルタイプ
06 Return file information I vS vR
入力フィールド
fcd-organization ファイル編成 (x"FF" を指定可能)
fcd-name-length ファイル名の長さ
fcd-filename-address ファイル名領域へのポインタ
fcd-key-def-address キー定義ブロックへのポインタ (I)
出力フィールド

キー定義ブロック (I)

fcd-file-status ユーザファイルの状態
fcd-organization ファイル編成
fcd-file-format ファイル形式
fcd-max-rec-length 最大レコード長
fcd-recording-mode レコードモード
fcd-min-rec-length 最小レコード長
fcd-file-status ファイルサイズ
fcd-data-compress データ圧縮ルーチン

返されるすべての情報を格納するためには、キー定義ブロックに十分な領域を割り当てる必要があります。十分な領域が割り当てられていないと、一部のデータ領域が破壊されます。

可変長の順ファイルおよび可変長の相対ファイルの場合は、キー定義情報が存在しません。

FCD の編成バイトを x"FF" に設定すると、ファイルタイプが判断されて、その関連情報セットが返されます。固定長の順ファイルが関連する場合は、このモードの操作は使用しないことをお奨めします。このモードでは、固定長の順ファイルの最初のレコードと可変長の順ファイルのヘッダーの違いを識別できません。ファイルタイプが非互換と判断されると、エラーコード 9/161 が返されます。


Create Index File

ファイルに新しい索引を追加するためのヘッダー情報のみを含む新しい .idx ファイルを作成します。

オペコード 操作 ファイルタイプ

07

Open new index

I

入力フィールド

As OPEN

出力フィールド

As OPEN


Get Next Record

索引ファイルのデータファイル部分から次の物理レコードを取得します。

オペコード 操作 ファイルタイプ

08

Get next record

I

入力フィールド
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態
fcd-current-rec-len 現在のレコード長
fcd-reladdr-offset or fcd-rel-addr-big (FCD2 only) 相対バイトアドレス

Add Key Value

索引ファイルの索引ファイル部分にキー値を追加します。

オペコード 操作 ファイルタイプ

09

Add key value

I

入力フィールド
fcd-key-id キー識別子
fcd-record-address レコード領域へのポインタ
出力フィールド
fcd-file-status ユーザファイルの状態

Re-index File

提供されたキー定義ブロックを使用してファイルの索引を再作成します。

オペコード 操作 ファイルタイプ

0B

Re-index file

I

入力フィールド
fcd-key-def-address キー定義ブロックへのポインタ
出力フィールド

なし


Flush File

特定のファイルのすべてのデータをディスクに書き出します。

オペコード 操作 ファイルタイプ

0C

Flush file

L S R I

入力フィールド

なし

出力フィールド

なし


Unlock Record

ファイル内の特定のレコードをロック解除します。

オペコード 操作 ファイルタイプ

0F

Unlock record

I

入力フィールド
fcd-record-address レコード領域へのポインタ
出力フィールド

なし

7.1.5 相対バイトアドレス指定

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

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

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

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

7.1.5.1 レコードの読み取り

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

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

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

  1. ファイルの次のレコードを読み取ります (このレコードのアドレスは、FCD の相対バイトアドレスフィールドで指定します)。

  2. FCD の fcd-key-id に新しい参照キーを入力します。

  3. READ (直接) 操作を実行して、このアドレスのレコードを返します。参照キーが新しいキーに変更されます。

  4. ファイルの次のレコードを読み取ります。このレコードは、新しい参照キーの索引にある次のレコードです。

7.1.5.2 レコードの再書き込み

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

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

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

7.1.5.3 レコードの削除

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

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

7.1.6 カスタムファイルハンドラの作成

ユーザ独自のカスタマイズされたファイルハンドラを作成し、そのファイルハンドラを Server Express が提供するファイルハンドラの代わりに使用できます。また、相対ファイルなどの特定のタイプのファイルを処理するファイルハンドラを作成することもできます。

7.1.6.1 カスタムファイルハンドラの使用

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

CALLFH"USERFH"

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


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


7.1.6.2 ファイルタイプに固有のカスタムファイルハンドラの使用

特定のファイルタイプ用にカスタムファイルハンドラを作成し、デフォルトのファイルハンドラの代わりに使用することができます。

各ファイル編成タイプに対するデフォルトのファイルハンドラとレコード形式は次のとおりです。

ファイルタイプ
デフォルトのファイルハンドラ
固定長レコード
可変長レコード
行順 lsfile lsfilev
sqfile sqfilev
索引 ixfile ixfilev
相対 rlfile rlfilev

ここに示すデフォルトのファイルハンドラの代わりにアプリケーションにリンクさせるファイルハンドラは、この章で説明する呼び出しインターフェイスの形式に従っている必要があります。

カスタムファイルハンドラをアプリケーションにリンクさせるには、cob コマンド行に -m オプションを含める必要があります。このオプションの詳細については、『Server Express ユーザガイド』の『cob フラグの説明』の章を参照してください。

例えば、固定長の順ファイルの処理をカスタムファイルハンドラ (myseqfh) にリダイレクトする場合は、次のコマンド行を使用します。

cob -x -msqfile=myseqfh myapp.cbl myseqfh.o

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

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

  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.

7.1.8 圧縮ルーチン

ファイルハンドラがデータを圧縮するために使用する圧縮ルーチンは、スタンドアロンモジュールです。そのため、次のように使用することができます。

Micro Focus の圧縮ルーチンとユーザ独自の圧縮ルーチンは、どちらも最大 127 個まで使用できます。

7.1.8.1 Micro Focus 圧縮ルーチン

Micro Focus の圧縮ルーチンは CBLDCnnn というモジュールに格納されています。nnn は 001~127 の数字のいずれかです。

Micro Focus の圧縮ルーチンを使用するには、FCD の fcd-data compress を 001~127 のいずれかの値に設定します。

7.1.8.1.1 CBLDC001

Micro Focus の圧縮ルーチン CBLDC001 では、ランレングスエンコーディング (RLC) 形式を使用します。RLC は、同じ文字の文字列 (実行) を検出し、その文字列を文字の識別子、カウントまたは 1 つのオカレンスとして減らす圧縮方法です。


注: 2 バイト文字 (2 バイトの空白文字を含む) は圧縮されないため、このルーチンは 2 バイト文字のオカレンスを格納するファイルでは無効です。


CBLDC001 は、特に空白文字、バイナリのゼロと文字のゼロ (1 文字に減らすことができる)、印刷可能文字 (カウント数とその後に続く反復文字の計 2 文字に減らすことができる) に対して実行することを目的としています。

圧縮ファイルのバイトは、次のような意味を持っています (16 進値が示されます)。

20-7F ほとんどの印刷可能な文字です。通常の ASCII 文字です。
80-9F それぞれ 1~32 文字までの空白文字。
A0-BF それぞれ 1~32 文字までのバイナリのゼロ。
C0-DF それぞれ 1~32 文字までの文字のゼロ。
E0-FF 後に続く文字の 1~32 回までのオカレンス数。
00-1F 後に続く文字の 1~32 回までのオカレンス数。圧縮コードとしてではなく、文字どおり解釈します。元のデータに 00-1F、80-9F、A0-BF、C0-DF、E0-FF のいずれかの範囲の文字が存在するときに使用されます。(このような文字の 1 文字は 2 バイトに拡張されます。それ以外は、圧縮により発生する弊害はありません。)
7.1.8.1.2 CBLDC003

CBLDC001 と同様、このルーチンではランレングスエンコーディング (RLC) を使用しますが、1 バイトと 2 バイトの文字列 (実行) を検出します。このルーチンは DBCS 文字に適していますが、CBLDC001 の代わりに使用することもできます。

圧縮形式は、ヘッダーバイト 2 個の後に 1 つまたは複数の文字が続きます。ヘッダーバイトのビットの内容は次のとおりです。

ビット 15 設定解除 - 1 文字
ビット 14 設定 - 圧縮シーケンス
設定解除 - 非圧縮シーケンス
ビット 0~13 圧縮した文字、または圧縮しない文字のカウント

文字列の長さはヘッダーのビットによって異なります。

ビット 14 および 15 を設定した場合 2 つの反復文字
ビット 14 のみを設定した場合 1 つの反復文字
その他 1~63 文字までの非圧縮文字
7.1.8.1.3 Micro Focus の圧縮ルーチンの呼び出し

データ ファイルを圧縮する場合は、ファイルハンドラは DATACOMPRESS コンパイラ指令で指定する圧縮ルーチンを呼び出します。

データを圧縮するために圧縮ルーチンを使用する場合は、プログラムから直接呼び出すことができます。

        call "CBLDCnnn" using input-buffer,
			      input-buffer-size,
			      output-buffer,
			      output-buffer-size,
			      compression-type

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

nnn 001~127 までのデータ圧縮ルーチン。
input-buffer PIC X データ項目。圧縮または圧縮解除するデータ。最大サイズは 65,535 バイト。
input-buffer-size 2 バイトの (PIC XX COMP-5) データ項目。input-buffer のデータの長さを指定します。
output-buffer PIC X データ項目。結果データを格納するバッファ。
output-buffer-size 2 バイト (PIC XX COMP-5) のデータ項目。ルーチンを起動するときに、このデータ項目には使用可能な出力バッファのサイズが格納されます。ルーチンを終了するには、output-buffer のデータ長を格納します。
compression-type 1 バイトの (PIC X) データ項目。入力データを圧縮するか、圧縮解除するかを指定します。
0 - 圧縮
1 - 圧縮解除

RETURN-CODE 特殊レジスタは、操作が成功したかどうかを示します。圧縮または圧縮解除は、出力バッファが小さく結果を受け付けられない場合にのみ失敗します。

7.1.8.2 ユーザ独自の圧縮ルーチン

ユーザ独自の圧縮ルーチンは、USRDnnn というモジュールに格納します。nnn128~255 までの数字です。

圧縮ルーチンを作成する場合は、以下に注意する必要があります。

7.2 ソートモジュール

COBOL プログラムで、SORT または MERGE 動詞を使用する場合は、コンパイラがこれらの文を呼び出し可能ソートモジュール (Extsm) の呼び出しに自動で変換します。この章では、プログラムで呼び出し可能ソートモジュールを明示的に呼び出してソートを実行する方法を説明します。

呼び出し可能ソートモジュールを明示的に呼び出してファイルをソートまたはマージするには、次の呼び出し文をプログラムに挿入します:

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

この場合のパラメータは、次のようになります:

パラメタ 説明
function-code 実行する操作の種類を示す 2 バイトのコード。有効なコードの詳細は、C『ファンクションコード』の項を参照してください。
sort-fcd ソートファイル制御記述 (FCD)。これは、ファイルを記述するデータ部の領域です。この領域には、レコード領域、ファイル名、文字の大小順序、キー定義ブロックおよびファイル定義ブロックへのポインタを格納します。ソート FCD の詳細については、『ソートファイル制御記述』の項を参照してください。

ファンクションコード値の一覧、ソートFCDの詳細仕様を含む、より詳しい情報は、 呼び出し可能ソートモジュール を参照してください。


Copyright © 2006 Micro Focus (IP) Ltd. All rights reserved.