書式オーバレイでは,AP実行時に出力形式を決められます。例えば,キーデータが変わったところで見出しやけい線によって区切りを付けたり,文字サイズを変更したりして印刷できます。
ここでは,書式オーバレイ機能を使用した集計表でブレークキーによって,出力形式を変更する例を示します。
図9-13 コントロールブレークで出力される帳票の出力例
処理の概要を示します。
コントロールブレークを利用した書式オーバレイのコーディングパターンの例(一部抜粋)を次に示します。プログラムサイズは,約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.