【COBOL】カウントを数えて表示する方法(ADD/COMPUTE/PERFORM VARYING/INSPECT TALLYING)

COBOLで「カウントを数えて表示したい」と思ったことはありませんか?

処理件数の集計、レコード数のカウント、ループ回数の管理など、カウント処理はCOBOLプログラミングで最も頻繁に使う基本操作のひとつです。

この記事では、PICTURE句でのカウンタ変数定義からADD文・COMPUTE文・PERFORM VARYINGでのカウントアップDISPLAY文での表示、さらにカウントダウン・条件付きカウント・ファイル読み込みレコード数カウント・INSPECT TALLYINGによる文字出現回数カウントまで、実務で使えるパターンを網羅的に解説します。

スポンサーリンク

カウンタ変数のデータ定義(PICTURE句)

カウント処理を行うには、まずWORKING-STORAGE SECTIONでカウンタ用の変数を定義します。COBOL では PICTURE句(PIC)で変数の型と桁数を指定します。

COBOL – カウンタ変数の定義
WORKING-STORAGE SECTION.
*> 基本的なカウンタ(5桁、初期値0)
01 WS-COUNTER        PIC 9(5)   VALUE 0.
*> 大きな値のカウンタ(8桁)
01 WS-TOTAL-COUNT    PIC 9(8)   VALUE 0.
*> 符号付きカウンタ(負の値も可能)
01 WS-SIGNED-CTR     PIC S9(5)  VALUE 0.
*> 表示用変数(編集項目)
01 WS-DISPLAY-CTR    PIC ZZ,ZZ9.
*> 上限値
01 WS-MAX-COUNT      PIC 9(5)   VALUE 100.
PIC指定 意味 範囲
PIC 9(5) 5桁の符号なし数値 0 ~ 99999
PIC S9(5) 5桁の符号付き数値 -99999 ~ 99999
PIC 9(8) 8桁の符号なし数値 0 ~ 99999999
PIC ZZ,ZZ9 ゼロサプレス+カンマ編集 表示用

ポイント:PIC 9(5) は符号なしなので負の値は扱えません。カウントダウンで負になる可能性がある場合は PIC S9(5)(Sは符号付き)を使いましょう。

ADD文でカウントアップする

最も基本的なカウント方法はADD文です。指定した値をカウンタ変数に加算します。

COBOL – ADD文でカウントアップ
IDENTIFICATION DIVISION.
PROGRAM-ID. ADD-COUNT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNTER    PIC 9(5) VALUE 0.
01 WS-MAX        PIC 9(5) VALUE 5.

PROCEDURE DIVISION.
    PERFORM UNTIL WS-COUNTER >= WS-MAX
        *> カウンタに1を加算
        ADD 1 TO WS-COUNTER
        DISPLAY 'カウント: ' WS-COUNTER
    END-PERFORM
    STOP RUN.

実行結果

カウント: 00001
カウント: 00002
カウント: 00003
カウント: 00004
カウント: 00005

ADD文のバリエーション

COBOL – ADD文の書き方パターン
*> パターン1: 1を加算(最も基本)
ADD 1 TO WS-COUNTER

*> パターン2: 任意の値を加算
ADD 10 TO WS-COUNTER

*> パターン3: 変数同士の加算
ADD WS-VALUE TO WS-COUNTER

*> パターン4: 結果を別変数に格納
ADD WS-A WS-B GIVING WS-RESULT

*> パターン5: 複数変数を一度に加算
ADD 1 TO WS-COUNT-A WS-COUNT-B WS-COUNT-C

ADD文の使い分け

  • ADD 1 TO 変数:単純なインクリメント(最もよく使う)
  • ADD A TO B:B に A の値を加算(B が更新される)
  • ADD A B GIVING C:A + B の結果を C に格納(A, B は変わらない)

COMPUTE文でカウントする

COMPUTE文は算術式を使った計算が可能で、複雑なカウント処理に便利です。

