RPGによるコーディング | 会話型処理(1) |
RPGによるコーディング方法を取り上げます。随時増ページの予定です。
画面ファイルを使用した会話型処理
ここでは画面からの入力によって、得意先マスターファイル(M420)を更新するケースを
想定します。レコードの追加、変更、削除の処理をまとめて更新ということにします。
シナリオ(ロジック)
会話型処理の方法はいろいろなやりかたがありますが、ここでは、第1画面、第2画面、・・・と
進行し、処理が正常に終了すれば、また第1画面に戻るというシナリオで話しをすすめます。
この方法だと、各画面の独立性が高く、処理も簡単で、デバッグなどにおいて注意を配る
必要のある範囲が広がらないという利点があります。そのロジックは次のようになります。
終了キー(F3キー)が押されるまで以下の処理を繰り返します。
画面番号により以下の処理
1.第一画面のとき
マスターファイル更新のキー部分を取得のための画面を表示します。
第一画面から入力を取得します。
1.1 F3キーのとき、プログラム終了します。
1.2 F6キーのとき、処理モードを切替します。
1.3 実行キーのとき、入力チェックをします。
OKなら第二画面への画面番号にします。
2.第二画面のとき
マスターのデータ部分取得のための画面を表示します。
第二画面から入力を取得します。
2.1 F12キーのとき、第一画面への番号にします。
2.2 実行キーのとき入力チェックをします。
結果OKなら更新確認状態にします。
結果OKですでに更新確認状態であれば、ファイルを更新します。
画面番号を1にします。
ここで説明するのは、第1・第2の2枚の画面のケースですが、この方法では画面が何枚ふえても、
第3画面のとき、第4画面のとき、・・・のようにプログラムを拡張してゆくことができます。
プログラム作成の前準備
RPGプログラムを作成するまえに、プログラムが必要とするファイルを作成しておく必要があ
ります。ここでは、画面ファイル(RM420S)と、マスターファイル(M420)です。
画面ファイル
画面ファイルは以下のような2枚の画面からなるものとします。
第1画面(キー部分入力画面)
RM420 追加 得意先マスター更新 0/08/21 12:02:11 得意先 F3= 終了 F6= 処理選択
第2画面(データ部分入力画面)
RM420 追加 得意先マスター更新 0/08/21 12:02:34 得意先 55555 得意先名 五目そば商店株式会社 カナ名称 ゴモクソバショウテン(カブ) TEL 05-5555-5555 担当営業 5555 売上実績 F12= 取消
この画面の定義記述(DDS)は次のようになります。
A*----------------------------------------------------------- A* ID : RM420S A* NAME : 得意先マスター更新画面 A*----------------------------------------------------------- A INDARA A R FMT01 OVERLAY PROTECT A CF03 CF06 A* A S1PGID 10A O 1 2 TEXT('PGM-ID') A S1MOD 6O +1 TEXT(' 処理モード ') A 1 31' 得意先マスター更新 ' A DSPATR(RI) A 1 61 DATE EDTCDE(Y) A 1 71 TIME A* A 3 2 ' 得意先 ' A S1TKNO 5A B +1TEXT(' 得意先 ') A 31 DSPATR(PC RI) A R FMT02 OVERLAY PROTECT A CF12 A CHANGE(29) A* A 5 2 ' 得意先名 ' A S1NMKJ 42O B +1TEXT(' 得意先名 ') A 32 DSPATR(PC RI) A 28 DSPATR(PR) A 6 2 ' カナ名称 ' A S1NMKN 20A B +1TEXT(' カナ名称 ') A 33 DSPATR(PC RI) A 28 DSPATR(PR) A 7 2 ' TEL ' A S1TEL 12A B +1TEXT(' TEL ') A 28 DSPATR(PR) A 8 2 ' 担当営業 ' A S1SLNO 4A B +1TEXT(' 担当営業 ') A 28 DSPATR(PR) A 9 2 ' 売上実績 ' A S1URGK 11Y 0O +1TEXT(' 売上実績 ') A EDTCDE(K) A*----------------------------------------------------------- A R FMT99 A 01 23 2 'F3= 終了 F6= 処理選択 ' A 02 23 2 'F12= 取消 ' A S9MSG 78A O 24 1TEXT(' MSG ')
第1画面
第1画面はFMT01とFMT99の2つの様式から構成されます。
FMT01はキーデータ入力のための様式、FMT99はキーガイド、メッセージ表示の様式です。
第2画面
第2画面はFMT01,FMT02,FMT99の3つの様式から構成されます。
FMT01、FMT99は上記に同じ。FMT02はデータ部入力のための様式です。
物理ファイル
更新対象となるファイルは次のように定義されているものとします。
物理ファイル名 WRKLIB/M420 レコード様式名 M420R 項目名 桁数 属性 欄見出し TKSTS 1 A 状態 TKTKNO 5 A 得意先 TKNMKJ 42 O 得意先名 TKNMKN 20 A 得意先カナ名 TKTEL 12 A TEL TKSLNO 4 A 担当営業 TKFLAG 1 A フラグ TKURJS 11 0 S 売上実績
制御仕様書(H仕様書)
通常のコーディングです。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 H Y-
ファイル仕様書
画面ファイル(RM420S)を使用するときは、15,16カラムをCFとします。
Cは入出力両用の意味です。装置はWORKSTNとします。
更新対象のマスターファイル(M420)は、変更、削除ありなので15,16カラムをUFと
します。またキーによるアクセスなので、31カラムをKとします。装置はDISK,レコードの
追加あり(WRITE命令使用)なので、64カラムにAを記述します。
MSGFは、メッセージテキストを実行開始時に、MSGテーブルにローディングするためのもの
です。50バイトのレコード長の単純なファイルで、入力専用のテーブルファイルなので、15,
16カラムをITとしています。また外部記述を使用しないので19カラムはFとし、26,27
カラムにレコード長(50)を記述します。さらに、拡張仕様書(E仕様書)でテーブルの追加の
記述が必要なので、39カラム目にEを記述します。装置はDISKです。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 FRM420S CF E WORKSTN FM420 UF E K DISK A FMSGF IT F 50 EDISK
拡張仕様書(E仕様書)
テーブルMSGにデータをローディングするために、11〜18カラムで上記のMSGFを指定
します。1レコードあたりのデータ数は1、レコード件数は5、データの長さは50を指定します。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 E MOD 1 4 6 E MSGF MSG 1 5 50
処理モード名(追加・変更・削除)を準備するために、MODを定義します。データはプログラムの
末尾に準備します。
シナリオ制御用の画面番号
次はどの番号の画面かを示す、画面制御用にフィールドを準備します。
演算仕様書(C仕様書)で定義しても差し支えありませんが、制御用のフィールドのような
重要なものはきっちりと、入力仕様書で定義するのもひとつの方法です。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 I DS I I 01 1 20W@FMT
基本処理の流れ
基本処理の流れは、初期処理、主処理、終了処理です。
このパターンはどのようなプログラムでも共通にできます。
C* 初期処理 C EXSR SBINZ C* 主処理 C EXSR SBMAIN C* 終了処理 C EXSR SBEND
主処理の中の流れ
主処理では終わりがリクエストされるまで、繰り返し処理をします。
終わりのリクエストはF3キーの押下で、RPGプログラムでは*INKCが*ONとして認識
されます。第1画面に関する処理はSB1000とその配下のプログラムに、第2画面は同じく
SB2000とその配下のプログラムの一手販売とします。
C* SBMAIN 主処理 C*--------------------------------------------------------------- C SBMAIN BEGSR C* +----C *INKC DOWEQ*OFF |+---C W@FMT CASEQ01 SB1000 第一画面 |+---C W@FMT CASEQ02 SB2000 第二画面 |+---C ENDCS +----C ENDDO C* C ENDSR
第一画面の処理
第1画面の処理の役目は、正しいキー部分のデータを入手することです。
画面のリクエスト番号が1である間、繰り返し処理をします。
画面表示の前準備
標識の01番02番を1,0とセットします。これは画面ファイルで記述した第1第2画面のキー
ガイドを標識いよって、表示/非表示操作をするためです。
RPGではこのような標識を使った操作はよく使われます。
標識セットはSETON、SETOF命令でするのがすじですが、ここではMOVEA命令で1行ですませています。
C* 第一画面向けセット C MOVEA'10' *IN,01
第1画面の表示
FMT99とFMT01で第一画面なので、FMT99をWRITE,FMT01はEXFMTで入出力します。
画面からの入力による処理
画面からの入力は、入力データとアテンション・キーの情報があります。
アテンション・キーとはワーク・ステーションからデータ転送をする引き金になったキーで
実行キーのほかにF01〜F24キー、スクロールキー、PRINTキーなどがあります。
ここででてくるのはF03、F06、実行キーなどです。それぞれ次のような約束にしています。
F03:終了リクエスト
F06:処理モード切替え
RPGではF03は*INKC,F06は*INKFとして認識されます。
データ入力後の処理
第1画面では、F03、F06、実行キーの3ケースの処理があります。
それぞれに対応した処理をコーディングします。すなわち
F03のとき、終了リクエストなのでここの繰返しを抜けるようにセットします。
F06のとき、処理モード変更リクエストなので、そのための内部サブを呼び出します。
実行キーのとき、入力データの妥当性チェックの内部サブ(SB1230)を呼び出します。
チェックOK(*いN30=*OFF)なら、次の画面を2とし、ファイルからの読取りデータを
画面にセットする内部サブ(SB1250)を呼び出します。
コーディングは次のようになります。
C* SB1000 第一画面処理 C*--------------------------------------------------------------- C SB1000 BEGSR C* C* 第一画面へセット C MOVEA'10' *IN,01 C* +----C W@FMT DOWEQ01 | C* 第一画面表示 | C WRITEFMT99 | C EXFMTFMT01 | C MOVE *BLANK S9MSG | C* |+---C SELEC || C* F3 |+---C *INKC WHEQ *ON || C Z-ADD00 W@FMT 終了要求 || C* F6 |+---C *INKF WHEQ *ON || C EXSR SB1220 処理変更 || C* ENTER |+---C OTHER || C EXSR SB1230 実行キー ||+--C *IN30 IFEQ *OFF ||| C EXSR SB1250 画面へ セット ||+--C ENDIF || C* |+---C ENDSL +----C ENDDO C* C ENDSR
処理変更、チェック、画面へセットの処理については省略します。
第2画面の処理
第2画面の処理の役目は、正しいデータ部分のデータを入手することです。
画面のリクエスト番号が2である間、繰り返し処理をします。
前準備
標識の01番02番を0,1とセットします。これは画面ファイルで記述した第1第2画面のキー
ガイドを標識で、表示/非表示の操作するためです。
また削除モードのとき、マスターファイルから読みとって表示する画面のデータは変更しても
無意味なので、変更できないようにプロテクトの標識(28)を*ONにします。
削除でない場合は、プロテクトしないので*OFFにします。
C* 第二画面向けセット C MOVEA'01' *IN,01
第2画面の表示
第2画面はFMT99とFMT01,FMT02なので、FMT99,FMT01をWRITE,
FMT02はEXFMTで入出力します。
画面からの入力による処理
ここでのアテンションキーはF12と実行キーのみです。
F12は第2画面から第1画面へもどるリクエストなので画面番号を1にします。
実行キーはデータ部の入力なのでチェックを行い、正しければファイルの更新を行います。
これは内部サブ(SB2250)を呼び出して行います。
コーディングは次のようになります。
C* SB2000 第二画面処理 C*--------------------------------------------------------------- C SB2000 BEGSR C* C* 第二画面へセット C MOVEA'01' *IN,01 C MOVE *BLANK S9MSG ERR-MSG +----C W@MOD IFEQ 04 削除 | C SETON 28 プロテクト | C MOVELMSG,4 S9MSG 更新確認 +----C ELSE | C SETOF 28 NONプロテクト +----C ENDIF C* +----C W@FMT DOWEQ02 第二画面 | C* 画面表示 | C WRITEFMT99 | C WRITEFMT01 | C EXFMTFMT02 | C MOVE *BLANK S9MSG | C* |+---C SELEC |+---C *INKL WHEQ *ON 取消キー || C Z-ADD01 W@FMT |+---C OTHER || C EXSR SB2230 実行キー |+---C ENDSL +----C ENDDO C* C ENDSR
エラーチェックと表示
画面からの入力データはいつも正しいとは限らないので、エラーチェックを行います。
そして、正しくなければそれを画面に表示します。
エラーの有無は画面フィールドに標識番号を対応させ、該当のフィールドにエラーがあればその
標識を*ONにします。この標識は画面ファイルで「カーソル位置付け」「反転高輝度」の属性に
関連づけておき、操作員にエラーの確認をしやすくしておきます。
たとえば得意先名の入力なしはエラーとして、そのフィールドには標識32を関連づけるとすると
画面ファイルの記述は次のようになります。
A 5 2 ' 得意先名 ' A S1NMKJ 42O B +1TEXT(' 得意先名 ') A 32 DSPATR(PC RI) A 28 DSPATR(PR)
この例で、標識28は先にでてきたように削除の場合、入力フィールドをプロテクトするためのものです。
ファイルの更新確認と更新
エラーがなければファイルの更新ですが、ここでは1度目は確認のメッセージのみ、画面訂正なし
で2度目のエラーなしのとき、ファイル更新をします。
そのために、画面ファイルで画面訂正の有無を感知するため、CHANGEパラメータを記述し、
標識29を定義しています。CHANGEパラメータを使用すると、画面のデータを訂正して転送すると、
該当の標識(ここでは29)が*ONになります。
A R FMT02 OVERLAY PROTECT A CF12 A CHANGE(29)
ファイル更新の内部サブ(SBUPD)が呼ばれるのは、
チェックでエラーなしで、かつ、画面訂正なし、のときです。
更新後は、当然第1画面へ戻るので画面番号1をセットします。
コーディングは次のようになります。
C* SB2230 第二画面のチェック C*-------------------------------------------------------------- C SB2230 BEGSR C* C* 属性の取得 C* (名前などの取得) C* エラーチェック C SETOF 303233 C* 得意先名入力なしはエラー +----C S1NMKJ IFEQ *BLANK | C MOVELMSG,3 S9MSG 要入力 | C SETON 3032 +----C ENDIF C* 得意先カナ名入力なしはエラー +----C S1NMKN IFEQ *BLANK | C MOVELMSG,3 S9MSG 要入力 | C SETON 3033 +----C ENDIF C* 更新確認/更新 +----C *IN30 IFEQ *OFF NO-ERROR |+---C *IN29 IFEQ *OFF NO-CHANGE || C EXSR SBUPD || C Z-ADD01 W@FMT |+---C ELSE CHANGED || C MOVELMSG,4 S9MSG 更新確認 |+---C ENDIF +----C ENDIF C* C ENDSR
RPG全ソースリストは次のとおりです。
**--------------------------------------------------------------- ** ID : RM420 ** ** NAME :得意先マスター更新 ** ** FUNC :標記第一画面を表示し、画面から更新する得意先Yが ** 入力されたなら、その妥当性をチェックする。 ** OKなら第二画面を表示する。第二画面でデータが ** 入力されたなら、その妥当性をチェックし、OKなら ** マスターファイルを更新し、第一画面にもどる。 ** F06キーが押されたときは、追加・変更・削除と順に処理 ** モードを切り替える。 ** ** NOTE : ** *IN29 モディファイフラグ *ON: MODIFIED ** *IN30 エラーフラグ *ON: ERR *OFF:OK ** **--------------------------------------------------------------- H Y- F*--------------------------------------------------------------- FRM420S CF E WORKSTN FM420 UF E K DISK A FMSGF IT F 50 EDISK E*--------------------------------------------------------------- E MOD 1 4 6 E MSGF MSG 1 5 50 I DS I I 01 1 20W@FMT C*--------------------------------------------------------------- C*初期処理 C EXSR SBINZ C*主処理 C EXSR SBMAIN C*終了処理 C EXSR SBEND C* C*--------------------------------------------------------------- C* SBMAIN 主処理 C*--------------------------------------------------------------- C SBMAIN BEGSR C* +----C *INKC DOWEQ*OFF |+---C W@FMT CASEQ01 SB1000 第一画面 |+---C W@FMT CASEQ02 SB2000 第二画面 |+---C ENDCS +----C ENDDO C* C ENDSR C*--------------------------------------------------------------- C* SBINZ 初期処理 C*--------------------------------------------------------------- C SBINZ BEGSR .INZ C* C Z-ADD04 W@MOD 70 処理モード C SETOF 30 SET NO-ERR C* C MOVEL'RM420' S1PGID PGM-ID C EXSR SB1220 処理選択 C* C ENDSR C*--------------------------------------------------------------- C* SB1000 第一画面処理 C*--------------------------------------------------------------- C SB1000 BEGSR C* C*第一画面へセット C MOVEA'10' *IN,01 C* +----C W@FMT DOWEQ01 | C*第一画面表示 | C WRITEFMT99 | C EXFMTFMT01 | C MOVE *BLANK S9MSG | C* |+---C SELEC || C* F3 |+---C *INKC WHEQ *ON || C Z-ADD00 W@FMT 終了要求 || C* F6 |+---C *INKF WHEQ *ON || C EXSR SB1220 処理変更 || C* ENTER |+---C OTHER || C EXSR SB1230 実行キー ||+--C *IN30 IFEQ *OFF ||| C EXSR SB1250 画面へセット ||+--C ENDIF || C* |+---C ENDSL +----C ENDDO C* C ENDSR C*--------------------------------------------------------------- C* SB1220 処理モード決定 ADD ->CHG ->DEL C*--------------------------------------------------------------- C SB1220 BEGSR C* +----C SELEC +----C W@MOD WHEQ 01 | C Z-ADD02 W@MOD 変更 +----C W@MOD WHEQ 02 | C Z-ADD04 W@MOD 削除 +----C W@MOD WHEQ 04 | C Z-ADD01 W@MOD 追加 +----C ENDSL C* C MOVELMOD,W@MOD S1MOD モード名 C* C ENDSR C*--------------------------------------------------------------- C* SB1230 実行キーが押されたときの処理 C*--------------------------------------------------------------- C SB1230 BEGSR C* C SETOF 3031 ERR-OFF C CLEARM420R C*試し読み C S1TKNO CHAINM420R 99 +----C *IN99 IFEQ *OFF |+---C W@MOD IFEQ 01 ADD || C MOVELMSG,2 S9MSG 重複 || C SETON 3031 |+---C ENDIF +----C ELSE |+---C W@MOD IFGE 02 CHG OR DEL || C MOVELMSG,1 S9MSG 該当なし || C SETON 3031 |+---C ENDIF +----C ENDIF C*OKなら第二画面へ +----C *IN30 IFEQ *OFF | C Z-ADD02 W@FMT +----C ENDIF C* C ENDSR C*--------------------------------------------------------------- C* SB1250 マスターから画面へセット C*--------------------------------------------------------------- C SB1250 BEGSR C* C CLEARFMT02 C* +----C W@FMT IFGE 02 CHG OR DEL | C MOVELTKNMKJ S1NMKJ 得意先名 | C MOVELTKNMKN S1NMKN 得意先カナ | C MOVELTKTEL S1TEL 電話番号 | C MOVELTKSLNO S1SLNO 担当営業 | C Z-ADDTKURJS S1URGK 売上実績 +----C ENDIF C* C ENDSR C*--------------------------------------------------------------- C* SB2000 第二画面処理 C*--------------------------------------------------------------- C SB2000 BEGSR C* C* SET TO SCR C MOVEA'01' *IN,01 C MOVE *BLANK S9MSG ERR-MSG +----C W@MOD IFEQ 04 削除 | C SETON 28 プロテクト | C MOVELMSG,4 S9MSG 更新確認 +----C ELSE | C SETOF 28 NONプロテクト +----C ENDIF C* +----C W@FMT DOWEQ02 第二画面 | C*画面表示 | C WRITEFMT99 | C WRITEFMT01 | C EXFMTFMT02 | C MOVE *BLANK S9MSG | C* |+---C SELEC |+---C *INKL WHEQ *ON 取消キー || C Z-ADD01 W@FMT |+---C OTHER || C EXSR SB2230 実行キー |+---C ENDSL +----C ENDDO C* C ENDSR C*--------------------------------------------------------------- C* SB2230 第二画面のチェック C*--------------------------------------------------------------- C SB2230 BEGSR C* C*属性の取得 C* (名前などの取得) C*エラーチェック C SETOF 303233 C*得意先名入力なしはエラー +----C S1NMKJ IFEQ *BLANK | C MOVELMSG,3 S9MSG 要入力 | C SETON 3032 +----C ENDIF C*得意先カナ名入力なしはエラー +----C S1NMKN IFEQ *BLANK | C MOVELMSG,3 S9MSG 要入力 | C SETON 3033 +----C ENDIF C*更新確認/更新 +----C *IN30 IFEQ *OFF NO-ERROR |+---C *IN29 IFEQ *OFF NO-CHANGE || C EXSR SBUPD || C Z-ADD01 W@FMT |+---C ELSE CHANGED || C MOVELMSG,4 S9MSG 更新確認 |+---C ENDIF +----C ENDIF C* C ENDSR C*--------------------------------------------------------------- C* SBUPD ファイル更新 C*--------------------------------------------------------------- C SBUPD BEGSR C* C MOVELS1TKNO TKTKNO 得意先Y C TKTKNO CHAINM420R 99 C* ファイルへ編集 C MOVELS1NMKJ TKNMKJ 得意先名 C MOVELS1NMKN TKNMKN 得意先カナ C MOVELS1TEL TKTEL 電話番号 C MOVELS1SLNO TKSLNO 担当営業 C* +----C *IN99 IFEQ *OFF |+---C W@MOD IFEQ 02 更新 || C UPDATM420R |+---C ELSE || C DELETM420R |+---C ENDIF +----C ELSE | C WRITEM420R +----C ENDIF C* C CLEARM420R C CLEARS1TKNO C CLEARFMT02 C Z-ADD01 W@FMT 第一画面へ C* C ENDSR C*--------------------------------------------------------------- C* SBEND 終了処理 C*--------------------------------------------------------------- C SBEND BEGSR C* C SETON LR C RETRN C* C ENDSR ** MOD ** 追加 変更 削除
◆なお、1〜5カラムにあるネスト表示は自作のネスト構造解析プログラムでソースに付加したものです。◆
前ページ 次ページ 目 次
(C)COPYRIGHT ISHIOKA KATSUHIDE 2000