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.
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編集で見やすく表示しましょう。