書式を利用したユーザ業務例について説明します。
書式を使用した業務例として,家電販売で受注した家電用品の納品書兼御請求書を出力する処理を想定した業務について説明します。納品書兼御請求書の出力例を次の図に示します。
図9-12 納品書兼御請求書の出力例
ユーザ業務例での処理の流れを,フローチャートで示します。
コーディングの概要を次に示します。
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.