*START・*ENDを用いたキーセット

# はじめに

皆さんは、データベースのレコードの読取処理を行う際、どのようにレコードにキーセットを行っていますか？

レコードの読取開始位置が決まっていない場合、*LOVAL ・*HIVAL を使用して、データベースの先頭や終わりからレコードを参照することが多いのではないでしょうか。

今回は、それらの代わりに*START・*END の予約語を用いてキーセットする方法についてご紹介します。

# 使用例

### データイメージ

TESTF は、No. をキーに昇順に並んでいる物理ファイルです。

TESTF
| No. | 名前 | 五十音順 No. |
| :-: | :------: | :----------: |
| １ | 佐藤一郎 | 4 |
| ２ | 佐藤次郎 | 6 |
| ３ | 佐藤三郎 | 5 |
| ４ | 伊藤一郎 | 1 |
| ５ | 伊藤次郎 | 3 |
| ６ | 伊藤三郎 | 2 |

TESTL01 は、TESTF の論理ファイルです。データは、五十音順 No.をキーに降順に並んでいます。

以下、上記のデータを用いた使用例並びに実行結果です。

### 昇順のキーの例

```PF:TESTF
A* レコード名
A          R TESTR                     TEXT(' テストファイル ')
A*
A* キー（データの順序
A          K TESTNBR
```

### 昇順の場合のソースコード例

```rpgle:TEST001R
C                   MOVEL(P)  *BLANK        NUMBER            1
C                   MOVEL(P)  *BLANK        RESULT           40
C     *START        SETLL     TESTF
C                   READ      TESTR                                  90
C   90              GOTO      #END
C                   MOVE      TESTNBR       NUMBER
C                   EVAL      RESULT      = ' № '
C                                         + %TRIMR(NUMBER   )
C                                         + ' は '
C                                         + %TRIMR(TESTNAME )
C                                         + ' です '
C     RESULT        DSPLY
C*
C                   MOVEL(P)  *BLANK        NUMBER
C                   MOVEL(P)  *BLANK        RESULT
C     *END          SETLL     TESTF
C                   READP     TESTR                                  90
C   90              GOTO      #END
C                   MOVE      TESTNBR       NUMBER
C                   EVAL      RESULT      = ' № '
C                                         + %TRIMR(NUMBER   )
C                                         + ' は '
C                                         + %TRIMR(TESTNAME )
C                                         + ' です '
C     RESULT        DSPLY

```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/b692070c-5194-fafa-3c9b-bf9e6ff1348d.png)

---

### 降順のキーの例

```PF:TESTl01
A* レコード　　　　　　　　　　　　　　
A          R TESTR                     PFILE(TESTF  )
A* KEY
A          K TESTKANA                  DESCEND
```

### 降順の場合のソースコード例

```rpgle:TEST001R
C                   MOVEL(P)  *BLANK        NUMBER
C                   MOVEL(P)  *BLANK        RESULT
C     *START        SETLL     TESTL01
C                   READ      TESTR01                                90
C   90              GOTO      #END
C                   MOVE      TESTKANA      NUMBER
C                   EVAL      RESULT      = ' 五十音順№ '
C                                         + %TRIMR(NUMBER   )
C                                         + ' は '
C                                         + %TRIMR(TESTNAME )
C                                         + ' です '
C     RESULT        DSPLY
C*
C                   MOVEL(P)  *BLANK        NUMBER
C                   MOVEL(P)  *BLANK        RESULT
C     *END          SETLL     TESTL01
C                   READP     TESTR01                                90
C   90              GOTO      #END
C                   MOVE      TESTKANA      NUMBER
C                   EVAL      RESULT      = ' 五十音順№ '
C                                         + %TRIMR(NUMBER   )
C                                         + ' は '
C                                         + %TRIMR(TESTNAME )
C                                         + ' です '
C     RESULT        DSPLY
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3070417/e0858791-7a88-f134-4ca9-537c0beebd98.png)

# 注意点

- SETLL の命令のみで使用可能  
  レコード末尾に読取開始位置をセットするとき、感覚的に SELGT を使いそうですが、\*END を使う場合、SETGT ではコンパイルエラーとなってしまうので、SETLL を使用する必要があります。
- 演算項目 2 には、ファイル名を指定  
  SETLL では、ファイル名かレコード名を指定が可能ですが、演算項目 1 に*START や*END を指定する際は、ファイル名の指定しなければなりません。

# 終わりに

今回は、*START・*END を使用したレコードの読取開始位置の設定方法についてご紹介させていただきました。

何点か注意しなければならない点がありますが、*LOVAL・*HIVALとは異なり、データが昇順、降順であることに影響を受けることなく、レコードの先頭または末尾にキーセットすることが可能となります。

最後までお読みいただきありがとうございました。ご参考になれば幸いです。