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

NECオフコン関連
オフコン一般
情報
トップ  >  制御変数

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)
COBOLプログラムでJRCODEを使用するには、特殊レジスタ:COMPLETION-CODEを使う。
COMPLETION-CODEに入れた値がJRCODEとして使用されます。
20行目のように特殊レジスタ:COMPLETION-CODEに値を入れれば良い。

TJR1
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.


JRCODEの値を受けて画面に表示するCOBOLプログラム(TJR2)。
18行目でCOMPLETION-CODEの値をDATA1にコピーして、次の19行目で画面に表示しています。

TJR2
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.


上の2つのプログラムを利用したサンプルのJS(JTEST1)。
1行目でJRCODEに100を入れて、2行目のTJR02でJRCODEの値を画面に表示。(100と表示されるはず。)
5行目のTJR01でJRCODEを入れて、7行目のTJR02でJRCODEの値を画面に表示。

JTEST1
/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の数値情報をファイルを介さずに受け渡すことができます。


ちなみに同一スレッドであればジョブ制御変数は引き継がれるので、以下のようにRUN文の先もジョブ制御変数の値は引き継がれます。

JTEST2
/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プログラム
センススイッチを使うときには、7〜8行目のように特殊名段落を使います。状態の確認には、21〜25行目のようにします。

TSSW1
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.


センススイッチ1番の状態を変更するCOBOLプログラム。
0を入力するとOFFになり、1から9を入力するとONになるというプログラムです。
23行目、25行目のSETでセンススイッチの状態を変更しています。

TSSW2
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.


下のJSはCOBOLプログラムTSSW1の動きを確認するためのものです。
1行目でSSW1をONにしているので、2行目のTSSW1では画面上にONと表示されます。6行目でSSW1をOFFにしているので、7行目のTSSW1では画面上にOFFと表示します。
11行目のTSSW2でセンススイッチ1番の状態を変更して、13行目のTSSW1で結果を表示しています。

JTEST4
*
/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 ;  


全センススイッチの状態を表示するCOBOLプログラム
COBOLプログラム:TSSW1はセンススイッチ1番だけを表示していましたが、全部表示するようにしたのが下のTSSW2です。そのまま8回同じ処理を書き加えただけです。

TSSW3
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.


TSSW3を利用してセンススイッチの変化を確認するJS

JTEST5
/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 ;