RPGによるコーディング | 会話型処理(3) |
RPGによるコーディング方法を取り上げます。随時増ページの予定です。
本ページは前のページが下敷きになっています。
ウインドウ枠画面を利用した検索処理
画面入力の際、マスター検索をする方法を紹介します。
例として、受注登録の第2画面での得意先コード入力のフィールドでマスター(M420)の検索を想定します。
画面ファイルの改定
検索要求のFキーはF4キーを使用するものとします。F4キーを使えるよう、FMT02にCF04を
追加します。
A R FMT02 TEXT(' 第二画面 ') A OVERLAY PROTECT A CF03 CF04 CF12
第2画面処理での入力後の処理の改定
F4キーがおされたときの処理を追加します。
2.第2画面のとき
マスターのデータ部分取得のための画面を表示します。
第2画面から入力を取得します。
2.1 F04キーのとき、検索処理をします。
(外部プログラムを呼び出します)
2.2 F12キーのとき、第1画面への番号にします。
2.3 実行キーのとき入力チェックをします。
結果OKなら第3画面への画面番号にします。
実際には内部サブルーチンSB2220を追加し、その中で検索プログラムの呼出し等を行います。
| C* 画面表示 | C WRITEFMT99 | C WRITEFMT01 | C EXFMTFMT02 | C MOVE *BLANK S9MSG | C* | C SELEC | C *INKD WHEQ *ON 取消キー | C EXSR SB2220 検索処理 | C *INKL WHEQ *ON 取消キー | C Z-ADD01 W@FMT | C OTHER | C EXSR SB2230 入力 チェック | C ENDSL
検索処理の内容は次のようになります。
1.カーソル位置を取得します。
2.カーソル位置が得意先コードのフィールドなら、外部の検索プログラムを呼び出します。
(すなわち、受注登録のプログラムと検索プログラムはまったく独立したプログラムです。)
結果の得意先コードがブランクでなければ、画面フィールドにセットします。
コーディングは次のようになります。
C* SB2220 検索処理 C*--------------------------------------------------------------- C SB2220 BEGSR C* C* カーソル位置の獲得 C MOVELWSLIN WSLINC 行 C MOVELWSCOL WSCOLC 桁 C* 検索プログラム呼出し C WSLINB IFEQ 004 行 C WSCOLB IFGE 011 桁 FROM C WSCOLB ANDLE015 桁 TO C MOVELS2TKNO P@TKNO 得意先 CODE C CALL 'KM420' 検索 プログラム C PARM P@TKNO 5 C PARM P@NMKN 20 C* 戻りの得意先コードがブランクでなければ画面にセットする。 C P@TKNO IFNE *BLANK C MOVELP@TKNO S2TKNO C ENDIF C ENDIF C ENDIF C* C ENDSR
検索プログラム
検索プログラムは画面にマスターのレコードを表示し、選択された行のコードを戻り値として
呼出し側に返します。
検索プログラムに要求されることは、次のとおりです。
1.マスターのレコードが大量にあっても処理できること。
2.前後に簡単にスクロールして表示できること。
3.コード順だけでなく、他のキー順でも処理できること。
4.できるだけ現在の画面の邪魔にならないようにPOPアップ(重ね表示)の形の画面のこと。
前準備
検索のための画面
ウインドウ枠機能を使って画面を構成します。画面の大きさは、17行x55カラムです。
境界は*の文字を使用してあらわします。
00000000001111111111222222222233333333334444444444555555555566666666667777777777 *********************************************************** * 得意先マスター検索 * * * * コード 得意先カナ * * 番号を入力して下さい 0 * * NO コード 得意先名称 * * 1 11111 一番星運送株式会社・・・・・・・・・・; * * 2 11112 二番千時興業株式会社・・・・・・・・・; * * 3 11113 三羽ガラス工業株式会社・・・・・・・・; * * 4 11114 四天王寺商店・・・・・・・・・・・・・; * * 5 11115 五目ちらし印刷株式会社・・・・・・・・; * * 6 11116 六地蔵農機具販売株式会社・・・・・・・; * * 7 11117 七福神プレス有限会社・・・・・・・・・; * * 8 11118 八つ当り食品産業株式会社・・・・・・・; * * 9 11119 九層倍薬品販売株式会社・・・・・・・・; * * F3= 終了 * * * * * *********************************************************** 00000000001111111111222222222233333333334444444444555555555566666666667777777777
ウインドウ枠
ウインドウ枠は、WINDOWパラメータとWDWBORDERパラメータで定義します。
WINDOWは枠の位置と大きさを、WDWBORDERは境界として使用する文字とその属性
を記述します。上記のウインドウ枠の記述は次のようになります。
A* WIN01 : ウインドウ枠宣言 A R WIN01 TEXT(' ウインドウ枠宣言 ') A WINDOW( 5 11 17 55) A WDWBORDER((*DSPATR RI) + A (*CHAR '********')) A*---------------------------------------------------------------* A R WIN02 TEXT('DUMMY') A ASSUME A 24 79' '
ウインドウ枠つきの画面を通常に表示するとそれまで表示されていた画面はクリアされてしまいます。
このクリアを抑止するのが、ASSUMEパラメータです。
このパラメータは別の様式に定義しておくだけで、プログラムで出力する必要はありません。
検索のためのウインドウ画面で必要な様式は、つぎのようになります。
* サブファイル制御部分(CTL01):タイトル行から項目見だしの行まで。
* サブファイルの部分(SFL01):明細の9行分
* キーガイドとエラーメッセージ部分部分(FMT99)
* ウィンドウ枠宣言部分(WIN01)
* ASSUMEの部分(WIN02)
検索プログラム
検索プログラムは次のような仕様とします。
検索画面を表示します。
得意先コードのフィールドに入力あれば、得意先コード順のファイルを検索し、そのコードから
順に9件表示します。得意先カナのフィールドに入力があれば、カナ順のファイルを読取りし、
入力されたカナから順に9件表示します。
両方に入力されたときは得意先コードを優先します。
ロールダウンキーが押されたときは、位置から後続9件分を表示します。
ロールアップキーがおされたときは、現在の位置から前9件分を表示します。
番号選択に数字が入力されたなら、その行を選択したものとして、その得意先コードをパラメータ
にセットして呼び出しもとにもどります。
制御仕様書
省略します。
ファイル仕様書
検索画面ファイル
サブファイルを使用する会話型ファイルとして記述します。
コード順得意先マスター(M420)、カナ順得意先マスター(M420L01)は同じレコード
様式名なので、一方(M420L01)をリネームします。
コーディングは次のようになります。
F*-------------------------------------------------------------- F* 検索画面 FKM420S CF E WORKSTN F RRN KSFILE SFL01 F* 得意先マスター FM420 IF E K DISK F* F* 得意先マスター L01 カナ 順 FM420L01 IF E K DISK F M420R KRENAMEM420R01
制御用の画面番号
画面は1枚だけですが、画面番号による会話型処理の制御のパターンを踏襲します。
サブファイル用の相対レコード番号(RRN)とページあたりの行数
入力仕様書で記述します。演算仕様書で記述しても差し支えありません。
コーディングは以下のようになります。
I* コントロールフラグ IWFLG DS I I 1 1 20W@FMT I* サブファイル用 I DS I I 0 P 1 30RRN I I 9 P 4 50WSPAG
キーリスト
コード順、カナ順に読み取りするためのキーリストを記述しておきます。
C* 得意先マスター C KLST01 KLIST C KFLD TKTKNO 得意先 CD C* 得意先マスター L01 C KLST02 KLIST C KFLD TKNMKN 得意先 (カナ)
基本的ロジック
画面番号(W@FMT)で繰り返しを制御します。
C EXSR SBINZ 初期設定処 C* +----C W@FMT DOWEQ01 | C EXSR SB1000 第1画面処 +----C ENDDO C* C EXSR SBEND 終了処理
初期設定
初期設定では、パラメータで与えられたコードによってファイルを読取り、サブファイルにセットします。
また、ウインドウ枠の様式の出力を行います。
C SBINZ BEGSR C* C Z-ADD000 N 70 C* キーのセット C MOVELP@TKNO S1TKNO 得意先 CD C MOVELP@TKKN S1NMKN 得意先 (カナ) C* マスター読取り C EXSR SBCSFL SFLINZ C EXSR SB1220 C MOVELMSG,01 S1MSG MSG C* ウィンドウ枠定義レコード出力 C WRITEWIN01 WINDOW 枠 C* C ENDSR
第一画面処理(検索画面処理)
検索画面を表示し、入力によって、終了・ロールダウン・ロールアップ・選択終了の処理をします。
入力後の処理
1.F3、F12キー
F3、F12キーのときは処理中断とし、得意先コードはブランクに、画面番号を0にします。
2.前ページ処理
ロールダウンのときは、内部サブルーチンSB1210を呼出し前ページ処理をします。
3.ロールアップ
ロールアップのときは、内部ルーチンSB1220を呼出し次ページ処理をします。
4.実行キー
実行キーのときは、SB1230を呼出します。
コーディングは次のようになります。
C* SB1000 第1画面処理 C*-------------------------------------------------------------- C SB1000 BEGSR C* C* 第1画面ループ処理 +----C W@FMT DOWEQ01 | C* 画面出力 | C WRITEFMT99 CMDキーガイド | C SETON 24 | C EXFMTCTL01 サブファイル 画 | C SETOF 24 | C* 入力処理 |+---C SELEC || C* F3 (終了) ,F12 (前画面) |+---C *INKC WHEQ *ON F3 = ON || C *INKL OREQ *ON F12= ON || C MOVEL*BLANK P@TKNO 得意先 CD || C MOVEL*BLANK P@TKKN 得意先 カナ || C Z-ADD000 W@FMT || C* ROLLDOWN (前頁) |+---C *IN07 WHEQ *ON ROLLDOWN || C EXSR SB1210 前頁処理 || C* ROLLUP (次頁) |+---C *IN08 WHEQ *ON ROLLUP || C EXSR SB1220 前頁処理 || C* (実行キー処理) |+---C OTHER || C EXSR SB1230 実行キー処 |+---C ENDSL | C* +----C ENDDO C* C ENDSR
次ページ処理
次ページ処理は現在表示されているレコードの次の9件を読取り表示します。
このために、サブファイルを初期化し、ついで読み取りしたマスターのレコードをサブファイルに
出力します。サブファイル初期化なので、CHAINとUPDATで出力します。
マスターの読取りはコード順とカナ順の2種類がありますが、どちらを読むべきかはインテリジェンスを
持たせた内部サブルーチンSBREADにまかせます。
コーディングは次のようになります。
C* SB1220 次ページ分処理 C*-------------------------------------------------------------- C SB1220 BEGSR C* C* サブファイル初期化 C EXSR SBCSFL C* +----C 001 DO WSPAG RRN | C* | C RRN CHAINSFL01 98 | C Z-ADDRRN S2NO 行 | C EXSR SBREAD | C* |+---C *IN99 IFEQ *OFF || C MOVELTKTKNO S2TKNO コード || C MOVELTKNMKJ S2NMKJ 得意先名称 || C UPDATSFL01 |+---C ENDIF +----C ENDDO C* C ENDSR
前ページ処理
ロールダウンキーのとき行う前ページ処理は、現在位置から2ページ分のレコードを逆読みし、ついで、
そこから1ページ分順読みするという小技を使います。順読みの部分とサブファイルへセットの部分は、
先の次ページ処理が流用できるからです。
コード順、カナ順どちらのファイルを逆読みするかは、インテリジェンスを持たせた内部サブSBREDPに
まかせます。途中で先頭まで行き着いたときは逆読みをやめ、そこから順よみということになります。
コーディングは次のようになります。
C* SB1210 前ページ処理 C*------------------------------------------------------------- C SB1210 BEGSR C* C* 2ページ分さかのぼる C WSPAG MULT 002 N +----C DO N | C EXSR SBREDP |+---C *IN99 IFEQ *ON /====C LEAVE |+---C ENDIF +----C ENDDO C* 読取りとセット C EXSR SB1220 サブファイル C* C ENDSR
実行キーのときの処理
実行キーの場合は、得意先が行番号で選択された(0でない)場合とそうでない場合にわかれます。
選択された場合は、その行のサブファイルをよみとり、その得意先コードをパラメータにセットします。
選択されてない場合は、画面から入力されたコードもしくはカナでファイルに位置付けし、レコード
9件分を読取りしてサブファイルにセットします。
コーディングは次のようになります。
C* SB1230 実行キー処理 C*-------------------------------------------------------------- C SB1230 BEGSR C* +----C S1SLT IFEQ 000 SELECT | C MOVELS1TKNO TKTKNO 得意先 CD | C MOVELS1NMKN TKNMKN 得意先 (カナ) | C EXSR SBSTLL 位置付け | C EXSR SB1220 明細編集 +----C ELSE | C S1SLT CHAINSFL01 90 | C MOVELS2TKNO P@TKNO 得意先 CD | C MOVEL*BLANK P@TKKN 得意先 カナ | C Z-ADD00 W@FMT +----C ENDIF C* C ENDSR
全体のコーディングは次のようになります。
**-------------------------------------------------------------- ** ID : KM420 ** NAME :得意先マスター検索 **-------------------------------------------------------------- H Y- 1 F*-------------------------------------------------------------- F*検索画面 FKM420S CF E WORKSTN F RRN KSFILE SFL01 F*得意先マスター FM420 IF E K DISK F* F*得意先マスターL01 eサ順 FM420L01 IF E K DISK F M420R KRENAMEM420R01 E*-------------------------------------------------------------- E MSG 1 2 50 ERR MSG I*-------------------------------------------------------------- I*コントロールフラグ IWFLG DS I I 1 1 20W@FMT I* サブファイル用 I DS I I 0 P 1 30RRN I I 9 P 4 50WSPAG C*-------------------------------------------------------------- C*パラメータ C *ENTRY PLIST C PARM P@TKNO 5 得意先CD C PARM P@TKKN 20 得意先カナ C*-------------------------------------------------------------- C*KEY LIST C*得意先マスター C KLST01 KLIST C KFLD TKTKNO 得意先CD C*得意先マスターL01 C KLST02 KLIST C KFLD TKNMKN 得意先カナ C*-------------------------------------------------------------- C* MAIN ROUTINE C*-------------------------------------------------------------- C* 初期設定 C EXSR SBINZ 初期設定処 C* +----C W@FMT DOWEQ01 | C EXSR SB1000 第1画面処 +----C ENDDO C* C EXSR SBEND 終了処理 C*-------------------------------------------------------------- C* SBINZ 初期設定 C*-------------------------------------------------------------- C SBINZ BEGSR C* C Z-ADD000 N 70 C*キーのセット C MOVELP@TKNO S1TKNO 得意先CD C MOVELP@TKKN S1NMKN 得意先カナ C*読取り C EXSR SBCSFL SFLINZ C EXSR SB1220 C MOVELMSG,01 S1MSG MSG C*ウィンドウ定義レコード出力 C WRITEWIN01 WINDOW枠 C* C ENDSR C*-------------------------------------------------------------- C* SB1000 第1画面処理 C*-------------------------------------------------------------- C SB1000 BEGSR C* C* 第1画面ループ処理 +----C W@FMT DOWEQ01 | C*画面出力 | C WRITEFMT99 CMDfーe゙aq゙ | C SETON 24 | C EXFMTCTL01 | C SETOF 24 | C*入力処理 |+---C SELEC || C* F3(終了),F12(前画面) |+---C *INKC WHEQ *ON F3 = ON || C *INKL OREQ *ON F12= ON || C MOVEL*BLANK P@TKNO 得意先CD || C MOVEL*BLANK P@TKKN 得意先カナ || C Z-ADD000 W@FMT || C* ROLLDOWN(前頁) |+---C *IN07 WHEQ *ON ROLLDOWN || C EXSR SB1210 前頁処理 || C* ROLLUP (次頁) |+---C *IN08 WHEQ *ON ROLLUP || C EXSR SB1220 前頁処理 || C*(実行キー処理) |+---C OTHER || C EXSR SB1230 実行キー処 |+---C ENDSL | C* +----C ENDDO C* C ENDSR C*-------------------------------------------------------------- C* SB1210 前ページ処理 C*-------------------------------------------------------------- C SB1210 BEGSR C* C*2ページ分さかのぼる C WSPAG MULT 002 N +----C DO N | C EXSR SBREDP |+---C *IN99 IFEQ *ON *====C LEAVE |+---C ENDIF +----C ENDDO C*読取りとセット C EXSR SB1220 C* C ENDSR C*-------------------------------------------------------------- C* SB1220 次ページ分処理 C*-------------------------------------------------------------- C SB1220 BEGSR C* C* サブファイル初期化 C EXSR SBCSFL C* +----C 001 DO WSPAG RRN | C* | C RRN CHAINSFL01 98 | C Z-ADDRRN S2NO 行Y | C EXSR SBREAD | C* |+---C *IN99 IFEQ *OFF || C MOVELTKTKNO S2TKNO コード || C MOVELTKNMKJ S2NMKJ 得意先名称 || C UPDATSFL01 |+---C ENDIF +----C ENDDO C* C ENDSR C*-------------------------------------------------------------- C* SB1230 実行キー処理 C*-------------------------------------------------------------- C SB1230 BEGSR C* +----C S1SLT IFEQ 000 SELECT | C MOVELS1TKNO TKTKNO 得意先CD | C MOVELS1NMKN TKNMKN 得意先カナ | C EXSR SBSTLL 位置付け | C EXSR SB1220 明細編集 +----C ELSE | C S1SLT CHAINSFL01 90 | C MOVELS2TKNO P@TKNO 得意先CD | C MOVEL*BLANK P@TKKN 得意先カナ | C Z-ADD00 W@FMT +----C ENDIF C* C ENDSR C*-------------------------------------------------------------- C* SBSTLL ファイル位置付け処理 C*-------------------------------------------------------------- C SBSTLL BEGSR C* +----C S1TKNO IFGT *BLANK | C S1NMKN OREQ *BLANK | C KLST01 SETLLM420R +----C ELSE | C KLST02 SETLLM420R01 +----C ENDIF C* 第1・2キーとも入力なし +----C S1TKNO IFEQ *BLANK | C S1NMKN ANDEQ*BLANK | C *LOVAL SETLLM420R +----C ENDIF C* C ENDSR C*-------------------------------------------------------------- C* .SBREAD マスターREAD処理 C*-------------------------------------------------------------- C SBREAD BEGSR C*コード順で読み取り +----C S1TKNO IFGT *BLANK | C S1NMKN OREQ *BLANK | C READ M420R 99 |+---C *IN99 IFEQ *ON || C *HIVAL SETGTM420R 位置付け |+---C ENDIF | C*カナ順で読み取り +----C ELSE | C READ M420R01 99 |+---C *IN99 IFEQ *ON || C *HIVAL SETGTM420R01 位置付け |+---C ENDIF | C* +----C ENDIF C* C ENDSR C*-------------------------------------------------------------- C* SBREDP マスターREADP処理 C*-------------------------------------------------------------- C SBREDP BEGSR C* C*コード順で逆読み取り +----C S1TKNO IFGT *BLANK | C S1NMKN OREQ *BLANK | C READPM420R 99 |+---C *IN99 IFEQ *ON || C *LOVAL SETGTM420R 位置付け |+---C ENDIF | C*カナ順で逆読み取り +----C ELSE | C READPM420R01 99 |+---C *IN99 IFEQ *ON || C *LOVAL SETGTM420R01 位置付け |+---C ENDIF | C* +----C ENDIF C* C ENDSR C*-------------------------------------------------------------- C* .SBCSFL サブファイル初期化処理 .SBCSFL C*-------------------------------------------------------------- C SBCSFL BEGSR C* C SETON 21 C WRITECTL01 SFL初期化 C SETOF 21 C* C ENDSR C*-------------------------------------------------------------- C* SBEND 終了処理 C*-------------------------------------------------------------- C SBEND BEGSR C* C SETON LR C RETRN C* C ENDSR ** MSG ** 行番号で選択してください。 予備
前ページ 次ページ 目 次
(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003