RPG

119. 名前による標識を使うには ?

永年、RPGに携わってきた開発者であれば 01- 99 の標識を扱うのには慣れているし、

違和感も無いと思うが、最初に RPG に触れた人であれば標識の概念に戸惑う場合が多い。

ユーザーに提供された *IN01 〜 *IN99 のブール値であるという理解は得られても

他の言語であれば、このようなブール値にはユーザー指定の任意の名前を与えることができるので、

名前によるブール値に慣れている場合は 01 - 99 の無気質な数値では記憶にも残りにくいし、

感覚的に慣れにくいのである。

そこで RPG の場合でもフィールドを標識の代用にするのではなく、標識そのものに名前をつけて

扱える方法をここで紹介しよう。

この方法には大別して2つの方法がある。

(1) 標識 01 – 99 に名前を命名する。
0001.00 D INDICATORS      DS                  BASED(INDPTR)
0002.00 D  NOT_FOUND             88     88                                   
0003.00 D  CHAIN_ERR             90     90                                   
0004.00 D INDPTR          S               *   INZ(%ADDR(*IN))                
0005.00                                                                      
0006.00 C     SHKEY         CHAIN     SHOHIN                             90  
0007.00 C                   IF        CHAIN_ERR = *ON                        
                             :                                               
0009.00 C                   END                                              
【 解説 】

データストラクチャー INDICATORSINDPTR というポインタを基底とするフィールドであり、

ポインタ INDPTR%ADDR(*IN) として初期設定されているので標識 01 - 99
標識バッファーを指している。

したがって CHAIN_ERR とは標識バッファーの 90番目であるので *IN90 と同じ値が常に入る。

これによって *IN90 の代わりに CHAIN_ERR という名前を使用することができるように
なったのである。

(2) ユーザーで標識自体を新規に定義する方法

既存の RPGソースを修正する場合に新規に標識を定義したいのだが、

既に使用済みの標識と重ならないようにしなければならない場合がある。

こんなときにコンパイル・リストを丹念に調査して未使用の標識を探しだす必要はない。

次の方法によって勝手に(?) 好みの名前を名前による標識を定義することができる。

0001.00 D @EOF            S              1N   INZ(*OFF)           
0002.00 D @FOUND          S              1N   INZ(*OFF)           
0003.00                                                           
0004.00 C                   EVAL      @EOF = READ_CHANG('G2SFL')  
0005.00 C                   DOW       NOT @EOF                    
0006.00 C                   MOVEL     '1'           #FG(RRN2)     
0007.00 C                   EVAL      @EOF = READ_CHANG('G2SFL')  
0008.00 C                   ENDDO                                 
【 解説 】

この RPG ソースは EnterpriseServer Ver4.0TONAKAI によって移行された
CGI ソースの一部を抜粋したものである。

標識 @EOF@FOUND

0001.00 D @EOF            S              1N   INZ(*OFF)           
0002.00 D @FOUND          S              1N   INZ(*OFF)

によって定義されている。1桁のタイプ N が標識であることを意味している。

0005.00 C                   DOW       NOT @EOF 

がコンパイル・エラーにもならずに正しく標識としてコンパイラーにも認識されている。

%EOF%FOUND はユーザーでは設定することができないので TONAKAI による移行では

@EOF@FOUND などのユーザー定義による標識に置き換えられているのである。