COBOL – COMPUTE文でカウント
IDENTIFICATION DIVISION.
PROGRAM-ID. COMPUTE-COUNT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNTER    PIC 9(5) VALUE 0.
01 WS-STEP       PIC 9(3) VALUE 5.

PROCEDURE DIVISION.
    *> COMPUTE文で1を加算
    COMPUTE WS-COUNTER = WS-COUNTER + 1

    *> ステップ値で加算
    COMPUTE WS-COUNTER = WS-COUNTER + WS-STEP

    *> 複雑な計算も可能
    COMPUTE WS-COUNTER = (WS-COUNTER + 1) * 2

    DISPLAY '結果: ' WS-COUNTER
    STOP RUN.
方法 ADD文 COMPUTE文
書き方 ADD 1 TO CTR COMPUTE CTR = CTR + 1
四則演算 加算のみ 加減乗除すべて可
可読性 高い(シンプル) 中程度
推奨場面 単純な加算 複雑な算術式

PERFORM VARYINGでカウントする

PERFORM VARYINGは、他の言語のforループに相当するCOBOLの繰り返し構文です。カウンタ変数を自動的に増減できます。

COBOL – PERFORM VARYINGでカウント
IDENTIFICATION DIVISION.
PROGRAM-ID. VARYING-COUNT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INDEX      PIC 9(5) VALUE 0.

PROCEDURE DIVISION.
    *> 1から10まで1刻みでカウント
    PERFORM VARYING WS-INDEX
        FROM 1 BY 1
        UNTIL WS-INDEX > 10
        DISPLAY 'カウント: ' WS-INDEX
    END-PERFORM
    STOP RUN.

実行結果

カウント: 00001
カウント: 00002
カウント: 00003
  ...
カウント: 00010

ステップ値を変更する(2刻み・5刻み)

COBOL – ステップ値を変更
*> 2刻みでカウント(2, 4, 6, 8, 10)
PERFORM VARYING WS-INDEX
    FROM 2 BY 2
    UNTIL WS-INDEX > 10
    DISPLAY '偶数: ' WS-INDEX
END-PERFORM

*> 5刻みでカウント(0, 5, 10, 15, 20)
PERFORM VARYING WS-INDEX
    FROM 0 BY 5
    UNTIL WS-INDEX > 20
    DISPLAY '5刻み: ' WS-INDEX
END-PERFORM

DISPLAY文での表示方法

COBOLでカウント値を画面に表示するにはDISPLAY文を使います。そのまま表示すると先頭にゼロが付くため、PICTURE編集で表示を整えるのが一般的です。

COBOL – DISPLAY文の表示パターン
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT       PIC 9(5)    VALUE 1234.
01 WS-DISP-1      PIC ZZZZZ9.
01 WS-DISP-2      PIC ZZ,ZZ9.
01 WS-DISP-3      PIC 99999.

PROCEDURE DIVISION.
    *> そのまま表示(前ゼロ付き)
    DISPLAY 'そのまま  : ' WS-COUNT

    *> ゼロサプレス表示
    MOVE WS-COUNT TO WS-DISP-1
    DISPLAY 'ゼロ抑制  : ' WS-DISP-1

    *> カンマ区切り表示
    MOVE WS-COUNT TO WS-DISP-2
    DISPLAY 'カンマ付き: ' WS-DISP-2

    *> 固定桁数表示
    MOVE WS-COUNT TO WS-DISP-3
    DISPLAY '固定桁数  : ' WS-DISP-3

    STOP RUN.

実行結果

そのまま  : 01234
ゼロ抑制  :   1234
カンマ付き:  1,234
固定桁数  : 01234
PICTURE編集記号 意味 例(値=1234)
9 数字をそのまま表示 01234
Z 先頭ゼロをスペースに 1234
,(カンマ) 3桁区切りのカンマ 1,234
.(ピリオド) 小数点 1234.00
- 負の値のときマイナス表示 -1234

カウントダウンする方法

上限値から0に向かってカウントダウンする方法です。SUBTRACT文またはPERFORM VARYINGのBY -1を使います。

