9.3.9 COBOLでのコントロールブレークを利用した例(ブレーク項目例題

書式オーバレイでは,AP実行時に出力形式を決められます。例えば,キーデータが変わったところで見出しやけい線によって区切りを付けたり,文字サイズを変更したりして印刷できます。

ここでは,書式オーバレイ機能を使用した集計表でブレークキーによって,出力形式を変更する例を示します。

(a) 出力例

図9-13 コントロールブレークで出力される帳票の出力例

[図データ]

書式オーバレイのサイズの目安は,約1KBです。
(b) 処理の流れ

処理の概要を示します。

[図データ]

(c) コーディング

コントロールブレークを利用した書式オーバレイのコーディングパターンの例(一部抜粋)を次に示します。プログラムサイズは,約32KBです。

000100************************************************************
000200* <書式ブレークポイント>                                       *
000300************************************************************
000400************************************************************
000500* 指定環境  環境変数    CBLX_PRT001=#PRT                             *
000600* コンパイルオプション  -XMAP,LinePrintまたは-Ks                    *
000700* 書式名                BRK1FC6G.FMP                                 *
000800* 行制御データ          BRK1FC6G.PCI                                 *
000900************************************************************
001000 IDENTIFICATION      DIVISION.
001100 PROGRAM-ID.         BRKPTFC.
001200 ENVIRONMENT         DIVISION.
001300 INPUT-OUTPUT        SECTION.
001400 FILE-CONTROL.
001500   SELECT  プリンタ  ASSIGN  TO  PRT001
001600           ORGANIZATION IS SEQUENTIAL
001700           FILE  STATUS  IS  プリンタ状態.
001800                       :
001900*      
002000************************************************************
002100*       書式印刷の定義                                               *
002200************************************************************
002300 I-O-CONTROL.  
002400   APPLY  FORMS-OVERLAY  TO  書式名  ON  プリンタ.
002500*  
002600 DATA  DIVISION.
002700 FILE  SECTION.
002800************************************************************
002900*       プリンタの定義                                               *
003000************************************************************
003100   FD  プリンタ  IS  GLOBAL
003200       RECORDING  MODE  IS  F
003300       LABEL  RECORD  IS  OMITTED
003400       DATA  RECORD  IS  行データ.
003500************************************************************
003600*       一行分のデータエリア                                         *
003700************************************************************
003800   01  行データ                PIC  X(71).
003900*    
004000   FD  伝票ファイル.
004100*  
004200   FD  商品マスタファイル.
004300   01  商品レコード.
004400          :  
004500 WORKING-STORAGE    SECTION.
004600 01  書式名                    PIC  X(8).
004700        :  
004800 01   ブレーク行1.  
004900   02   FILLER                 PIC  X(2)    VALUE SPACE.
005000   02   ハイフンフィールド     PIC  X(66)   VALUE
005100 '--------------------------------
005200 '-'.  
005300                          :
005400 77  明細最終行                PIC  S9(4) VALUE  60.
005500************************************************************
005600*       プログラムの開始                                             *
005700************************************************************
005800 PROCEDURE          DIVISION.
005900 帳票処理.
006000*  
006100*       プリンタのオープン
006200     OPEN  OUTPUT  プリンタ.  
006300     IF  プリンタ状態  =  正常
006400       THEN
006500*        書式マップ名の設定
006600         MOVE  'BRK1FC6G'  TO  書式名
006700*  
006800         PERFORM  ファイルオープン
006900*
007000*       1ページ分の印刷処理
007100         PERFORM  1ページ印刷  UNTIL  印刷終了 = 1
007200*    
007300         PERFORM  ファイルクローズ
007400*
007500         CLOSE  プリンタ
007600         IF  プリンタ状態  NOT  =  正常
007700           THEN
007800             MOVE  異常  TO  プログラム状態
007900         END-IF
008000*
008100       ELSE
008200         MOVE  異常  TO  プログラム状態
008300     END-IF.
008400************************************************************
008500*       プログラムの終了                                             *
008600************************************************************
008700     IF  プログラム状態  =  正常
008800       THEN  
008900         MOVE  正常終了  TO  RETURN-CODE
009000       ELSE
009100         MOVE  異常終了  TO  RETURN-CODE
009200     END-IF.
009300*  
009400     STOP  RUN.
009500*  
009600************************************************************
009700*       一ページ印刷                                                *
009800************************************************************
009900 1ページ印刷  SECTION.
010000*
010100        :
010200
010300     PERFORM  ヘッダ印刷.
010400*  
010500     IF  プログラム状態  =  正常
010600       THEN  
010700         PERFORM  明細印刷
010800     END-IF.
010900*
011000     IF  プログラム状態  =  正常
011100       THEN  
011200         PERFORM  トレイラ印刷  
011300     END-IF.
011400 1ページ印刷-END.
011500     EXIT.
011600************************************************************
011700*       ヘッダ印刷処理                                               *
011800************************************************************
011900 ヘッダ印刷  SECTION.  
012000       :
012100 ヘッダ印刷-END.
012200     EXIT.
012300************************************************************
012400*       明細印刷処理                                                 *
012500************************************************************
012600 明細印刷  SECTION.  
012700     MOVE  +0  TO  合計.
012800*  
012900     PERFORM  伝票読み込み
013000     PERFORM  WITH  TEST  BEFORE  
013100          UNTIL  ((伝票ファイルEOF = 1)  OR
013200                  (プログラム状態  =  異常)  OR
013300                  (行カウンタ  >  明細最終行))
013400       MOVE  SPACE  TO  行データ
013500*
013600       PERFORM  ブレーク判定
013700*    
013800       PERFORM  明細行組み立て
013900       COMPUTE    合計  =  合計  +  WK-売上高
014000       MOVE  明細行  TO  行データ  
014100       MOVE  1  TO  改行数
014200       PERFORM  行出力
014300*  
014400       PERFORM  伝票読み込み
014500     END-PERFORM.  
014600*  
014700     IF  伝票ファイルEOF = 1
014800       THEN
014900         MOVE  1  TO  合計行出力
015000         MOVE  1  TO  印刷終了
015100     END-IF.
015200*
015300 明細印刷-END.  
015400     EXIT.
015500************************************************************
015600*       トレイラ印刷処理                                             *
015700************************************************************
015800 トレイラ印刷  SECTION.
015900       :
016000 トレイラ印刷-END.
016100     EXIT.  
016200************************************************************
016300*       ブレーク判定処理                                             *
016400************************************************************
016500 ブレーク判定  SECTION.
016600     IF  地区名  NOT = WK-地区名
016700       THEN  
016800         IF  WK-地区名  NOT =  HIGH-VALUE
016900           THEN  
017000             MOVE  ブレーク行1  TO  行データ
017100             MOVE  1  TO  改行数  
017200             PERFORM  行出力
017300         END-IF      
017400         MOVE  地区名  TO  WK-地区名  
017500         MOVE  担当者名  TO  WK-担当者名
017600         MOVE  レベル1ブレーク  TO  ブレークフラグ
017700       ELSE
017800         IF  担当者名  NOT = WK-担当者名
017900           THEN  
018000             IF  WK-担当者名  NOT =  HIGH-VALUE
018100               THEN
018200                 MOVE  ブレーク行2  TO  行データ
018300                 MOVE  1  TO  改行数
018400                 PERFORM  行出力
018500             END-IF  
018600             MOVE  担当者名  TO  WK-担当者名
018700             MOVE  レベル2ブレーク  TO  ブレークフラグ
018800         END-IF  
018900     END-IF.
019000*
019100 ブレーク判定-END.  
019200     EXIT.
019300************************************************************
019400*       行出力処理                                                   *
019500************************************************************
019600 行出力  SECTION.
019700     WRITE  行データ  BEFORE  ADVANCING   改行数  LINE.
019800     IF  プリンタ状態  NOT  =  正常
019900       THEN  
020000         MOVE  異常  TO  プログラム状態
020100     END-IF.  
020200     COMPUTE  行カウンタ = 行カウンタ + 改行数.
020300*      
020400 行出力-END.  
020500     EXIT.  
020600************************************************************
020700        :
020800        :
020900************************************************************
021000 END  PROGRAM  BRKPTFC.

注※
COBOL2002の場合は-XMAP,LinePrint,COBOL85の場合は-Ksとなります。