1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ILERPGAdvent Calendar 2022

Day 12

新組み込み関数 %RANGE !

Last updated at Posted at 2022-12-11

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
1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?