LoginSignup
0
0

More than 1 year has passed since last update.

DS(データ構造)を LIKE,OVERLAY で宣言したときにコンパイルエラーになる原因

Last updated at Posted at 2022-12-06

はじめに

DS(データ構造)は、LIKE、OVERLAY を使用することで、リテラルの属性や長さを固定せずに宣言することをDS(データ構造)の長さや属性をリテラルで宣言しない方法でご紹介しました。
しかしこの方法を使用すると、(画像1)のようなコンパイルエラーが発生する事があります。

(画像1)
dsCompileError_01.png

もちろん、使用している変数のデータタイプ/長さは正しく宣言しています。
この記事では、このようなエラーが発生する原因をご紹介します。

原因

DS のサブフィールドの桁数がオーバーする原因は以下の 2 つの理由が関係しています。

  1. DDS でゾーン十進数と宣言しても、IBM i はパック十進数として認識する。
  2. 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)
dsCompileError_02.png

この相互参照表から、IBM i はゾーン十進数を以下のように認識する事、属性は D 仕様書を優先する事が分かります。

  1. DDS で宣言したフィールド → パック十進数
  2. DS で宣言したフィールド → ゾーン十進数

おわりに

IBM i の数字タイプへの認識、属性は D 仕様書を優先する事を踏まえると以下の記述を追記することで、コンパイルエラーを回避することができます。

D                 DS
D  WSKA01

(画像3)
dsCompileError_03.png

もし似たようコンパイルエラーでお困りの際に、ご参考になれば幸いです。
最後までお読み頂きありがとうございます。

関連した投稿

DS(データ構造)の長さや属性をリテラルで宣言しない方法

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0