新組み込み関数 %RANGE ！

**V7R5** 又は PTF適用済み **V7R3以上** で使用可能な新組み込み関数（**BIF**）その名も「**%RANGE**」！
最近の`RPGLE` のアップデートは、`FOR EACH`、`%LIST` とかリスト系に力を入れていそう。「**%RANGE**」がどんなもんよ？と調べてみたら、「これ便利か？」って感じでしたが、折角調べたので **爪痕** 残しておきます。

#### 使い方

`IF 判定値 IN %RANGE(開始値:終了値)` この文法で、`判定値`が範囲内にあれば **TRUE** 、範囲外であれば **FALSE** です。「オッ、オゥ...」って感じです。
つまりコレって`IF 判定値 >= 開始値 AND 判定値 <= 終了値`と同じという...。インパクトが...。まぁ、たまには息抜きも良いでしょう！

#### コード例
以下にコード例を記載します。

```rpgle: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*  Ｖ７Ｒ５（又はＰＴＦ適用済みＶ７Ｒ３以上）
     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`になっちゃいますので、順番は気をつけましょう。

```rpgle: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

```

また、否定する場合は、全体をカッコで括ります。
```rpgle: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
```