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

PL/Iの「PICTURE」で遊ぼう!数値編集のキホンとゼロ抑制の魔法

こんにちは。メインフレームの深淵へようこそ。
JavaやCOBOLの世界からやってきた皆さんにとって、PL/I(ピーエルワン)という言語は、まるで「何でもありの秘密基地」のように見えるかもしれません。

今日は、PL/Iの「PICTURE」属性、特に数値の見た目を整える`9`と`Z`の挙動についてお話しします。これを知っておけば、基幹システムの帳票出力やデータ変換で「あれ?数字が消えた!?」なんて焦ることもなくなりますよ。

1. そもそもPL/Iには「予約語」がない?

まず、皆さんが一番驚くポイントから。PL/Iには、Javaのように厳格に定められた「予約語」が存在しません。

例えば、`IF`や`THEN`といった構文上のキーワードでさえ、変数名として使えてしまうのです。
/i
/ こんな恐ろしい宣言も、PL/Iでは「合法」です /
DCL IF FIXED DEC(5);
DCL THEN FIXED DEC(5);

「えっ、プログラムが壊れないの?」と思いますよね。PL/Iは文脈で判断します。だからこそ、変数名は分かりやすく、かつキーワードと被らないように命名するのが、我々アーキテクトの腕の見せ所なんです。

2. PICTURE属性の「9」と「Z」:化粧のルール

さて、本題の数値編集です。PL/Iでは数値を文字として整形する際、`PICTURE`(略してPIC)を用います。これが本当に便利で、COBOLユーザーにはおなじみですが、PL/Iではより柔軟に制御できます。

数値を保持する「9」

`PIC ‘999’` は、「ここには必ず数字が入るよ」という宣言です。
もし数値が `5` であれば、`005` と表示されます。いわゆる「ゼロ埋め」ですね。

ゼロを消し去る「Z」

一方、`PIC ‘ZZ9’` は、「数字がなければ空白(スペース)にするよ」という魔法の指定です。
もし数値が `5` であれば、` 5` と表示されます。この「先頭の不要なゼロを隠す」ことをゼロ抑制(Zero Suppression)と呼びます。

3. 実践!コードで見てみよう

実際のバッチプログラムを想定して、少し書いてみましょう。

/i
DCL VAL_RAW FIXED DEC(5) INIT(123);
DCL VAL_ZERO FIXED DEC(5) INIT(0);

/ ‘999’ はゼロ埋め。値が0なら 000 となる /
DCL OUT_999 PIC ‘999’;

/ ‘ZZ9’ はゼロ抑制。値が0なら空白のみ( )となる /
DCL OUT_ZZ9 PIC ‘ZZ9’;

/ 編集処理 /
OUT_999 = VAL_RAW; / 結果: ‘123’ /
OUT_999 = VAL_ZERO; / 結果: ‘000’ /

OUT_ZZ9 = VAL_RAW; / 結果: ‘123’ /
OUT_ZZ9 = VAL_ZERO; / 結果: ‘ 0’ (※Zは最後の9を残す指定なら0を表示) /

4. 知っておくべき「データ例外」の恐怖

ここが一番大切です。PL/Iは非常に親切ですが、時として厳格です。
もし、`PIC ‘999’` と宣言した変数に、数字以外の文字(例えば ‘ABC’ や空白)を無理やり代入しようとするとどうなるでしょうか?

システムは悲鳴を上げて「データ例外(Data Exception)」で異常終了します。
Javaの `NumberFormatException` と似ていますが、メインフレームの世界ではこれが「異常終了(ABEND)」という形で、バッチ全体の停止に直結します。

  • 解決のヒント:

データを受け取る際は、必ず `IF TYPE_CHECK` のような検証を挟むか、一度文字列(CHARACTER)として受け取ってから数値へ変換する癖をつけましょう。

最後に:怖がらなくて大丈夫です

PL/Iの仕様は、一見すると古臭く、難解に見えるかもしれません。しかし、一つひとつの属性が「メモリをどう使うか」「帳票にどう出すか」という、当時のエンジニアたちの知恵の結晶です。

`9`でしっかりと桁を揃え、`Z`で読みやすく整える。この小さな積み重ねが、何十年も動き続ける基幹システムの「美しさ」を作っています。

もし現場でエラーが出ても、「ああ、これはデータが形を崩したんだな」と、落ち着いて変数の中身を確認してみてください。きっと、PL/Iが静かにヒントを教えてくれるはずですよ。

それでは、また次回の深掘りでお会いしましょう!

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