SETLLとSETGT、READとREADPについて

おはようございます。皆さんはIBMi (AS/400)使っていますでしょうか?

RPGSRC内のファイル操作において、様々な演算命令がありますが、
その中でもREADやREADPなどは使う機会が多いと思います。

私自身。初めてIBMiに触れた時は、このあたりの概念でかなり苦戦した記憶があります。
同じように悩む人が少しでも減るように、READを使ったデータ取得の仕組みについて、簡単にまとめてみようかと思います。

そもそもREADやREADPがどういう事をしてくれるのかと言うと、ファイルのレコードを
・READを使うと「順方向に」、
・READPを使うと「逆方向に」、
それぞれ1件ずつ取得する命令になります。

SQLの様に複数レコードを一括で取得するわけではなく、
例えばREADを使うと現在位置から1件取得、もう一度使うとさらに次の1件を取得……というような動きになります。

ただしファイルを「どこから読み始めるか」は自分で決める必要があります。
これを行うのがSETLLやSETGTという命令になります。
・SETLLでは指定したキー値「以上」の位置にファイルポインタをセットします。
・SETGTでは指定したキー値「より大きい」位置にセットします。

つまり、SETLLやSETGTで「読み取り位置のスタート地点」を決めてから、READやREADPでレコードを取得していく。という形になります。

READ、READP、SETLL、SETGT…
色々と出てきて頭がごちゃごちゃしてきますね。
CHAINなら「位置決め」と「読み取り」が1つの命令で済むのに…

ですが、これらの命令の違いや使い方をしっかり理解しておかないと、
自分が想定していたものとは異なるデータを取得してしまうこともあります。

では実際に使い分けてみると、どのようにデータが取れるのか見てみましょう。

こんなデータをご用意しました。並び順はコードの昇順です。

比較しやすいようにSETLLとSETGTで指定するキーはそら豆のコード「A2001」で固定します

同じキーの値を指定しているのにかかわらず、異なる結果が得られるのが一目瞭然です。