COBOL – カウントダウン(SUBTRACT文)
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNTER    PIC 9(5) VALUE 5.

PROCEDURE DIVISION.
    PERFORM UNTIL WS-COUNTER = 0
        DISPLAY 'カウントダウン: ' WS-COUNTER
        SUBTRACT 1 FROM WS-COUNTER
    END-PERFORM
    DISPLAY '完了!'
    STOP RUN.

実行結果

カウントダウン: 00005
カウントダウン: 00004
カウントダウン: 00003
カウントダウン: 00002
カウントダウン: 00001
完了!

PERFORM VARYINGでカウントダウン

COBOL – PERFORM VARYINGでカウントダウン
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INDEX      PIC S9(5) VALUE 0.

PROCEDURE DIVISION.
    *> 10から1までカウントダウン
    PERFORM VARYING WS-INDEX
        FROM 10 BY -1
        UNTIL WS-INDEX < 1
        DISPLAY 'カウントダウン: ' WS-INDEX
    END-PERFORM
    STOP RUN.

注意:カウントダウンで BY -1 を使う場合、カウンタ変数は符号付き(PIC S9)で定義してください。符号なし(PIC 9)だと負の値になったときにアンダーフローが発生する可能性があります。

条件付きカウント(IF文との組み合わせ)

特定の条件を満たすデータだけをカウントする方法です。IF文と組み合わせることで、条件付きカウントを実現します。

COBOL – 条件付きカウント(合格者数を数える)
IDENTIFICATION DIVISION.
PROGRAM-ID. CONDITIONAL-COUNT.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-SCORE-TABLE.
   05 WS-SCORES      PIC X(30)
      VALUE '085072091060045088076095068082'.
   05 WS-SCORE       PIC 9(3) OCCURS 10
      REDEFINES WS-SCORES.
01 WS-INDEX        PIC 9(2)  VALUE 0.
01 WS-PASS-COUNT   PIC 9(2)  VALUE 0.
01 WS-FAIL-COUNT   PIC 9(2)  VALUE 0.
01 WS-PASS-LINE    PIC 9(3)  VALUE 70.

PROCEDURE DIVISION.
    PERFORM VARYING WS-INDEX
        FROM 1 BY 1
        UNTIL WS-INDEX > 10
        IF WS-SCORE(WS-INDEX) >= WS-PASS-LINE
            ADD 1 TO WS-PASS-COUNT
        ELSE
            ADD 1 TO WS-FAIL-COUNT
        END-IF
    END-PERFORM

    DISPLAY '合格者数: ' WS-PASS-COUNT
    DISPLAY '不合格者数: ' WS-FAIL-COUNT
    STOP RUN.

実行結果

合格者数: 07
不合格者数: 03

EVALUATE文で複数条件のカウント

複数の条件に応じて異なるカウンタを更新する場合はEVALUATE文が便利です。

COBOL – EVALUATE文で評価別カウント
01 WS-GRADE-A     PIC 9(3) VALUE 0.
01 WS-GRADE-B     PIC 9(3) VALUE 0.
01 WS-GRADE-C     PIC 9(3) VALUE 0.

*> スコアに応じた評価別カウント
EVALUATE TRUE
    WHEN WS-SCORE(WS-INDEX) >= 90
        ADD 1 TO WS-GRADE-A
    WHEN WS-SCORE(WS-INDEX) >= 70
        ADD 1 TO WS-GRADE-B
    WHEN OTHER
        ADD 1 TO WS-GRADE-C
END-EVALUATE

ファイル読み込みレコード数カウント

実務で非常によく使うパターンです。ファイルからレコードを読み込みながら、処理件数をカウントします。

COBOL – ファイル読み込みレコード数カウント
IDENTIFICATION DIVISION.
PROGRAM-ID. FILE-COUNT-SAMPLE.

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT IN-FILE ASSIGN TO 'INPUT.DAT'
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD IN-FILE.
01 IN-RECORD       PIC X(80).

