A−VXのジョブ制御言語(JCL)
- 6 制御変数
-
制御変数とは、先行するプログラムでセットされた値を後続のプログラムに受け渡し、ジョブの実行条件、制御条件を後のプログラムに与えるものです。以下の2種類のものがあります。
- ジョブ制御変数(JRCODE)
- センススイッチ
なお、ジョブ制御変数、センススイッチ共にジョブステップが強制終了された時は、値は入りません。従って必要に応じて流れ制御文(/: ABORT、/: NORMAL)によって強制終了されたかどうか確認する必要があります。
- ★ジョブ制御変数(JRCODE)
各スレッドごとに1個存在し、プログラム中やJS中の/SET文で値を設定することができます。この値は、(COBOL)プログラム中で参照したり、JS中でJSの処理の流れを制御するのに利用することができます。
使用例:
JRCODEは0から255までの値を取ることができます。スレッド開始時に0にリセットされ、スレッド終了時に値は廃棄されます。
PRG01、PRG02は正常だとJRCODEに0を入れ、エラーが発生した場合は0以外の値を入れて終了するプログラムです。/RUN PRG01,FIL=TESTLML,DEV=MSD000; /> ; /: JRCODE GE 1 JUMP=ERMSG; /SET JRCODE=0; /RUN PRG02,FIL=TESTLML,DEV=MSD000; /> ; /: JRCODE EQ 0 ENDJOB; ERMSG/PAUSE ERROR;
3行目の流れ制御文(/:)でJRCODEが1以上の値なら8行目にジャンプして「ERROR」と表示します。
4行目でJRCODEに0をセットしています。
7行目でJRCODEが0ならジョブを終了します。
- ★センススイッチ
-
センススイッチは各スレッドごとに8個存在し、プログラム中やJS中の/SET文で状態を変更することができます。この状態は(COBOL)プログラム中で参照したり、JS中でJSの処理の流れを制御するのに利用することができます。
使用例:
センススイッチはONとOFFの状態を取ることができます。スレッド開始時に全てのセンススイッチはOFFの状態にクリアされます。/RUN PRG01,FIL=USERJSL2,SSW1=ON; /> ; /: ALL=1100XXXX JUMP=AAA; /SET ALL=0000000; /RUN PRG02,FIL=USERJSL2; /> ; AAA/RUN PRG03,ALL=00000000; /> ;
1行目のRUN文ではセンススイッチ1番をONにしてからPRG01を実行しています。
3行目の流れ制御文(:/)でセンススイッチの1番、2番、3番、4番がそれぞれON、ON、OFF、OFFの状態ならば、PRG02を実行せずに7行目にジャンプします。
4行目で、全センススイッチをOFFにします。
7行目のRUN文では、全センススイッチをOFFにしてからPRG03を実行しています。
- 具体的な例
-
この文章を書くためのテスト用に幾つかCOBOLプログラムを作ってみました。
せっかく作ったのでサンプルとして公開します。
- (1)JRCODE
JRCODEを入力してプログラム終了時にJSに値を引き渡すCOBOLプログラム(TJR1)
TJR1
COBOLプログラムでJRCODEを使用するには、特殊レジスタ:COMPLETION-CODEを使う。
COMPLETION-CODEに入れた値がJRCODEとして使用されます。
20行目のように特殊レジスタ:COMPLETION-CODEに値を入れれば良い。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TJR01. 000030** 000040 ENVIRONMENT DIVISION. 000050** 000060 DATA DIVISION. 000070 WORKING-STORAGE SECTION. 000080 01 DATA1 PIC 9(3). 000090 SCREEN SECTION. 000100 SD GAMEN 000110 END STATUS IS ENDSTS. 000120 01 TEST1-ACT. 000130 05 LINE 5. 000140 10 COLUMN 15 PIC 9(3) INTO DATA1. 000150 PROCEDURE DIVISION. 000160 MPRG. 000170** 手入力 000180 ACCEPT TEST1-ACT. 000190** 000200 MOVE DATA1 TO COMPLETION-CODE. 000210 STOP RUN.
TJR2
JRCODEの値を受けて画面に表示するCOBOLプログラム(TJR2)。
18行目でCOMPLETION-CODEの値をDATA1にコピーして、次の19行目で画面に表示しています。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TJR02. 000030** 000040 ENVIRONMENT DIVISION. 000050** 000060 DATA DIVISION. 000070 WORKING-STORAGE SECTION. 000080 01 DATA1 PIC 9(3) VALUE 999. 000090 SCREEN SECTION. 000100 SD GAMEN 000110 END STATUS IS ENDSTS. 000120 01 TEST-KAKU. 000130 05 LINE 22. 000140 10 COLUMN 40 PIC 9(3) FROM DATA1. 000150 PROCEDURE DIVISION. 000160 MPRG. 000170** 000180 MOVE COMPLETION-CODE TO DATA1. 000190 DISPLAY TEST-KAKU. 000200 STOP RUN.
JTEST1
上の2つのプログラムを利用したサンプルのJS(JTEST1)。
1行目でJRCODEに100を入れて、2行目のTJR02でJRCODEの値を画面に表示。(100と表示されるはず。)
5行目のTJR01でJRCODEを入れて、7行目のTJR02でJRCODEの値を画面に表示。/SET JRCODE=100; ・・・JRCODEに100を入力 /RUN TJR02,FIL=TESTAPLML; ・・・JRCODEの値(100)を画面に表示 /> ; /PAUSE ; /RUN TJR01,FIL=TESTAPLML; ・・・JRCODEをキーボードから入力 /> ; /RUN TJR02,FIL=TESTAPLML; ・・・TJR01で入力したJECODEの値を画面に表示 /> ; /PAUSE ;
この例を見ればわかるように、COBOLプログラム間で0〜255の数値情報をファイルを介さずに受け渡すことができます。
JTEST2
ちなみに同一スレッドであればジョブ制御変数は引き継がれるので、以下のようにRUN文の先もジョブ制御変数の値は引き継がれます。/SET JRCODE=100; ・・・JRCODEに100を入力 /RUN JTEST3; ・・・ジョブストリームJTEST3を実行する /> ; /RUN TJR02; ・・・JRCODEの値(200)を画面に表示 /> ; JTEST2で入れた値が引き継がれる /PAUSE ;
JTEST3/RUN TJR02; ・・・JRCODEの値(100)を画面に表示 /> ; JTEST2で入れた値が引き継がれる /SET JRCODE=200; ・・・JRCODEに200を入力
- (2)センススイッチ
-
センススイッチ1番の状態を表示するCOBOLプログラム
TSSW1
センススイッチを使うときには、7〜8行目のように特殊名段落を使います。状態の確認には、21〜25行目のようにします。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TSSW1. 000030** 000040 ENVIRONMENT DIVISION. 000050** 000060 CONFIGURATION SECTION. 000070 SPECIAL-NAMES. 000080 SWITCH-1 IS TSTSW1 ON STATUS IS SW1ON. 000090 DATA DIVISION. 000100 WORKING-STORAGE SECTION. 000110 01 DATA1 PIC X(3) VALUE SPACE. 000120 SCREEN SECTION. 000130 SD GAMEN 000140 END STATUS IS ENDSTS. 000150 01 TEST1-DSP. 000160 05 LINE 10. 000170 10 COLUMN 10 PIC X(4) VALUE "SW01". 000180 10 COLUMN 20 PIC X(3) USING DATA1. 000190 PROCEDURE DIVISION. 000200 MPRG. 000210 IF SW1ON 000220 THEN 000230 MOVE "ON" TO DATA1 000240 ELSE 000250 MOVE "OFF" TO DATA1. 000260 DISPLAY TEST1-DSP. 000270 STOP RUN.
TSSW2
センススイッチ1番の状態を変更するCOBOLプログラム。
0を入力するとOFFになり、1から9を入力するとONになるというプログラムです。
23行目、25行目のSETでセンススイッチの状態を変更しています。
000010 IDENTIFICATION DIVISION. 000020 PROGRAM-ID. TSSW2. 000030** 000040 ENVIRONMENT DIVISION. 000050** 000060 CONFIGURATION SECTION. 000070 SPECIAL-NAMES. 000080 SWITCH-1 IS TSTSW1 ON STATUS IS SW1ON. 000090 DATA DIVISION. 000100 WORKING-STORAGE SECTION. 000110 01 DATA1 PIC 9(1) VALUE ZERO. 000120 SCREEN SECTION. 000130 SD GAMEN 000140 END STATUS IS ENDSTS. 000150 01 TEST1-ACT. 000160 05 LINE 10. 000170 10 COLUMN 20 PIC 9(1) INTO DATA1. 000180 PROCEDURE DIVISION. 000190 MPRG. 000200 ACCEPT TEST1-ACT. 000210 IF DATA1 = 0 000220 THEN 000230 SET TSTSW1 TO OFF 000240 ELSE 000250 SET TSTSW1 TO ON. 000260 STOP RUN.
JTEST4
下のJSはCOBOLプログラムTSSW1の動きを確認するためのものです。
1行目でSSW1をONにしているので、2行目のTSSW1では画面上にONと表示されます。6行目でSSW1をOFFにしているので、7行目のTSSW1では画面上にOFFと表示します。
11行目のTSSW2でセンススイッチ1番の状態を変更して、13行目のTSSW1で結果を表示しています。* /SET SSW1=ON; /RUN TSSW1,FIL=TESTAPLML; /> ; /PAUSE ; * /SET SSW1=OFF; /RUN TSSW1,FIL=TESTAPLML; /> ; /PAUSE ; * /RUN TSSW2,FIL=TESTAPLML; /> ; /RUN TSSW1,FIL=TESTAPLML; /> ; /PAUSE ;
TSSW3
全センススイッチの状態を表示するCOBOLプログラム
COBOLプログラム:TSSW1はセンススイッチ1番だけを表示していましたが、全部表示するようにしたのが下のTSSW2です。そのまま8回同じ処理を書き加えただけです。
000010 IDENTIFICATION DIVISION. 000020************************************** 000030** TEST ** 000040************************************** 000050 PROGRAM-ID. TSSW3. 000060** 000070 ENVIRONMENT DIVISION. 000080** 000090 CONFIGURATION SECTION. 000100 SPECIAL-NAMES. 000110 SWITCH-1 IS TSTSW1 ON STATUS IS SW1ON 000120 SWITCH-2 IS TSTSW2 ON STATUS IS SW2ON 000130 SWITCH-3 IS TSTSW3 ON STATUS IS SW3ON 000140 SWITCH-4 IS TSTSW4 ON STATUS IS SW4ON 000150 SWITCH-5 IS TSTSW5 OFF STATUS IS SW5OFF 000160 SWITCH-6 IS TSTSW6 OFF STATUS IS SW6OFF 000170 SWITCH-7 IS TSTSW7 OFF STATUS IS SW7OFF 000180 SWITCH-8 IS TSTSW8 OFF STATUS IS SW8OFF. 000190************************************** 000200 DATA DIVISION. 000210 WORKING-STORAGE SECTION. 000220 01 DATA1 PIC X(3) VALUE SPACE. 000230 01 DATA2 PIC X(3) VALUE SPACE. 000240 01 DATA3 PIC X(3) VALUE SPACE. 000250 01 DATA4 PIC X(3) VALUE SPACE. 000260 01 DATA5 PIC X(3) VALUE SPACE. 000270 01 DATA6 PIC X(3) VALUE SPACE. 000280 01 DATA7 PIC X(3) VALUE SPACE. 000290 01 DATA8 PIC X(3) VALUE SPACE. 000300 SCREEN SECTION. 000310 SD GAMEN 000320 END STATUS IS ENDSTS. 000330 01 TEST1-DSP. 000340 05 LINE 10. 000350 10 COLUMN 10 PIC X(4) VALUE "SW01". 000360 10 COLUMN 20 PIC X(3) USING DATA1. 000370 05 LINE 11. 000380 10 COLUMN 10 PIC X(4) VALUE "SW02". 000390 10 COLUMN 20 PIC X(3) USING DATA2. 000400 05 LINE 12. 000410 10 COLUMN 10 PIC X(4) VALUE "SW03". 000420 10 COLUMN 20 PIC X(3) USING DATA3. 000430 05 LINE 13. 000440 10 COLUMN 10 PIC X(4) VALUE "SW04". 000450 10 COLUMN 20 PIC X(3) USING DATA4. 000460 05 LINE 14. 000470 10 COLUMN 10 PIC X(4) VALUE "SW05". 000480 10 COLUMN 20 PIC X(3) USING DATA5. 000490 05 LINE 15. 000500 10 COLUMN 10 PIC X(4) VALUE "SW06". 000510 10 COLUMN 20 PIC X(3) USING DATA6. 000520 05 LINE 16. 000530 10 COLUMN 10 PIC X(4) VALUE "SW07". 000540 10 COLUMN 20 PIC X(3) USING DATA7. 000550 05 LINE 17. 000560 10 COLUMN 10 PIC X(4) VALUE "SW08". 000570 10 COLUMN 20 PIC X(3) USING DATA8. 000580 PROCEDURE DIVISION. 000590 MPRG. 000600 IF SW1ON 000610 THEN 000620 MOVE "ON" TO DATA1 000630 ELSE 000640 MOVE "OFF" TO DATA1. 000650 IF SW2ON 000660 THEN 000670 MOVE "ON" TO DATA2 000680 ELSE 000690 MOVE "OFF" TO DATA2. 000700 IF SW3ON 000710 THEN 000720 MOVE "ON" TO DATA3 000730 ELSE 000740 MOVE "OFF" TO DATA3. 000750 IF SW4ON 000760 THEN 000770 MOVE "ON" TO DATA4 000780 ELSE 000790 MOVE "OFF" TO DATA4. 000800 IF SW5OFF 000810 THEN 000820 MOVE "OFF" TO DATA5 000830 ELSE 000840 MOVE "ON" TO DATA5. 000850 IF SW6OFF 000860 THEN 000870 MOVE "OFF" TO DATA6 000880 ELSE 000890 MOVE "ON" TO DATA6. 000900 IF SW7OFF 000910 THEN 000920 MOVE "OFF" TO DATA7 000930 ELSE 000940 MOVE "ON" TO DATA7. 000950 IF SW8OFF 000960 THEN 000970 MOVE "OFF" TO DATA8 000980 ELSE 000990 MOVE "ON" TO DATA8. 001000 DISPLAY TEST1-DSP. 001010 STOP RUN.
JTEST5
TSSW3を利用してセンススイッチの変化を確認するJS
/RUN TSSW3,FIL=TESTAPLML; /> ; /PAUSE ; * /SET ALL=01010101; /RUN TSSW3,FIL=TESTAPLML; /> ; /PAUSE ; * /SET ALLSSW=11111111; /RUN TSSW3,FIL=TESTAPLML; /> ; /PAUSE ; * /SET ALLSSW=XXXX0000; /RUN TSSW3,FIL=TESTAPLML; /> ; /PAUSE ;