9.3.10 COBOLでのCSVファイルを利用した書式印刷例(CSVファイル印刷例題

Excelなどから入力したデータを基にして,該当するCSVファイルのデータを印刷します。このとき,APで設定した条件とCSVファイルのデータをマッチングさせ,ある条件に該当するデータに対し拡大印刷したり,「*」を付けて印刷したりできます。ここでは,1科目でも100点があるか,または前回より20番以上順位が上がった人のデータに対して「*」を付けて印刷する例を示します。

(a) 出力例

図9-14 CSVファイルから出力される帳票の出力例

[図データ]

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

処理の概要を示します。

[図データ]

(c) コーディング

CSVファイルを利用した書式オーバレイのコーディングパターンの例を次に示します。プログラムサイズは約44KBです。

000100************************************************************
000200* <書式CSVファイル入力>                                     *
000300************************************************************
000400************************************************************
000500* 指定環境  環境変数    CBLX_PRT001=#PRT                         *
000600*                         CBL_SYSCSVIN=csvファイル名(CSVPRFC.CSV)  *
000700* コンパイルオプション  -XMAP,LinePrintまたは-Ks               *
000800* 書式イメージ          CSV1FC6G.FMP                             *
000900* 行制御データ          CSV1FC6G.PCI                             *
001000************************************************************
001100 IDENTIFICATION      DIVISION.
001200 PROGRAM-ID.         CSVPRFC.
001300*
001400 ENVIRONMENT         DIVISION.
001500*  
001600 INPUT-OUTPUT        SECTION.
001700 FILE-CONTROL.  
001800   SELECT  プリンタ  ASSIGN  TO  PRT001
001900           ORGANIZATION IS SEQUENTIAL
002000           FILE  STATUS  IS  プリンタ状態.
002100*  
002200************************************************************
002300*       書式印刷の定義                                               *
002400************************************************************
002500 I-O-CONTROL.
002600   APPLY  FORMS-OVERLAY  TO  書式名  ON  プリンタ.
002700*  
002800************************************************************
002900*       CSVファイルの呼び名の定義                                 *
003000************************************************************
003100 CONFIGURATION       SECTION.
003200 SPECIAL-NAMES.  
003300     SYSCSV  IS  CSVIN.
003400*
003500 DATA  DIVISION.
003600 FILE  SECTION.
003700************************************************************
003800*       プリンタの定義                                               *
003900************************************************************
004000   FD  プリンタ  IS  GLOBAL
004100       RECORDING  MODE  IS  F
004200       LABEL  RECORD  IS  OMITTED
004300       DATA  RECORD  IS  行データ.
004400************************************************************
004500*       一行分のデータエリア                                         *
004600************************************************************
004700   01  行データ                PIC  X(70).
004800*
004900 WORKING-STORAGE    SECTION.
005000*
005100   01  書式名                    PIC  X(8).
005200*  
005300 01  模試回数ヘッダ行.
005400   02  FILLER                  PIC  X(15).
005500   02  ヘッダ模試回数          PIC  Z9
005600                          CHARACTER  TYPE  IS  POINT-12 WIDE.
005700   02  FILLER                  PIC  X(51).
005800*    
005900 01   明細行-1                 REDEFINES  明細行.
006000   02   FILLER                 PIC  X(1).
006100   02   明細行-順位1           PIC  ZZZZZZ9.
006200   02   明細行-氏名1           PIC  X(16).
006300   02   FILLER                 PIC  X(4).
006400   02   明細行-英語点数1       PIC  ZZ9
006500                               CHARACTER  TYPE  IS  FORMAT-2.
006600   02   FILLER                 PIC  X(3).
006700   02   明細行-数学点数1       PIC  ZZ9  
006800                               CHARACTER  TYPE  IS  FORMAT-2.
006900         :
007000************************************************************
007100*       プログラムの開始                                             *
007200************************************************************
007300 PROCEDURE          DIVISION.
007400*  
007500*    プリンタのオープン
007600     OPEN  OUTPUT  プリンタ
007700     IF  プリンタ状態  =  正常
007800       THEN
007900*        書式マップ名の設定
008000         MOVE  'CSV1FC6G'  TO  書式名  
008100            :
008200*       1ページ分の印刷処理
008300         PERFORM  1ページ印刷  UNTIL  印刷終了 = 1
008400*  
008500*       プリンタのクローズ
008600         CLOSE  プリンタ
008700         IF  プリンタ状態  NOT  =  正常
008800           THEN
008900             MOVE  異常  TO  プログラム状態
009000         END-IF
009100*  
009200       ELSE
009300         MOVE  異常  TO  プログラム状態
009400     END-IF.
009500************************************************************
009600*       プログラムの終了                                             *
009700************************************************************
009800     IF  プログラム状態  =  正常
009900       THEN
010000         MOVE  正常終了  TO  RETURN-CODE
010100       ELSE
010200         MOVE  異常終了  TO  RETURN-CODE
010300     END-IF
010400*  
010500     STOP  RUN.  
010600***********************************************************
010700*       一ページ印刷                                                *
010800***********************************************************
010900 1ページ印刷  SECTION.  
011000*  
011100     PERFORM  ヘッダ印刷
011200*
011300     IF  プログラム状態  =  正常
011400       THEN
011500         PERFORM  明細印刷
011600     END-IF
011700*
011800     IF  プログラム状態  =  正常
011900       THEN
012000         PERFORM  トレイラ印刷
012100     END-IF.
012200 1ページ印刷-END.
012300     EXIT.
012400************************************************************
012500*       ヘッダ印刷処理                                               *
012600************************************************************
012700 ヘッダ印刷  SECTION.  
012800        :
012900 ヘッダ印刷-END.
013000     EXIT.  
013100************************************************************
013200*       明細印刷処理                                                 *
013300************************************************************
013400 明細印刷  SECTION.  
013500          :  
013600       PERFORM  明細行組み立て
013700          :
013800       PERFORM  明細行出力
013900          :  
014000 明細印刷-END.
014100     EXIT.  
014200************************************************************
014300*       トレイラ印刷処理                                             *
014400************************************************************
014500 トレイラ印刷  SECTION.
014600        :
014700 トレイラ印刷-END.
014800     EXIT.
014900************************************************************
015000*       行出力処理                                                   *
015100************************************************************
015200 行出力  SECTION.
015300     IF  改行数  =  999
015400       THEN
015500         WRITE  行データ  BEFORE  ADVANCING   PAGE
015600       ELSE
015700         WRITE  行データ  BEFORE  ADVANCING   改行数  LINE
015800     END-IF
015900     COMPUTE  行カウンタ = 行カウンタ + 改行数
016000         :
016100*
016200 行出力-END.
016300     EXIT.
016400************************************************************
016500*       明細行出力処理                                               *
016600************************************************************
016700 明細行出力  SECTION.  
016800*  
016900     EVALUATE  書体種別
017000       WHEN   ビット-X01
017100*             英語のみ100点
017200         WRITE  行データ  FROM  明細行2-2
017300                        BEFORE  ADVANCING   改行数  LINE
017400          :  
017500       WHEN   OTHER  
017600*             その他
017700         WRITE  行データ  FROM  明細行
017800                        BEFORE  ADVANCING   改行数  LINE
017900     END-EVALUATE
018000          :
018100*
018200 明細行出力-END.
018300     EXIT.
018400************************************************************
018500*       明細行組み立て処理                                           *
018600************************************************************
018700 明細行組み立て  SECTION.
018800       :
018900     PERFORM  書体変更
019000       :
019100*  
019200 明細行組み立て-END.
019300     EXIT.
019400************************************************************
019500*       書体変更処理                                                 *
019600************************************************************
019700 書体変更  SECTION.
019800     INITIALIZE  書体フラグ
019900     MOVE  SPACE  TO  明細行2
020000*
020100     IF  英語点数 = 100
020200       THEN
020300         COMPUTE  書体-英語 = 書体-英語 OR ビットON
020400         MOVE  '*'  TO  明細行2-英語P
020500     END-IF.
020600        :
020700*  
020800 書体変更-END.
020900     EXIT.
021000************************************************************
021100 END  PROGRAM  CSVPRFC.

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