フリー・フォーマット RPG で対話型アプリケーション (メインメニュー)

まず最初にメインメニューから見ていきましょう。

プログラムを呼び出すとまずメインメニューが表示され、そこでファンクションキーを押すとそれに対応した処理メニューが出てくる、といった、ある意味いちばんシンプルなかたちの対話型プログラムになっています。

画面イメージはこちらにあります。


画面の定義

こちらが画面の定義ですね。

     A*****************************************************************
     A* ファイル名: MAINMENU                                          *
     A* 関連プログラム: CUSMAIN                                       *
     A* 説明: これは表示装置ファイルMAINMENU です。これ               *
     A*    には1 つのレコード様式HDRSCN があります。               *
     A*****************************************************************
     A                                       DSPSIZ(24 80 *DS3)
     A                                       CHGINPDFT(CS)
     A                                       PRINT(QSYSPRT)
     A                                       INDARA
     A          R HDRSCN
     A                                       CA03(03 'END OF INQUIRY')
     A                                       CA05(05 'MAINTENANCE MODE')
     A                                       CA06(06 'SEARCH BY ZIP MODE')
     A                                       CA07(07 'SEARCH BY NAME MODE')
     A                                  2  4TIME
     A                                       DSPATR(HI)
     A                                  2 28'CUSTOMER MAIN INQUIRY'
     A                                       DSPATR(HI)
     A                                       DSPATR(RI)
     A                                  2 70 DATE
     A                                       EDTCDE(Y)
     A                                       DSPATR(HI)
     A                                  6  5'Press one of the following'
     A                                  6 32'PF keys.'
     A                                  8 22'F3 End Job'
     A                                  9 22'F5 Maintain Customer File'
     A                                 10 22'F6 Search Customer by Zip Code'
     A                                 11 22'F7 Search Customer by Name'

プログラム

こちらがプログラムのソースになります。

      //****************************************************************
      // プログラム名: CUSMAIN                                         *
      // 関連ファイル: MAINMENU (DSPF)                                 *
      // 関連プログラム: CUSMNT (ILE RPG PGM)                          *
      //                 SCHZIP (ILE RPG PGM)                          *
      //                 SCHNAM (ILE RPG PGM)                          *
      // 説明:      これは得意先のメイン照会プログラムです。           *
      //            このプログラムは、次の処置のいずれかを選ぶ         *
      //            ようにユーザーにプロンプトを出します。             *
      //            1.得意先レコードの維持                             *
      //              (追加、更新、削除、表示)                         *
      //            2.郵便番号による得意先レコードの検索               *
      //            3.名前による得意先レコードの検索                   *
      //****************************************************************

     Fmainmenu  cf   E             workstn indds(indicators)

      // フィールド定義:
     D indicators      ds
     D exitKey                         n    overlay(indicators:3)
     D maintainKey                     n    overlay(indicators:5)
     D srchZipKey                      n    overlay(indicators:6)
     D srchCustKey                     n    overlay(indicators:7)

      // プロトタイプ定義:
     D CustMaintain    pr                   extproc('CUSMNT')
     D SearchZip       pr                   extproc('SCHZIP')
     D SearchName      pr                   extproc('SCHNAM')

      /free

           // 終了キーが押されるまでループする
           dow '1' ;

              // メインメニューの表示
              exfmt hdrscn;

              // 要求された処置の実行
              if exitKey;
                 // プログラムの終了
                 leave;
              elseif maintainKey;
                 // 得意先データの維持
                 CustMaintain();
              elseif srchZipKey;
                 // 郵便番号に基づく得意先データの検索
                 SearchZip();
              elseif srchCustKey;
                 // 得意先名による得意先データの検索
                 SearchName();
              endif;

           enddo;

           *inlr = *on;

      /end-free

メイン・ロジック

メインメニューを F3 キーが押されるまで出し続ける、という仕様のため、プログラム上は無限ループと、条件(F3 キーが押されたという画面からの情報)によるそのループの脱出によってそれが実現されています。

無限ループは

           dow '1' ;

とコーディングし、C でいう while での無限ループとほぼまったく同様の書き方になりますね。

           while (1) {

上記の無限ループの中では、以下の exfmt 命令で画面バッファ(画面ファイルの中の hdrscn というレコードの内容)を読み取り、

              exfmt hdrscn;

その画面バッファから読み取った情報に応じて、次に呼び出すプログラム(サブプロシージャ)を選択したり、

              elseif srchZipKey;
                 // 郵便番号に基づく得意先データの検索
                 SearchZip();

画面バッファから読んだ情報の中に F3 キーが押されたという情報があれば、それで無限ループを抜ける、という構造になっています。
leave は Do ループを抜ける、という命令になります。

              if exitKey;
                 leave;

ループを抜ける、という大事な仕事があるので、if の先頭になっています。
elseif で(↑で見たように)キーに応じて定義されたプロシージャへの呼び出しを追加していく、というようになっています。

              elseif maintainKey;
                 CustMaintain();

              elseif srchZipKey;
                 SearchZip();

              elseif srchCustKey;
                 SearchName();

画面バッファからの読み取り

exfmt 命令で読み出す画面バッファの情報は、画面ファイルの定義を見ればわかります。

     A                                       INDARA
     A          R HDRSCN
     A                                       CA03(03 'END OF INQUIRY')
     A                                       CA05(05 'MAINTENANCE MODE')
     A                                       CA06(06 'SEARCH BY ZIP MODE')
     A                                       CA07(07 'SEARCH BY NAME MODE')

プログラムの方で用いられている exitKey というような定義は以下の D 仕様書の中にあります。

     Fmainmenu  cf   E             workstn indds(indicators)

      // フィールド定義:
     D indicators      ds
     D exitKey                         n    overlay(indicators:3)
     D maintainKey                     n    overlay(indicators:5)
     D srchZipKey                      n    overlay(indicators:6)
     D srchCustKey                     n    overlay(indicators:7)

画面ファイル (mainmenu) に INDARA キーワードが定義されているので、indds キーワードでこのように CAxx で定義されているキーをあらかじめ指定しておくことができるようになっているわけですね。

サブプロシージャの呼び出し

F3 以外のキーが押された場合は、それに応じて呼び出されるサブプロシージャのそれぞれの実際の処理は、別の"モジュール"を呼び出して実現されています。

     D CustMaintain    pr                   extproc('CUSMNT')
     D SearchZip       pr                   extproc('SCHZIP')
     D SearchName      pr                   extproc('SCHNAM')

たとえば CustMaintain() ; という処理は、D 仕様書の CustMaintain に指定された 'CUSMNT' という外部モジュールを呼び出す、というわけです。

では次にその 'CUSMNT' の内容を見てみましょう。

[Top Pageに戻る]

Ads by TOK2