WORKING-STORAGE SECTION.
01 WS-EOF-FLAG     PIC 9     VALUE 0.
   88 WS-EOF                      VALUE 1.
01 WS-READ-COUNT   PIC 9(8)  VALUE 0.
01 WS-VALID-COUNT  PIC 9(8)  VALUE 0.
01 WS-ERROR-COUNT  PIC 9(8)  VALUE 0.
01 WS-DISP-READ    PIC ZZ,ZZZ,ZZ9.
01 WS-DISP-VALID   PIC ZZ,ZZZ,ZZ9.
01 WS-DISP-ERROR   PIC ZZ,ZZZ,ZZ9.

PROCEDURE DIVISION.
    OPEN INPUT IN-FILE
    READ IN-FILE
        AT END SET WS-EOF TO TRUE
    END-READ

    PERFORM UNTIL WS-EOF
        ADD 1 TO WS-READ-COUNT
        *> レコードの妥当性チェック
        IF IN-RECORD NOT = SPACES
            ADD 1 TO WS-VALID-COUNT
        ELSE
            ADD 1 TO WS-ERROR-COUNT
        END-IF
        READ IN-FILE
            AT END SET WS-EOF TO TRUE
        END-READ
    END-PERFORM

    *> 結果表示
    MOVE WS-READ-COUNT  TO WS-DISP-READ
    MOVE WS-VALID-COUNT TO WS-DISP-VALID
    MOVE WS-ERROR-COUNT TO WS-DISP-ERROR
    DISPLAY '読込件数: ' WS-DISP-READ
    DISPLAY '正常件数: ' WS-DISP-VALID
    DISPLAY 'エラー件数: ' WS-DISP-ERROR

    CLOSE IN-FILE
    STOP RUN.

実行結果

読込件数:      1,250
正常件数:      1,248
エラー件数:          2

ファイル読み込みカウントの実務ポイント

  • 88レベル条件名88 WS-EOF VALUE 1)を使うとEOF判定が読みやすくなる
  • 読込件数・正常件数・エラー件数の3つのカウンタを用意するのが基本パターン
  • 処理完了後は3つの整合性チェック(読込 = 正常 + エラー)を行うと安全

配列要素のカウント

配列(OCCURS句)の要素数をカウントする方法です。条件に合致する要素の数を数えるパターンを紹介します。

COBOL – 配列要素のカウント
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-PRODUCT-TABLE.
   05 WS-PRODUCT OCCURS 20 TIMES.
      10 WS-PROD-NAME   PIC X(20).
      10 WS-PROD-PRICE  PIC 9(7).
      10 WS-PROD-STOCK  PIC 9(5).
01 WS-TOTAL-ITEMS   PIC 9(3) VALUE 20.
01 WS-INDEX          PIC 9(3) VALUE 0.
01 WS-IN-STOCK-CTR   PIC 9(3) VALUE 0.
01 WS-OUT-STOCK-CTR  PIC 9(3) VALUE 0.

PROCEDURE DIVISION.
    *> 在庫あり/なしの商品数をカウント
    PERFORM VARYING WS-INDEX
        FROM 1 BY 1
        UNTIL WS-INDEX > WS-TOTAL-ITEMS
        IF WS-PROD-STOCK(WS-INDEX) > 0
            ADD 1 TO WS-IN-STOCK-CTR
        ELSE
            ADD 1 TO WS-OUT-STOCK-CTR
        END-IF
    END-PERFORM

    DISPLAY '在庫あり: ' WS-IN-STOCK-CTR ' 件'
    DISPLAY '在庫なし: ' WS-OUT-STOCK-CTR ' 件'
    STOP RUN.

INSPECT TALLYING(文字出現回数カウント)

INSPECT TALLYINGは、文字列中に特定の文字やパターンが何回出現するかをカウントする専用命令です。

COBOL – INSPECT TALLYING の基本
IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-COUNT-SAMPLE.

DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TEXT         PIC X(30)
   VALUE 'HELLO WORLD, HELLO COBOL!     '.
