ILE RPG プログラムの例

この節では、給与計算を実行する簡単な ILE RPG プログラムを説明します。

問題文

ある小さい会社の給与計算部門では、その週の社員の給与をリストする印刷出 力を作成したいとします。 システム上には EMPLOYEE と TRANSACT の 2 つのディスク・ファイルが あるとします。

最初のファイル EMPLOYEE には社員のレコードが入っています。 下の図は社員レコードの形式を示しています。

図 2. 社員物理ファイルの DDS
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*
A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++++*
A          R EMP_REC
A            EMP_NUMBER     5          TEXT('EMPLOYEE NUMBER')
A            EMP_NAME      16          TEXT('EXPLOYEE NAME')
A            EMP_RATE       5  2       TEXT('EXPLOYEE RATE')
A          K EMP_NUMBER

2 番目のファイル TRANSACT には、各社員がその週に働いた時間数とその社員が 受け取ったボーナスが記録されています。 下の図はトランザクション・レコードの形式を示しています。

図 3. TRANSACT 物理ファイルの DDS
*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ..*
A..........T.Name++++++RLen++TDpB......Functions++++++++++++++++++++*
A          R TRN_REC
A            TRN_NUMBER     5          TEXT('EMPLOYEE NUMBER')
A            TRN_HOURS      4  1       TEXT('HOURS WORKED')
A            TRN_BONUS      6  2       TEXT('BONUS')

各社員の給与の計算は、「時間数」(TRANSACT ファイルからの) と「社員支給率」 (EMPLOYEE ファイルからの) とを掛けて、それに TRANSACT ファイルからの 「ボーナス」を加えることによって行われます。 40 時間を超えて働いた場合には、 通常の率の 1.5 倍が社員に支払われます。

制御仕様書

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+... 8
HKeywords++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
H DATEDIT(*DMY/)

今日の日付は、日、月、年の形式で「/」を区切り記号として印刷されます。

ファイル仕様書

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...
FFilename++IPEASFRlen+LKlen+AIDevice+.Keywords+++++++++++++++++++++++++++
FTRANSACT  IP   E           K DISK
FEMPLOYEE  IF   E           K DISK
FQSYSPRT   O    F   80        PRINTER

ファイル仕様書には次の 3 つのファイルが定義されています。

定義仕様書

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...
D+Name++++++++++ETDsFrom+++To/L+++IDc.Keywords+++++++++++++++++++++++++
D Pay             S              8P 2
D Heading1        C                   'NUMBER  NAME              RATE    H-
D                                     OURS  BONUS    PAY       '
D Heading2        C                   '______  ________________  ______  _-
D                                     ____  _______  __________'
D CalcPay         PR             8P 2
D   Rate                         5P 2 VALUE
D   Hours                       10U 0 VALUE
D   Bonus                        5P 2 VALUE

定義仕様書を使用して、社員の週給を入れる "Pay" という変数と報告書の見出し の印刷に備えての "Heading1" と "Heading2" の 2 つの固定情報を宣言します。

演算仕様書

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...
 /free
    chain trn_number emp_rec;
    if %found(emp_rec);
       pay = CalcPay (emp_rate: trn_hours: trn_bonus);
    endif;
 /end-free

演算仕様書のコーディング項目には、以下のものが含まれています。

出力仕様書

*.. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 ...+...
OFilename++DF..N01N02N03Excnam++++B++A++Sb+Sa+...........................
O..............N01N02N03Field+++++++++YB.End++PConstant/editword/DTformat
OQSYSPRT   H    1P                     2  3
O                                           35 'PAYROLL REGISTER'
O                       *DATE         Y     60
O          H    1P                     2
O                                           60 Heading1
O          H    1P                     2
O                                           60 Heading2
O          D   N1PN99                  2
O                       TRN_NUMBER           5
O                       EMP_NAME            24
O                       EMP_RATE      L     33
O                       TRN_HOURS     L     40
O                       TRN_BONUS     L     49
O                       Pay                 60 '$     0.  '
O          D   N1P 99                  2
O                       TRN_NUMBER           5
O                                           35 '** NOT ON EMPLOYEE FILE **'
O          T    LR
O                                           33 'END OF LISTING'

出力仕様書では、どのフィールドを QSYSPRT 出力に書き出すかを記述します。

サブプロシージャー

サブプロシージャーは、渡されたパラメーターを使用して社員の給与を計算し ます。 結果の値は、RETURN ステートメントを使用して呼び出し元に戻されます。

