Google
オフコン練習帳内を検索
インターネット全体を検索

NECオフコン関連
オフコン一般
情報
トップ  >  COBOL実行環境指定機能

COBOL実行環境指定機能

COBOL実行環境指定機能とは?

COBOL実行環境指定機能は、A-VXのCOBOL85やCOBOL74独自の機能です。富士通やマイクロフォーカスのCOBOLはもちろん、NECの他の種類(Windows用とか)のCOBOLにもありません。

特徴は、下の例のように「見出し部(IDNTIFICATION DIVISION)より前に、注記行の形で書く」ことです。

000000*\CBLENV;
000000*\FILE FILET,DEV=MSD,BUSY=STATUS;
000000*\END;
000000 IDNTIFICATION DIVISION.
000000 PROGRAM-ID.     TPRG.

NECの「COBOL85プログラミング手引書」には次のように書いてあります。

COBOL実行環境指定機能は、システムに依存したファイル管理機能を、COBOL原始プログラム中に記述するためのものです。通常、COBOLでは記述ができず、したがって扱うことのできない機能を利用することができるようになります。

ファイルに関する細かい動きを指定するための機能です。結構いろいろな指定ができますが、磁気テープなど今では使わないものもたくさんあります。ここでは、よく使われていると思われるものを2,3紹介します。
それ以外についてや、それぞれの詳細については、とても書ききれないのでNECのマニュアル「COBOL85プログラミング手引書」や「データ管理説明書」「リレーショナル型データベース説明書」を参照してください。

COBOL実行環境指定の記述方法

次のような決まりがあります。

  • 見出し部(IDNTIFICATION DIVISION)より前に書く。
  • 実行環境指定機能の記述の前や記述中には、注記行(コメント行)を書くことはできない。
  • 標識領域(7桁目)に必ず”*”を書き、8〜72桁目に記述する。
  • 1つの記述が1行に入りきらない場合は、複数行にわたって記述できる。このときは、1つのパラメータの途中で改行してはいけない。
  • 空白は許された位置だけにしか入れてはいけない。
  • 実行環境指定で許されたファイル編成以外のファイルに対して指定した場合、そのプログラムの動作は保証されない。

*\CBLENV; 8桁から”\CBLENV;”を書き、COBOL実行環境指定の始まりを示します。
*\FILE 内部ファイル名,パラメータ [,パラメータ]・・・; ファイルに関する指定では、8桁目から”\FILE”を書き、次にパラメータを記述します。このパラメータは”,”で区切り、終わりは”;”を記述します。この記述は、複数行にわたって書くことができます。
*\\END; 8桁目から”\END”を書き、COBOL実行環境指定の終わりを示します。

ファイルビジー時の動作を変更する

COBOL実行環境指定機能の中でよく使われるのが、ファイルビジー(ファイル使用中)が発生したときのプログラムの動きに関するものです。
A-VXのCOBOLで作ったプログラムは、一般的にファイルビジーが発生するとビジーが解除されるまで待ち合わせます。これをファイルビジーが発生すると待ち合わせずにファイルステータスを返すように変更することができます。

オープンされるまで待ち続けては困る、ビジーならビジーでステータスを返してくれれば、そこで別の処理をするよ、ということもありますよね。

NECの説明書から関連する部分のみ抽出して引用します。同じファイルステータス”91”を返すものとして、LOCKパラメータも書いておきました。

●RDBファイルの記述方法
¥FILE 内部ファイル名,DEV[,LOCK={ WAIT | STATUS }]
[,BUSY={MESSAGE | STATUS }];

●磁気ディスクファイルの記述方法
¥FILE 内部ファイル名,DEV[,LOCK={ WAIT | STATUS }]
[,BUSY={MESSAGE | STATUS }];

LOCK= WAIT ファイルが共用されている場合、START命令で位置付けようとするレコードまたはREAD命令で読み込もうとするレコードが他のプログラムからロックされているときは、ロックが解除されるまで待つ。
STATUS ファイルが共用されている場合、START命令で位置付けようとするレコードまたはREADで読み込もうとするレコードが他のプログラムからロックされているときはファイルステータスとして”91”を設定する。
BUSY= MESSAGE ファイルのオープンでファイルビジーになったとき、メッセージを表示し、ビジーが解除されるまで待ち状態とする。
STATUS ファイルのオープンでファイルビジーとなったとき、ファイルステータスとして”91”を設定する。

例えば以下のように書きます。

000000*\CBLENV;
000000*\FILE FILE1,DEV=MSD,BUSY=STATUS;
000000*\FILE FILE2,DEV=MSD,BUSY=MESSAGE;
000000*\END;
000000 IDNTIFICATION DIVISION.
000000 PROGRAM-ID.     TPRG.
   :
000000 INPUT-OUTPUT   SECTION.
000000 FILE-CONTROL.
000000     SELECT FILETST1 ASSIGN  FILE1-MSD
000000                     ORGANIZATION RELATIVE
000000                     ACCESS MODE RANDOM
000000                     RELATIVE KEY KEY-1
000000                     FILE STATUS FILE-STS.
000000     SELECT FILETST2 ASSIGN  FILE2-MSD
   :
   : 

