【入門編】PIC ‘9’と’Z’による数値編集の差異 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「魔法のマスク」を解読する:PIC ‘9’と’Z’の意外な関係

皆さん、こんにちは。長年メインフレームの深淵でコードを書き続けてきたアーキテクトです。
JavaやC#といった現代的な言語から、突如としてこの「PL/I」という古の言語に放り込まれた皆さん。画面に並ぶ `DCL` や `PIC` といった見慣れない記号に、少し戸惑っていませんか?

大丈夫です。PL/Iは、一見すると「呪文」のようですが、実は非常に論理的で、一度コツを掴めばこれほど頼りになる相棒はいません。今日は、帳票出力やデータ変換で必ずと言っていいほど遭遇する「数値編集(Picture句)」の基礎、特に ‘9’‘Z’ の違いについて、現場の視点から紐解いていきましょう。

そもそも「Picture(画像)」って何?

PL/Iにおいて `PICTURE`(または `PIC`)は、変数の「見た目」を決定づけるマスクのようなものです。
例えば、Javaの `int` 型は単なる数値ですが、PL/Iの `PIC` は、「データがどうメモリに格納され、どう表示されるべきか」というルールを、変数そのものに刻み込みます。

この「見た目の定義」が、帳票出力の現場で大きな役割を果たします。

先行ゼロの「守護神」:’9′ と ‘Z’

帳票で「000123」と出るか、「 123」と出るか。この違いを決定づけるのが、`9` と `Z` です。

1. 頑固な ‘9’(Numeric Digit)

`PIC ‘9’` は「ここは必ず数字が入るぞ!」という強い意志を表します。
仮に変数に `123` という値が入っていて、定義が `PIC ‘999999’` だとしましょう。すると、空いた桁は律儀に `0` で埋められます。結果は “000123” です。

2. 空気を読む ‘Z’(Zero Suppression)

一方、`PIC ‘Z’` は「0(ゼロ)を表示したくない」という控えめな性格です。
同じ値 `123` を `PIC ‘ZZZZZ9’` で受け取ると、上位のゼロはすべてスペース(空白)に変換され、結果は ” 123″ となります。

なぜ `Z` を使うのか? それは、帳票を見た人間が「金額の桁数」を直感的に把握しやすくするためです。0が羅列されている帳票よりも、適度に空白が入っている方が、読みやすさは段違いですよね。

実際にコードで見てみましょう

現場のバッチプログラムを想定した、シンプルな例です。

/i
/ プログラムの基本構造:PROCEDUREとOPTIONS(MAIN) /
SAMPLE_PIC: PROC OPTIONS(MAIN);

/ DCL(宣言): 変数の定義です /
DCL VALUE_NUM FIXED DEC(6) INIT(123);

/ 9で定義:先行ゼロが表示される /
DCL OUT_9 PIC ‘999999’;

/ Zで定義:先行ゼロがスペースになる /
DCL OUT_Z PIC ‘ZZZZZ9’;

OUT_9 = VALUE_NUM;
OUT_Z = VALUE_NUM;

/ PUT SKIPで標準出力へ書き出し /
PUT SKIP EDIT(‘PIC 9の結果:’, OUT_9) (A, A);
PUT SKIP EDIT(‘PIC Zの結果:’, OUT_Z) (A, A);

END SAMPLE_PIC;

このコードを実行すると、コンソールやスプールには以下のように出力されます。

PIC 9の結果:000123
PIC Zの結果: 123

ここで注意!変換時の「例外」と罠

さて、ここからが少しだけ「現場の知恵」です。
`PIC` を使ったデータ移動は、単なる代入ではなく「変換」です。

  • 桁あふれ(Overflow)の恐怖:

もし `VALUE_NUM` が `1234567` となり、`PIC ‘999999’` の変数に代入しようとすると、上位桁が切り捨てられ、システムによっては計算例外(FIXEDOVERFLOW)が発生したり、データが破壊されたりします。

  • 非数字の混入:

`PIC ‘9’` や `PIC ‘Z’` が定義された変数に、数値以外の文字(スペースなど)が入った状態で計算を行おうとすると、プログラムは即座に「コンバージョン・エラー」で異常終了します。これはメインフレームのバッチでは日常茶飯事のトラブルです。

アーキテクトからのアドバイス

「なんとなく動くから」と `PIC` を定義するのではなく、「この変数は計算に使うのか? それとも帳票に出すだけか?」を常に意識してください。
計算に使う変数は `FIXED DEC` や `BIN FIXED` を使い、帳票出力の直前に `PIC` 変数へ `MOVE`(代入)する。これが、トラブルを未然に防ぐ「メインフレーム流・堅牢な設計」の第一歩です。

終わりに:怖がらなくて大丈夫

PL/Iの `PIC` は、最初は不親切なルールのように思えるかもしれません。しかし、これは「データがどうあるべきか」を厳格に管理するための知恵です。

先行ゼロを消すだけで、帳票の品格はぐっと上がります。次にコードを書くときは、ぜひ `Z` を使って、読み手にとって親切な数値表示を試してみてくださいね。

また次回の記事では、`PACKAGE` を使ったモジュール分割のコツについてお話ししましょう。現場で培った「動くコード」の感覚を、皆さんと共有できるのを楽しみにしています。

それでは、良いコーディングライフを!

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