現場のPL/I職人が教える「PICTURE編集」の深淵:数値出力のゼロ抑制とデータ例外の罠
諸君、お疲れ様だ。メインフレームの保守現場で、夜中のバッチジョブが `S0C7`(データ例外)で落ちて冷や汗をかいた経験は一度や二度ではないだろう。
PL/IのPICTURE属性は、一見するとCOBOLのピクチャ句と似たようなものに見える。だが、PL/Iの柔軟すぎる仕様は、時に未熟なコーダーを地獄へ突き落とす。今日は、数値編集の基本である `’9’` と `’Z’` の挙動、そしてそれが引き起こす「落とし穴」について、実務の視点から紐解いていこう。
—
1. ‘9’ と ‘Z’:その役割と「ゼロ抑制」の哲学
まずは基本の確認だ。PICTURE編集において、数値の扱いは大きく分けて「内部表現」と「編集表現」の二つがある。
- ‘9’ (Numeric digit):
対象位置に数値が必ず存在することを保証する。値が0であっても ‘0’ が出力される。
- ‘Z’ (Zero suppression):
対象位置の値が0の場合、それをスペースに置き換える。いわゆる「ゼロ抑制」だ。ただし、上位桁から順に適用され、一度非ゼロの数字が現れると、それ以降の ‘Z’ は ‘9’ と同等の挙動を示す。
この二つの使い分けは、レポート出力の可読性を左右する。金額フィールドで `000150` と出るより ` 150` と出る方が、現場のユーザーにとっては遥かに見やすいはずだ。
—
2. 現場を凍り付かせる「データ例外」の正体
多くの若手がハマるのが、「編集済みフィールドを、そのまま算術演算に巻き込む」というミスだ。
PL/Iでは、PICTURE編集文字を含んだ変数は「文字型(Character)」として扱われることが多い。もし君が、`PICTURE ‘ZZZ,ZZ9’` と宣言した変数に対し、数値演算を行おうとしたらどうなるか。コンパイラは親切にも変換を試みるが、実行時に値がスペースを含んでいれば、CPUは処理を拒否し、容赦なく `S0C7` を叩きつける。
実践:安全な出力処理のコーディング例
以下に、VSAMファイルからの読み込みと、ゼロ抑制を考慮した出力処理のテンプレートを記す。
/i
/ ————————————————————- /
/ 数値編集のサンプル:VSAM入力からレポート出力への変換 /
/ ————————————————————- /
DCL IN_REC_AMT FIXED DEC(7,0); / VSAM上の数値データ /
DCL OUT_EDIT_AMT PIC ‘ZZZ,ZZ9’; / ゼロ抑制編集用 /
DCL WORK_AMT FIXED DEC(7,0); / 計算用ワークエリア /
/ VSAMからの読み込み処理を想定 /
READ FILE(FILE_IN) INTO(IN_DATA);
WORK_AMT = IN_REC_AMT; / 演算は必ず固定小数点型で行う /
/ 編集:ここで初めてPIC属性へ代入する /
OUT_EDIT_AMT = WORK_AMT;
/
- 【重要】
- OUT_EDIT_AMTを再度数値として計算に使ってはならない。
- 使う場合は必ず、元のFIXED DEC型変数に戻すこと。
/
—
3. トラブルを未然に防ぐ「ONユニット」の活用
どれだけ注意深くコーディングしても、データが汚れている(例えば、数値項目にスペースや不正な文字が入っている)ケースはある。そんな時に頼りになるのが、PL/Iの `ON CONVERSION` ユニットだ。
データ変換の例外をトラップし、異常終了を回避してログに詳細を残す。これが大規模バッチの「品質」を左右する。
/i
/ 不正な数値変換が発生した際の緊急回避コード /
ON CONVERSION
BEGIN;
DISPLAY(‘!!! 変換エラー発生 !!!’);
DISPLAY(‘エラー箇所: ‘ || ONCHAR());
/ ここでエラー処理(スキップやデフォルト値設定)を行う /
RESUME;
END;
—
4. スペシャリストからの提言
最後に、現場の諸君に伝えておきたいことがある。
PL/Iには「予約語」が存在しない。これは非常に強力だが、裏を返せば「どんな変数名でも許されてしまう」という恐ろしい仕様だ。`PICTURE` という変数名を作ることすら文法的には可能だが、そんなコードをレビューで持ち込まれたら、私なら即座に突き返す。
「動くコードを書くのは当たり前。メンテナンスする人間が、PICTUREの挙動で悩まないコードを書け。」
数値の編集は、データの入出力における「最後の化粧」だ。だが、その化粧の下にあるのは常に厳格な「数値型(FIXED DECやBINARY)」でなければならない。文字としてのPICTUREと、計算のための数値型。この境界線を曖昧にしないことこそが、メインフレームシステムを長生きさせる秘訣だ。
何か不明点があれば、またいつでも聞きに来てくれ。基幹システムの安定は、こうした細部へのこだわりから生まれるのだから。