プロシージャー仕様書はプロシージャーの始めと終わりを指示します。 定義仕様書は、プロシージャーの戻りタイプ、プロシージャーへのパラメーター 、およびローカル変数である Overtime を定義します。

P CalcPay         B
D CalcPay         PI             8P 2
D   Rate                         5P 2 VALUE
D   Hours                       10U 0 VALUE
D   Bonus                        5P 2 VALUE
D Overtime        S              5P 2 INZ(0)

  /free

    // 支払われる超過勤務時間を決定します。
    if Hours > 40;
      Overtime = (Hours - 40) * Rate * 1.5;
      Hours = 40;
    endif;

    // 給与合計を計算し、呼び出し元に戻します。
    return  Rate * Hours + Bonus + Overtime;
 /end-free
P CalcPay         E

ソース・プログラム全体

次の図は、このプログラムで使用されるすべての仕様書を組み合わせます。この図は、このプログラムのソース・ファイルに入力すべきものを示しています。

図 4. 給与計算サンプル・プログラム
 *------------------------------------------------------------------------*
 * 説明: このプログラムは、社員の週給の印刷出力を                         *
 *       作成します。                                                     *
 *------------------------------------------------------------------------*
H DATEDIT(*DMY/)
 *------------------------------------------------------------------------*
 * ファイル定義                                                           *
 *------------------------------------------------------------------------*
FTRANSACT  IP   E           K DISK
FEMPLOYEE  IF   E           K DISK
FQSYSPRT   O    F   80        PRINTER
 *------------------------------------------------------------------------*
 * 変数の宣言                                                             *
 *------------------------------------------------------------------------*
D Pay             S              8P 2
 *------------------------------------------------------------------------*
 * 定数の宣言                                                             *
 *------------------------------------------------------------------------*
D Heading1        C                   'NUMBER  NAME              RATE    H-
D                                     OURS  BONUS    PAY       '
D Heading2        C                   '______  ________________  ______  _-
D                                     ____  _______  __________'
 *------------------------------------------------------------------------*
 * サブプロシージャー CalcPay のためのプロトタイプの定義                  *
 *------------------------------------------------------------------------*
D CalcPay         PR             8P 2
D   Rate                         5P 2 VALUE
D   Hours                       10U 0 VALUE
D   Bonus                        5P 2 VALUE
 *------------------------------------------------------------------------*
 * トランザクション・ファイル (TRANSACT) 内の各レコードごとに、           *
 * 該当する社員が見つかった場合は給与を計算し明細を印刷します。           *
 *------------------------------------------------------------------------*
 /free
    chain trn_number emp_rec;
    if %found(emp_rec);
       pay = CalcPay (emp_rate: trn_hours: trn_bonus);
    endif;
 /end-free

 *------------------------------------------------------------------------*
 * 報告書レイアウト                                                       *
 *  -- 1P がオンであれば見出し行を印刷する                                *
 *  -- レコードが見つかった場合 (標識 99 がオフ) は                       *
 *     給与明細を印刷し、それ以外の場合は例外レコードを印刷する           *
 *  -- LR がオンのときは 'リストの終わり' と印刷する                      *
 *------------------------------------------------------------------------*
OQSYSPRT   H    1P                     2  3
O                                           35 'PAYROLL REGISTER'
O                       *DATE         Y     60
O          H    1P                     2
O                                           60 Heading1
O          H    1P                     2
O                                           60 Heading2
O          D   N1PN99                  2
O                       TRN_NUMBER           5
O                       EMP_NAME            24
O                       EMP_RATE      L     33
O                       TRN_HOURS     L     40
O                       TRN_BONUS     L     49
O                       Pay                 60 '$     0.  '
O          D   N1P 99                  2
O                       TRN_NUMBER           5
O                                           35 '** NOT ON EMPLOYEE FILE **'
O          T    LR
O                                           33 'END OF LISTING'
 *------------------------------------------------------------------------*
 * サブプロシージャー  -- 超過時間給与を計算します。                      *
 *------------------------------------------------------------------------*
P CalcPay         B
D CalcPay         PI             8P 2
D   Rate                         5P 2 VALUE
D   Hours                       10U 0 VALUE
D   Bonus                        5P 2 VALUE
D Overtime        S              5P 2 INZ(0)

  /free

    // 支払われる超過勤務時間を決定します。
    if Hours > 40;
      Overtime = (Hours - 40) * Rate * 1.5;
      Hours = 40;
    endif;

    // 給与合計を計算し、呼び出し元に戻します。
    return  Rate * Hours + Bonus + Overtime;
 /end-free
P CalcPay         E