はじめに
DS(データ構造)を使用してフィールドを合成/分割する方法は、RPG を使用している方なら一度は記述したことがあるかと思います。
その際、皆さんはどのように定義をしていますか?
大抵の場合、以下のように各変数の長さや属性を宣言しているのではないでしょうか?
D W#YYYYMM 1 6 0
D W#YYYY 1 4 0
D W#MM 5 6 0
日付のように桁数が変わらないフィールドを合成/分割する際はさほど問題は起こらないかと思います。
しかし、もし DDS で宣言したフィールドを合成/分割する場合はリテラルで宣言すると、DDS の桁数が変更になった際に、DS も再度定義し直す必要があります。
その際、再定義のし忘れや桁数間違え等のミスが起こる可能性が考えられます。
この記事では、このようなミスを防ぐために DS の長さや属性をリテラルで宣言しない方法をご紹介します。
キーワード
使用するキーワードは以下の2つです。
- OVERLAY
- LIKE
DS の長さ宣言
以下の例では、OVERLAY( DS 名 :*NEXT)を記述することで、DDS で宣言したフィールドを合成しています。
D W#WSKA00 DS
D WSKA01 OVERLAY(W#WSKA00 )
D WSKA02 OVERLAY(W#WSKA00 :*NEXT )
D WSKA03 OVERLAY(W#WSKA00 :*NEXT )
D WSKA04 OVERLAY(W#WSKA00 :*NEXT )
D WSKA05 OVERLAY(W#WSKA00 :*NEXT )
A WSKA01 1A
A WSKA02 2A
A WSKA03 3A
A WSKA04 4A
A WSKA05 5A
もし、これをリテラルで宣言しようとするとこのようになります。
D W#WSKA00 DS
D WSKA01 1 1
D WSKA02 2 3
D WSKA03 4 6
D WSKA04 7 10
D WSKA05 11 15
OVERLAY( DS 名 :*NEXT)は、サブフィールドを DS 内の次に使用可能な位置に宣言することができます。
DS の属性宣言
もし DDS のフィールドを直接合成せずに変数を使用する際は、LIKE を使用すると便利です。
D W#WSKA00 DS
D W#KA01 LIKE(WSKA01 )
D OVERLAY(W#WSKA00 )
D W#KA02 LIKE(WSKA02 )
D OVERLAY(W#WSKA00 :*NEXT )
D W#KA03 LIKE(WSKA03 )
D OVERLAY(W#WSKA00 :*NEXT )
D W#KA04 LIKE(WSKA04 )
D OVERLAY(W#WSKA00 :*NEXT )
D W#KA05 LIKE(WSKA05 )
D OVERLAY(W#WSKA00 :*NEXT )
LIKE は属性を取得することができます。
おわりに
DS をリテラルで宣言せずに OVERLAY や LIKE を使用することは、長い目で見たときにより効率の良いコーディングであると思います。
ご参考になれば幸いです。最後までお読み頂きありがとうございます。