R P G 演 算 仕 様 書
前ページ 次ページ 目 次

演算仕様書は、COBOLのPROCEDURE DIVISIONに相当します。



まずは、サンプル・プログラムをごらん下さい。以下のサンプル・プログラムで見て
行くこととします。

このプログラムは得意先マスター(M420)をよみ、内容を印刷します。
このとき、売上は1000で割った値つまり、千円単位で表示します。余りは、切り
捨てです。

入力

入力ファイル(M420)は次のように定義してあるものとします。

得意先マスター(レコード様式 : M420R)
フィールド名 長さ タイプ  小数点以下 見出し名
TKDEL    削除フラグ
TKTKNO   得意先Y
TKNMKJ 42   得意先名
TKNMKN 20   得意先カナ
TKTEL 12   電話番号
TKSLNO   営業担当
TKFLG   フラグ
TKUR\ 11 売上実績


出力
出力は印刷ファイル(LM420AP)として、次のように印刷するように定義して
あるものとします。
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999



フィールド名 長さ タイプ 小数点以下 カラム 見出し名
P@TKNO    得意先
P@NMKJ 42   10 得意先名
P@NMKN 20   54 得意先カナ
P@TEL 12   76 電話番号
P@UR\ 91 売上実績

サンプル・プログラム
     H*===============================================================
     H* ID   : LM420
     H* NAME : 得意先一覧表印刷
     H* FUNC : 得意先マスターファイルについて、キー順に順次よみ、
     H*        同一覧表を印刷する。
     H*
     H*===============================================================
     H            Y/                                    1
     F*===============================================================
     FM420    IF  E           K        DISK
     F*
     FLM420AP O   E                    PRINTER
     C*===============================================================
     C* 1.前処理
     C                     READ M420R                    99
     C* 2.本処理
+----C           *IN99     DOWEQ*OFF
|    C*
|    C                     MOVELTKTKNO    P@TKNO            得意先  
|    C                     MOVELTKNMKJ    P@NMKJ            得意先名  
|    C                     MOVELTKNMKN    P@NMKN            得意先カナ
|    C                     MOVELTKTEL     P@TEL             電話番号  
|    C           TKUR\     DIV  1000      P@UR\             売上実績  
|    C*                                                     
|    C                     WRITEDTL01                       
|    C*                                                     
|    C                     READ M420R                    99 
+----C                     ENDDO                            
     C* 3.後処理
     C                     SETON                     LR
     C                     RETRN


演算仕様書の様式
1〜5桁 パンチカード時代のなごりの順序番号用のフィールドです。
6桁 演算仕様書の仕様書コードCを指定します。
7桁 その行すべてを注釈とするとき’*’を記述します。
9〜17桁 実行制御用の標識を指定します。
18〜23桁 演算用の因子1を指定します。
28〜32桁 演算のコマンドを指定します。
33〜42桁 演算用の因子2を指定します。
43〜48桁 演算結果を指定します。
49〜51桁 変数を定義する場合、その桁数を指定します。
52桁 数値変数を定義する場合、その小数点以下の桁数を指定します。
54〜59桁 演算結果、標識セットがある場合指定します。


説明1:
     C*===============================================================
     C* 1.前処理
     C                     READ M420R                    99
1、2行目:プログラムを読みやすくするためのコメントです。
3行目 : 読み取りをおこなっています。
READ :順次読み取りです。
M420R: ファイルM420のレコード様式M420Rを読取りしています。
99 :EOFのとき、99番の標識がONになります。
          よみとりOKのときはOFFです。
           ON/OFFは具体的には’1’/’0’です。標識は01〜99が使えます。
COBOLでは、概略次のようなコーディングに相当します。

             READ     M420    AT    END    MOVE    '1'    TO    標識99.

            (一般のCOBOLには標識99はありません。)

参考 : AS/400のCOBOLでは、インディケータとして、
      07  SWITCHES  PIC 1
                    OCCURS  99  TIMES
                    INDICATORS 01.
のように定義されます。SWITCHES(1)〜SWITCHES(99)


説明2:
...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 2.本処理
+----C           *IN99     DOWEQ*OFF
|
|         ・・・
|
+----C                     ENDDO
DOWEQ :   DO−WHILE−EQです。PERFORMに相当します。
*IN99 :     標識99番の意味です。値は*ONか*OFFのどちらかです。
ENDDO :    END−DOで、END−PERFORMに相当します。
+−−−−:範囲をわかりやすくするために、1〜5桁を使用しています。


