最初のページに戻ります。

総合の目次があるページに戻ります。

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.21.RPGの基本 RPGサイクル4

[ Previous ] [ HOME ] [ Upper ] [ Next ]


制御レベル標識の2つの顔

ここから説明する事は、ものすごく重要です。制御レベル標識の理解に欠かせないことなのです。前から、説明しているように、制御レベル標識は、合計のキーブレイクの検出に使われます。そのとき、その標識(L1からL9)を明細演算の中で使う場合と、合計演算の中で使う場合では、制御レベル標識がオンになるタイミングが違います。

明細演算の中の制御レベル標識(つまり、条件標識として使った場合)

グループの始まりの時に、オンとなります。これは、最初のレコードを読み込んだときもオンです。

合計演算の中の制御レベル標識

グループの終わり(切れ目)の時に、オンとなります。これは、最初のレコードは読み込んだときにはオンになりません。

lvlcnd_ind.gif

キー 金額 条件標識 レベル標識
田中さん 120円 オン オフ
田中さん 400円 オフ オフ
田中さん 160円 オフ オフ
田中さん 180円 オフ オフ
田中さん 200円 オフ オフ
田中さん 240円 オフ オフ
田中さん 350円 オフ オン
小林さん 220円 オン  オフ
小林さん 450円 オフ オフ
小林さん 730円 オフ オフ
小林さん 80円 オフ オフ
小林さん 100円 オフ オフ
小林さん 400円 オフ オフ
小林さん 320円 オフ オン
森さん 400円 オン オフ
森さん 300円 オフ オフ
森さん 110円 オフ オフ
森さん 60円 オフ オフ
森さん 700円 オフ オフ
森さん 1100円 オフ オフ
森さん 115円 オフ オン

これを、理解するために、これからお見せするソースを良く見て下さい。

     H            Y/                                    1
     FBALLP   IP  E           K        DISK
     FQPRINT  O   F     132     OF     PRINTER
     IBALLR       01
     I                                              COLOR L1
     C                     ADD  1         O1CNT   50       
     C*                                                    
     C           *INL1     IFEQ *ON
     C           *INOF     OREQ *ON 
     C                     EXCPT#HED 
     C                     END
     C*
     C                     EXCPT#DTL
     C*
     CL1                   EXCPT#TOL                       
     CLR                   RETRN                           
     C*
     C           *INZSR    BEGSR                           
     C                     TIME           O1TIME  60       
     C                     ENDSR                           
     O*
     OQPRINT  E  101           #HED
     O                                    1 'H'
     O                                   26 'NUMBER OF BALLS BALLR7'
     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

これが、実行結果です。最初のレコードを読み込んだ時点で、条件標識L1がオンになっていることに注目して下さい。大事なポイントです。「オン」の部分です。また、最初のレコードの読み込みでは、レベルL1はオフです。第一サイクルはオフになっているのですね。

第1レコードを読み込むと、レベル標識はオフで、条件標識Lxはオンになる

と覚えておきましょう。

レベル標識L1 条件標識L1 読み込み

内部で待避されたデータ

処理中のデータ

ソース

印字結果

データ番号 データ番号 データ番号

 

オン

1 1緑     1 1緑

EXCPT#HED

H   NUMBER OF BALLS BALLR7   実行日付: 98/10/10
H                            実行時間:  9:24:31
            1 1緑

EXCPT#DTL

D    1緑                    
    2 1緑     2 1緑

EXCPT#DTL

D    1緑                    

オン

  3 2赤 3 2赤 2 1緑

EXCPT#TOL

T                 2                       

 

オン         3 2赤

EXCPT#HED

H   NUMBER OF BALLS BALLR7   実行日付: 98/10/10
H                            実行時間:  9:24:31
            3 2赤

EXCPT#DTL

D    2赤                    
    4 2赤     4 2赤

EXCPT#DTL

D    2赤                    
    5 2赤     5 2赤

EXCPT#DTL

D    2赤                    
    6 2赤     6 2赤

EXCPT#DTL

D    2赤                    
    7 2赤     7 2赤

EXCPT#DTL

D    2赤                    
    8 2赤     8 2赤

EXCPT#DTL

D    2赤                    
    9 2赤     9 2赤

EXCPT#DTL

D    2赤                    
    10 2赤     10 2赤

EXCPT#DTL

D    2赤                    
    11 2赤     11 2赤

EXCPT#DTL

D    2赤                    
    12 2赤     12 2赤

EXCPT#DTL

D    2赤                    
    13 2赤     13 2赤

EXCPT#DTL

D    2赤                    

オン

  14 3青 14 3青 13 2赤

EXCPT#TOL