01 WS-TALLY        PIC 9(3) VALUE 0.

PROCEDURE DIVISION.
    *> パターン1: 特定文字の出現回数
    MOVE 0 TO WS-TALLY
    INSPECT WS-TEXT
        TALLYING WS-TALLY
        FOR ALL 'L'
    DISPLAY 'Lの出現回数: ' WS-TALLY

    *> パターン2: 文字列の出現回数
    MOVE 0 TO WS-TALLY
    INSPECT WS-TEXT
        TALLYING WS-TALLY
        FOR ALL 'HELLO'
    DISPLAY 'HELLOの出現回数: ' WS-TALLY

    *> パターン3: 全文字数のカウント
    MOVE 0 TO WS-TALLY
    INSPECT WS-TEXT
        TALLYING WS-TALLY
        FOR CHARACTERS
    DISPLAY '総文字数: ' WS-TALLY

    *> パターン4: 先頭のスペース数
    MOVE 0 TO WS-TALLY
    INSPECT WS-TEXT
        TALLYING WS-TALLY
        FOR LEADING SPACES
    DISPLAY '先頭スペース数: ' WS-TALLY

    STOP RUN.

実行結果

Lの出現回数: 005
HELLOの出現回数: 002
総文字数: 030
先頭スペース数: 000
INSPECT TALLYINGの種類 意味 使用例
FOR ALL すべての出現回数 特定文字の総数
FOR LEADING 先頭から連続する回数 先頭ゼロの数
FOR CHARACTERS 全文字数 文字列の長さ
BEFORE/AFTER 指定文字の前後で範囲限定 カンマ前の文字数

BEFORE/AFTERで範囲を限定する

COBOL – BEFORE/AFTERの使い方
01 WS-DATA    PIC X(20) VALUE 'ABCABC,DEFABC       '.
01 WS-CNT     PIC 9(3)  VALUE 0.

*> カンマより前の「ABC」の出現回数
INSPECT WS-DATA
    TALLYING WS-CNT
    FOR ALL 'ABC' BEFORE INITIAL ','
DISPLAY 'カンマ前のABC: ' WS-CNT
*> 結果: 002(カンマより前にABCが2回)

数値フォーマット(PICTURE編集の応用)

カウント結果を見やすく表示するためのPICTURE編集の応用パターンです。

COBOL – 数値フォーマットの応用パターン
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-COUNT        PIC 9(8)       VALUE 12345678.

*> 表示用変数(様々なフォーマット)
01 WS-FMT-ZERO    PIC 99999999.     *> 12345678
01 WS-FMT-SUPP    PIC ZZZZZZZZ9.    *> 12345678
01 WS-FMT-COMMA   PIC ZZ,ZZZ,ZZ9.   *> 12,345,678
01 WS-FMT-UNIT    PIC ZZ,ZZZ,ZZ9.   *> 12,345,678 件
01 WS-FMT-SIGN    PIC +ZZ,ZZZ,ZZ9.  *> +12,345,678

PROCEDURE DIVISION.
    MOVE WS-COUNT TO WS-FMT-ZERO
    MOVE WS-COUNT TO WS-FMT-SUPP
    MOVE WS-COUNT TO WS-FMT-COMMA
    MOVE WS-COUNT TO WS-FMT-UNIT
    MOVE WS-COUNT TO WS-FMT-SIGN

    DISPLAY '前ゼロ付き    : ' WS-FMT-ZERO
    DISPLAY 'ゼロサプレス  : ' WS-FMT-SUPP
    DISPLAY 'カンマ区切り  : ' WS-FMT-COMMA
    DISPLAY '単位付き      : ' WS-FMT-UNIT ' 件'
    DISPLAY '符号付き      : ' WS-FMT-SIGN
    STOP RUN.

実行結果

前ゼロ付き    : 12345678
ゼロサプレス  : 12345678
カンマ区切り  : 12,345,678
単位付き      : 12,345,678 件
符号付き      : +12,345,678

よくあるエラーと対処法

