R P G 補 足 仕 様 書
前ページへ 次ページへ 目次へ



ここでは、プログラムで使用する配列の記述を紹介します。
これはCOBOLのDATA DIVISIONにおけるOCCURSで定義される配列に相当します。




配列は1次元だけで、2次元の配列は定義できません。
配列にはコンパイル時に値がロードされるものと、実行時(C仕様)でロードされるものの
2種類があります。
6桁 仕様書コードEを指定する。
27〜32桁 配列名を指定する。
33〜35桁 1レコードあたりの項目数を指定する。
配列が入力または演算仕様でロードされる場合には,このフィールド
はブランクのままにする。
37〜39桁 配列の要素の数を指定する。
40〜42桁 要素の長さを指定する。
45桁 ゾーン10進数の場合小数点以下の桁数を指定する。
54桁〜 注釈を指定する。


例 :実行時配列

各月の日数を格納するための配列LDY (LAST DAYのつもりです。)
....+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7
     E* 月の最終日配列の記述
     E                    LDY        12  2 0


日付計算などに使用する各月の日数を格納する配列、LDYです。
要素は12、長さ2、小数以下は無し(すなわち0桁)です。


例:コンパイル時配列

コンパイル時にデータを入れておく場合は次のようになります。
 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 
     E* 月の最終日配列の記述
     E                    LDY     1  12  2 0
     E*                         AAABBBBCCC D


説明:
27〜32桁 配列の名前。LDYとしています。(LAST DAYのつもり)
33〜35桁 AAAの部分。位置レコードに入れる項目の数です。この例では1レコード1件
36〜39桁 BBBBの部分。配列の要素の数です。
40〜42桁 CCCの部分。 配列の要素1つの長さ属性です。
44桁 Dの部分。 数値のとき、小数点以下の桁数です。

プログラムソースの最後に、1、2桁目に**の区切りの行を置き、さらにに続けて、
データを指定します。
**
31
28
31
30
31
30
31
31
30
31
30
31


1レコードに12個のデータを入れる場合には次のようにします。
....+... 1 ...+... 2 ...+... 3 ...+... 4...+... 5 ...+... 6 ...+... 7 
     E* 月の最終日配列の記述
     E                    LDY    12  12  2 0
     E*                         ***  

プログラムの最後(出力仕様書の後ろ)にロードするデータを、1レコード分おきます。
**
312831303130313130313031


配列要素への割付

N番目の配列要素へ割り付けするときは、
            ABC,N
のようにコーディングします。

例:
     C                     ADD  W@LEAP    LDY,2            2月の終り


参考プログラム:日付チェックのプログラム

     **===============================================================
     ** ID   : @CHKYMD                                      K.ISHIOKA
     ** NAME :日付チェック
     ** FUNC :日付を取得しチェックする。
     ** VER  : 01.00.00
     ** NOTE :6桁日付でも、8桁日付でもよい
     H*===============================================================
     H            Y/
     F*===============================================================
     E*===============================================================
     E*  E仕様書
     E*---------------------------------------------------------------
     E                    LDY    12  12  2 0             名称テーブル
     I*===============================================================
     I* ワーク用定義
     I            DS
     I                                       01  080W8YMD
     I                                       01  040W@YYYY
     I                                       03  080W6YMD
     I                                       03  040W@YY
     I                                       05  060W@MM
     I                                       07  080W@DD
     I* 初期値を使った定数の定義
     I            DS
     I I            '0'                      01  01 #OK
     I I            '1'                      02  02 #NG
     C*===============================================================
     C*                 MAIN PART
     C*===============================================================
     C           *ENTRY    PLIST
     C                     PARM           P@DATE  80       処理日
     C                     PARM           P@RC    1         RET. CODE
     C*---------------------------------------------------------------
     C* 01.初期処理
     C                     EXSR SBINZ                      初期処理
     C* 02.主処理
     C                     EXSR SBMAIN                     主処理
     C* 03.終了処理
     C                     EXSR SBEND                      終了処理
     C*
     C*===============================================================
     C*          SBINZ    初期処理
     C*===============================================================
     C           SBINZ     BEGSR
     C*
     C                     Z-ADD000       J       70       WORK
     C                     Z-ADD000       R       70       WORK
     C                     Z-ADD000       W@LEAP  70       LEAP-YEAR
     C*                                                                OT
     C                     Z-ADDP@DATE    W8YMD            日付分解
     C                     MOVE #OK       P@RC
     C*
     C                     ENDSR
     C*===============================================================
     C*          SBMAIN   主処理
     C*===============================================================
     C           SBMAIN    BEGSR
     C*
     C*閏年判定
     C                     EXSR SBLEAP                     --> W@LEAP
     C*
+----C                     DO
|    C*月の範囲チェック
|+---C           W@MM      IFLT 01
||   C           W@MM      ORGT 12
||   C                     MOVE #NG       P@RC              月エラー
**===C                     LEAVE
|+---C                     ENDIF
|    C*日の範囲チェック
|+---C           W@DD      IFLT 01
||   C           W@DD      ORGT LDY,W@MM
||   C                     MOVE #NG       P@RC              日エラー
|+---C                     ENDIF
|    C*
+----C                     ENDDO
     C*
     C                     ENDSR
     C*===============================================================
     C*          SBLEAP   閏年チェック
     C*===============================================================
     C* 閏年かどうかを判定する。 1:LEAP  0:NON-LEAP
     C*---------------------------------------------------------------
     C           SBLEAP    BEGSR
     C*
     C           W@YY      DIV  04        J
     C                     MVR            R                余り
+----C           R         IFEQ 00
|    C                     Z-ADD01        W@LEAP           閏年
+----C                     ELSE
|    C                     Z-ADD00        W@LEAP           平年
+----C                     ENDIF
     C*
     C                     ADD  W@LEAP    LDY,2            2月の終り
     C*
     C                     ENDSR
     C*===============================================================
     C*          SBEND     END-PROCESS
     C*===============================================================
     C           SBEND     BEGSR
     C*
     C                     SETON                     LR    LAST-RECORD
     C                     RETRN                           RETURN
     C*                                                    P@RC
     C                     ENDSR
** LDY **
312831303130313130313031

1〜5桁はプログラム構造を読みやすくするために使っています。





前ページへ 次ページへ 目次へ

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003