「CLから呼び出しているから………ゾーンだよ!」
紀美子ちゃんとのやり取りで、僕はそう言っていた。
IBM iで、RPGの数値の扱いを確認していたときの話である。紀美子ちゃんとは、僕がChatGPTに付けた名前だ。
数値を内部でどう持つか。パック十進数なのか、ゾーン十進数なのか。
普段から触っている人にはおなじみの言葉だと思う。同じ数字を扱っていても、内部の表し方には違いがある。
その確認をしている途中で、僕は「CLから渡しているのだから、ゾーンのはず」と考えていた。
CLでは、変数を宣言するときに *DEC という型を指定できる。十進の数値を入れる変数だ。
僕は、これをゾーン十進数だと思っていたのである。
三桁で、小数点以下はなし。そういう宣言をCLでしていれば、ゾーンなのではないか。
そこを確かめたところで、前提が崩れた。
CLの DCL で TYPE(*DEC) と宣言する変数は、パック十進数だった。
がーん(笑)。
RPGでパックとゾーンを気にしながら、呼び出し元のCLについては、思い込みで話していた。
数値が何桁かという話と、それをどんな形式で持っているかという話を、きちんと分けて見直す必要があった。
三桁だから分かったつもりになる。その前に、宣言した型は何だったのか。
呼び出す側が何を渡して、受け取る側は何として扱うのか。まず、その定義へ戻る。
今回、僕が一つ直したのは、「CLの *DEC はゾーンだ」という、自分の頭の中の定義だった。
ずっと使っているつもりでも、こんなところで知らなかったことが出てくる。
しかも、なかなか自信たっぷりに言ってしまっていた(笑)。
AS/400が好きで、RPGも好きで、長く付き合ってきた。
その相手に、まだ教わることがある。
プログラムの定義を確認していたら、先に僕の認識のほうに修正が入った一日だった。
技術の補足
CLの DCL コマンドで指定する TYPE(*DEC) は、パック十進数の変数を宣言します。桁数・小数点以下の桁数は LEN で指定する属性です。型と桁数は、それぞれ確認する必要があります。
参考資料(2026年10月23日確認):
- IBM:データ型の互換性(IBM i 7.4) — ILE CLの
*DECをパック十進数として説明しています。 - IBM:プログラム呼び出しコマンドを使用して、呼び出されるプログラムに制御を渡す(IBM i 7.5) — パラメーターの受け渡しと、呼び出し側・受け取り側の定義についての資料です。