R P G | 演 算 仕 様 書 |
演算仕様書は、COBOLのPROCEDURE DIVISIONに相当します。
まずは、サンプル・プログラムをごらん下さい。以下のサンプル・プログラムで見て
行くこととします。
このプログラムは得意先マスター(M420)をよみ、内容を印刷します。
このとき、売上は1000で割った値つまり、千円単位で表示します。余りは、切り
捨てです。
入力
入力ファイル(M420)は次のように定義してあるものとします。
得意先マスター(レコード様式 : M420R)
フィールド名 長さ タイプ 小数点以下 見出し名 TKDEL 1 A 削除フラグ TKTKNO 5 A 得意先Y TKNMKJ 42 O 得意先名 TKNMKN 20 A 得意先カナ TKTEL 12 A 電話番号 TKSLNO 4 A 営業担当 TKFLG 1 A フラグ TKUR\ 11 S 0 売上実績
出力
出力は印刷ファイル(LM420AP)として、次のように印刷するように定義して
あるものとします。
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999
XXXXX XXXXXXXXXXXXXXXX..XXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXX 99999999
フィールド名 長さ タイプ 小数点以下 カラム 見出し名 P@TKNO 5 A 3 得意先 P@NMKJ 42 O 10 得意先名 P@NMKN 20 A 54 得意先カナ P@TEL 12 A 76 電話番号 P@UR\ 8 S 0 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:1、2行目:プログラムを読みやすくするためのコメントです。
C*=============================================================== C* 1.前処理 C READ M420R 99
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:MOVEL: MOVE−LEFTで左詰め格納です。
...+....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\ 売上実績
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桁目をPとします。
*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 A 20 DATA − 2 A 20 DATA − 3 B 20 DATA − 4 C 30 DATA − 5 A
特定のキーをもつレコードの単独よみ
...+....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 A 200 DATA−A 20 DATA2 B 200 DATA−B 30 DATA3 B 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