技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した普通の文系SEによる技術ブログ。

opensource COBOL:コントロールブレイクサンプル

コントロールブレイク(キー項目が変わる度に何らかの処理を実行)のロジックについて、以前の記事で紹介しました。

https://akira2kun.hatenablog.com/entry/2018/10/06/150330
 
COBOLでサンプルプログラムを作成しましたので、参考までに紹介します。
 
【サンプルプログラム】
       IDENTIFICATION    DIVISION.
       PROGRAM-ID.       CONTBREK.
       ENVIRONMENT       DIVISION.
       INPUT-OUTPUT      SECTION.
       FILE-CONTROL.   
           SELECT  F1  ASSIGN  TO  "C:\tmp\a.txt".
           SELECT  F2  ASSIGN  TO  "C:\tmp\b.txt".
      *
       DATA                  DIVISION.
       FILE                  SECTION.
       FD  F1.
       01  F1R.
           03  F1-REC        PIC X(33).
       FD  F2.
       01  F2R.
           03  F2-REC        PIC X(33).
      *
       WORKING-STORAGE       SECTION.
       01  WORK.
           03  F1-END        PIC X(01).
           03  F1-OLD-KEY    PIC X(07).
       01  F1-REC-WORK.
           03  F1-SYOHIN-CODE
                             PIC X(07).
           03  F1-COMMA1     PIC X(01).
           03  F1-HANBAI-YMD PIC X(08).
           03  F1-COMMA2     PIC X(01).
           03  F1-HANBAI-KOSUU
                             PIC X(05).
           03  F1-COMMA3     PIC X(01).
           03  F1-HANBAI-KINGAKU
                             PIC X(09).
           03  F1-CRLF       PIC X(02).
       01  F2-TITLE-WORK.
           03  F2-ASTER1     PIC X(02) VALUE '**'.
           03  F2-SYOHIN-CODE-TITLE
                             PIC X(07).
           03  F2-ASTER2     PIC X(22)
               VALUE '**********************'.
           03  F2-CRLF-TITLE PIC X(02) VALUE X'0D0A'.
       01  F2-REC-WORK.
           03  F2-SYOHIN-CODE
                             PIC X(07).
           03  F2-COMMA1     PIC X(01).
           03  F2-HANBAI-YMD PIC X(08).
           03  F2-COMMA2     PIC X(01).
           03  F2-HANBAI-KOSUU
                             PIC X(05).
           03  F2-COMMA3     PIC X(01).
           03  F2-HANBAI-KINGAKU
                             PIC X(09).
           03  F2-CRLF       PIC X(02).
      *
       PROCEDURE         DIVISION.
      *
      * 各種処理の呼び出し
      *
       000-CONTROLLER-S.
           PERFORM  100-START-S THRU 100-START-E.
           PERFORM  200-MAIN-S  THRU 200-MAIN-E
               UNTIL F1-END = HIGH-VALUE.
           PERFORM  300-END-S   THRU 300-END-E.
           STOP RUN.
       000-CONTROLLER-E.
      *
      * 前処理
      *
       100-START-S.
           INITIALIZE WORK.
           OPEN  INPUT  F1.
           OPEN  OUTPUT F2.
           PERFORM 210-READ-S THRU 210-READ-E.
       100-START-E.
      *
      * 主処理
      *
       200-MAIN-S.
           IF F1-SYOHIN-CODE NOT = F1-OLD-KEY
               PERFORM 220-WRITE-TITLE-S  THRU 220-WRITE-TITLE-E
               MOVE    F1-SYOHIN-CODE     TO   F1-OLD-KEY
           END-IF.
           PERFORM     230-WRITE-RECORD-S THRU 230-WRITE-RECORD-E.
           PERFORM     210-READ-S         THRU 210-READ-E.
       200-MAIN-E.
      *
      * READ処理
      *
       210-READ-S.
           READ F1
           AT END
               MOVE HIGH-VALUE TO F1-END
               GO TO 210-READ-E
           END-READ.
           MOVE F1-REC         TO F1-REC-WORK.
       210-READ-E.
      *
      * WRITE処理(タイトル)
      *
       220-WRITE-TITLE-S.
           MOVE  F1-SYOHIN-CODE TO F2-SYOHIN-CODE-TITLE.
           MOVE  F2-TITLE-WORK  TO F2-REC.
           WRITE F2R.
       220-WRITE-TITLE-E.
      *
      * WRITE処理(レコード)
      *
       230-WRITE-RECORD-S.
           MOVE  F1-REC-WORK TO F2-REC-WORK.
           MOVE  F2-REC-WORK TO F2-REC.
           WRITE F2R.
       230-WRITE-RECORD-E.
      *
      * 後処理
      *
       300-END-S.
           CLOSE  F1.
           CLOSE  F2.
       300-END-E.
 
【入力ファイル】
・C:\tmp\a.txt
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
0000002,20180401,00001,00001000
0000003,20180402,00002,00002000
 
【出力ファイル】
・C:\tmp\b.txt
**0000001**********************
0000001,20180401,00100,00010000
0000001,20180402,00200,00020000
**0000002**********************
0000002,20180401,00001,00001000
**0000003**********************
0000003,20180402,00002,00002000