下記に示すようなJCLで示されるプログラム(PROG1)があったとして、PROG1をCOBOLで作る場合、DD * ステートメントで定義されたデータにどうやってアクセスすればいいのか?ということで検索されていたと考えます。
//STEP1 EXEC PGM=PROG1
//OUTLIST DD SYSOUT=*
//DATAIN DD *
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
//
順次データセットとしてアクセスする
SYSINであろうがSYSOUTであろうが、プログラムからは順次データセットに見えますから、順次ファイルにアクセスする手順でプログラムを書くことできます。実際、どこに(例えば、DASDやTAPE上のデータセットなのか、JESのスプールなのか)書き出される、どこから読み込まれるかは、JCLのDDステートメントに定義されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
IDENTIFICATION DIVISION. PROGRAM-ID. PROG1. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT OUTFILE ASSIGN TO OUTLIST. SELECT INFILE ASSIGN TO DATAIN. * DATA DIVISION. FILE SECTION. FD OUTFILE RECORDING MODE F BLOCK 0 RECORD 132. 01 OUTDATA. 03 OUTAREA PIC X(132). FD INFILE RECORDING MODE F BLOCK 0 RECORD 80. 01 INDATA PIC X(80). * PROCEDURE DIVISION. OPEN INPUT INFILE, OUTPUT OUTFILE. LOOP. READ INFILE AT END CLOSE OUTFILE, INFILE STOP RUN. WRITE OUTDATA FROM INDATA. GO TO LOOP. * END PROGRAM PROG1. |
ACCEPT、DISPLAY命令でアクセスする
DD名を言語が定めたものに合わせることができるなら、もっと簡単方法もあります。入力データのDD名を「SYSIN」にできるならACCEPT命令が使えます。この場合、プログラムでファイルをオープンしたりクローズする必要もありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
IDENTIFICATION DIVISION. PROGRAM-ID. PROG1. * ENVIRONMENT DIVISION. CONFIGURATION SECTION. INPUT-OUTPUT SECTION. * DATA DIVISION. WORKING-STORAGE SECTION. 01 INDATA PIC X(80). * PROCEDURE DIVISION. LOOP. MOVE '/*EOF*/' TO INDATA. デバイス側がEOF状態なら、 ACCEPT INDATA FROM SYSIN. INDATA領域の内容は変わらない。 IF INDATA = '/*EOF*/' THEN GO TO DONE. DISPLAY INDATA UPON SYSOUT. GO TO LOOP. * DONE. STOP RUN. * END PROGRAM PROG1. |
//STEP1 EXEC PGM=PROG1
//SYSIN DD *
ABCDEFGHIJKLMNOPQRSTUVWXYZ
1234567890
//
- 実行JCLの例
出力であれば、DISPLAY命令でSYSOUTに出力できます。SYSOUTへの出力の場合、JCLにSYSOUT DD文がなければ、OSのLE(言語環境プログラム)が、自動的にSYSOUTデータセットを割り振ります(z/OSの場合)。ACCEPTとDISPLAY命令による方法は簡単ですが、DD名は規定されてしまっています(SYSIN、SYSOUTなど、詳細はCOBOLのマニュアルを参照)。それ以外の名前のDD名にしたい場合(例えば、SYSINのDD名は別目的で使用してしまっている等)は、順次ファイルとして定義してアクセスします。