IBM Z マスターへの道③ ~JCL1~

[前回](https://qiita.com/trtrbohz/items/da8ae3f8332fd52dd46b)に引き続き、第３回 JCL1シナリオ を実施する。
このシナリオの学習目的は
・これまでJCLを扱ってきたがそれほど深く触れてきていなかった。この回でZ/OS環境下でなぜ重要なのかもう少し深く学習する。
・JCLはZ/OSの中核なので、課題を通してコンセプトと文法に慣れる。
![280.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/c3a5f63f-1c81-4908-1d67-d60b1fdc2892.png)

### 1. 課題にアクセス
まず、[Z xplore](https://ibmzxplore.influitive.com/forum/) にアクセスし、「FUNDAMENTALS」をクリック
 ![スクリーンショット 2022-06-06 12.06.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/d3b1ccc3-e8e3-ccc7-035f-73a91bf06df7.png)

### ２. シナリオPDF入手
３つ目のシナリオである「JCL1」が選択可能となっているのでクリックし、PDFをダウンロードしておく。

### ３．シナリオ JCL1-1  LOAD IT UP
「JCLSETUP」ファイルを"ZXP.PUBLIC.JCL"から探しだす。
このファイルはこのシナリオで利用するデータを作るといった単純なジョブ。
ファイルを見てみると、「&SYSUID」というメンバーがある。"SYSUID"と共に記述されているアンパサンドはシンボルとして知られており、システムが"&SYSUID"を!ユーザIDと置き換えるようになっている。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/62ddab5d-600e-af2e-c94b-427dffd0f190.png)

### ４．シナリオ JCL1-2  SUBMIT IT
上記で検索した「JCLSETUP」を右クリックして「Submit job」を実行。
![015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/08697785-9254-d616-9839-43954836316e.png)

“Job”について：JCLはシステムに何をしたいのか記述しているものであり、システムに伝えられるタスクはジョブ。これらのジョブの結果にアクセスし、処理し、管理できるz/OSのコンポーネントはJES(Job Entry Subsystem)である。
このJCL1に関して、先ほど「Submit job」したようにタスクを処理するためシステムにJESを投じる。

### ５．シナリオ JCL1-3  FILTER AND FIND IT
この段階で、VSCodeの左下に"JOBS"があり、拡大鏡アイコンをクリックして以下のような検索を実施することが可能。
・ユーザーIDを入力してジョブオーナーの結果検索
・＊(アスタリスク) を入力して接頭語検索
・ブランク検索でJobID検索
拡大鏡アイコンをクリックし、オーナーや接頭語を選ぶことで再建策可能。先ほどSubmitしたジョブも検索可能であり、次からそれを見ていく。

### ６．シナリオ JCL1-4  YOU GOT A ZERO.PERFECT!
VSCodeの左下にある"JOBS"の中で、先ほどSubmitした"JCLSETUP"の隣にある"＞"をクリック。他のジョブ結果もあるかもしれないが、ここではJCLSETUPに集中。一度Submitしていると、ジョブの右側に"CC 0000"がある。
また、JESMSGLGの中にも同様の数字を見つけれられる。CC (Condition Code) 0000　は全て期待通りのエラーなしを意味している。逆に、その他コード番号を得た場合は、調査し修正する箇所があることを示す。

### ７．シナリオ JCL1-5  JUMP RIGHT TO IT
JCL を Submit した後、小さなメッセージが VSCode の画面右下に現われることに気づくと思う。VSCodeの左下にある"JOBS"を見ていくよりも、このメッセージをクリックする方がより早く結果にアクセスすることが可能。
ジョブは開始直後の "ACTIVE" から開始し、ジョブの"＞"を再表示することでステータスを更新できる。

### ８．シナリオ JCL1-6  KICKING OFF SOME COBOL
ZXP.PUBLIC.JCL から JCL2 を自身の Zxxxxx.JCL データセットへコピーし、"＞"マークをクリックすることによりJCL データセットを再表示する。このJCLは COBOL コードをコンパイル、実行するために使われる。すなわち、コンパイルした後、このコードは LOAD data set 内に結果プログラムを出力する。
JCL の中で、データがどこから来て、どこへ行くのか記載しているステートメントは Data Definition Statement、または単に DD ステートメントと言われる。
![290.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/a6ed2b71-1f18-27ba-e4a4-3a40795ca12b.png)

JCL2 のファイルを見ると、18行目にインプットのデータセットが示されていて、19行目にアウトプットを出力することがわかる。
※ダウンロードしたドキュメントに記載された記述と、手元で実施しているファイルに差異があるので、ここでは実際に操作した内容に基づいて記載する。

さらにコードを見ていくと、リターンコード０(エラーなく、全て正常終了)の場合
プログラムを実行する。
これまでのところをおさらいすると、コードをコンパイルし実行するためにＪＣＬを使う。

### ９．シナリオ JCL1-7  RUN, CODE, RUN
COBOL コードをコンパイルした後、23行目を実行する。その際、インプットデータを25,26行目から得て、アプトを27行目で定義する。
例えば、DDステートメントの名前は"//"後の"FNAMES","LNAMES"である。![300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/61fd3212-f409-1236-fa60-1a18addcfb2a.png)

"//*"で始まる行はコメントであり、JESから無視される。が、コメント行はあとでコードを理解する情報を提供してくれる。

### １０． シナリオJCL1-8  THEY CAN'T ALL BE ZEROS
Zxxxxxx データセット内の JCL2 をサブミットし、７で示したように実行結果を見ると、ABEND(異常終了の短縮型)と示されているように上手くいっていない。
でも、大丈夫。
次のステップで、COBOLコードを見て、実際のCOBOL
COBOLコードとコンパイルするJCLコードをどのように比較するか理解する。
![090.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/578b9f7c-d2d2-9673-cf00-a475f2e9aa1c.png)

### １１．シナリオJCL1-9  COMPARE THE CODE
"//COBOL.SYSIN"で始まる行がコンパイル対象のCOBOLコードを示している。そこで、
そのコード(CBL001)を開いてみる。この CBL001 は"ZXP.PUBLIC.SOURCE" に存在している。
![300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/9f4a6412-ba3c-cfb0-5ef4-e7ebce4d0c1b.png)
CBL001 を開き、"FILE-CONTROL"を探す。
ここには、JCL の中で参照する変数名を示している。例えば、COBOLコードの中でFIRST-NAME が JCL コード内の DD ステートメントで FNAMES に割り当てられている。
この２つのコードを並べて開き、変更すべき箇所を確認する。
![310.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/cba8d8ba-f0ed-eb70-94ed-ac48b52b2846.png)
※変更すべき箇所は、JCL2 の 27行目。CBL001 では、"COMBINED"と定義されているのに JCL2 では"COMBINE"となっている。そこで、JCL2にある"COMBINE"を"COMBINED"に修正。
その後、JCL2 を Submit すると、CC=0 が得られ正常終了を確かめられる。
![150.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/acac34af-d7af-436a-a0ba-e4671b745302.png)

### １２．シナリオJCL1-10  ALL ABOARD
ZXP.PUBLIC.JCL から JCL3 を自身の Zxxxxx.JCL データセットへコピーし、"＞"マークをクリックすることによりJCL データセットを再表示する。すると、この JCL コードには、シーケンシャルデータセットへ入力を指示する IEBGENER を持つコードもあることが分かる。
ヘッダーから、ニューヨークのポキプシー駅とグランドセントラル駅の間の情報であり、テキストで運行時間が記載されている。
![320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/448fbe3b-52f7-b870-da87-f8e4125cadda.png)

### １３．シナリオJCL1-11  YOU'RE NO DUMMY
JCL3 の中の"DUMMY"については、気にする必要がない。この JCL は何もコールしていない、ただ「パラメータは必要とされるが、何もしないので問題ない」とのこと。

### １４．シナリオJCL1-12  A FRIENDLY DISPOSITION
ここまでの JCL の中で、DISP(disposition)パラメータを見てきた。DISP パラメータとは、システムに対してデータ・セットの状況を説明し、そ のステップまたはジョブの終了後のデータ・セットの後処理方法を指定する ために使用する。
標準DISPパラメータは３パーツで構成されている。第一フィールドが状態であり、次の文字列が使われる。
NEW : データセット新規作成
SHR : 既存データの再利用、他のユーザに必要であれば利用させる
OLD : 既存データの再利用、他のユーザに必要であれば利用させない
MOD : シーケンシャルなデータセットだけ。既存データを利用するが、新規レコードのみ。データセットがなければ、新規作成。

### １５．シナリオJCL1-13  WHAT'S YOUR STATUS
DISPパラメータの次の第2フィールドでは、正常完了時にデータセットに何が起こるのか示している。また、第3フィールドで異常発生時にデータセットに何が起こるのか示している。
JCL3では様々な値が使われているが、まずは以下の3つを知っておくべき
DELETE : ストレージから完全消去
CATLG : 後で利用するため記録
PASS : このステップ完了後に利用するため保持

### １６．シナリオJCL1-14  RIGHT ON TIME
JCL3を Submit し結果を見ると、100％正しく完了するために2か所の編集が必要ということが分かる。
重複停車は不要。つまり、2度表示されている"Beacon"と"Cortiant"の重複を削除する。
![330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/3a9390f8-d8d7-54ec-1d90-803b98072f0e.png)
そこで、JCL3 を修正。
まず、"Beacon"
![191.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/9540987c-6cd3-782b-21da-9de6f15abbf0.jpeg)
次いで、"Cortiant"
![201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/d29d81a1-ba59-4522-d130-da17ab9fa9ee.png)
その後、Zxxxxx.JCL3OUT データセットを削除し、再度 Submit 実施。
※Zxxxxx.JCL3OUT データセットを削除しなければ、以下のエラーとなる。![220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/61f58215-bc3f-a745-349e-543e9dcf6ef2.png)
![350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/fcdfe6c3-b9f1-1dad-c942-ee8f3215da0f.png)

### １７．WHO KNEW?
最後に JCL2 と JCL3 の結果を評価するため、ZXP.PUBLIC.JCL 内の CHKJCL1 を Submit し、正常終了( CC=0 )することを確認する。
CHKJCL のリターンコードが CC=0127であれば、「11 シナリオJCL1-9  COMPARE THE CODE」とJCL3を確認すること。
![250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/a60004bf-7c6f-c1ce-0992-b02d91db1cc6.png)

### １８． 締め
　JCL1挑戦画面( https://ibmzxplore.influitive.com/ )を見てみると、「Challenge Complete, check my FILES submission」ボタンが表示されているので、こちらをクリックして完了！
![350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/682574/ce9277d3-5f34-9314-5890-192c85c85b81.png)