1. 導入:なぜ「カテゴリ指定」が必要なのか
現場で長年COBOLを触っていると、「集団項目の一部だけを初期化したい」という場面によく遭遇します。通常、INITIALIZE文を使うと集団項目全体が初期化されてしまい、残しておきたいデータまで消えてしまうことがあります。そんな時、個別にMOVE文を書くのはコードが冗長になり、保守性も下がります。COBOL 2002から導入された「カテゴリ指定」を使えば、特定の属性を持つ項目だけを効率的にリセットでき、コードの可読性を劇的に向上させることが可能です。
2. 基礎知識:カテゴリとは何か
COBOLのデータ項目には、PICTURE句によって定義される「カテゴリ」が存在します。
・NUMERIC: 数字項目(9のみで構成)
・ALPHABETIC: 英字項目(Aのみで構成)
・ALPHANUMERIC: 英数字項目(Xで構成)
INITIALIZE文にこれらのカテゴリを指定することで、コンパイラは集団項目の中を走査し、合致する属性を持つ項目だけを対象に初期化を行います。これにより、論理的に関連するデータ群の中で、数値データだけをゼロクリアするといった精密な操作が可能になります。
3. 実装/解決策:特定のデータ型を狙い撃つ
実装手順は非常にシンプルです。INITIALIZE文の後に、対象としたい集団項目名、そしてキーワード「ALL」、最後に「NUMERIC」などのカテゴリを指定するだけです。これにより、集団項目内の全項目をチェックし、数値項目だけが初期値(通常は0)に設定されます。
4. サンプルプログラム
以下は、売上データ管理を想定したサンプルコードです。氏名やIDはそのままに、金額データだけをリセットする処理を記述しています。
000200 05 WS-USER-ID PIC X(05).
000300 05 WS-USER-NAME PIC X(20).
000400 05 WS-PRICE-1 PIC 9(07).
000500 05 WS-PRICE-2 PIC 9(07).
000600
000700 PROCEDURE DIVISION.
000800 — 初期化処理 —
000900 WS-USER-IDとNAMEはそのままに、数値項目のみ初期化する
001000 INITIALIZE WS-SALES-DATA ALL NUMERIC.
001100
001200 DISPLAY ‘初期化完了。WS-PRICE項目が0になっています。’.
5. 応用・注意点:現場でハマらないために
この機能を使う際の注意点が二つあります。
一つ目は、「COMP-3(パック十進数)」などもNUMERICに含まれる点です。意図しない計算項目までゼロクリアされないか、事前にデータ定義を確認してください。
二つ目は、「REDEFINES」句との兼ね合いです。再定義された項目が混在する集団項目に対して使用する場合、思わぬ範囲まで初期化される可能性があるため、複雑な構造体に対してはテスト環境で動作を確認することが鉄則です。
適切に使えば、MOVE文の羅列から解放され、より洗練された保守性の高いプログラムが書けます。ぜひ次の改修から取り入れてみてください。

コメント