同じプログラム内でファイルごとに指定を変えることができます。例えばファイルAはMESSAGEで、ファイルBとファイルCはSTATUSでといった具合にです。
さらに同じファイルでも、プログラムごとに指定を変えることもできます。例えばプログラムXではファイルAをMESSAGEにして、プログラムYでは同じファイルAをSTATUSにするというようにです。
ただ複雑にすると何か問題が発生したときにわけがわからなくなりやすいです。

一時ファイルを使用する

ジョブ内で一時ファイルを使うときに、指定します。
COBOL85では一時ファイルはシステムサブルーチンのCBLETMPF、CBLETMPDで作成/削除するので、主にCOBOL74で使用することが多いです。
COBOL74では「TYPE=TEMP」、COBOL85では「TYPE=EXTEMP」になります。

●磁気ディスクファイルの記述方法
COBOL74
¥FILE 内部ファイル名,DEV[,TYPE=TEMP(nnnn,mmmm)]
[,DUP= { YES | NO }];

COBOL85
¥FILE 内部ファイル名,DEV[,TYPE=EXTEMP(nnnnnn,mmmmmm)]
[,DUP= { YES | NO }];

TYPE= (COBOL74記述)
TEMP(nnnn,mmmm)
(COBOL85記述)
EXTEMP(nnnnnn,mmmmmm)
副レコードキーを持つ索引ファイル以外のファイルを一時ファイルとして確保することを指定する。nnnnで一時ファイルの大きさ(セクタ)を、mmmmで一時ファイルの拡張エクステントの大きさ(セクタ)を指定する。 ただし、(副レコードキーを持たない)索引ファイルのときmmmmを指定しても無意味である。
(COBOL85記述)ファイル領域不足の場合、OPEN命令実行時にファイルステータスとして”96”が返却される。
(COBOL85記述)(nnnnnn,mmmmmm)を省略した場合は、一時ファイル宣言システムサブルーチン(CBLTMPF)で使用できるファイルであることを示す。
DUP= YES TYPE=を指定したとき、そのファイルが索引ファイルであるとき同一のキーの存在を許す。
NO TYPE=を指定したとき、そのファイルが索引ファイルであるとき同一のキーの存在を許さない。

例えば以下のように書きます。

000000*\CBLENV;
000000*\FILE TMP1,DEV=MSD,TYPE=TEMP(1000,1000);
000000*\FILE TMP2,DEV=MSD,TYPE=TEMP(1000,1000),DUP=YES;
000000*\END;
000000 IDNTIFICATION DIVISION.
000000 PROGRAM-ID.     TPRG.
   :
000000     SELECT     TMP1  ASSIGN TO TMP1-MSD.
   : 

一時ファイルは、オープンでファイルが作成され、ジョブ(正確にはスレッド)を実行している間は存在し続けて、ジョブ(スレッド)が終了すると自動的に削除されます。

プリンタの改ページ制御

物理ページモードのときのファイルクローズ時の改ページ動作を変更することができます。

●プリンタファイルの記述方法
\FILE 内部ファイル名,DEV=PRN[,SKIP={ YES | NO }];

SKIP= YES LINAGEが指定されていないプリンタファイル(物理ページモード)のとき、ファイルのクローズ時改ページする。
NO LINAGEが指定されていないプリンタファイル(物理ページモード)のとき、ファイルのクローズ時改ページする。

プリンタに関しては、他に改行間隔を変更するもの、プリンタ直接スプールファイルがファイル未発見となった場合の動作、プリンタファイルのオープンでファイルビジーになった場合のパラメータがあります。

削除レコードの読み込み

順ファイルや相対ファイルで削除レコードを読み込むことができます。

A-VXはDELETE命令でレコードを削除しても本当に削除するのではなく、レコードの先頭2バイトを16進数のFFを書き込むことによって削除レコードにしています。READ命令でレコードを読み込むときには、レコードの先頭1バイトがFFのレコードは飛ばして読み込んでいきます。
COBOL実行環境指定機能を使うとREAD命令はレコード先頭がFFであろうとなかろうと無視して読み込んでいくようにすることができます。

DELETE命令で削除したレコードも、削除直後は2バイト目以降のデータはそのまま残っているので、うっかり削除したデータを救い出すことができる可能性があります。

●磁気ディスクファイルの記述方法
\FILE 内部ファイル名,DEV=MSD[,DEL={ SKIP | ACCEPT }];

DEL= SKIP 順ファイルまたは相対ファイルのとき削除レコード(レコードの先頭がFF)は読み込みの対象としない。(通常のアクセス)
ACCEPT 順ファイルまたは相対ファイルのとき削除レコードも読み込みの対象とする。

例えば以下のように書きます。

000000*\CBLENV;
000000*\FILE FILE1,DEV=MSD,TYPE=ACCEPT;
000000*\END;
000000 IDNTIFICATION DIVISION.
000000 PROGRAM-ID.     TPRG.
   :
000000     SELECT   FILE1  ASSIGN TO FILE1-MSD.
   :