ファイル入出力処理
TSOユーザーとの対話操作に必要な端末との入出力機能に加え、コマンドやプログラムの反復実行に必要となるのがファイルの入出力機能です。
CLISTにおけるファイル入出力機能では、順次データセット、区分データセットのメンバー(1つの順次データセットとなる)、ファイルとして割り振られている端末がサポートされます。
区分データセットのメンバー内容の読み取り
データセットからの読み込みは、GETFILEステートメントで行うことができます。
ファイルのアクセスの前後にデータセットをOPEN、CLOSEすることはCLISTでも同じです。それぞれOPENFILE、CLOSFILEステートメントを使用します。
1 2 3 4 5 6 7 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 ALLOC DD(WRKUT1) DA('MY.JCL(JCL20)') SHR ①データセットの割り当て OPENFILE WRKUT1 INPUT ②データセットのオープン GETFILE WRKUT1 ③1レコードを読み込む GETFILE WRKUT1 (次のレコードを読み込む) CLOSFILE WRKUT1 ④データセットのクローズ FREE DD(WRKUT1) ⑤データセットの割り当て解除 |
最初にデータセットをOPENしますが、それに先立ちOPENするデータセットを割り当てます。これはJCLのDDステートメントに相当します。使用するデータセットが決まっていて、またどのユーザーでも共通に使われるのであれば、TSOのログオン・プロシージャーにDDステートメントを追加しますが、作業のために一時的に使用するデータセットや処理の内容や結果によってアクセスするデータセットが決まるようような場合は、事前にアクセスするデータセットを定義できません。このような場合は、TSOのALLOCATEコマンドを使い実行時に必要なデータセットを割り当てます。これは動的割り振り(ダイナミック・アロケーション)と呼ばれます。
OPENFILEステートメントでデータセットをOPENします。最初のパラメーターはOPENするファイルのDD名、次のパラメーターはOPENの種類です。読み込みの場合はINPUT、書き込みの場合はOUTPUT、更新の場合はUPDATEとなります。
GETFILEステートメントによってファイル(データセット)からレコードを読み取ります。1回のGETFILEで1レコード(1論理レコード)が読み取られて、レコードの内容はDD名と同じ名前の変数に格納されます。DD名がWRKUT1であれば、変数名&WRKUT1が自動的に作成され、そこにレコード内容が格納されます。GETFILEを発行する毎に次のレコードが読み取られます。必要なレコードを読み取って処理が終了したら、CLOSFILEステートメントでデータセットをCLOSEします。
EOF(End Of File)の処理
読み込み処理においてEOFとなった場合、CLISTではエラールーチンによってそれを知ることができます。最後のレコードを読み込んだ後にGETFILEステートメントが発行されると、EOF状態となりエラールーチンが実行されます。エラールーチンはERRORステートメントで定義します。EOF状態はエラーコード400で、変数LASTCCに設定されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 ERROR + ①エラールーチンの定義 DO WHILE &LASTCC = 400 SET &EOF = ON RETURN END ALLOC DD(WRKUT1) DA('MY.JCL(JCL20)') SHR OPENFILE WRKUT1 INPUT READ: + GETFILE WRKUT1 IF &EOF EQ ON THEN GOTO EOF ②EOFかどうかを判定 : レコードを読んだ後の処理を行う : GOTO READ EOF: + ③EOFになった後の処理 CLOSFILE WRKUT1 FREE DD(WRKUT1) |
CLISTの冒頭にERRORステートメントでエラールーチンを定義しています。CLIST内でエラーが発生すると、ここに定義したステートメントが実行されます。サンプルではエラーコードが400なら変数EOFにONを設定して復帰しています。
メインプロシージャーの中でGETFILEステートメントの後に、変数EOFがONになっているかを判定しています。ONになっていたらラベルEOFへジャンプしてEOFの処理を行います。
順次データセットへの書き込み
データセットへの書き込みは、PUTFILEステートメントで行うことができます。先頭から上書きする場合はOUTPUT、既存のレコードを更新する場合はUPDATEを指定したOPENFILEステートメントでデータセットをOPENします。
1 2 3 4 5 6 7 8 9 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 SET &DDNAME = WRKUT2 ①DD名の設定 ALLOC DD(&DDNAME) NEW SPACE(1 1) TRACKS + ②一時的データセットの割り振り BLKSIZE(0) LRECL(120) RECFM(F B) OPENFILE &DDNAME OUTPUT ③データセットのオープン SET &&DDNAME = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ④レコード内容の設定 PUTFILE &DDNAME ⑤次のレコードとして書き込み CLOSFILE &DDNAME FREE DD(&DDNAME) |
一時的データセットを割り振り、CLISTでの作業内容を書き込む例です。書き込みの場合は、PUTFILE発行前に、DD名と同じ名前の変数にレコードの内容を格納します。変数内のデータの長さが、レコード長に満たない場合は空白が埋まります。逆にレコード長の方が短い場合は、レコード長に合わせてデータが切り捨てられます。
サンプル:PDSメンバー内容の表示
端末入出力機能とファイル入出力機能を使用したサンプルとして、区分データセットのメンバー内容を画面に表示するCLISTを示します。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8 /* /* SAMPLE CLIST: /* DISPLAY PDS DATASET MEMBER. /* PROC 0 CONTROL NOMSG FREE DD(SYSUT1) FREE DD(SYSUT2) CONTROL MSG END(ENDO) WRITENR PLEASE ENTER JCL DATASET NAME ==> READ &DSN SET &NULL = MAIN: + WRITENR PLEASE ENTER MEMBER NAME ==> READ &MEM IF &MEM = &NULL THEN EXIT ERROR + DO WHILE &LASTCC = 400 SET &EOF = ON RETURN ENDO ALLOC DD(SYSUT1) DA('&DSN(&MEM)') SHR ALLOC DD(SYSUT2) DA(*) OPENFILE SYSUT1 INPUT OPENFILE SYSUT2 OUTPUT SET &EOF = OFF DO WHILE &EOF = OFF GETFILE SYSUT1 IF &EOF = OFF THEN DO SET &SYSUT2 = &SYSUT1 PUTFILE SYSUT2 ENDO ENDO CLOSFILE SYSUT1 CLOSFILE SYSUT2 FREE DD(SYSUT1) FREE DD(SYSUT2) GOTO MAIN |