サイクルの処理
AS/400 RPG/400 解説書 資料番号 SC88-5204-00 2.0 第2章
RPG/400プログラム・サイクルおよびエラー処理
RPG/400プログラム論理の一部はRPG/400コンパイラーによって提供されます。コンパイラーによって提供される論理は、プログラム・サイクルまたは論理サイクルと呼ばれます。プログラム・サイクルとは、読み取った各レコードを特定の順序でプログラムが処理していく一連のステップのことです。
原始プログラムの中でRPG/400
仕様書にコーディングする情報には、レコードの読取りまたは書出しを行う時点を明示的に指定する必要はありません。原始プログラムのコンパイル時に、RPG/400コンパイラーによって、これらの操作の論理順序が設定されます。コーディングした仕様によって、プログラムがサイクル内の各ステップを使用することもあればしないこともあります。
プライマリー・ファイル(ファイル仕様書の 16 桁目の
P で示される)およびセカンダリー・ファイル(ファイル仕様書の
16 桁目のSで示される)では、プログラム・サイクルによって入力が制御されることをコンパイラーに指示します。全手順ファイル(ファイル仕様書の
16 桁目の F
で示される)では、プログラム指定の演算命令(たとえば、READおよびCHAIN
)によって入力が制御されることをコンパイラーに指示します。
プログラムは以下のもので構成することができます。
1つのプライマリー・ファイルおよび1つまたは複数のセカンダリー・ファイル
全手順ファイルのみ
1つのプライマリー・ファイルおよび1つまたは複数の全手順ファイルの組合わせ。ここではサイクルによって制御される入力もありますが、プログラムによって制御される入力もあります。
ファイルがない(たとえば、パラメーター・リストまたはデータ域データ構造を入力に使用する場合)
|
ここでは、実践的な考え方を、出来るだけ簡単に理解出来るように説明しようと思っています。
このRPGサイクル(ここでは簡単にサイクルと呼ばせてください。)は、最初の頃、実は、よく分かりませんでした。本をいくら読んでも、先輩にいくら聞いても、ピンと来なかったのです。後で、これは、単に、最初の第一歩を踏み誤っていたことに気づきました。
サイクル処理は、実際のプログラムコードとは、切り離して考えるべだったのです。乱暴に言えば、仕様書とサイクルは、1対1対応しない、のです。そうして、より理解を深めるためには、「サイクル」と「仕様書」の接点を探し出すのです。驚く方もいるとは思うのですが、この方が、習得は楽です。
暗黙の処理
サイクルでは、多くの暗黙の処理をしています。暗黙の処理とは、「勝手に」される処理の事です。こちらの意図に添う場合も、添わない場合もあります。これを利用するときは、「最高だ」と思うことも有るのですが、必要ないときは、「最悪だ」ということにもなります。目的によって、「最高」であり、「最悪」にもなるわけです。使い方を誤れば、半日、下手すれば数日悩むことも有りました。
そんなに難しくはない
ここまで、読んで、「えー、難しそう」と思った方、そんなことはありません。理屈が分かると、よくできているな、としみじみ思います。サイクルの基本と応用のうち、ここでは、基本を、徹底的にやろうと思っています。このサイクルをc仕様書の説明の前に、持ってきたのは、意味があります。このサイクルを全く使わない方式を、「全手順(Full Procedure)」というのですが、これだと、ばんばんc仕様書を使います。このc仕様書の後に、サイクル処理を説明しては、「RPGの本質」的なサイクルの説明の機会を失うし、また、集計さえなければ、HFIOの仕様書だけでも、印刷プログラムを作成出来るのです。
気構え
ここでは、仕様書の話しよりも、サイクルの論理に終始すると思います(多分)。まるで、実際のプログラムは存在しなくて、論理(理屈)ばかり、でつまらないかもしれないのですが、サイクルの理解は、一般的プログラムのロジックの理解に繋がるはずです。勿論、如何にコードするか(仕様書を如何に使うか)は、後で説明しますが、ここからしばらくは、論理の話しに集中します。また、暗黙にされる部分も有りますので、(従って、コーディングすることができない部分が有るので)、想像力をたくましく持ってください。
サイクルの第一歩:明細処理
サイクルの基本は、「明細処理」と「合計処理」の2つです。明細処理は、「明細サイクル」「明細時」ともいいます。また、合計処理は「合計サイクル」「合計時」ともいいます。ここでは、「処理」という言葉を使います。
明細処理は、早い話、1レコードの処理の事です。以前説明したように、フィールドの集まりをレコードと、言うのでしたね。つまり、ファイルから、決まった長さのフィールドの集まりを、取りだすのですが、この取りだされたレコードに対する処理を「明細処理」といいます。実は、この明細処理に対して、「合計処理」があるので、これと区別するために、「明細」にこだわっています。処理が違うのです。明細処理とは、「今、読み込んだレコードの処理」と思ってください。合計処理は、後ほどお話しします。
明細処理では、一つのレコードの「入力」から、「演算」、「出力」までの処理を含みます。関係する主な仕様書は、i、c、oです。iでは、後ほど説明する「レベル標識」が大切です。この「レベル標識」は、i仕様書で、初期定義されて、続くC仕様書でも、O仕様書でも、使われます。主に「合計処理」で使われます。
また、サイクルの特色として、o仕様書に出力レコードの種類を3つ指定できます。それは、H「見出しレコードHeader」、D「明細レコードDetail」、T「合計レコードTotal」の3種類のレコードが有ります。これらは、このRPGサイクルと密接に関連して、動作します。見出しレコードは印刷の見出し、明細レコードは印刷の明細、合計レコードは印刷の合計、を意味しています。また、印刷以外に、ファイルにデータを書き出す場合に、明細や合計も利用できます。(ただし、外部記述では、o仕様書は、特定の限られた場合にしか使われませんので、ファイルの書き出しでは、あまりo仕様書は使われません。)
尚、通常は、レコードはE(例外レコード;サイクルの例外のこと)を使う方がわかりやすいです。通常使うのが「例外」では変に聞こえますが...
Hレコードの処理
これは、印刷の見出し部分の定義です。中でも、第1ページの見出しは、「明細の前に行う」必要が有るので、特別扱いされます。o仕様書の指定方法から「1P出力」などと呼ばれたりします。初めてRPGを勉強すると、大抵テキストに出てきたと思います。(今はどうか知らないけど)。この処理は、以前は、c仕様書を通らず、いきなり、o仕様書に行くため、時間の印刷が出来ませんでした。しかし、今は、*INZSRというサブルーチン(c仕様書)が有るおかげで、可能となりました。そもそも*INZSRが追加されたのは、このTIME命令の為でした。サブルーチンはc仕様書で出てきます。
Dレコードの処理
これは、読み込んだレコードの出力だけです。
Tレコードの処理
これは、「明細処理」ではなく、「合計処理」の時に出力されるレコードです。「合計処理」はこの後、説明します。
明細処理では、読み込んだレコードと一対一の対応になります。一件読み込んで、その一件を演算したり、出力したりします。これだけならば、簡単ですよね。簡単というより、単純です。でも、「合計処理」が入ってくると、少しだけ、ややこしくなります。多くの人が躓くのは、ここだろうと思います。これから、合計処理の基本を、かみ砕いて説明していきます。
合計処理の基本:暗闇のキャッチボール
ここで、ちょっと、脇道にそれて、次のお話を聞いてください。
あなたは、キャッチャーです。相手のピッチャーは恐ろしくコントロールがよくて、真っ暗闇なのに、あなたのミットに、きちんとボールを投げてきます。構えていると、声がかかって、ボールが飛んできます。キャッチすると、初めて、ミットの中のボールが見えます。あなたは、そのボールを足下に置いて、次のボールをキャッチして、捕球すると、また、足下に置きます。
ある日、監督が来て、今日はボールがいつものと違う、といいます。ボールに色が塗ってあって、「赤」と「青」と「緑」出そうです。そして、「赤なら赤が有る限り投げてくる。青なら青を有る限り投げてくる。緑もそうだ。それで、各々のボールを色別にカウントしてくれ」といいます。やれやれと、仕方なく、いつもの暗闇のキャッチボールが始まります。
第1球がきました。「緑」でした。この前に、受けたボールは有りません。貯めたボールが無いので、「緑」1個と数えます。また、ボールが来ました。これも「緑」です。「緑」2個と呟きます。そして、第3球は、「赤」でした。「緑」と違うものがきました。だから、「緑」は2個で終わり、さらに、今受け取った「赤」を1個と判断しました。その後、「赤」が10回も続きました。「あーあ早く「青」が来ないかな。「青」が来れば、「赤」のカウントが終わるのに」、とすこし、あきあきしていました。そして、やっと、待望の「青」がきました。キャッチャーで有るあなたは、そこで「赤」を11個とカウントして、同時に「青」が一個とカウントしました。そして「青」が、さらに4個続いた後で、ピッチャーが、「もうボール無いよ!」と叫んでいるのが聞こえました。つまり、「青」のボールは5個だったことが分かりました。
分かりましたか。このお話のポイントは何でしょう?
ポイント
最初の「緑」のボールが来たとき、無条件に緑一個とカウントしている。
第1サイクル(ファーストサイクル)のこと。
「緑」のボールの後に、「赤」のボールが来たとき、初めて、「緑」のカウントが終了している。
集計完了は、次のレコードを読んだ後、初めて、わかる。つまり、手元には、もう「赤」が来ている!「赤」のボールが来て初めて、「緑」のボールの集計が完了している!
最後の「青」が、「もうボール無いよ!」の掛け声が来て、初めて、「青」のカウントが終わる。
EOF(End of File)も、集計のタイミングになる。
イメージを身につけよう
サイクルは、暗記するものではなく、「流れ」を理解する事です。流れが分かれば、サイクルが見えてきます。
図では、分かりづらいところがありますね。文章で、説明します。
上記の場合、ボールのカウントだけが、目的なので、必要となる、フィールドは、
ボールの色を比較する為の、今受け取ったボールの色NEWBALLと、一つ前のボールの色OLDBALL。
数を数えるための、COUNT。
基本的に、
NEWBALLに今のボールをセット。
NEWBALL≠OLDBALLならば(前とボールの色が違ったら;=キーブレイク)、集計したカウントを表示してから、そのカウントを0に戻す。
OLDBALLに今のボールをセット。(ここは、NEWBALL≠OLDBALLの時のみでもよい。)
ボールのカウント(集計)をする。
という流れになります。
解説 |
明細処理 合計処理 |
NEWBALL |
比較 |
OLDBALL |
COUNT |
集計結果 |
処理を開始します。 |
● |
最初に、ボールを受け取るときは、OLDBALLは、空っぽですね。ですから、「前とボールの色が違ったら、集計したカウントを表示。」のルールが有るのですが、最初だけ例外です。(だって、まだ集計すらしていないでしょう?)この場合、キーブレイクは起こしません。 OLDBALLに今の緑をセットして、緑のボール一個として、COUNTをアップします。 |
明細処理 |
● |
≠ |
空 |
1 |
|
次も、緑のボールです。NEWBALL=緑、OLDBALL=緑ですので、キーブレイクは起きません。COUNTをアップします。 |
明細処理 |
● |
= |
● |
2 |
● |
次に来たのが、赤のボールです。NEWBALL=赤、OLDBALL=緑ですので、キーブレイクが起きます。表示したカウントを表示して、カウントを0に戻します。
OLDBALLに今の赤をセットして、赤のボール一個として、COUNTアップします。 |
合計処理 |
● |
≠ |
● |
0 |
2 |
明細処理 |
● |
→ |
● |
1 |
|
NEWBALL=赤、OLDBALL=赤ですので、キーブレイクは起きません。COUNTをアップします。 |
明細処理 |
● |
= |
● |
2 |
明細処理 |
● |
= |
● |
3 |
明細処理 |
● |
= |
● |
4 |
明細処理 |
● |
= |
● |
5 |
明細処理 |
● |
= |
● |
6 |
明細処理 |
● |
= |
● |
7 |
明細処理 |
● |
= |
● |
8 |
明細処理 |
● |
= |
● |
9 |
明細処理 |
● |
= |
● |
10 |
明細処理 |
● |
= |
● |
11 |
● |
その次が青のボールです。NEWBALL=青、OLDBALL=赤ですので、キーブレイクが起きます。表示したカウントを表示して、カウントを0に戻します。 OLDBALLに今の青をセットして、青のボール一個として、COUNTアップします。 |
合計処理 |
● |
≠ |
● |
0 |
11 |
明細処理 |
● |
→ |
● |
1 |
|
NEWBALL=青、OLDBALL=青ですので、キーブレイクは起きません。COUNTをアップします。 |
明細処理 |
● |
= |
● |
2 |
明細処理 |
● |
= |
● |
3 |
明細処理 |
● |
= |
● |
4 |
明細処理 |
● |
= |
● |
5 |
EOF |
ここで、EOFが起きます。EOFとは、早い話、もうファイルにデータが無いことです。つまり、すべてのボールを処理し終わった、ということになります。
そこで、キーブレイクでは無いのですが、青の次のボールは来ないのですから、青の集計結果を表示します。キーブレイクと同じ処理です。表示したカウントを表示して、カウントを0に戻します(最後だから、しなくてもいい)。受け取ったボールが無いのですから、COUNTはアップしません。 |
合計処理 |
EOF |
? |
● |
0 |
5 |
処理を終了します。 |
どうですか?わかりましたか?このページは大事なので、繰り返し見てください。
ページも重くなってきたので、続きは、次にします。今度は、RPGサイクルが、この処理をどのようにしているか、を説明していきます。
起立、礼、着席
1998/9/27 |