【PL/I入門】数値編集の「9」と「Z」に惑わされるな!メインフレーム流・帳票出力の魔法
こんにちは!IBMメインフレームの世界へようこそ。
JavaやCOBOLでバリバリ開発してきたエンジニアの方にとって、PL/Iのコードを初めて見たとき、「なんだこの独特な記述は…?」と少し身構えてしまうかもしれませんね。
でも、安心してください。PL/Iは「汎用言語(Programming Language One)」という名の通り、実は非常に論理的で、一度コツを掴めばこれほど頼もしい相棒はいません。今日は、基幹システムの帳票出力で必ず遭遇する「数値編集(PIC句)」の謎について、一緒に紐解いていきましょう。
—
数値編集の基本:なぜ「9」と「Z」を使い分けるの?
データベースの中にある数値は、あくまで「バイナリ」や「パック十進数」といったコンピュータが計算しやすい形をしています。しかし、それをそのまま出力すると、人間には読みづらいですよね。
そこで登場するのが、PL/Iの`PICTURE`(PIC)句です。
これは、「データをどのような見た目で表示するか」という「型」のテンプレートだと考えてください。
「9」は「数字の場所確保」
`PIC ‘9999’` と宣言した場合、これは「ここは絶対に数字が入る4桁の場所ですよ」という予約席です。
例えば、値が `123` であれば、先行ゼロを埋めて `0123` と表示されます。銀行の口座番号やコード類など、「桁数が決まっていて、ゼロも表示したい」場面で使います。
「Z」は「先行ゼロの消しゴム」
一方、`PIC ‘ZZZ9’` はどうでしょう。
これは「もしその桁が先行ゼロ(意味のないゼロ)なら、空白(スペース)に置き換えて表示してね」という指示です。
- 値が `123` なら ` 123` (先頭がスペース)
- 値が `5` なら ` 5` (頭の3桁がスペース)
帳票で「金額」を表示するとき、`00000500円` と出るより、` 500円` と右寄せで表示されたほうが圧倒的に見やすいですよね。「Z」は、読みやすさを追求するための「消しゴム」だとイメージしてください。
—
実践!PL/Iでのデータ宣言と編集コード
では、実際にどのように書くのか、メインフレームのバッチプログラムを想定したコードを見てみましょう。
/i
/ プログラムの入り口は OPTIONS(MAIN) で宣言します /
MY_PROG: PROCEDURE OPTIONS(MAIN);
/ 内部データ(計算用) /
DCL RAW_AMOUNT FIXED DECIMAL(7,0) INIT(1234);
/ 編集用データ(出力用) /
/ 9は「必ず表示」、Zは「ゼロなら空白」 /
DCL DISPLAY_AMOUNT_A PIC ‘9999999’; / 0001234 と表示 /
DCL DISPLAY_AMOUNT_B PIC ‘ZZZZZZ9’; / 1234 と表示 /
/ 処理実行 /
DISPLAY_AMOUNT_A = RAW_AMOUNT;
DISPLAY_AMOUNT_B = RAW_AMOUNT;
/ 結果の確認(SYSPRINTへ出力) /
PUT SKIP LIST(‘— 編集結果 —‘);
PUT SKIP LIST(‘PIC 9形式: ‘ || DISPLAY_AMOUNT_A);
PUT SKIP LIST(‘PIC Z形式: ‘ || DISPLAY_AMOUNT_B);
END MY_PROG;
—
現場で役立つ「ちょっとした注意点」
ここで、実務でよくある「落とし穴」を一つだけ共有します。
「Z」と「9」が混ざった時の挙動
初心者の頃、「`PIC ‘ZZ9Z’`」のように途中にZを挟むとどうなるか迷うことがあります。
実はPL/Iのルールでは、「Z」は原則として左側から連続して指定します。途中に9を挟むと、その9よりも左側にあるZは機能しなくなる(空白にならない)という仕様があるのです。
「あれ、空白にならないぞ?」と思ったら、それは「Z」を左側に寄せきれていないことが原因かもしれません。
—
最後に:PL/Iは怖くない!
メインフレームのレガシーなコードは、一見すると「魔法の呪文」のように見えるかもしれません。でも、一つ一つのキーワードを紐解けば、すべては「正しく、美しくデータを表示する」という目的のために設計されています。
「Z」の消しゴムで不要なゼロを消し、「9」の枠で大事な数値を守る。
この感覚さえ掴めれば、帳票出力やデータ変換の改修も、きっと楽しくなるはずですよ。
もし現場で「このPIC句の意味がどうしても腑に落ちない!」という奇妙な宣言に出会ったら、それはきっと歴史あるシステムが生き抜いてきた証です。怖がらずに、一歩ずつ解き明かしていきましょう。
それでは、また次回のブログでお会いしましょう。ハッピー・コーディング!
