V7R5 又は PTF適用済み V7R3以上 で使用可能な新組み込み関数(BIF)その名も「%RANGE」!
最近のRPGLE
のアップデートは、FOR EACH
、%LIST
とかリスト系に力を入れていそう。「%RANGE」がどんなもんよ?と調べてみたら、「これ便利か?」って感じでしたが、折角調べたので 爪痕 残しておきます。
使い方
IF 判定値 IN %RANGE(開始値:終了値)
この文法で、判定値
が範囲内にあれば TRUE 、範囲外であれば FALSE です。「オッ、オゥ...」って感じです。
つまりコレってIF 判定値 >= 開始値 AND 判定値 <= 終了値
と同じという...。インパクトが...。まぁ、たまには息抜きも良いでしょう!
コード例
以下にコード例を記載します。
QII0120R.rpgle
C MOVEL(P) *BLANK MSG 48 メッセージ
C Z-ADD 20221201 W#DATE_S 8 0 開始日
C Z-ADD 20221225 W#DATE_E 8 0 終了日
C Z-ADD 20221212 W#TODAY 8 0 本日
C* 従来の比較方法
C IF W#TODAY >= W#DATE_S AND
C W#TODAY <= W#DATE_E
C EVAL MSG = %CHAR(W#TODAY)
C + ' は '
C + %CHAR(W#DATE_S)
C + ' ~ '
C + %CHAR(W#DATE_E)
C + ' 範囲内(従来 '
C MSG DSPLY
C ENDIF
C*
C* V7R5(又はPTF適用済みV7R3以上)
C IF W#TODAY IN %RANGE( W#DATE_S : W#DATE_E )
C EVAL MSG = %CHAR(W#TODAY)
C + ' は '
C + %CHAR(W#DATE_S)
C + ' ~ '
C + %CHAR(W#DATE_E)
C + ' 範囲内(新① '
C MSG DSPLY
C ENDIF
C*
C SETON LR
C RETURN
因みに「%RANGE(範囲)」 とは言っても、引数の順番は、あくまでも 下限値 → 上限値 の順番なので、次の様に引数の順番をひっくり(終了値~開始値)返すと、FALSE
になっちゃいますので、順番は気をつけましょう。
QII0121R.rpgle
C*
C MOVEL(P) *BLANK MSG 48 メッセージ
C Z-ADD 20221201 W#DATE_S 8 0 開始日
C Z-ADD 20221225 W#DATE_E 8 0 終了日
C Z-ADD 20221212 W#TODAY 8 0 本日
C*
C* 範囲の向き反対(これは FALSE になる
C IF W#TODAY IN %RANGE( W#DATE_E : W#DATE_S )
C EVAL MSG = %CHAR(W#TODAY)
C + ' は '
C + %CHAR(W#DATE_S)
C + ' ~ '
C + %CHAR(W#DATE_E)
C + ' 範囲内(新② '
C MSG DSPLY
C ENDIF
また、否定する場合は、全体をカッコで括ります。
QII0122R.rpgle
C*
C MOVEL(P) *BLANK MSG 48 メッセージ
C Z-ADD 20221201 W#DATE_S 8 0 開始日
C Z-ADD 20221225 W#DATE_E 8 0 終了日
C Z-ADD 20231212 W#TODAY 8 0 本日
C*
C* 否定
C IF NOT(W#TODAY IN %RANGE( W#DATE_E : W#DATE_S ))
C EVAL MSG = %CHAR(W#TODAY)
C + ' は '
C + %CHAR(W#DATE_S)
C + ' ~ '
C + %CHAR(W#DATE_E)
C + ' 範囲外(新③ '
C MSG DSPLY
C ENDIF