MAIN(main_procedure_name)

MAIN キーワードは、このソース・プログラムがリニア・メイン・モジュールのためのものであり、リニア・メイン・プロシージャーを含んでいることを示します。 リニア・メイン・プロシージャーは、main_procedure_name パラメーターで指定され、モジュールのプログラム入り口プロシージャーとなります。

main_procedure_name は、ソース・プログラムで定義されているプロシージャーの名前でなければなりません。 リニア・メイン・プロシージャーは、プログラム呼び出しインターフェースを介してのみ呼び出されるものであり、結合プロシージャー呼び出しでは呼び出せません。 リニア・メイン・プロシージャーに対して再帰呼び出しを行うと、その呼び出しは動的プログラム呼び出しになります。

したがって、以下の規則が適用されます。
  • リニア・メイン・プロシージャーのプロトタイプが指定される場合、 EXTPGM キーワードを指定する必要があります。
  • リニア・メイン・プロシージャーのプロトタイプが指定されず、 プロシージャー・インターフェースが指定される場合、 プロシージャー・インターフェースで EXTPGM キーワードを指定する必要があります。
  • プログラムにパラメーターがなく、プログラムが RPG プログラムから呼び出されない場合には、 プロトタイプもプロシージャー・インターフェースも不要です。
  • プロシージャーをエクスポートすることはできません。 そのため、main_procedure_name のプロシージャーの始めの指定で、EXPORT キーワードを指定することはできません。
リニア・メイン・モジュールには、RPG プログラム・サイクルのロジックは組み込まれません。 したがって、サイクルに依存する言語機能は指定できません。
注: NOMAIN キーワードを使用すると、RPG プログラム・サイクルを含まないモジュールを作成することもできます。
詳しくは、リニア・モジュールを参照してください。

以下の 2 つの例では、リニア・メイン・プログラムとその /COPY ファイルを示します。

図 1. 以下のサンプルのリニア・メイン・プログラムで使用されている /COPY ファイルの DSPCURTIME
      *  The prototype for the linear-main procedure must have
      *  the EXTPGM keyword with the name of the actual program.
     D DisplayCurTime  PR                  EXTPGM('DSPCURTIME')
図 2. プログラムで使用されるリニア・メイン・プロシージャーのサンプル
* The program is named DSPCURTIME, and the module has
      * a linear-main procedure called DisplayCurTime.

      * The Control specification MAIN keyword signifies that this is
      * a linear-main module, and identifies which procedure is the
      * special subprocedure which serves as the linear-main procedure,
      * which will act as the program-entry procedure.

     H MAIN(DisplayCurTime)
      * Copy in the prototype for the program
      /COPY DSPCURTIME
      *--------------------------------------------------
      * Procedure name: DisplayCurTime
      *--------------------------------------------------
     P DisplayCurTime  B
     D DisplayCurTime  PI
      /FREE
       dsply ('It is now ' + %char(%time()));
      /END-FREE
     P DisplayCurTime  E

以下の例では、プロトタイプを必要としないリニア・メイン・プログラムを示します。 プログラムの名前は PRTCUSTRPT で、モジュールには、リニア・メイン・プロシージャーの PrintCustomerReport が含まれています。 このプログラムは、*CMD オブジェクトのコマンド処理プログラムになるものであるため、RPG プロトタイプは必要ありません。 制御仕様書の MAIN キーワードでは、これがリニア・メイン・モジュールであることを示し、 プログラム入り口プロシージャーとして機能するリニア・メイン・プロシージャーとなる、特殊なサブプロシージャーであるプロシージャーを識別します。

図 3. RPG プログラムまたはプロシージャー内から呼び出されないリニア・メイン・プログラム
     H MAIN(PrintCustomerReport)

      *--------------------------------------------------
      * Program name: PrintCustomerReport (PRTCUSTRPT)
      *--------------------------------------------------     P PrintCustomerReport...
     P                 B
     F ... file specifications
     D                 PI              EXTPGM('PRTCUSTRPT')
     D  custName                  25A  CONST

       ... calculations, using the custName parameter     P PrintCustomerReport...
     P                 E