説明3:
...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C                     MOVELTKTKNO    P@TKNO             得意先  
     C                     MOVELTKNMKJ    P@NMKJ             得意先名  
     C                     MOVELTKNMKN    P@NMKN             得意先カナ
     C                     MOVELTKTEL     P@TEL              電話番号  
     C           TKUR\     DIV  1000      P@UR\              売上実績  
MOVEL: MOVE−LEFTで左詰め格納です。
DIV :   DEVIDE(除算)でTKUR¥/1000をP@UR¥に格納します。
               このとき、小数以下は切り捨てられます。


説明4:
     C* 3.後処理
     C                     SETON                     LR
     C                     RETRN
SETON : 標識をONにします。ここではLR標識をONにしています。
LR標識 : LAST−RECORD標識です。これがONになるとRPGプログラムは終了します。
RETRN :RETURNで呼び出し側へ制御を返します。


標識

AS/400ソフトウエアの体系では、標識を多用しています。
RPGで使用できる標識は次のようなものがあります。
(ただし、ここでは全てを説明するわけではありません。)
01-99 一般標識 プログラムの中でプログラマーが自由にオン・オフできる
KA-KN、KP-KY 機能キー標識 Fキーに対応する。F1〜F12、F13〜F24
L1-L9 制御レベル標識 キーブレーク処理用
LR 最終レコード標識 最終レコードを読取したときオン。ファイルはクロースされる。
MR 突合せレコード標識  
H1-H9 停止標識 ほぼ、STOP リテラルに相当
RT 戻り標識  
U1−U8 外部標識  いわゆるUPSIです。
OA-OG,OV オーバーフロー標識  


RPGサイクル

RPGは実行時、RPGサイクルと呼ばれる手順で処理をしています。
疑似コーディングで表わすと次のようになります。
DO UNTIL(LRがONになるまで)
      
      1.見出しおよび明細の出力
      2.入力レコードの入手
      3.合計演算の実行(L1〜L9,LR標識による)C仕様書の部分
      4.合計出力の書き出し
      5.IF LR=オフ THEN
          5.1 入力からフィールドの転送
          5.2 明細演算の実行 (C仕様書の部分)
      ELSE
          5.3終了処理
      ENDIF
      
END−DO
このRPGサイクルに沿ったプログラムを記述すれば、上記でC仕様書の部分だけのコーディングになり、
簡潔なプログラムが作れるのですが、COBOLプログラマーにはあまりなじみがないので、ここでは
取り上げません。
上記処理サイクル中の5.2の明細演算の実行の部分だけで、さらに繰返し処理を実現する方法で、
話をすすめます。(サイクルプログラムは、RPGプログラマーでも尻込みをする人が多い)


RPGの命令

RPGの命令は約100種あります。(APPENDEXを参照)
概略をサンプルで示します。

演算命令
加減乗除
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 加減乗除
     C*          要素1    命令 要素2    結果              意味 
     C                     Z-ADD123       A                A=0+123    
     C                     Z-SUB456       B                B=0-456    
     C           A         ADD  B         C                C=A+B      
     C           D         SUB  E         F                F=D-E      
     C           G         MULT H         I                I=G*H      
     C           J         DIV  K         L                L=J/K 
     C                     MVR            AMARI             余り取得
     C*
     C* 四捨五入: 53桁目をHとすると、小数以下第1位を四捨五入して割付。
     C           M         DIV  N         P         H       四捨五入  


割付・連結命令
         C* 1.割付                                                         
         C                     MOVELQQ        RR                左詰割付 
         C                     MOVE SS        TT                右詰割付 
         C                     MOVEL*BLANK    UU                SPACE    
         C                     MOVEL*ZERO     VV                ZERO

         C* 2.残りクリア: 53桁目をPとする、残りはブランクになる
         C                     MOVEL'***'     WW        P       残りをブランク
     
         C* 3.連結                                                          
         C           UU        CAT  VV        WW               WW=UU || VV 
補足説明
1.MOVEL,MOVEとも割りつけ元が短いとき、割付先の残りはそのままになります。
      例:RRが10バイトで’ABCDEFGHIJ’、QQが’XYZ’のとき、
             MOVEL ’XYZ’           RR
             なら、RRは’XYZDEFGHIJ’に、
             MOVE    ’XYZ’           RR
             なら、RRは’ABCDEFGXYZ’になります。

2.残りをブランクにするためには、53桁目をとします。
     *BLANK,*ZEROのときは長さは割り付け先にあわされます。


文字列処理
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 文字列の連結
     C                     MOVEL'AA'      AAA  2
     C                     MOVEL'BBB'     BBB  3
     C           AAA       CAT  BBB       CCC  5
     C* 文字列の切り出し
     C                     MOVEL'ABCDEFGH'DDD  8
     C                     Z-ADD5         LEN  30
     C                     Z-ADD2         T    20
     C           LEN       SUBSTDDD:T     EEE  5
     C*