T                11                  

 

オン

        14 3青

EXCPT#HED

H   NUMBER OF BALLS BALLR7   実行日付: 98/10/10
H                            実行時間:  9:24:31
            14 3青

EXCPT#DTL

D    3青                    
    15 3青     15 3青

EXCPT#DTL

D    3青                    
    16 3青     16 3青

EXCPT#DTL

D    3青                    
    17 3青     17 3青

EXCPT#DTL

D    3青                    
    18 3青     18 3青

EXCPT#DTL

D    3青                    

オン

    LR     18 3青

EXCPT#TOL

T                 5         

ロジックの流れを見てみましょう。

rundarw.gif 1
     C                     ADD  1         O1CNT   50   
2
     C           *INL1     IFEQ *ON
     C           *INOF     OREQ *ON 
     C                     EXCPT#HED 
     C                     END           
3
     C                     EXCPT#DTL     
4
     CL1                   EXCPT#TOL      
     CLR                   RETRN           

当然ですが、プログラムの流れは、行番号の小さいものから大きいものへ進みます。また、サイクルの場合、C仕様書の最後に来てから、C仕様書の最初に戻るのは、暗黙に行われます。上の図の回る矢印はそれを意味まします。

上の図を、プログラマーの立場で見ると、

「O1CNTにカウントアップしている。その後、もし、最初のレコードを読み込んだ直後か、L1(制御ブレイク)か、オーバーフローが起きると、見出し印刷している。その後、明細を印刷している。キーブレイクが起きた途端、読み込んだレコードは、どこかに置いておいて、合計を印刷している。もし、最終レコード標識(LR)がオンになると、合計を出して、プログラムを終了する。」

という感じになります。

では、一行ずつ内容を見てましょう。

      C                     ADD  1         O1CNT   50       

これは、もう説明しましたが、O1CNTという整数5桁の数字フィールドに、数字をカウントアップしていくものです。O1CNTは、レコードが読まれる度に、1,2,3,4,5,6...と数字が増えていきます。これを、合計の時に、レコード件数として使っていますね。

     C           *INL1     IFEQ *ON
     C           *INOF     OREQ *ON 
     C                     EXCPT#HED 
     C                     END                     

ここで、明細条件としてのL1がオン、もしくは、オーバーフロー標識がオンならば、見出し印刷と定義しています。この*INL1は、最初のレコードが読み込まれた直後(このレコードの内容も参照できます。*INZSRの中では、最初のレコードを読み込む前の処理なので、最初のレコードの内容を参照できません。これに対して、この*INL1は、最初のレコードを読み込んだ直後にオンになるので、そのレコードの内容を利用することが出来ます。また、#DTLの後に、この見出し印刷の部分を持ってきてしまうと、最初の明細を印刷してから、見出し印刷をする事になります。

    C                     EXCPT#DTL                              

明細の印刷です。

     CL1                   EXCPT#TOL             

ここで、キーブレイクの時の処理をしています。サブルーチンにとばしても良いし、IFで条件を指定することも出来ます。また、第一サイクルでは、ブレークが起きないので、最初のレコードを読み込んだばかりの時は、このレベル標識はオンにはなりません。また、このレベル標識がオンになっている状態を「合計サイクル」と呼び、特殊な処理状態になります。そもそも、このキーブレイクは、直前に読み込んだレコードに対して、L1と指定したフィールドの値が変わると、キーブレイク発生として、オンになる訳で、実際、オンになっているときは、キーブレイクの新しいキーを読み込んでいることになります。「1緑」が「2赤」に変わったとすると、プログラムが処理しようとしているのは、「2赤」なのに、合計処理で参照したいのは、その一個前の「1緑」という、皮肉な事になってしまいます。これをさけるために、通常は、「1緑」のデータを待避しておいて、キーブレイクしたら、新しい「2赤」ではなくて、待避しておいた「1緑」を参照するという事をしなくてはいけません。ところが、このサイクル処理では、信じられないことに、その待避を自動的に行っていて、レベル標識L1がオンの時に行われる内容は、待避なんて指定していないのに、ちゃんと「1緑」のレコードで行われます。ここはとても大事な部分です。上記の表に、「内部で待避されたデータ」をわざわざ入れたのはその為です。

     CLR                   RETRN                             

ここでプログラムの終了を指定しています。LRはレベル標識と連動していて、LRがオンになると、全てのレベル標識がオンになります。親ガメがこけると子ガメがこけるのと同じですね。

今日はここまで。

起立、礼、着席

1999/8/1


[ Previous ] [ HOME ] [ Upper ] [ Next ]

You are at K's tips-n-kicks of AS/400

 

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送