17.21.RPGの基本 RPGサイクル4 |
制御レベル標識の2つの顔ここから説明する事は、ものすごく重要です。制御レベル標識の理解に欠かせないことなのです。前から、説明しているように、制御レベル標識は、合計のキーブレイクの検出に使われます。そのとき、その標識(L1からL9)を明細演算の中で使う場合と、合計演算の中で使う場合では、制御レベル標識がオンになるタイミングが違います。 明細演算の中の制御レベル標識(つまり、条件標識として使った場合)
合計演算の中の制御レベル標識
これを、理解するために、これからお見せするソースを良く見て下さい。
これが、実行結果です。最初のレコードを読み込んだ時点で、条件標識L1がオンになっていることに注目して下さい。大事なポイントです。「オン」の部分です。また、最初のレコードの読み込みでは、レベルL1はオフです。第一サイクルはオフになっているのですね。 第1レコードを読み込むと、レベル標識はオフで、条件標識Lxはオンになる と覚えておきましょう。
ロジックの流れを見てみましょう。
当然ですが、プログラムの流れは、行番号の小さいものから大きいものへ進みます。また、サイクルの場合、C仕様書の最後に来てから、C仕様書の最初に戻るのは、暗黙に行われます。上の図の回る矢印はそれを意味まします。 上の図を、プログラマーの立場で見ると、 「O1CNTにカウントアップしている。その後、もし、最初のレコードを読み込んだ直後か、L1(制御ブレイク)か、オーバーフローが起きると、見出し印刷している。その後、明細を印刷している。キーブレイクが起きた途端、読み込んだレコードは、どこかに置いておいて、合計を印刷している。もし、最終レコード標識(LR)がオンになると、合計を出して、プログラムを終了する。」 という感じになります。 では、一行ずつ内容を見てましょう。
これは、もう説明しましたが、O1CNTという整数5桁の数字フィールドに、数字をカウントアップしていくものです。O1CNTは、レコードが読まれる度に、1,2,3,4,5,6...と数字が増えていきます。これを、合計の時に、レコード件数として使っていますね。
ここで、明細条件としてのL1がオン、もしくは、オーバーフロー標識がオンならば、見出し印刷と定義しています。この*INL1は、最初のレコードが読み込まれた直後(このレコードの内容も参照できます。*INZSRの中では、最初のレコードを読み込む前の処理なので、最初のレコードの内容を参照できません。これに対して、この*INL1は、最初のレコードを読み込んだ直後にオンになるので、そのレコードの内容を利用することが出来ます。また、#DTLの後に、この見出し印刷の部分を持ってきてしまうと、最初の明細を印刷してから、見出し印刷をする事になります。
明細の印刷です。
ここで、キーブレイクの時の処理をしています。サブルーチンにとばしても良いし、IFで条件を指定することも出来ます。また、第一サイクルでは、ブレークが起きないので、最初のレコードを読み込んだばかりの時は、このレベル標識はオンにはなりません。また、このレベル標識がオンになっている状態を「合計サイクル」と呼び、特殊な処理状態になります。そもそも、このキーブレイクは、直前に読み込んだレコードに対して、L1と指定したフィールドの値が変わると、キーブレイク発生として、オンになる訳で、実際、オンになっているときは、キーブレイクの新しいキーを読み込んでいることになります。「1緑」が「2赤」に変わったとすると、プログラムが処理しようとしているのは、「2赤」なのに、合計処理で参照したいのは、その一個前の「1緑」という、皮肉な事になってしまいます。これをさけるために、通常は、「1緑」のデータを待避しておいて、キーブレイクしたら、新しい「2赤」ではなくて、待避しておいた「1緑」を参照するという事をしなくてはいけません。ところが、このサイクル処理では、信じられないことに、その待避を自動的に行っていて、レベル標識L1がオンの時に行われる内容は、待避なんて指定していないのに、ちゃんと「1緑」のレコードで行われます。ここはとても大事な部分です。上記の表に、「内部で待避されたデータ」をわざわざ入れたのはその為です。
ここでプログラムの終了を指定しています。LRはレベル標識と連動していて、LRがオンになると、全てのレベル標識がオンになります。親ガメがこけると子ガメがこけるのと同じですね。 今日はここまで。 起立、礼、着席 1999/8/1 |
You are at K's tips-n-kicks of AS/400
|
SEO | [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送 | ||