補足説明
1.文字列の連結
上の例で、CCCは’AABBB’になります。PL/IのCCC=AAA || BBB;に相当します。

2.文字列の切り出し
上の例で、EEEは、’BCDEF’になります。


プログラム実行制御命令

処理の条件分岐 : IF 〜 THEN 〜 ELSE
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* IF 〜 THEN 〜 ELSE
     C           AA        IFEQ 12
     C                     MOVEL'AAA'     CC
     C                     ELSE
     C                     MOVEL'BBB'     CC
     C                     ENDIF
     C* AA=12ならCCは’AAA’にそうでないとき’BBB’になる。
     C*
     C*  各種IF                                            意味
     C          AA        IFEQ BB                          AA = BB
     C          AA        IFNE BB                          AA ≠ BB
     C          AA        IFGT BB                          AA > BB
     C          AA        IFGE BB                          AA ≧ BB
     C          AA        IFLT BB                          AA < BB
     C          AA        IFLE BB                          AA ≦ BB
     C*
補足説明
一般形:IFxxの形、xxはEQ,NE,GT,GE,LT,LE
       条件の組合せ:ANDxx,ORxx
       IFにつづけて、ANDxx,ORxxをコーディングする。


例 :IFにおける条件の組み合せ
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C           AA        IFGE 11
     C           AA        ANDLE50 
     C                     MOVEL'AAA'     CC
     C                     ELSE
     C                     MOVEL'BBB'     CC
     C                     ENDIF
補足:AAが11〜50のとき、CCは’AAA’になる、そうでないときは’BBB’になる


繰り返し処理 : DO
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 1 .DOWxx 〜 ENDDO
     C*    A=Bの間、繰り返し実行
     C           A         DOWEQB
     C*                      処理1
     C*                      処理2
     C*                      ・・・
     C                     ENDDO
     C*
     C* 2.Xを1からNまで変化させながら、N回繰り返し実行
     C           1         DO    N         X
     C*                      処理1
     C*                      処理2
     C*                      ・・・
     C                     ENDDO
     C* 3.DOループの脱出(LEAVE命令で脱出する。)
     C           A         DOWEQB
     C*                      処理1
     C*                      処理2
     C           CC        IFGT DD
     C                     LEAVE
     C                     ENDIF
     C                     ENDDO
補足:1.繰り返し条件が複合するの場合は、IFの場合と同じく、
          ANDxx,ORxxをつづける。
      2.COBOLの次の例に相当する。
          PERFORM    VARYING  X  FROM  1  BY  1  UNTIL  X=N
                     処理1
                     処理2
                     ・・・
          END-PERFORM.
      3.LEAVE命令を実行すると、繰り返し処理をやめ、ENDDOの後ろに
          制御が移る。


内部サブルーチンの呼出
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 3.サブルーチン呼出
     C                     EXSR           SBAAA
          ・・・
          ・・・
     C*呼び出されるサブルーチン
     C           SBAAA     BEGSR
     C*
     C*                    処理1
     C*                    処理2
     C*                   ・・・
     C                     ENDSR
補足 : COBOLのPERFORMに相当。


ケース処理によるサブルーチンの呼出
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* CASE処理によりサブルーチン呼出。
     C*    BBが10ならSBPP、20ならSBQQ、30ならSBRRを呼出す
     C           BB        CASEQ10        SBPPP
     C           BB        CASEQ20        SBQQQ
     C           BB        CASEQ20        SBRRR
     C                     ENDCS
補足:CASxxは演算項目1と項目2の比較条件成立のとき、サブルーチンを呼出す。
           一般形はCASxx。xxは条件でIFの場合に同じ。条件複合の場合も同様。


ケースによる分岐処理 : SELECT 〜 WHEN
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* SELCT〜WHEN
     C                     SELEC
     C           CC        WHEQ 'A'
     C                     Z-ADD100       XXX
     C           CC        WHEQ 'B'
     C                     Z-ADD200       XXX
     C           CC        WHEQ 'C'
     C                     Z-ADD300       XXX
     C                     OTHER
     C                     Z-ADD999       XXX
     C                     ENDS
補足:XXXはCCがAなら100、Bなら200、Cなら300、その他なら999になります。


入出力命令
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 1.データベース入出力
     C*     順読みと逆順よみ
     C                     READ AAAR                       順読み
     C                     READPAAAR                       逆順読み
補足:逆順読みをするときは、予め、読取位置を目的の位置へのセットする操作が必要。