カウント処理で発生しやすいエラーとその対処法をまとめます。

SIZE ERROR(桁あふれ)

カウンタの桁数を超えた場合に発生します。

COBOL – SIZE ERRORの防止
*> NG: PIC 9(3) で 999 を超えるとエラー
01 WS-SMALL-CTR   PIC 9(3) VALUE 999.
ADD 1 TO WS-SMALL-CTR
*> → 000 に戻る(桁あふれ)

*> OK: ON SIZE ERROR で桁あふれを検出
ADD 1 TO WS-SMALL-CTR
    ON SIZE ERROR
        DISPLAY 'エラー: カウンタが桁あふれしました'
    NOT ON SIZE ERROR
        CONTINUE
END-ADD

注意:COBOLのデフォルト動作ではSIZE ERRORが発生してもプログラムは停止しません。桁あふれした値が「0」に戻るだけなので、必ず ON SIZE ERROR で検出しましょう。

カウンタの初期化忘れ

COBOL – カウンタの初期化
*> 方法1: VALUE句で初期化(定義時)
01 WS-COUNTER  PIC 9(5) VALUE 0.

*> 方法2: MOVE文で初期化(処理中)
MOVE 0 TO WS-COUNTER

*> 方法3: INITIALIZE文で初期化(グループ項目一括)
INITIALIZE WS-COUNTER

*> 方法4: INSPECT TALLYING の前は必ず初期化
MOVE 0 TO WS-TALLY
INSPECT WS-TEXT TALLYING WS-TALLY FOR ALL 'A'

無限ループ

COBOL – 無限ループの防止
*> NG: カウンタ更新を忘れて無限ループ
PERFORM UNTIL WS-COUNTER >= 10
    DISPLAY '処理中...'
    *> ADD 1 TO WS-COUNTER を忘れている!
END-PERFORM

*> OK: 安全策としてリミットカウンタを併用
01 WS-LIMIT     PIC 9(8) VALUE 0.
01 WS-MAX-LOOP  PIC 9(8) VALUE 1000000.

PERFORM UNTIL WS-COUNTER >= 10
    OR WS-LIMIT >= WS-MAX-LOOP
    ADD 1 TO WS-COUNTER
    ADD 1 TO WS-LIMIT
END-PERFORM

IF WS-LIMIT >= WS-MAX-LOOP
    DISPLAY '警告: ループ上限に到達しました'
END-IF
エラー 原因 対処法
桁あふれ(SIZE ERROR) PICの桁数不足 桁数を増やす / ON SIZE ERROR で検出
初期化忘れ VALUE句やMOVEの漏れ VALUE 0 を必ず指定
無限ループ ADD忘れ / 条件誤り リミットカウンタを併用
アンダーフロー 符号なしで負の値 PIC S9(符号付き)を使用
TALLYING値が不正 INSPECT前の初期化漏れ INSPECT前に MOVE 0 TO TALLY

実務で使えるカウントパターン集

業務アプリケーションで頻出するカウント処理のパターンをまとめます。

バッチ処理の処理件数レポート

COBOL – バッチ処理の件数レポート
WORKING-STORAGE SECTION.
01 WS-COUNTS.
   05 WS-INPUT-CNT    PIC 9(8) VALUE 0.
   05 WS-INSERT-CNT   PIC 9(8) VALUE 0.
   05 WS-UPDATE-CNT   PIC 9(8) VALUE 0.
   05 WS-DELETE-CNT   PIC 9(8) VALUE 0.
   05 WS-SKIP-CNT     PIC 9(8) VALUE 0.
   05 WS-ERROR-CNT    PIC 9(8) VALUE 0.
01 WS-DISP-COUNTS.
   05 WS-D-INPUT      PIC ZZ,ZZZ,ZZ9.
   05 WS-D-INSERT     PIC ZZ,ZZZ,ZZ9.
   05 WS-D-UPDATE     PIC ZZ,ZZZ,ZZ9.
   05 WS-D-DELETE     PIC ZZ,ZZZ,ZZ9.
   05 WS-D-SKIP       PIC ZZ,ZZZ,ZZ9.
   05 WS-D-ERROR      PIC ZZ,ZZZ,ZZ9.

