サイクルと仕様書
本来、サイクルは、仕様書の「裏」で働く、ロジックですが、イメージしづらいので、ここからお話しすることは、以下の構造を頭にたたき込んでからにしてください。
入力レコード → |
入力(i仕様書) |
|
|
↓ |
|
|
明細演算(c仕様書) |
|
|
合計演算(c仕様書) |
|
|
↓ |
|
|
出力(o仕様書) |
→ 出力レコード |
いままで、i仕様書とo仕様書は、やってきましたよね。ここで、サイクルのお話をひとまず、置いておいて、いよいよ、c仕様書へ突入します。プログラムがプログラムたる所以(ゆえん)でもある、とも言えるほど、c仕様書は大事です。いわゆるプログラムの命令や計算を記述するものです。プログラムのエンジン部分とでもいうのかなぁ。
覚えていますか(復習のコーナー)
RPGのプログラムの仕様書を全部言えますか?
H仕様書
F仕様書
E仕様書
L仕様書
i仕様書
C仕様書
o仕様書
でしたね。 |
c仕様書の構造
c仕様書は、大きく分けて、「明細サイクル部分」と、「合計サイクル部分」と「サブルーチン部分」に分かれます。この順序通りに、入力しないと、コンパイルエラーで、プログラムを作れませんので、この順番も覚えて下さい。
c仕様書 |
明細演算部分 |
合計演算部分 |
サブルーチン部分 |
たとえば、以下のようになります。
H仕様書 |
H Y/ 1 |
F仕様書 |
FBALLP IP E K DISK
FQPRINT O F 132 OF PRINTER |
i仕様書 |
IBALLR 01
I COLOR L1 |
C仕様書 |
明細演算部分 |
C ADD 1 O1CNT 50
C*
C OF EXCPT#HED
C EXCPT#DTL |
合計演算部分 |
CL1 EXCPT#TOL
CLR RETRN |
サブルーチン部分 |
C *INZSR BEGSR
C TIME O1TIME 60
C EXCPT#HED
C ENDSR |
o仕様書 |
OQPRINT E 101 #HED
O 1 'H'
O 26 'NUMBER OF BALLS BALLR4'
O 43 '実行日付:'
O UDATE Y 52
O*
O E 1 #HED
O 1 'H'
O 43 '実行時間:'
O O1TIME 52 '0 : : '
O*
O E 1 #DTL
O 1 'D'
O COLOR 10
O*
O E 1 #TOL
O 1 'T'
O O1CNT JB 20 |
それから、全手順の場合(つまり、サイクルを使わないプログラムの場合)は、合計演算部分はありません。したがって、全手順の場合は、「明細演算部分」と「サブルーチン」だけになります。
3つの部分の区別の仕方
明細演算
仕様書のコード「C」の後(7、8桁)に、Lxが無い。(大抵は空白)
合計演算
仕様書のコード「C」の後(7、8桁)に、Lxが有る。(Lxは、L1からL9及びLR)
※もし、RPGサイクルを使わない(全手順)場合、この合計演算は記述しません。
サブルーチン
BEGSRとENDSRに挟まれている。
間違った指定の例
L1合計演算が、明細演算の前にあるので、間違い。
→ |
CL1 EXCPT#TOL |
|
C ADD 1 O1CNT 50
C*
C OF EXCPT#HED
C EXCPT#DTL |
|
CLR RETRN |
|
C *INZSR BEGSR
C TIME O1TIME 60
C EXCPT#HED
C ENDSR |
サブルーチンが、c仕様書の最後に無いので、間違い。
|
C ADD 1 O1CNT 50
C*
C OF EXCPT#HED
C EXCPT#DTL |
→ |
C *INZSR BEGSR
C TIME O1TIME 60
C EXCPT#HED
C ENDSR |
|
CL1 EXCPT#TOL
CLR RETRN |
c仕様書の骨組み
大まかにc仕様書の構成を覚えてしまいましょう。この方が、覚えやすいのでは無いでしょうか?
「項目x」は、正しくは、「演算項目x」です。「命令」は正しくは、「演算命令」です。「結果」は正しくは、「結果のフィールド」です。これが基本的な骨組みです。「命令」の部分には、四則演算の他に、ファイルへのアクセス命令や、その他のオブジェクトの制御、他、たくさんの命令コードが入ります。
c仕様書のレイアウト
さらに、細かくc仕様書を見ておきましょう。この章での、ポイントである、「標識」とつく部分をよく見ておいてください。
桁 |
6 |
7 〜 8 |
9 〜 17 |
18 〜 27 |
28 〜 32 |
33 〜 42 |
43 〜 48 |
49 〜 51 |
52 |
53 |
54 〜 59 |
60 〜 80 |
名前 |
仕様書コード |
制御レベル |
条件付け標識 |
演算項目1 |
演算命令 |
演算項目2 |
結果フィールド |
フィールドの長さ |
小数部分の桁数 |
命令拡張 |
結果の標識 |
注記 |
記入項目 |
C |
ブランク, L0 ,L1 〜L9,
LR,
(SR ,AN、OR) |
ブランク, 01 〜 99 ,
KA 〜 KN、KP 〜 KY ,
L1 〜 L9,
LR,
MR,
H1 〜 H9,
RT,
U1 〜 U8,
OA 〜 OG、OV |
記号名 またはリテラル,
フィールド名 |
命令コード |
記号名 またはリテラル,
フィールド名 |
フィールド名 |
ブランク, 数字フィールドの長さ=1
〜 30,
文字フィールドの長さ1 〜 256 |
ブランク, 0 〜 9 |
ブランク, H,N,P |
ブランク, 01 〜 99,
KA 〜 KN、KP 〜KY,
H1 〜 H9,
L1 〜 L9,
LR,
OA 〜 OG、OV,
U1 〜 U8,
RT |
|
よく使われる命令コード
ここに上げるのは、自分の会社のRPGソースを走査して、命令語の出現回数をカウントして、並び替えたものです。何かの役に立つかもしれませんね。やはりトップはMOVE命令でした。出現回数が80回以上のものは、確実に覚えて下さい。自分はここに出ている命令コードは、全てマニュアルを見ないでも、分かります。英語で言えば、基本単語です。
順位 |
命令コード |
出現回数 |
順位 |
命令コード |
出現回数 |
順位 |
命令コード |
出現回数 |
順位 |
命令コード |
出現回数 |
1 |
MOVE |
9,294 |
27 |
ANDNE |
417 |
53 |
DIV |
105 |
79 |
READP |
19 |
2 |
Z-ADD |
7,805 |
28 |
CALL |
402 |
54 |
CABNE |
101 |
80 |
ORLT |
17 |
3 |
END |
6,083 |
29 |
READE |
362 |
55 |
ORNE |
97 |
81 |
ENDSL |
16 |
4 |
MOVEL |
4,020 |
30 |
ANDEQ |
358 |
56 |
READC |
94 |
82 |
REDPE |
16 |
5 |
IFEQ |
3,624 |
31 |
GOTO |
341 |
57 |
IN |
88 |
83 |
WHLT |
15 |
6 |
ADD |
2,389 |
32 |
MOVEA |
335 |
58 |
FREE |
85 |
84 |
DOWEQ |
11 |
7 |
EXSR |
2,245 |
33 |
CLEAR |
311 |
59 |
ANDLT |
78 |
85 |
ITER |
11 |
8 |
PARM |
2,236 |
34 |
COMP |
286 |
60 |
WHGE |
78 |
86 |
DOUNE |
10 |
9 |
BEGSR |
2,111 |
35 |
PLIST |
268 |
61 |
WHLE |
76 |
87 |
CABGT |
9 |
10 |
ENDSR |
2,111 |
36 |
DO |
261 |
62 |
OPEN |
72 |
88 |
MVR |
7 |
11 |
KFLD |
1,845 |
37 |
OREQ |
260 |
63 |
ORGT |
67 |
89 |
ORGE |
6 |
12 |
ELSE |
1,227 |
38 |
UPDAT |
224 |
64 |
IFLE |
66 |
90 |
SETGT |
6 |
13 |
IFNE |
1,132 |
39 |
LEAVE |
217 |
65 |
DELET |
64 |
91 |
SORTA |
5 |
14 |
EXCPT |
953 |
40 |
EXFMT |
210 |
66 |
LOKUP |
59 |
92 |
CAS |
4 |
15 |
CHAIN |
859 |
41 |
IFGT |
197 |
67 |
SETOF |
59 |
93 |
UNLCK |
4 |
16 |
WRITE |
717 |
42 |
CASEQ |
178 |
68 |
ENDDO |
46 |
94 |
XLATE |
4 |
17 |
DEFN |
699 |
43 |
ENDIF |
164 |
69 |
CLOSE |
44 |
95 |
ENDCS |
3 |
18 |
WHEQ |
698 |
44 |
IFLT |
158 |
70 |
SUBST |
43 |
96 |
TESTN |
3 |
19 |
CABEQ |
665 |
45 |
SELEC |
153 |
71 |
Z-SUB |
39 |
97 |
CASNE |
2 |
20 |
CAT |
645 |
46 |
MULT |
152 |
72 |
ANDGE |
38 |
98 |
CHEKR |
2 |
21 |
KLIST |
601 |
47 |
IFGE |
147 |
73 |
SCAN |
29 |
99 |
CABLT |
1 |
22 |
TAG |
591 |
48 |
READ |
147 |
74 |
BITON |
21 |
100 |
DOUGE |
1 |
23 |
SETLL |
566 |
49 |
SETON |
128 |
75 |
OTHER |
20 |
101 |
DOWLE |
1 |
24 |
DOUEQ |
493 |
50 |
ANDLE |
126 |
76 |
OUT |
20 |
102 |
DUMP |
1 |
25 |
RETRN |
466 |
51 |
SUB |
117 |
77 |
ANDGT |
19 |
103 |
ORLE |
1 |
26 |
TIME |
429 |
52 |
XFOOT |
117 |
78 |
BITOF |
19 |
104 |
WHNE |
1 |
※サブルーチンの定義BEGSRとENDSRが、2111回定義されているのに、サブルーチン呼び出し命令のEXSRが2245回と、数字が違いますね。どうしてだと思いますか?そう、同じサブルーチンを複数呼び出すので、EXSRの方が多いのですね。
起立、礼、着席
1999/4/10 |