07.CLIST入門⑦

ファイル入出力処理

TSOユーザーとの対話操作に必要な端末との入出力機能に加え、コマンドやプログラムの反復実行に必要となるのがファイルの入出力機能です。
CLISTにおけるファイル入出力機能では、順次データセット、区分データセットのメンバー(1つの順次データセットとなる)、ファイルとして割り振られている端末がサポートされます。

区分データセットのメンバー内容の読み取り

データセットからの読み込みは、GETFILEステートメントで行うことができます。
ファイルのアクセスの前後にデータセットをOPEN、CLOSEすることはCLISTでも同じです。それぞれOPENFILE、CLOSFILEステートメントを使用します。

最初にデータセットを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に設定されます。

CLISTの冒頭にERRORステートメントでエラールーチンを定義しています。CLIST内でエラーが発生すると、ここに定義したステートメントが実行されます。サンプルではエラーコードが400なら変数EOFにONを設定して復帰しています。
メインプロシージャーの中でGETFILEステートメントの後に、変数EOFがONになっているかを判定しています。ONになっていたらラベルEOFへジャンプしてEOFの処理を行います。

順次データセットへの書き込み

データセットへの書き込みは、PUTFILEステートメントで行うことができます。先頭から上書きする場合はOUTPUT、既存のレコードを更新する場合はUPDATEを指定したOPENFILEステートメントでデータセットをOPENします。

一時的データセットを割り振り、CLISTでの作業内容を書き込む例です。書き込みの場合は、PUTFILE発行前に、DD名と同じ名前の変数にレコードの内容を格納します。変数内のデータの長さが、レコード長に満たない場合は空白が埋まります。逆にレコード長の方が短い場合は、レコード長に合わせてデータが切り捨てられます。

サンプル:PDSメンバー内容の表示

端末入出力機能とファイル入出力機能を使用したサンプルとして、区分データセットのメンバー内容を画面に表示するCLISTを示します。