*> 処理完了後のレポート出力
MOVE WS-INPUT-CNT  TO WS-D-INPUT
MOVE WS-INSERT-CNT TO WS-D-INSERT
MOVE WS-UPDATE-CNT TO WS-D-UPDATE
MOVE WS-DELETE-CNT TO WS-D-DELETE
MOVE WS-SKIP-CNT   TO WS-D-SKIP
MOVE WS-ERROR-CNT  TO WS-D-ERROR

DISPLAY '=============================='
DISPLAY '  処理結果レポート'
DISPLAY '=============================='
DISPLAY '入力件数    : ' WS-D-INPUT
DISPLAY '  登録件数  : ' WS-D-INSERT
DISPLAY '  更新件数  : ' WS-D-UPDATE
DISPLAY '  削除件数  : ' WS-D-DELETE
DISPLAY '  スキップ  : ' WS-D-SKIP
DISPLAY '  エラー件数: ' WS-D-ERROR
DISPLAY '=============================='

実行結果

==============================
  処理結果レポート
==============================
入力件数    :     10,500
  登録件数  :      8,200
  更新件数  :      1,850
  削除件数  :        100
  スキップ  :        300
  エラー件数:         50
==============================

進捗表示付きカウント

大量データの処理中に進捗状況を表示するパターンです。

COBOL – 進捗表示付きカウント
01 WS-PROC-COUNT   PIC 9(8)  VALUE 0.
01 WS-DISP-PROC    PIC ZZ,ZZZ,ZZ9.
01 WS-PROGRESS     PIC 9(8)  VALUE 0.

*> メイン処理ループ内
ADD 1 TO WS-PROC-COUNT

*> 1000件ごとに進捗表示
COMPUTE WS-PROGRESS =
    FUNCTION MOD(WS-PROC-COUNT, 1000)
IF WS-PROGRESS = 0
    MOVE WS-PROC-COUNT TO WS-DISP-PROC
    DISPLAY '処理中... ' WS-DISP-PROC ' 件完了'
END-IF

カウント方法の使い分け早見表

やりたいこと 使う命令 コード例
1ずつカウントアップ ADD ADD 1 TO CTR
計算式でカウント COMPUTE COMPUTE CTR = CTR + N
ループカウント PERFORM VARYING PERFORM VARYING I FROM 1 BY 1
カウントダウン SUBTRACT / BY -1 SUBTRACT 1 FROM CTR
条件付きカウント IF + ADD IF cond ADD 1 TO CTR
文字出現回数 INSPECT TALLYING INSPECT str TALLYING cnt FOR ALL "X"
ゼロサプレス表示 PIC Z + MOVE MOVE CTR TO PIC-Z
カンマ区切り表示 PIC ZZ,ZZ9 MOVE CTR TO PIC-COMMA

まとめ

COBOLのカウント処理について、基本から実務パターンまでを解説しました。

テーマ キーワード
カウンタ定義 PIC 9(n) VALUE 0
カウントアップ ADD 1 TO / COMPUTE
ループカウント PERFORM VARYING FROM BY UNTIL
カウントダウン SUBTRACT 1 FROM / BY -1
条件付きカウント IF 条件 ADD 1 TO
文字カウント INSPECT TALLYING FOR ALL
表示フォーマット PIC Z / PIC ZZ,ZZ9
エラー防止 ON SIZE ERROR / リミットカウンタ

カウント処理はシンプルですが、桁あふれ・初期化忘れ・無限ループの3つのエラーに注意が必要です。特に実務では、読込件数・正常件数・エラー件数の3カウンタを用意してバッチ処理の結果を正確に把握するパターンが欠かせません。

目的に合わせてADD文・COMPUTE文・PERFORM VARYING・INSPECT TALLYINGを使い分け、PICTURE編集で見やすく表示しましょう。