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

PL/Iの「ピクチャ編集」を恐れるな!数値表示の魔法を紐解く

皆さん、こんにちは。メインフレームの世界へようこそ!

JavaやC言語、あるいはCOBOLでバリバリとコードを書いてきた皆さんにとって、PL/Iの「ピクチャ(Picture)指定」は、最初に立ちはだかる少し奇妙な壁かもしれません。「なぜ数字を扱うのに文字列のような指定をするのか?」と不思議に思うのも無理はありません。

でも、安心してください。PL/Iのピクチャ指定は、かつてのプログラマーたちが「限られたメモリと、限られた画面表示域」の中で、いかに美しく、かつ見やすくデータを表現するかを追求した、いわば「職人芸の知恵」なんです。

今日は、その中でも特に登場頻度が高い`9`と`Z`の挙動について、現場の視点から優しく解説しますね。

そもそも「ピクチャ」って何?

PL/Iにおいて、`PIC`(または`PICTURE`)属性は、いわば「データの型を決定しつつ、表示形式を整形する魔法のテンプレート」です。

COBOLの`PICTURE`句と似ていますが、PL/Iの場合は、内部的な数値計算用データと、表示用の文字データを同じピクチャという枠組みで柔軟に扱えるのが特徴です。

数値を飾る魔法の文字

  • `9`: 「ここに必ず数字が入ります」という宣言。
  • `Z`: 「もしここがゼロなら、空白(スペース)に置き換えます」というゼロサプレス(Zero Suppress)の合図。

実際にコードで見てみよう

以下の例を見てください。給与計算の結果を出力するようなシーンを想定しています。

/ メインプログラムの始まり /
TEST_PROG: PROCEDURE OPTIONS(MAIN);

/ 数値データを定義 /
DCL SALARY FIXED DECIMAL(5) INIT(1250);
DCL ZERO_VAL FIXED DECIMAL(5) INIT(0);

/ ピクチャ指定を用いた出力用変数の宣言 /
/ ‘99999’はそのまま数字として表示 /
DCL OUT_RAW PIC ‘99999’;
/ ‘ZZZZ9’はゼロを空白に変換しつつ、最後の1桁は必ず表示 /
DCL OUT_EDIT PIC ‘ZZZZ9’;

/ 値の代入:ここでPL/Iが勝手に変換(編集)してくれます /
OUT_RAW = SALARY;
OUT_EDIT = SALARY;

/ 結果出力(PUT LISTは簡易出力です) /
PUT SKIP LIST(‘そのまま出力: ‘ || OUT_RAW); / 結果: 01250 /
PUT SKIP LIST(‘編集して出力: ‘ || OUT_EDIT); / 結果: 1250 /

/ ゼロの場合の挙動 /
OUT_EDIT = ZERO_VAL;
PUT SKIP LIST(‘ゼロを編集: ‘ || OUT_EDIT); / 結果: 0 /

END TEST_PROG;

見ての通り、`Z`を使うと先頭の不要なゼロが消えて、桁が右寄せされたように綺麗に表示されますよね。これが帳票出力の現場で重宝される理由です。

避けて通れない「データ例外(Data Exception)」の恐怖

さて、現場で最も恐れられているのが「データ例外」です。これは、「ピクチャで定義した枠に、入りきらない(あるいは形式が合わない)データが突っ込まれたとき」に発生します。

例えば、`DCL VAL PIC ‘999’;` と宣言した変数に、`1234`という4桁の数値を代入しようとすると、プログラムは「おいおい、そんな大きな数字、この枠には入らないよ!」と悲鳴を上げて異常終了(ABEND)します。

トラブルを防ぐためのポイント

1. 桁あふれを意識する: 固定小数点型からピクチャ型へ代入する際は、必ずピクチャの桁数が数値の最大値をカバーしているか確認しましょう。
2. 空白を混入させない: ピクチャ変数はあくまで「数値の形式」を規定するものです。そこに不正な文字(スペースや記号)を直接代入しようとすると、システムは容赦なく例外を投げます。

最後に:怖がる必要はありません

PL/Iのピクチャ指定は、最初はとっつきにくいかもしれませんが、慣れてしまえば「データの入出力の門番」として非常に優秀な相棒になります。

もしコードを書いていて「何かがおかしい」と感じたら、まずは「そのピクチャは、受け取ろうとしているデータのサイズと型を正確に表せているか?」を立ち止まって確認してみてください。

メインフレームのレガシーコードは、長年の知恵が詰まった宝箱です。一つずつ紐解けば、必ず納得できるロジックに出会えますよ。皆さんのプログラミングライフが、少しでも楽しいものになりますように!

それでは、また次回の記事でお会いしましょう。ハッピー・コーディング!

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