最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

7.12.RPGサイクルと使用の実際

[ Previous ] [ HOME ] [ Upper ] [ Next ]


RPGは便利だし、作成も楽だし、ソースが短くて保守も楽だけど、問題は、勝手にファイルオープンして、全レコードを対象としてしまうので、下手すると時間がかかることがあるのです。例えば、10万件のデータの最後の100件の処理では、サイクルだと、99,900件を読み飛ばすのです。これでは、いくら便利でも、使いたくないですよね。

これを解決する手段は2つ。

対象ファイルをあらかじめ中間ファイルに作成してから、サイクルプログラムを使う。
OPNQRYFをしてからサイクルプログラムを使う。きっと、OS内部的には同じことです。

中間ファイルの作成は、

  • プログラムによる、
  • FMTDTAによる、
  • CRTLFで選択による、
  • CPYFによる

といろいろあるのですが、この中でもっとも実行効率がいいのは、FMTDTAです。でも、中間ファイルを作るのは、中間ファイルのDDSを登録したり、開発のテストでバグが出やすいし、何よりCPYF以外は、固定的な値でしかデータ選択できません。
そこで、お勧めは、

OPNQRYF + RPG CYCLE

です。

実行効率は、FMTDTAと同じレベル(らしい)です。現在の開発で、バッチ系はほとんどこれです。
OPNQRYFはS/38のリリース7からで、発表当初は何だこれ?で、特約店内でもみんな、うん?という感じでしたが、今では、すごいなこれです。そもそも、RPG CYCLEで、データ選択というと、アドレスファイルと言われたものですが、(私はやったことない!)、自分は今にいたるまで、これをしているプログラムは見たことなく、アドレスファイルによるデータ選択は、超マイナーでした。だから、中間ファイル+サイクルまたは全手順がほとんどでした。(ちなみに、選択キーがキーとなる論理ファイルがあるのならば、OPNQRYF+サイクルよりも、全手順が圧倒的に早いです。OSがソートを予めしているので当たり前です。)この状況では、OPNQRYFはぴか一の優れものだったのです。(今でも)。


利用手順は、簡単です。

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で「キー順」の指定です。

各々変数で指定可能ですので、起動画面で、何順と指定して、その内容をKEYFLDで指定したり、年月日を指定して、
QRYSLTでデータ選択(抽出)をしたり、便利便利。これで、中間ファイルから開放されます。



上の、QRYSLTの内容を変数にするには、

fldが数字の場合...OPNQRYF file QRYSLT('fld=%RANGE(' |< &str |> &end |< ')') KEYFLD(*FILE)
fldが文字の場合...OPNQRYF file QRYSLT('fld=%RANGE(" ' |< &str |< ' " " ' |< &end |< ' ") ' ) KEYFLD(*FILE)

おのおの &STRが10で&ENDが100ならば、上の式は、実行中に以下のようになります。

fldが数字の場合...OPNQRYF file QRYSLT('fld=%RANGE(10 100) ')KEYFLD(*FILE)
fldが文字の場合...OPNQRYF file QRYSLT('fld=%RANGE("10"  "100") ')   KEYFLD(*FILE)実行中に、ジョブログを見ていると分かります。

尚、QRYSLT内は文字列なので、それを合成するために、&strや&endはCLPのなかでは文字(DCL &str *CHAR 3)です。
&str,&endを数字フィールドで定義すると、コンパイルでエラーになりますので気づきます。


注意事項

QRYSLTの内容は、フィールドの属性をきちんと反映させた文字列です。ここがよく分からない人がよくいますが、ほんとに単純です。
要は、この文字列をOSが判定して、選択その他の関数を実行するのです。その際、参照するフィールドが数字か文字かで記述が違うだけです。

例えば、
フィールドAが数字で、10のものを抽出したければ、QRYSLT('A=10') となります。
フィールドAが文字で、10のものを抽出したければ、QRYSLT(' A="10" ') となります。("はシングルコーテーションx2のこととして、QRYSLTに例外的に認められたルールです。"はCLPでは固定情報内部以外では使えません。)

迷う人は、どうやらQRYSLTが文字列である、と言う点と、文字フィールドの選択の内容とが、CLPの中でごっちゃになってしまっているようです。あくまで、選択内容を表す、QRYSLTは文字列なのです。その文字列の中が、ファイルのフィールドの属性によって記述が違うだけなのです。
つまり、QRYSLT(&QRYSLT)とした場合、&QRYSLTは文字列として定義します。(だって、QRYSLTの中身は文字なんだもん)。その&QRYSLTにデータをセットするとき、指定の値を、文字ならば"で括るし、数字はそのままむき出しでセットするのです。
KEYFLDもフィールド名を指定できます。ここは変数にしても可能です。その変数の値は、フィールド名そのものです。

CLOFは必須です。これがないと、プログラムがエラーでLRオンにしないで終了すると、SHARE(*YES)なので、ファイルオープンのままです。対話型だと困ります。バッチでこのまま終了してくれれば、ジョブ終了時に、ファイルはクローズされます。RCLRSCもいいかも。
立て続けに、OPNQRYFでオープンしたファイルを参照するプログラムを呼び出す場合は、POSDBFを使います。

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                      

となります。
そうそう、pgm1、pgm2で参照されるファイルは、OVRDBFでSHARE(*YES)されていて、かつ、OPNQRYFで参照されなければ、うまく動きません。システムがオープンしたファイルをpgm1は、共用オープンしなくては意味がないのです。
それから、以下はOKです。

OVRDBF  fileA  fileB SHARE(*YES)
OPNQRYF fileA ....
 
で、ファイル  fileB がオープンされます。  

また、QRYSLTはさまざまな関数を持っています。RANGE,VALUESは頻繁に利用します。「データ管理機能」のマニュアルに詳しくでています。


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送