はじめに
DS(データ構造)は、LIKE、OVERLAY を使用することで、リテラルの属性や長さを固定せずに宣言することをDS(データ構造)の長さや属性をリテラルで宣言しない方法でご紹介しました。
しかしこの方法を使用すると、(画像1)のようなコンパイルエラーが発生する事があります。
もちろん、使用している変数のデータタイプ/長さは正しく宣言しています。
この記事では、このようなエラーが発生する原因をご紹介します。
原因
DS のサブフィールドの桁数がオーバーする原因は以下の 2 つの理由が関係しています。
- DDS でゾーン十進数と宣言しても、IBM i はパック十進数として認識する。
- DS で宣言した変数は、ゾーン十進数として認識する。
実際にコンパイルリストを見て、これらの原因を確認してみましょう。
IBM i が認識しているフィールドの属性
まず前提として、DDS でフィールドを以下のように宣言します。
A WSKA01 6S 0 COLHDG(' 年月 ')
A*
A WSKA11 4S 0 COLHDG(' 年 ')
A WSKA12 2S 0 COLHDG(' 月 ')
そして、D 仕様書内では DDS で宣言したフィールドを使用して、以下のように宣言します。
D DS
D W#WSKA00 LIKE(WSKA01 )
D WSKA11 OVERLAY(W#WSKA00 )
D WSKA12 OVERLAY(W#WSKA00 :*NEXT )
一見すると、問題がないように思いますが、コンパイルリストを確認すると、冒頭で紹介した通り、(画像1)のようなコンパイルエラーが発生します。
ここで、コンパイルリストの相互参照表を確認することで、IBM i が認識しているフィールドの属性を知ることができます。
(画像2)
この相互参照表から、IBM i はゾーン十進数を以下のように認識する事、属性は D 仕様書を優先する事が分かります。
- DDS で宣言したフィールド → パック十進数
- DS で宣言したフィールド → ゾーン十進数
おわりに
IBM i の数字タイプへの認識、属性は D 仕様書を優先する事を踏まえると以下の記述を追記することで、コンパイルエラーを回避することができます。
D DS
D WSKA01
もし似たようコンパイルエラーでお困りの際に、ご参考になれば幸いです。
最後までお読み頂きありがとうございます。