メインフレームの現場で、長年「なぜか数字が綺麗に揃わない」「帳票出力で意図しない空白が入る」というトラブルに遭遇したことはないだろうか。
PL/Iを扱う上で避けて通れないのが、`PICTURE`句による数値編集だ。特に、新人や他言語から来たエンジニアが最初の壁として躓くのが、この`9`と`Z`の「先行ゼロ抑制」の挙動である。
今回は、基幹バッチ処理の帳票出力やVSAMファイルへの書き出しで、この違いを理解していないと発生する「致命的な事故」を防ぐための実践的な知見を共有しよう。
—
1. `9` と `Z` の根本的な設計思想
PL/Iにおいて、`PICTURE`句は単なる型定義ではない。それは、メモリ上のバイナリデータを「人間が読める文字コード」に変換する際のアートだ。
- `9` (Digit): 数値をそのまま保持する。先行ゼロ(Leading Zero)はそのまま`0`として表示される。
- `Z` (Zero Suppression): 数値を保持するが、もしその桁が`0`であれば、スペース(空白)に置き換えて出力する。
帳票出力において、金額や数量が「0000123」と出るか、「 123」と出るかは、ユーザーの読みやすさに直結する。この基本を甘く見てはいけない。
—
2. 実践コード:帳票出力と例外処理
以下のサンプルコードを見てほしい。実務で頻出する、ファイル出力時の数値編集と、計算過程での例外トラップの基本形だ。
/i
/————————————————————–/
/ プログラム名: EDIT_TEST /
/ 概要: 数値編集(9 vs Z)の挙動確認とONユニットの活用 /
/————————————————————–/
EDIT_TEST: PROCEDURE OPTIONS(MAIN);
DCL NUM_VAL FIXED DEC(7) INIT(123);
DCL EDIT_9 PIC ‘9999999’; / 9を用いた編集 /
DCL EDIT_Z PIC ‘ZZZZZZ9’; / Zを用いた編集(末尾の9は必須) /
/ ONユニット: 変換エラー発生時の安全策 /
ON CONVERSION BEGIN;
PUT SKIP LIST(‘データ変換エラーが発生しました。値を確認してください。’);
END;
/ 編集の適用 /
EDIT_9 = NUM_VAL;
EDIT_Z = NUM_VAL;
PUT SKIP EDIT(‘結果(PIC 9): ‘, EDIT_9) (A, A);
PUT SKIP EDIT(‘結果(PIC Z): ‘, EDIT_Z) (A, A);
/
- 注意点:
- PIC ‘ZZZZZZZ’ と全てZにすると、0が全て空白になり、
- 数値0が出力されなくなるリスクがある。
- そのため、一桁は必ず9を残すのが定石だ。
/
END EDIT_TEST;
—
3. なぜ `Z` は「末尾に `9`」が必要なのか
実務で最も多いミスが、`PIC ‘ZZZZZZ’` と定義してしまうことだ。もし変数の値が `0` だった場合、この定義では「空文字列(オールスペース)」となってしまう。
後続のバッチでそのファイルを読み込み、`FIXED DEC`型へ再変換しようとしたとき、スペースが含まれたフィールドを数値として解釈できず、`CONVERSION`例外が飛んでくる。これが夜間バッチを停止させる典型的な原因だ。
- 教訓: 帳票の見た目を整えるために `Z` を使うのは良いが、ファイル出力やDB保存を前提とするフィールドには、極力 `9` を使い、編集ロジックは出力側の `PUT` 文や報告書作成プログラム内で完結させるのが、保守性を高める唯一の道である。
—
4. 現場のアーキテクトからのアドバイス
VSAMのレコード定義や、レガシーな固定長ファイル(FB/VB)を扱う際は、以下の3点を意識してほしい。
1. データ変換の境界線を意識せよ:
`Z` 編集されたデータは、もはや「数値」ではなく「文字列(文字コード)」だ。計算が必要なフィールドに `Z` を使ってはいけない。
2. `ON CONVERSION` を過信しない:
例外をトラップして処理を継続するのも一つの手だが、そもそも例外を発生させない「型ガード」が最も堅牢だ。入力データに対しては、`VALIDATE` ロジックを組み込む癖をつけておこう。
3. BUILTIN関数の活用:
複雑な編集が必要な場合は、`PIC`句で無理をせず、`TRIM`や`SUBSTR`を駆使したロジックを組むほうが、十年後の保守担当者に感謝される。
PL/Iの `PICTURE` 句は、いわば「伝統工芸」のようなものだ。古い言語かもしれないが、その仕様の一つ一つには、計算機リソースが乏しかった時代のエンジニアたちの「いかに効率よく、かつ人間らしくデータを扱うか」という知恵が詰まっている。
この知識を武器に、今日も安定稼働する基幹システムを守り抜いてくれ。何かあればいつでも聞くように。
