RPGの画面プログラム作成 その4(サブファイルを使った品名検索)

品名による品目照会プログラム

以下の物理ファイル(PF)、論理ファイル(LF)、表示装置ファイル(DSPF)、RPG3プログラム(RPG)を作成します。
20150914rpg1

物理ファイルと論理ファイルは作成済みです。

表示装置ファイルの作成

SAMPLIB/QDSPSRCにHINFM3を作成し、コンパイルします。

PANEL11をサブファイルレコード、PANEL22をサブファイル制御レコードとして定義します。
サブファイルレコードにはSFLキーワードの指定が必要です。
サブファイルレコードをDDSで記述する場合は画面上の最初のレコード(今回は9行目)だけを指定します。
サブファイル制御レコードにはSFLCTLキーワードの指定が必要です。
サブファイル制御レコードでサブファイルサイズ(メモリ上のレコード数)、サブファイルページ(1画面に表示数)、表示するための条件、個々のフィールドに対する見出しを指定します。

※サブファイルレコードはサブファイル制御レコードの直前に指定します。

RPG3プログラムの作成

SAMPLIB/QRPGSRCにHINRPG3を作成し、コンパイルします。

20150914rpg2

20150914rpg3

RPG3プログラムの実行

HINMSPには51レコードあります。
作成したRPG3プログラムを実行します。
CALL HINRPG3

品名のカナに「リンゴ9」を入力して検索します。
レコードがないため、「該当なし」が表示されます。
20150914rpg4

品名のカナに「リンゴ0」を入力して検索します。
該当レコードは51件ありますが、50件をサブファイルに書き込んだ時点で、サブファイルレコードが一杯になり、51件目のレコードは書き込みしません。
PgUpとPgDnで、プログラムに制御が渡ること無く、ページング処理ができます。
20150914rpg5

ここでF11を押すと、51件目から最大50レコードを読み込みます。
今回は1件しかありません。
20150914rpg6

さらにF11を押すと、次のレコードがないため、「無し」を表示します。
サブファイルは空で表示しようとするとエラーになるので、ダミーのレコードを登録して表示させます。
20150914rpg7

RPGからみると、サブファイルのレコード数やページサイズはわかりません。
RPGでは、サブファイル(のレコード様式)を指定してレコードが一杯になるまで書き込むだけです。
レコードが一杯になったかどうかは書き込んだ後の標識で判断できます。
書き込むときに、相対レコード番号のカウントを+1することで、書き込み件数がわかります。

INFDS 装置固有のフィードバック

上記でサブファイルのレコード数がわからないと書きましたが。 INFDS (File Information Data Structure) を利用すれば可能です。

INFDSを指定するためには、次の記入を行います。

  • ファイル仕様書でファイル情報データ構造の名前と一緒に INFDSキーワードを指定。
  • 定義仕様書で使用したいファイル情報データ構造およびサブフィールドを指定

上記の例ではSFLRCDには、サブファイルのレコード数がはいる。

BRRNはサブファイルに対して入・出力を行うと、そのサブファイル・レコードの RRN(相対レコード番号)が更新されている。 TOPRRN は現在表示されているサブファイルの先頭の SFLレコードの RRNが保管されている。

今回のプログラムではサブファイルレコードのサイズを固定し、いっぱいになるまで最初にデータをサブファイルに書き込んでます。そのあとにユーザーに制御を渡しています。ユーザーはロール・アップやロール・ダウンが自由にできます。

実際にはこのように作ることはないと思います。SFLSIZ を SFLPAG の +1だけ大きく定義しておくと SFL は自動で拡張されます。ロール・アップ要求で新しく次の表示するサブファイルのデータを作成するようにします。

行数が固定の場合は、SFLSIZ = SFLPAG にします(ロールアップ自体不要)。

まとめるとサブファイルの使い方は2通りです。

  • SFLSIZ+1 = SFLPAG(自動拡張、一覧表示など)
  • SFLSIZ = SFLPAG (固定行数、入力フォーマットが固定になる帳票など)
スポンサーリンク
memordmレクタングル(大)
memordmレクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
memordmレクタングル(大)