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

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

よく使うマニュアルです

Wiki

updated on 2004.06.23

17.24.RPGの基本 全手順を使ったキーブレイク

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


今回は、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


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

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

 

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