今回は、RPGサイクルを使わない、「全手順」によるプログラムを考えてみましょう。RPGサイクルでは、キーブレイクの指定がとてもラクでしたが、今度は、すべて自分でロジックを考えなくてはなりません。まずは、オーソドックスなキーブレイクのロジックから。構造化はこのあとに行います。
一般的なフロー
|
1 |
ファイルのオープン。RPGでは、勝手に開きますが、必ず、まず「開くのだ。」と、意識していましょう。但し、RPGの命令語※OPENを使えば、任意の場所で、オープンできます。 |
2 |
このプログラムでは、該当データが無くても、必ず見出しを出します。よって、この場所で明細印刷をします。これは、データ無い時に、まったく印刷しないと、オペレータが困るためにこのようにしました。データが無ければ、見出しを出さないのであれば、4のあとに見出し印刷をすることになるでしょう。
2000-1-13
もし、見出しの中に読み込んだデータを印刷したい場合は、当然データを読み込んでから、印刷することになります。ここでは、気にしないで行きましょう。
|
3 |
ファイルのデータの読み込み。RPGサイクルでは、この部分も暗黙に行われます。しかしながら、全手順では、しっかりコードしなくてはなりません。命令語は、READ命令ですね。 |
4 |
ファイルの最後になったら、プログラムを終わりにしないと、永久に終わらない(ループ化した)プログラムになってしまいます。また、EOF標識は、最後のレコードを読み込んだときにONになるのではなくて、最後のレコードを読んで、さらに再びファイル読み込みをして、初めてONになることにも、注意しておいてください。 |
5 |
キーブレイクでは必ず、入る処理が、この初回(ファーストサイクル)の判定です。これを無視すると、最初のレコードが、必ず、ブレイクしてしまいます。なぜなら、比較する対象が、無いのに無理やり比較するためです。 |
6 |
初回ならば、無条件にキーブレイクを「起こさないように」、比較フィールド(W1OLD)にキーを退避します。 |
7 |
キーブレイクのエンジン部分です。もし、W1OLDとCOLOR(今読み込んだ値)が異なっているとしたら、キーブレイクがおきているので、8,9,10へ進みます。もし同じならば、11へ進みます。 |
8 |
同一キーのとき(キーブレイクがおきていない間)に、集計された値を印刷します。 |
9 |
印刷し終わったら、合計フィールドを、次の集計に備えて、ゼロに戻します。 |
10 |
比較フィールド(W1OLD)にキーを退避します。 |
11 |
キーブレイクを起こしたときに、印刷する内容である、合計を、ここで集計します。これを、7の前で集計してしまうと、キーブレイクを起こした、レコードまでも、集計してしまうので、7のあと、キーブレイクの処理が終わってからでないと、集計できません。 |
12 |
読み込んだレコードの印刷。 |
13 |
最後に集計してきた、キーブレイク用の合計の印刷をします。そうしないと、最後にキーブレイクしてから、EOFになるまでの明細の合計が出ないまま、プログラムが終わってしまいます。 |
14 |
ファイルのクローズ。必ず開いたファイルは、閉じなくてはいけません。全手順のRPGでは、LR(Last
Record)をONにすること、または、※CLOSE命令で行います。 |
※OPEN、CLOSE命令では、F仕様書で、UserControlの指定をしなくてはいけません。
さて、では全手順のプログラムを見ていきましょう
全手順(DOUEQ)の例 BALLR5
上記のフローに合わせて、無理やりタグ(\READ,\END)を入れました。あしからず。また、プログラムの「あるべき姿」はここでは追求していません。まずはロジックを学びましょう。
H Y/ 1
FBALLP IF E K DISK
FQPRINT O F 132 OF PRINTER
C *LIKE DEFN COLOR W1OLDC
C*
C TIME O1TIME 60
C EXCPT#HED
C*
C \READ TAG
C*
C READ BALLP 90
C *IN90 CABEQ*ON \END
C*
B001 C *IN80 IFEQ *OFF
001 C MOVE COLOR W1OLDC
001 C MOVE *ON *IN80
E001 C ENDIF
C*
B001 C COLOR IFNE W1OLDC
001 C EXCPT#TOL
001 C Z-ADD0 O1CNT 50
001 C MOVE COLOR W1OLDC
E001 C ENDIF
C*
C ADD 1 O1CNT
C*
C OF EXCPT#HED
C EXCPT#DTL
C
C GOTO \READ
C*
C \END TAG
C*
C EXCPT#TOL
C*
C MOVE *ON *INLR
C RETRN
OQPRINT E 101 #HED
O 1 'H'
O 26 'NUMBER OF BALLS BALLR5'
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 J 20 |
概要
|
|
\READ |
TAG |
|
|
|
|
|
|
READ |
BALL |
|
|
|
*IN90 |
CABEQ |
*ON |
\END |
|
|
|
GOTO |
\READ |
|
|
|
|
|
|
|
|
|
|
\END |
TAG |
|
|
|
|
|
|
MOVE |
*ON |
*INLR |
|
|
|
|
|
RETRN |
|
|
|
|
フローとの対比図
上記のフローにコードを対応させてみました。多くは語りません。よーく、見て、わからない命令語は、面倒がらずにマニュアルを引きましょう。マニュアルを見る習慣をつけるのも大事なことです。自分で解決する、手段や能力を養いましょう!
|
1 |
RPGでは、このプログラムを呼び出した時点で、「暗黙のオープン」を行います。 |
2 |
C TIME O1TIME
C EXCPT#HED |
3 |
C \READ TAG
C READ BALLP |
4 |
C *IN90 CABEQ*ON \END |
5 |
C *IN80 IFEQ *OFF |
6 |
C MOVE COLOR W1OLDC
C MOVE *ON *IN80※
C ENDIF ※初回オフ |
7 |
C COLOR IFNE W1OLDC |
8 |
C EXCPT#TOL |
9 |
C Z-ADD0 O1CNT |
10 |
C MOVE COLOR W1OLDC
C ENDIF |
11 |
C ADD 1 O1CNT |
12 |
C OF EXCPT#HED
C EXCPT#DTL
ここでは、フロー図に無いが、「オーバーフローの処理」もしている。 |
|
C GOTO \READ 12から2の後ろに飛ぶ処理の部分です。 |
13 |
C \END TAG
C EXCPT#TOL |
14 |
C MOVE *ON *INLR |
\READ TAGが入っていませんでした。3の枠に入れることにしました。 [2000-2-4]
BALLR5の実行例
H NUMBER OF BALLS BALLR5 実行日付: 98/10/10
H 実行時間: 9:24:35
D 1緑
D 1緑
T 2
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
D 2赤
T 11
D 3青
D 3青
D 3青
D 3青
D 3青
T 5 |
全手順では、プログラムの流れを理解していることが、何よりも大事です。命令語やその記述方法は、その後で勉強すべきものだと思います。フロー図を何度も見て、暗記してください。
起立、礼、着席
2000/1/4 |