複数キーがある場合のREADEの使い方について教えてください。現在、RPG3の勉強中なのですが、資料などを確認しても解らないので質問させていただきます。例えばキーがKEY1-3の3つあるとして、その内KEY1-2の2つが等しくKEY3が異なる全レコードに対して処理を行う場合はどのような記述をすればいいのでしょうか。例えば、以下のようなレコードがあるとして、KEY1=B かつ KEY2=ABD のレコードに対してのみ処理を行いたいとします。この場合、対象となるのは5番と6番のレコードです。--------------------KEY1 KEY2 KEY3 番号A ABC 100 1A ABC 200 2A ABD 300 3B ABC 100 4B ABD 120 5B ABD 300 6C ABC 100 7C ABD 150 8C ABE 300 9--------------------最初はKLISTにKEY1とKEY2を指定して演算項目1に指定して読み込めば大丈夫なのかと思いましたが、これをやると、5番目のレコードは読み込むのですが、6番目のレコードは読み込んでくれません。原因はKEY3が5番と6番で異なるからだとお思います。なにかワイルドカード的なものをKEY3に指定すればいいのかと考えましたが、ワイルドカードを指定する方法が見つかりません。色々なサイトでREADEはSETLLとセットで使用するものだという情報も得ましたが、SETLLの演算項目1にKLISTを指定すると、5番目を読み込んだ後にまた5番目の位置に位置決めしてしまいループが止まりません。なのでSETGTでも試しましたが、コレをやると5番目すら読み込んでくれなくなりました。このような場合、どのようにREADEを使用すれば、KEY1-2が等しいレコードだけを読み込み対象にしてくれるのでしょうか?ご教示いただければ幸いです。
下記のような例になります。つまり 上位2つのキー・フィールドを組み合わせたキー・リスト EQLKEY によってREADE するとお望みの実行となります。0001.00 C*----------------------------------------------------+ 0002.00 C SETKEY KLIST 0003.00 C KFLD KEY1 0004.00 C KFLD KEY2 0005.00 C KFLD KEY3 0006.00 C*----------------------------------------------------+ 0007.00 C MOVE *LOVAL KEY3 0008.00 C SETKEY SETLLFILE 0009.00 C*----------------------------------------------------+ 0010.00 C EQLKEY KLIST 0011.00 C KFLD KEY1 0012.00 C KFLD KEY2 0013.00 C*----------------------------------------------------+ 0014.00 C DO *HIVAL 0015.00 C SETOF 50 0016.00 C EQLKEY READEFILE 50 0017.00 C 50 LEAVE 0018.00 C END
SETLLは位置決めの為に一度行うものです。KEY1=B・KEY2=ABDの位置から読み始めなさい、とPGMに命令してます。ファイルにKEY3まで定義してあったとしても、KEY1・KEY2をキーリストに定義しSETLL・READEで問題ありません。むしろ今回の処理では、記述しない方がすっきりします。SETLL・READEでDOで回した時、に該当する一件目しか読み込まないというのであれば、ロジックを見直した方がいいかと思います。キーリスト KEY001 KLIST KFLD KEY1 KFLD KEY2パターン1・・・IKDさんの記述した*HIVAL KEY001 SETLLFILEA DO *HIVAL KEY001 READEFILEA 9090 LEAVE 処理 ENDDOパターン2・・・DOWEQ KEY001 SETLLFILEA KEY001 READEFILEA 90 *IN90 DOWEQ*OFF 処理 KEY001 READEFILEA 90 ENDDOパターン3・・・DOUEQ KEY001 SETLLFILEA *IN90 DOUEQ*ON KEY001 READEFILEA 90 *IN90 IFEQ *ON 処理 ELSE 処理 ENDIF ENDDOこの何れかに該当するようロジックを見直してください。DOの回し方は好みが分かれるところですが、それぞれ特性を生かした記述を心がけて下さい。極力余計な記述をさけ、特性を生かしメンテナンスの向上を意識しましょう。尚、CHAIN・LOKUP・READなどの命令直前でフラグを*OFFにする必要もありません。
位置がずれて見づらくてすいません。