1. 導入:なぜ「累積」を知っておく必要があるのか
COBOLのベテランとして現場を見ていると、初心者がよく陥るミスの一つに「INSPECT TALLYING命令のカウンタが意図せず増え続けてしまう」という現象があります。例えば、複数の項目を調べてその合計を出したいのに、前の結果が残っていて数字が合わない……といったケースです。実は、INSPECT TALLYINGには「値をゼロクリアしない」という設計思想があります。この特性を理解すれば、バグを防ぐだけでなく、複数の条件をまとめて集計する高度な処理も可能になります。
2. 基礎知識:INSPECT TALLYINGの仕組み
INSPECT命令は、文字列内の文字をカウントしたり置換したりするための強力なツールです。中でもTALLYING句は、指定した文字が何回出現したかを数え、その結果を「受取り側(カウンタ)」の変数に格納します。
ここで重要なのが、この命令はカウンタの値を「上書き」するのではなく、「加算」するという点です。つまり、カウンタに初期値が入っていれば、その値に新しいカウント結果が積み上げられていきます。この「累積性」こそが、COBOLが事務処理計算を得意とする理由の一つでもあるのです。
3. 実装/解決策:カウンタの管理術
この「勝手に初期化されない」挙動を制御するための鉄則は、「計算の開始前に、必ず明示的にゼロをMOVEする」ことです。ループ処理の中で繰り返しカウントを行う場合は、各ループの先頭で必ず初期化を行いましょう。逆に、複数の項目を調べて合計値を出したい場合は、初期化せずに連続してINSPECTを実行することで、自然と集計が完成します。
4. サンプルプログラム:動作確認用コード
以下は、文字列の中から「A」と「B」の合計出現数をカウントするサンプルです。動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. INSPECT-SAMPLE.
WORKING-STORAGE SECTION.
01 WS-TARGET-STR PIC X(10) VALUE “ABACABA”.
01 WS-TOTAL-CNT PIC 9(02).
PROCEDURE DIVISION.
MAIN-PROCEDURE.
- 1. まず必ずゼロで初期化する
MOVE 0 TO WS-TOTAL-CNT.
- 2. 「A」の数を数える(この時点では3)
INSPECT WS-TARGET-STR TALLYING WS-TOTAL-CNT FOR ALL “A”.
- 3. 続けて「B」の数を数える(累積されるので 3 + 2 = 5 となる)
INSPECT WS-TARGET-STR TALLYING WS-TOTAL-CNT FOR ALL “B”.
DISPLAY “合計出現回数は: ” WS-TOTAL-CNT.
STOP RUN.
5. 応用・注意点:現場で役立つポイント
現場での開発で特に注意すべきは、「サブルーチンや繰り返しループ内でのリセット漏れ」です。
プログラムが長くなると、どこで変数を使っているか追いきれなくなることがあります。もし特定の変数を「使い回し」て集計しているなら、処理の直前で必ず「INITIALIZE」命令や「MOVE 0」を使ってクリーンな状態にしてください。
また、逆に「複数の異なる文字列から特定の文字を合計したい」という場合は、この累積性を逆手に取り、一度もゼロクリアせずに複数のINSPECT文を並べることで、効率的に集計を行うことができます。この「意図した累積」と「意図しない累積」の区別を意識するだけで、あなたのコードの品質はぐっと向上しますよ。

コメント