RPG

247. SFLEND の「続く...」と「終り」を正しく表示するには ?

SFLレコードの表示で右下に表示される「続く...」と「終り」を正しく表示するための解説である。

SFLレコードの「続く...」と「終り」の表示

そもそも「続く...」と「終り」を表示するためには DSPF のSFLCTL の記述で

      A          R SFCTL01                   SFLCTL(SFREC01)
              :
      A  49                                  SFLEND(*MORE)

のように SFLEND(*MORE) を記述しておけば標識 49 によって
「続く...」と「終り」を制御して表示することができる。
ここで標識: 49 とは、SFLレコードがこれ以上表示できない、つまり
EOF (= End Of File )であるときに ON にセットすればよい。
IBM の解説書ではこのあたりが曖昧に書かれているので読者はわかりにくいかも知れない。
つまり標識 49 がオンになればこれ以上ロール・アップ(PageDown)できない。
そこで

      A          R SFCTL01                   SFLCTL(SFREC01)
              :
      A N49                                  ROLLUP(14 ' 次頁 ')
      A  49                                  SFLEND(*MORE)

のようにして ROLLUPキーを同じ標識 49 で制御しておけばより完璧となる。

後は RPGプログラム・ソースの中でデータの読取りがEOF になったときに
標識 : 49をオンにセットするようにすればよい。
ここでは標識 : 49を使わずに「EOF」というフィールドで定義して処理する方法を紹介しよう。
何せ RPG の標識という BOOL値は嫌われ者で、
オープン系から IBM RPG の世界に入った人では標識というものが理解しずらいらしい。
そこで最近は IBM も %EOF などを用意して
できるだけ標識を使わなくても記述できるように RPG を改良している。

    D INGID_PTR       S               *   INZ(%ADDR(*IN))   
    D INDICATORS      DS                  BASED(INGID_PTR)  
    D  EOF                   49     49                      
          :
    C     TOPRRN        DO        ENDRRN        RRN1              4 0 
    C                   READ      SHOHIN                              
    C                   IF        %EOF                                
    C                   MOVE      *ON           EOF                   
    C                   LEAVE                                         
    C                   ENDIF
    C*----------------------------------------------------+  
    C     WRITE         SFREC01                      
    C*----------------------------------------------------+ 
    C                   ENDDO
【解説】
   D INGID_PTR       S               *   INZ(%ADDR(*IN))

とは標識の配列 *IN のポインターを INGID_PTR として定義している。
次にそのポインター INGID_PTR を基底として

   D INDICATORS      DS                  BASED(INGID_PTR)  
   D  EOF                   49     49

という INDICATORS というデータ構造を作成して、その 49桁目を EOF としているのだから
EOF というフィールドは標識 : 49 であることを意味する。

    D EOF             S              1N

というように任意の標識として EOF という名前の標識を定義することも可能であるが
DSPF の DDSソースには EOF という名前の標識は使えないので
49番目の標識として定義する必要がある。

さてこのようにして標識 EOF を定義してから

    C                        READ      SHOHIN                              
    C                        IF        %EOF                                
    C                        MOVE      *ON           EOF                   
    C                        LEAVE                                         
    C                        ENDIF

を実行すると商品マスター: SHOHIN の読取りで EOF (%EOF) になったときに
標識 EOF をオンにすることができる。
これで SFLEND の制御と名前による標識による制御と二つのテクニックを紹介したことになる。
今までの標識による制御よりスマートに見えないだろうか ?