【入門編】CICS EXEC CICSコマンドにおけるデータ受け渡し – PL/Iの基本構文とデータ制御実践ガイド

PL/Iで挑むCICSの世界:DFHCOMMAREAという名の「伝言板」を使いこなそう

こんにちは。メインフレームの世界へようこそ。
普段、JavaやCOBOLでバリバリ開発されている皆さんが、いざPL/Iの世界に足を踏み入れると、「なんだこの独特な記法は……」と戸惑うのは当然のことです。

特にCICS(シーアイシーエス)環境では、画面から入力されたデータや、プログラム間で引き継ぐ値をどう扱うかが肝になります。今日は、そんな皆さんのために、PL/Iにおけるデータ受け渡しの要である「DFHCOMMAREA」について、優しく解説していきますね。

1. CICSプログラムの基本の「き」:PACKAGEとPROCEDURE

Javaで言うところのクラスやメソッドに近い感覚ですが、PL/Iでは少しだけお作法が違います。まずはこの骨組みを見てみましょう。

1
/ CICSプログラムの基本構造 /
MYPROG: PACKAGE OPTIONS(MAIN);

MY_PROC: PROCEDURE(DFHEIBLK, DFHCOMMAREA);

/ CICSが自動で提供してくれる特別な箱たち /
DCL DFHEIBLK PTR; / 実行インターフェースブロック(EIB):システム情報が入る箱 /
DCL DFHCOMMAREA CHAR(); / 通信領域(COMMAREA):プログラム間でデータを渡す箱 /

/ ここに処理を書きます /
RETURN;
END MY_PROC;

END MYPROG;

ここで「えっ?」となるのが `DFHEIBLK` と `DFHCOMMAREA` ですよね。

  • DFHEIBLK: 「今、何時?」「どの端末から来たの?」といった、実行時のステータスが詰まったシステムからのメモ書きです。
  • DFHCOMMAREA: プログラムAからプログラムBへ、「これ、あとで使ってね!」と渡す伝言板のようなものです。

2. なぜ `CHAR()` なのか? PL/Iの「柔軟すぎる」型宣言

PL/Iのデータ宣言で、最も初心者を悩ませるのが `CHAR()` という書き方です。
Javaなら `String` と書けば中身の長さは適宜調整されますが、PL/Iはもともとメモリ管理を厳密に行う言語です。

`CHAR()` は「長さは今は決めないけど、どこかにデータがあるよ」というポインタのような宣言です。これだけだとただの「謎の塊」なので、皆さんが普段扱う構造体(COBOLでいうレコードレイアウト)を「被せる(マッピングする)」という作業が必要です。

3. 実践!構造体マッピングでデータを読み解く

では、実際にプログラム間でデータをやり取りする現場のコードを見てみましょう。

1
/ 共有するデータの定義(コピーブックなどで管理されることが多いです) /
DCL 1 MY_DATA_AREA BASED(ADDR(DFHCOMMAREA)),
3 USER_ID CHAR(8), / ユーザーID /
3 TRANS_CODE CHAR(4), / トランザクションコード /
3 ITEM_COUNT FIXED BIN(15); / 品目数 /

/ ロジック内での利用例 /
IF EIBCALEN > 0 THEN DO; / 前のプログラムから何か渡されているかチェック /
/

  • ここで魔法が起きます!
  • BASED属性により、DFHCOMMAREAのアドレスを
  • MY_DATA_AREAという構造体として解釈させます。

/
PUT SKIP LIST(‘ユーザーIDは: ‘ || USER_ID);
END;

ここがポイント!

  • BASED(ADDR(DFHCOMMAREA)): これが「この構造体を、COMMAREAというメモリ空間に重ねて使うよ」という宣言です。
  • EIBCALEN: 「EIB(システムメモ)」の中にある「COMMAREAの長さ」を保持する変数です。これを確認せずにアクセスすると、メモリアクセス違反でプログラムが異常終了(アベンド)するので、実務では必ずチェックしてくださいね。

4. 怖がらなくて大丈夫。PL/Iは「親切な設計図」です

Javaのオブジェクト指向に慣れていると、PL/Iの「メモリ上に直接レイアウトを定義して、そこに名前を付けてアクセスする」という感覚は、少し泥臭く感じるかもしれません。

しかし、これは裏を返せば「コンピュータがメモリのどこをどう読んでいるか」を明示的に制御しているということ。メインフレームにおける基幹システムは、この「正確なデータ制御」によって何十年も止まらずに動き続けているのです。

初心者さんへのアドバイス

1. まずは「マッピング」を疑う: データの値がおかしいときは、大抵この `DCL` 構造体の定義と、実際のデータの長さがズレています。
2. `EIBCALEN` を信じる: 渡されたはずのデータが空のときは、まずこの変数が0になっていないか確認しましょう。

PL/Iは、一度仲良くなれば、メモリの隅々まで自分の意のままに操れる、非常に頼もしい相棒になります。今日から少しずつ、この「伝言板(COMMAREA)」の扱いをマスターしていきましょう!

何か詰まったら、いつでも聞いてくださいね。一緒に紐解いていきましょう。

タイトルとURLをコピーしました