読取位置の位置づけ : SETLL , SETGT
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 位置づけ
     C* 1.キーの値を超えない位置に位置づけ( SET LESS THAN )
     C           KEY11     SETLLBBBR                       
     C* 2.キーの値よりも大きい位置に位置づけ( SET GREATER THAN )
     C           KEY12     SETGTBBBR                       
     C*
補足:BBBRはレコード様式名とします。
      次のようなデータがあるとして、KEY11が15とすると、
      上の例のSETLL命令を実行すると、キー10と20の間に位置づけられます。
      上の例でKEY12が50とすると、キー30の後ろに位置づけられます。
      COBOLのSTART命令に相当します。
キ ー デ ー タ
1 0 DATA −1
2 0 DATA −2
3 0 DATA −3


キーによる位置づけと読みとりの組み合せ(正順よみと逆順よみ)
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C*1. 正順読み(KEY11の次から)
     C           KEY11     SETLLBBBR                       位置づけ
     C                     READ BBBR                     99
     C           *IN99     DOWEQ*OFF
     C*                    処理1
     C*                    処理2
     C*                   ・・・
     C                     READ BBBR                     99
     C                     ENDDO
     C*
     C*2. 逆順読み(一番最後から)
     C           *HIVAL    SETGTBBBR                        最後へ位置付け
     C                     READPBBBR                     99 逆読み
     C           *IN99     DOWEQ*OFF
     C*                    処理A
     C*                    処理B
     C*                   ・・・
     C                     READPBBBR                     99 逆読み
     C                     ENDDO
補足説明 :
1.プログラム開始時は先頭レコードに位置づけされています。
2.逆読みするときは、最終レコードのさらに後ろに位置づけする。このため、*HIVALを使います。


同一キーのレコードを読む
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 1.データベース入出力
     C* 1.正順、同一キー:KEY11と同じものを持つレコードをよむ。
     C           KEY11     READEBBBR                     98
     C*
     C* 2.逆順、同一キー:KEY22と同じものを持つレコードをよむ。
     C           KEY11     REDPEBBBR                     98
補足:
1.の例で、KEY11を20とすると、下のDATA−2からDATA−4が読取されます。
DATA−5をよみとりしようとすると標識98がオンになります。

データ
キー1 データ キー2
10 DATA − 1
20 DATA − 2
20 DATA − 3
20 DATA − 4
30 DATA − 5


特定のキーをもつレコードの単独よみ
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* レコードの単独よみ
     C*     (KEY22で与えられた値のキーを持つレコードをよむ)
     C           KEY22     CHAINCCCR
     C*
補足:一連のREADと異なり、CHAINでは読取位置は移りません。何度でも同じレコードが読まれます。


レコードの追加、置換え、削除
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 1.追加
     C                     WRITEDDDR
     C* 2.置換え
     C                     UPDATDDDR
     C* 3.削除
     C                     DELETDDDR
補足 :
1.WRITEはレコードの件数が増加します。F仕様書でレコード件数増加の定義が必要です。
2.UPDATは、一度READやCHAIN命令で一度読み込みしたものを置き換えします。
   (読取していないレコードを置き換え処理できません)
3.DELETは、一度READやCHAIN命令で一度読み込みしたものを削除します。
  (読取していないレコードを削除処理できません)


定義命令

キーリスト

レコードのキーは1つのフィールドだけとは限りません。
また、1ヶ所にかたまってまっているとも限りません。(       )内はフィールド名とします。
キー1
(KFLD1)
データ1 キー2
(KFLD2)
キー3
(KFLD3)
データ2
10 DATA1 200 DATA−A
20 DATA2 200 DATA−B
30 DATA3 400 DATA−C
このような、複数の散在したキーを扱うためには、キーリストと呼ぶキーの定義を行って、
それによって、SETLLや、READE、CHAINなどに指定します。
(もちろん、1個のキー項目で、1つのキーリストにすることもできます。)

キーリストのコーディング
キーの順は、キー1、2、3の順に定義されているものとして、上記の例のコーディングは次のようになります。
 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* キーリスト
     C           KEY11     KLIST
     C                     KFLD           KFLD1
     C                     KFLD           KFLD2
     C                     KFLD           KFLD3

画面入出力

ワークステーションの画面との入出力をするにはDSPLYを使用します。

 ...+....1....+....2....+....3....+....4....+....5....+....6....+....7..
     C* 画面への表示のみ
     C           MSG1      DSPLY
     C* 画面への表示と応答の取得
     C           MSG2      DSPLY          REPLY

結果のフィールドに変数を指定すると、画面からの応答を受取ることができます。




前ページ 次ページ 目 次

(C)COPYRIGHT ISHIOKA KATSUHIDE 2000−2003