9.3.8 COBOLでの標準的な書式オーバレイ例(標準書式例題

書式を利用したユーザ業務例について説明します。

書式を使用した業務例として,家電販売で受注した家電用品の納品書兼御請求書を出力する処理を想定した業務について説明します。納品書兼御請求書の出力例を次の図に示します。

図9-12 納品書兼御請求書の出力例

[図データ]

(a) 処理の流れ

ユーザ業務例での処理の流れを,フローチャートで示します。

[図データ]

(b) コーディング例

コーディングの概要を次に示します。

000100************************************************************
000200*  ユーザ業務例-標準書式印刷AP                                *
000300*      指定環境  環境変数    CBLX_PRT001=#PRT                    *
000400*      コンパイルオプション  -XMAP,LinePrintまたは-Ks          *
000500*      書式名                STD1FC6G.FMP                        *
000600*      行制御データ          STD1FC6G.PCI                        *
000700************************************************************
000800 IDENTIFICATION      DIVISION.
000900 PROGRAM-ID.         STDPRFC.
001000*  
001100 ENVIRONMENT         DIVISION.
001200*  
001300 INPUT-OUTPUT        SECTION.
001400 FILE-CONTROL.
001500   SELECT  プリンタ  ASSIGN  TO  PRT001
001600           ORGANIZATION IS SEQUENTIAL
001700           FILE  STATUS  IS  プリンタ状態.
001800*  
001900   SELECT  テキストファイル  ASSIGN  TO  ファイル名
002000           ORGANIZATION  IS  LINE  SEQUENTIAL
002100           FILE  STATUS  IS  ファイル状態.
002200************************************************************
002300*       書式印刷の定義                                               *
002400************************************************************
002500 I-O-CONTROL.  
002600   APPLY  FORMS-OVERLAY  TO  書式名  ON  プリンタ.
002700*    
002800 DATA  DIVISION.
002900 FILE  SECTION.
003000************************************************************
003100*       プリンタの定義                                               *
003200************************************************************
003300   FD  プリンタ  IS  GLOBAL
003400       RECORDING  MODE  IS  F
003500       LABEL  RECORD  IS  OMITTED
003600       DATA  RECORD  IS  行データ.
003700************************************************************
003800*       一行分のデータエリア                                         *
003900************************************************************
004000   01  行データ                PIC  X(122).
004100*  
004200   FD  テキストファイル.
004300   01  テキストレコード.
004400     02   FILLER               PIC  X(86).
004500     02   小計                 PIC  9(15).
004600     02   FILLER               PIC  X(21).
004700*  
004800 WORKING-STORAGE    SECTION.
004900*  
005000 01  書式名                    PIC  X(8).
005100 01  プリンタ状態              PIC  X(2).
005200 01  プログラム状態            PIC  X(2).
005300 01  行カウンタ                PIC  S9(4).
005400*  
005500 01  ファイル名                PIC  X(12) VALUE 'STDPRFC.TXT'.
005600 01  ファイル状態              PIC  X(2).
005700*  
005800 01   番号行.
005900   02   FILLER                 PIC  X(3).
006000   02   番号行-番号            PIC  X(12).
006100   02   FILLER                 PIC  X(107).
006200*  
006300 01   年月日行.
006400   02   FILLER                 PIC  X(101).
006500   02   年月日行-年1           PIC  X(2).
006600   02   年月日行-年2           PIC  X(2).
006700   02   FILLER                 PIC  X(4).
006800   02   年月日行-月            PIC  X(2).
006900   02   FILLER                 PIC  X(4).
007000   02   年月日行-日            PIC  X(2).
007100   02   FILLER                 PIC  X(5).
007200*  
007300 01   名前行.  
007400   02   FILLER                 PIC  X(3).
007500   02   名前行-名前            PIC  X(37).
007600   02   FILLER                 PIC  X(7).
007700   02   名前行-コード          PIC  X(10).
007800   02   FILLER                 PIC  X(65).
007900*  
008000 01   支店行.
008100   02   FILLER                 PIC  X(90).
008200   02   支店行-支店            PIC  X(13).
008300   02   FILLER                 PIC  X(8).
008400   02   支店行-担当            PIC  X(10).
008500   02   FILLER                 PIC  X(1).
008600*  
008700 01   住所行.
008800   02   FILLER                 PIC  X(12).
008900   02   住所行-住所            PIC  X(46).
009000   02   FILLER                 PIC  X(64).
009100*  
009200 01   合計行.
009300   02   FILLER                 PIC  X(83).
009400   02   合計行-合計            PIC  ¥¥,¥¥¥,¥¥¥,¥¥¥,¥¥9.
009500   02   FILLER                 PIC  X(21).
009600*  
009700 01  合計                      PIC  9(18).
009800*  
009900 01   日付.  
010000   02   年                     PIC  9(2).
010100   02   月                     PIC  9(2).
010200   02   日                     PIC  9(2).
010300*  
010400 77  正常                      PIC  X(2)  VALUE  '00'.
010500 77  異常                      PIC  X(2)  VALUE  '01'.
010600 77  正常終了                  PIC  S9(4) VALUE  +0.
010700 77  異常終了                  PIC  S9(4) VALUE  16.
010800*  
010900 77  明細行数                  PIC  S9(4) VALUE  25.
011000************************************************************
011100*       プログラムの開始                                             *
011200************************************************************
011300 PROCEDURE          DIVISION.
011400     MOVE  正常  TO  プログラム状態.
011500     MOVE  ZERO  TO  行カウンタ.
011600************************************************************
011700*       帳票プリント処理                                             *
011800************************************************************
011900 帳票処理.
012000*  
012100*       プリンタのオープン  
012200*            
012300     OPEN  OUTPUT  プリンタ.
012400     IF  プリンタ状態  =  正常
012500       THEN
012600*       1ページ分の印刷処理
012700         PERFORM  1ページ印刷
012800*
012900         CLOSE  プリンタ
013000         IF  プリンタ状態  NOT  =  正常
013100           THEN
013200             MOVE  異常  TO  プログラム状態
013300         END-IF
013400*
013500       ELSE
013600         MOVE  異常  TO  プログラム状態
013700     END-IF.  
013800************************************************************
013900*       プログラムの終了                                             *
014000************************************************************
014100*
014200     IF  プログラム状態  =  正常
014300       THEN
014400         MOVE  正常終了  TO  RETURN-CODE
014500       ELSE
014600         MOVE  異常終了  TO  RETURN-CODE
014700     END-IF.
014800*  
014900     STOP  RUN.
015000*
015100************************************************************
015200*       一ページ印刷                                                *
015300************************************************************
015400 1ページ印刷  SECTION.
015500*
015600     MOVE  'STD1FC6G'  TO  書式名.
015700*  
015800     PERFORM  ヘッダ印刷.
015900*
016000     IF  プログラム状態  =  正常
016100       THEN  
016200         PERFORM  明細印刷
016300     END-IF.
016400*
016500     IF  プログラム状態  =  正常
016600       THEN
016700         PERFORM  トレイラ印刷
016800     END-IF.
016900 1ページ印刷-END.
017000     EXIT.
017100************************************************************
017200*       ヘッダ印刷処理                                               *
017300************************************************************
017400 ヘッダ印刷  SECTION.
017500     MOVE  SPACE  TO  行データ.
017600*  
017700     WRITE  行データ  BEFORE  ADVANCING  4  LINES.
017800     IF  プリンタ状態  NOT  =  正常
017900       THEN
018000         MOVE  異常  TO  プログラム状態
018100     END-IF.
018200*    
018300     MOVE  SPACE       TO  番号行.
018400     MOVE '1234567890' TO  番号行-番号.
018500     MOVE  番号行      TO  行データ.
018600     WRITE  行データ  BEFORE  ADVANCING  3  LINES.
018700     IF  プリンタ状態  NOT  =  正常  
018800       THEN  
018900         MOVE  異常  TO  プログラム状態
019000     END-IF.  
019100*      
019200     MOVE  SPACE       TO  年月日行.
019300     ACCEPT  日付 FROM DATE.
019400     MOVE  '19'        TO  年月日行-年1.
019500     MOVE  年          TO  年月日行-年2.
019600     MOVE  月          TO  年月日行-月.
019700     MOVE  日          TO  年月日行-日.
019800     MOVE  年月日行    TO  行データ.
019900     WRITE  行データ  BEFORE  ADVANCING  1  LINE.
020000     IF  プリンタ状態  NOT  =  正常
020100       THEN
020200         MOVE  異常  TO  プログラム状態
020300     END-IF.
020400*  
020500     MOVE  SPACE  TO  名前行.
020600     MOVE  '○×A1電器' TO  名前行-名前.  
020700     MOVE  'K0012345'     TO  名前行-コード.
020800     MOVE  名前行         TO  行データ.
020900     WRITE  行データ  BEFORE  ADVANCING  1  LINE.
021000     IF  プリンタ状態  NOT  =  正常
021100       THEN
021200         MOVE  異常  TO  プログラム状態
021300     END-IF.
021400*  
021500     MOVE   SPACE TO 支店行.
021600     MOVE '港支店'        TO  支店行-支店.
021700     MOVE '日立太郎'      TO  支店行-担当.
021800     MOVE   支店行        TO  行データ.
021900     WRITE  行データ  BEFORE  ADVANCING  1  LINE.
022000     IF  プリンタ状態  NOT  =  正常
022100       THEN  
022200         MOVE  異常  TO  プログラム状態
022300     END-IF.
022400*    
022500     MOVE SPACE TO 住所行.
022600     MOVE '○×市△□区2-50'  TO  住所行-住所.
022700     MOVE 住所行            TO  行データ.
022800     WRITE  行データ  BEFORE  ADVANCING  5  LINES.
022900     IF  プリンタ状態  NOT  =  正常  
023000       THEN
023100         MOVE  異常  TO  プログラム状態
023200     END-IF.
023300*        
023400 ヘッダ印刷-END.
023500     EXIT.  
023600************************************************************
023700*       明細印刷処理                                                 *
023800************************************************************
023900 明細印刷  SECTION.
024000     MOVE  +0  TO  合計.
024100     OPEN  INPUT  テキストファイル.
024200*
024300     PERFORM  WITH  TEST  AFTER  
024400          VARYING  行カウンタ
024500          FROM  1  BY  1  
024600          UNTIL  ((プログラム状態  =  異常)  OR
024700                   (行カウンタ  >=  明細行数))
024800       MOVE  SPACE  TO  行データ  
024900       READ  テキストファイル
025000         IF  ファイル状態  =  正常
025100           THEN
025200             COMPUTE    合計  =  合計  +  小計
025300             MOVE  テキストレコード  TO  行データ
025400             WRITE  行データ  BEFORE  ADVANCING  1  LINE
025500             IF  プリンタ状態  NOT  =  正常  
025600               THEN  
025700                 MOVE  異常  TO  プログラム状態
025800             END-IF
025900           ELSE
026000             MOVE  SPACE  TO  行データ
026100             WRITE  行データ  BEFORE  ADVANCING  1  LINE
026200             IF  プリンタ状態  NOT  =  正常
026300               THEN
026400                 MOVE  異常  TO  プログラム状態
026500             END-IF
026600         END-IF
026700*    
026800     END-PERFORM.
026900*  
027000     CLOSE  テキストファイル.
027100*      
027200 明細印刷-END.
027300     EXIT.
027400************************************************************
027500*       トレイラ印刷処理                                             *
027600************************************************************
027700 トレイラ印刷  SECTION.  
027800     MOVE  SPACE  TO  行データ.
027900*    
028000     WRITE  行データ  BEFORE  ADVANCING   2  LINE.  
028100     IF  プリンタ状態  NOT  =  正常
028200       THEN
028300         MOVE  異常  TO  プログラム状態
028400     END-IF.
028500*
028600     MOVE  SPACE   TO  合計行.
028700     MOVE  合計    TO  合計行-合計.
028800     MOVE  合計行  TO  行データ.
028900     WRITE  行データ  BEFORE  ADVANCING   PAGE.
029000     IF  プリンタ状態  NOT  =  正常
029100       THEN
029200         MOVE  異常  TO  プログラム状態
029300     END-IF.
029400*
029500 トレイラ印刷-END.
029600     EXIT.    
029700************************************************************
029800 END  PROGRAM  STDPRFC.  

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