RPG | COBOL←→ RPG対応 |
ここでは、RPGを学習しようとするCOBOLプログラマーのために
COBOLに対応するRPG(III)の命令について紹介しています。
4つのDIVISION
ほぼ次のように対応します。厳密な意味での対応ではありません。
COBOL RPG仕様書 IDENTIFICATION DIVISION H ENVIRONMENT DIVISION F DATA DIVISION E,I,C,O PROCEDURE DIVISION C
プログラムID (PROGRAM-ID)
H仕様書の75〜80桁に記述します。省略可。
RPGのH仕様書でのプログラムIDはほとんど意味を持ちません。
ソースファイルにおけるメンバー名が、実質のプログラムIDとなります。
データ・エリア
データエリアはローカル・データ・エリアとユーザー・データ・エリアがあります。
COBOLではどちらもSPECIAL−NAMES段落でLOCAL−DATA/DATA−AREAとして定義します。
SPECIAL−NAME.
LOCAL−DATA IS L−ARA
DATA−AREA IS U−ARA.
データエリアの入力・出力はACCEPT/DISPLAYで行います。
ユーザーデータエリアの入出力には、「FOR 〜」が必要です。
ACCEPT WK−LDA FROM L−ARA.
ACCEPT WK−UDA FROM U−ARA FOR ’USRARA’.
DISPLAY WK−LDA UPON L−ARA.
ACCEPT WK−UDA UPON U−ARA FOR ’USRARA’.
ここで、WK−LDA/WK−UDAはWORKING−STORAGE SECTIONで定義済みとします。
RPGでは、どちらも入力仕様書のデータ構造でタイプ’U’のデータ構造として定義します。
RPGの例:ユーザー・データ・エリアは外部にUSRARAの名前で定義済みとします。
...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+...5 ...+... I* ローカル・データ・エリア IARA1 UDS I 1 10 L@FLD1 I 11 15 L@FLD2 I* ユーザー・データ・エリア IARA2 UDS I 1 10 U@FLD1 I 11 15 U@FLD2 I 16 30 U@FLD3
C* ユーザーデータエリアの入出力 C IN USRARA C OUT USRARA
ローカル・データ・エリアはプログラム開始した段階ですでに値が取り込まれています。
またLR(ラスト・レコード標識)がONでプログラムが終了すると、自動的に出力されます。
ユーザーデータエリアの情報ははIN命令で取得し、OUT命令で外部に出力されます。
ファイル定義 (FILE-CONTROL)
プログラムで使用するファイルは、F仕様書で記述します。
ファイル名
COBOLではSELECT文で、内部のファイル名と外部の実体名(または装置名)を記述しますが、RPGでは外部記述を使用してコンパイルするため、ファイル名は原則として外部の実体名を記述します。ファイル名はF仕様書の7桁目から記述します。
アクセスモード(ACCESS MODE)
RPGではアクセスモードについては特に指定はしません。
ファイル編成(ORGANIZATION)
ファイルの編成については、「装置」として、40カラムから記述します。
DISK データベースファイル、INDEXED,SEQUENTIALとも PRINTER 印刷装置ファイル WORKSTN 表示装置ファイル レコードキー
キー項目の指定は、キー項目で位置決めするか、相対レコード番号(RRN)で位置決めするかを31カラムに指定します。Kとするとキー項目で位置決め、ブランクは相対レコード番号です。
入出力のモード
入出力のモードはCOBOLではOPEN時に決めますが、RPGではF仕様書で15カラムに記述します。Iは入力、Uは入出力、Oは出力です。
処理手順
入出力でどのような処理がされるかを16カラムに記述します。
F:全手順すなわち、READ,WRITE,すべての処理方法がとられます。
C:入出力両方向の処理方法(会話型処理)がとられます。
P:RPGサイクルで動作するとき、プライマリーファイルとしての処理手順がとられます。レコードキー
COBOLではSELECT文でレコードキーのキー項目を記述しますが、RPGでは指定しません。演算仕様書中で随時記述し使用します。
例:
COBOL INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT FILE1 ASSIGN DATABASE-M420 ACCESS MODE RANDOM RECORD KEY TKTKNO ORGANIZATION INDEXED.RPG ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+...5 ...+... FM420 IF E K DISK
外部ファイルへのアサイン ( SELECT 〜 ASSIGN TO )
原則として、プログラム内部のファイル名と外部ファイル名は一致させて使用します。
次のような場合は、CLのOVRDBFコマンドで外部の実体と連携させます。
COBOL SELECT FILE1 ASSIGN TO DATABASE-M420. ***** ----RPG用CL OVRDBF FILE(FILE1) TOFILE(WRKLIB/M420) ***** ----
注:RPGのプログラムではF仕様書でFILE1と記述されているものとします。
SORCE-COMPUTER / OBJECT-COMPUTER
RPGでは不要です。(OSの機能が十分でなかったころの産物です。)
レコードレイアウトの定義 FD
I 仕様書のDS(データ構造)が対応しますが、レコードレイアウトはデータベースファイルの定義で行い、
プログラム内部では普通行いません。
コンパイラーはコンパイルのとき、該当のデータベースファイルから必要な情報を取得します。
01 レベルのグループ項目
I仕様書におけるDSが対応します。
例:
COBOL 01 YYMMDD. 03 YY PIC 99. 03 MM PIC 99. 03 DD PIC 99.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... IYYMMDD DS I 01 040YYMM I 01 020YY I 03 040MM I 05 060DD
中間レベルのグループ項目に相当するものは、上例のYYMMのように、割付場所を重複させて実現します。
中間レベルのグループ項目より、むしろREDEFINES に相当します。
データ項目の定義(長さ、タイプ、小数点以下)
データベースファイル記述、I仕様書での記述、C仕様書での記述の3通りの方法があります。
例:
COBOL
01 M420R. 03 TKSTS PIC X. 03 TKTKNO PIC X(5). 03 TKNMKJ PIC X(42). 03 TKNMKN PIC X(20). 03 TKTEL PIC X(12). 03 TKGYSH PIC X(2). 03 TKFLG PIC X. 03 TKUR\ PIC S9(15).RPG
データベース
ファイルの記述 ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... A R M420R TEXT('得意先MF') A*データフィールド A TKSTS 1A COLHDG('状態フラグ') A TKTKNO 5A COLHDG('得意先Y') A TKNMKJ 42O COLHDG('得意先名') A TKNMKN 20A COLHDG('得意先カナ') A TKTEL 12A COLHDG('電話番号 ') A TKGYSH 2A COLHDG('業種コード') A TKFLG 1A COLHDG('フラグ ') A TKUR\ 15S 0 COLHDG('売上実績額')RPG
I仕様書の中 ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... IREC1 DS I 1 1 TKSTS I 2 6 TKTKNO I 7 48 TKNMKJ I 49 68 TKNMKN I 69 80 TKTEL I 81 82 TKGYSH I 83 83 TKFLG I 84 980TKUR\RPG
C仕様書で +... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C Z-ADD000 X 70 パックデシマル C MOVE *BLANK MMM 32 文字列 OT C *LIKE DEFN AAA BBB 参照先と同一 ↑参照先 ↑定義
注:*LIKEを使用すると、参照先と同じ属性の変数が定義できます。
上の例では、BBBを定義しています。
変数名の長さは、COBOL は31桁まで,RPG-IIIは 6桁まで
初期値 (VALUE)
I 仕様書の中での記述(8桁目を I とする)
例:
COBOL 01 CONST. 03 NO-X PIC X VALUE '0'. 03 YES-X PIC X VALUE '1'.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... I DS I I '0' 1 1 NO I I '1' 2 2 YES
ダミー項目(FILLER)
RPGでFILLERに該当するものはありません。
定義をしないでおくと実質的にFILLERの状態になります。
例:
COBOL 01 DTL01. 03 NBR PIC 99. 03 FILLER PIC XX VALUE SPACE. 03 NAME-KJ PIC X(32).RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... I DS I 1 20NBR I 5 36 NAMEKJ
再配置(REDEFINES)
I 仕様書のDSで同じ場所を占めるように定義します。
例:
COBOL 01 YYMMDD. 03 YY PIC 99. 03 MM PIC 99. 03 DD PIC 99. 01 YYMM-R REDEFINES YYMMDD. 03 YYMM PIC 9999.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... IYYMMDD DS I 01 040YYMM I 01 020YY I 03 040MM I 05 060DD
配列 (OCCURS)
E仕様書で定義します。1次元の配列のみです。
例:
COBOL 01 DAYS OCCURS 12. 03 M-DAY 99.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 E MDY 12 2 0 月の日数
PICTURE 編集
印刷ファイルのDDSで定義します。
DDS A*. 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 A* 編集コードのテスト A R DTL01 A FLD01 7S 0 1 EDTCDE(1) A FLD02 7S 0 +2 EDTCDE(2) A FLD03 7S 0 +2 EDTCDE(3) A FLD04 7S 0 +2 EDTCDE(4) A* A R DTL02 A FLD0J 7S 0 1 EDTCDE(J) A FLD0K 7S 0 +2 EDTCDE(K) A FLD0L 7S 0 +2 EDTCDE(L) A FLD0M 7S 0 +2 EDTCDE(M)印刷される
場合 ...+... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 DTL01 9,999,999 9,999,999 9999999 9999999 DTL02 9,999,999- 9,999,999- 9999999- 9999999-
スクリーンセクション(SCREEN SECTION)
該当する対応がありません。画面への入出力は、EXFMT命令を使用します。
RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C EXFMTFMT01
プログラムへの受取パラメータ(USING)
予約語 の*ENTRYを使ったENTRY PLISTが対応します。
例:
COBOL PROCEURE DIVISION USING YYMM RTN.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C *ENTRY PLIST C PARM YYMM C PARM RTN
内部サブルーチンとその呼出(SECTION)
BEGSR 〜 ENSSRが相当します。呼出は EXSR 命令で行います。
例:
COBOL PERFORM AAA-SUB. ・・・ AAA-SUB SECTION. ・・・ ・・・ AAA-SUB-END. EXIT.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C EXSR AAASUB ・・・ C AAASUB BEGSR ・・・ ・・・ C ENDSR
外部プログラムの呼出と引き渡しパラメータ
CALL命令とPARMの組合せが対応します。
例:
COBOL CALL 'BBBPGM' USING AA BB CC.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C CALL 'BBBPGM' C PARM AA C PARM BB C PARM CC
パラメータリストを定義しておき、複数個所で利用できます。(下例)
RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C PLIST1 PLIST C PARM AA C PARM BB C PARM CC C ・・・ C ・・・ C CALL 'BBBPGM' PLIST1 C ・・・ C ・・・ C CALL 'BBBPGM' PLIST1
簡易入出力
COBOLのACCEPT/DISPLAYに対しては、DSPLYの機能がほぼが対応します。
RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C 'ERROR' DSPLY C 'INPUT?' DSPLY RET
1番目の例は表示のみ、2番目の例は、表示と変数RETへ応答を要求します。
条件分岐 ( IF〜 THEN〜 ELSE〜END-IF)
RPGではIF , ELSE , ENDIF が対応します。
例 :
COBOL IF YY > 50 THEN ADD 1900 YYYY ELSE ADD 2000 YYYY END-IF.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C YY IFGT 50 C ADD 1900 YYYY C ELSE C ADD 2000 YYYY C ENDIF
条件分岐(EVALUATE 〜 WHEN 〜 END-EVALUATE)
SELEC 〜 WHXX 〜 ENDSLが対応します。
例:
COBOL EVALUATE RANK WHEN 'A' MOVE 1.3 TO RITSU WHEN 'B' MOVE 1.25 TO RITSU WHEN OTHER MOVE 1.0 TO RITSU END-EVALUATE.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C SELEC C RANK WHEQ 'A' C Z-ADD1.3 RITSU C RANK WHEQ 'B' C Z-ADD1.25 RITSU C OHTER C Z-ADD1.0 RITSU C ENDSL
繰返し処理1(PERFORM 〜 UNTIL)
DOUXX 〜 ENDDO が対応します。
例:
COBOL PERFORM UNITL STS = '*' ・・・ ・・・ END-PARFORM.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C STS DOUEQ'*' C ・・・ C ・・・ C ENDDO
内部サブルーチン呼出型の繰返しは対応する命令はありません。
DOXX 〜 EXSR ・・・ 〜 ENDDOで実現します。
繰返し処理2(PERFORM 〜 VARYING 〜 FROM 〜 BY 〜 UNTIL〜 END-PERFORM)
DO 〜 ENDDO が対応します。
例:
COBOL PERFORM VARYING K FROM 11 BY 1 UNTIL > 19 ・・・ ・・・ END-PERFORM.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C 11 DOUGT19 K C ・・・ C ・・・ C ENDDO
条件の複合
条件が複合する場合は、IFXXやDOWXX,DOUXXなどの後に、ANDXX,ORXXを後続させます。
例:
COBOL IF A = B OR C = D THEN MOVE 123 TO X ELSE MOVE 456 TO X END-IFRPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C A IFEQ B C C OREQ D C Z-ADD123 X C ELSE C Z-ADD456 X C ENDIF
日付取得 (ACCEPT)
UDATEまたは*DATEを使用します。
例:
COBOL ACCEPT YYMMDD FROM DATE.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C Z-ADDUDATE W6YMD C* C Z-ADD*DATE W8YMD
注:UDATEは6桁日付、*DATEは8桁日付です。
この日付はサインオンしたときの日付です。システム日付ではありません。
ジョブ日付は、コマンドまたはCLプログラムで変更が可能です。
表示 ( DISPLAY )
DSPLY命令が対応します。
例:
COBOL DISPLAY DATA1 UPON CONSOLE.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... C DATA1 DSPLY
ファイルオープン (明示OPEN)
OPENが対応します。RPGは特に指定しないと、自動OPENです。
F仕様書で、ユーザーがオープンの制御権を持つ旨の指定が必要です。
例:
COBOL OPEN I/O M420.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... 〜 7 ...+ FM420 UF E K DISK UC ・・・ ・・・ C OPEN M420
71、72桁にUCを指定すると、ユーザーがオープンの制御権を持ちます。
このときは、プログラム開始時に自動OPENされません。
ファイルのオープン属性 (INPUT, I-O, OUTPUT)
F仕様書で記述します。
例:
COBOL OPEN INPUT FILE1. OPEN I-O FILE2. OPEN OUTPUT FILE3.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 . FFILE1 IF E K DISK FFILE2 UF E K DISK FFILE3 O E K DISK
ファイルクローズ (CLOSE)
CLOSEが対応します。(ユーザーがオープンの制御権を持つ場合)
例:
COBOL CLOSE M420.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 ...+... 7 . C CLOSEM420
加減乗除 (ADD, SUBTRACT, MULTIPLY, DIVIDE)
それぞれ次のように対応します。
例:
COBOL ADD A TO B GIVING C. SUBTRACT B FROM A CIVING C. MULTIPLY A BY B GIVING C. DIVIDE A BY B GIVING C REMAINDER R.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... 7 ...+ C A ADD B C C A SUB B C C A MULT B C C A DIV B C C MVR R 剰余取得
注:割算の余りは、MVRという別の命令によって取得します。
四捨五入
53桁目にHを指定します。
例:
COBOL COMPUTE C ROUNDED = A * B.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 . C A MULT B C H
計算(COMPUTE)
RPG-IIIにはCOMPUTEに該当する命令はありません。
注:ILE−RPGにはCOMPUTEに相当する命令(EVAL)があります。
移送命令 ( MOVE )
MOVEL,MOVEが該当します。MOVELは左詰割付、MOVEは右詰割付です。
移送元が短いとき、COBOLではブランクが詰られますが、RPGでは前のデータが残ったままになります。(これを利用して文字列の連結を行うことがあります)
ブランクを詰めるには、53桁目にPを指定します。
例:
COBOL MOVE A TO B.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 . C MOVELA B C MOVELC D P C MOVE E F
注:移送命令考慮事項
RPGでは同じフィールド名(変数名)は入力、出力同じところがとられます。
例えば、入力のフィールド名が、FLD01,FLD02,FLD03、同じく出力のフィールド名がFLD01、FLD02、FLD03と
すると、入力から出力への移送命令は不要です。
文字列チェック(INSPECT)
部分的にSCAN命令が対応します。
例:補足:COBOLでは見つかるまでの文字数で3になりますが、RPGではX1は4、X2は5になります。
COBOL 01 ID-1 PIC X(10) VALUE "123ABXXXXX". 01 CONTR-1 PIC 99 VALUE 00. INSPECT ID-1 TALLYING CONTR-1 FOR CHARACTERS BEFORE INITIAL "AB".RPG I DS I I '123ABXXXXX' 1 10 WRK1 I I '1234ABXXXX' 11 20 WRK2 C* C 'AB' SCAN WRK1 X1 70 C 'AB' SCAN WRK2 X2 70 C X1 DSPLY C X2 DSPLY C SETON LR
ブランク、ゼロ( SPACE ZERO )
*BLANK、*ZEROが該当します。
例:
COBOL MOVE SPACE TO AA. MOVE ZERO TO BB.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... C MOVE *BLANK AA C MOVE *ZERO BB
ローバリュー/ハイバリュー(LOW−VALUE/HIGH−VALUE)
RPGでは予約語の*LOVAL,*HIVALが該当します。
例:
COBOL MOVE LOW-VALUE TO CC. MOVE HIGH-VALUE TO DD.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... C MOVE *LOVAL CC C MOVE *HIVAL DD
配列のN番目の要素
AAA,Nの形でコーディングします。(RPG-III)
従って配列名は最長4桁までに制限しておくのが便利です。
例:
COBOL MOVE LOW-VALUE TO AAA (N).RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ... C MOVE *LOVAL AAA,N
順次読取(READ)
READ命令が対応します。
例:
COBOL READ FILE1 AT END 〜RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 C READ FILE1R 99
注:COBOLにはない、次のような命令があります。
READE 同一キーグループのみの読取り REDPE 同一キーグループのみの逆読取り
キーによるランダムアクセス
CHAIN命令が該当します。
例:
COBOL SELECT FILE1 ASSIGN PFM20 ORGANIZATION IS INDEXED ACCESS MODE RANDOM RECORD KEY 〜 ・・・ READ FILE1 INVALID KEY MOVE SPACE TO NAME1.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 FM420 IF E K DISK C* ・・・ ・・・ C KEY1 CHAINFILE1R 98 C *IN98 IFEQ *ON C MOVE *BLANK NAME1 C ENDIF
出力 (WRITE)
WRITE命令が該当します。
COBOLの場合、WRITE命令が実行されると、出力バッファーはクリアされますが、
RPGの場合はクリアされないので注意が必要です。
バッファーをクリアするためには、RPGではCLEAR命令があります。
例:
COBOL WRITE F1REC.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 C WRITEF1REC C CLEARF1REC
注:上例のクリア命令はCOBOL互換の例のために入れたものです。
通常は、WRITEのたびにクリアを入れることはあまりしません。
実行打ち切り (STOP)
該当する命令はありません。
制御権の戻し(GO BACK)
RETRN命令が該当します。この命令を実行すると、RPGは呼出側プログラムに制御を戻します。
例:
COBOL GO BACK.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 C SETON LR C RETRN
注:SETON LRはLAST RECORDをよみとった意味で、ファイルをCLOSEします。
LRをオンにしないで、RETRNすると、ファイルはOPENのままです。
セクションからの抜け出し。(EXIT)
RPGには該当する命令はありません。強いていえば、ENDSRが相当します。
例:
COBOL EXIT.RPG ... 1 ...+... 2 ...+... 3 ...+... 4 ...+... 5 ...+... 6 C ENDSR
対応する命令のないもの
RPGにはあるが、COBOLには対応する命令がないものには次のようなものがあります。
MOVE 右詰割りつけ。
MVR 剰余取得。
SORTA 配列ソート
READE 同一キー読取
REDPE 同一キー読取。(逆順)
XFOOT 配列要素の合計。
XLATE 文字置き換え。
目 次
(C)COPYRIGHT ISHIOKA KATSUHIDE ,2000