7.12.RPGサイクルと使用の実際 |
RPGは便利だし、作成も楽だし、ソースが短くて保守も楽だけど、問題は、勝手にファイルオープンして、全レコードを対象としてしまうので、下手すると時間がかかることがあるのです。例えば、10万件のデータの最後の100件の処理では、サイクルだと、99,900件を読み飛ばすのです。これでは、いくら便利でも、使いたくないですよね。 これを解決する手段は2つ。 対象ファイルをあらかじめ中間ファイルに作成してから、サイクルプログラムを使う。 中間ファイルの作成は、
といろいろあるのですが、この中でもっとも実行効率がいいのは、FMTDTAです。でも、中間ファイルを作るのは、中間ファイルのDDSを登録したり、開発のテストでバグが出やすいし、何よりCPYF以外は、固定的な値でしかデータ選択できません。 OPNQRYF + RPG CYCLE です。
OVRDBF file qtemp/file SHARE(*YES) OPNQRYF file QRYSLT('fld=%RANGE(100 500)') KEYFLD(*FILE) CALL pgm (サイクル) CLOF file MONMSG CPF0000 DLTOVR file でおわり。 QRYSLTで「データ選択」、 各々変数で指定可能ですので、起動画面で、何順と指定して、その内容をKEYFLDで指定したり、年月日を指定して、
fldが数字の場合...OPNQRYF file QRYSLT('fld=%RANGE(' |< &str |> &end |< ')')
KEYFLD(*FILE) おのおの &STRが10で&ENDが100ならば、上の式は、実行中に以下のようになります。 fldが数字の場合...OPNQRYF file QRYSLT('fld=%RANGE(10 100) ')KEYFLD(*FILE) 尚、QRYSLT内は文字列なので、それを合成するために、&strや&endはCLPのなかでは文字(DCL
&str *CHAR 3)です。 注意事項QRYSLTの内容は、フィールドの属性をきちんと反映させた文字列です。ここがよく分からない人がよくいますが、ほんとに単純です。 例えば、 迷う人は、どうやらQRYSLTが文字列である、と言う点と、文字フィールドの選択の内容とが、CLPの中でごっちゃになってしまっているようです。あくまで、選択内容を表す、QRYSLTは文字列なのです。その文字列の中が、ファイルのフィールドの属性によって記述が違うだけなのです。 CLOFは必須です。これがないと、プログラムがエラーでLRオンにしないで終了すると、SHARE(*YES)なので、ファイルオープンのままです。対話型だと困ります。バッチでこのまま終了してくれれば、ジョブ終了時に、ファイルはクローズされます。RCLRSCもいいかも。 OVRDBF file qtemp/file SHARE(*YES) OPNQRYF file QRYSLT('fld=%RANGE(500 1000)') KEYFLD(*FILE) CALL pgm1 POSDBF file (*FIRST) CALL pgm2 CLOF file MONMSG CPF0000 DLTOVR file となります。 OVRDBF fileA fileB SHARE(*YES) また、QRYSLTはさまざまな関数を持っています。RANGE,VALUESは頻繁に利用します。「データ管理機能」のマニュアルに詳しくでています。 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||