1. 導入:なぜCLASS句が重要なのか
COBOLで業務プログラムを書いていると、頻繁に直面するのが「入力データのチェック」です。例えば「この項目には英大文字とスペースしか入ってはいけない」というルールがある場合、皆さんはどのように書いていますか?
IF文で「A以上かつZ以下、またはスペース」と条件を羅列するのは、コードが長くなり、何より後から見た時に意図が伝わりにくいものです。
今回紹介するCLASS句(特殊名)を使えば、条件に名前を付けて、まるで英語の文章を読むようにスマートに記述できるようになります。
2. 基礎知識:CLASS句とは?
CLASS句は、Environment DivisionのSPECIAL-NAMES段落で定義します。
一言で言えば、「特定の文字の集まりに、自分たちで名前(クラス名)を付ける機能」です。
一度定義してしまえば、Procedure Divisionで「IF データ名 IS クラス名」という非常にシンプルな形式で判定ができるようになります。これにより、コードの保守性が格段に向上します。
3. 実装/解決策:定義と判定の仕組み
まず、SPECIAL-NAMES段落で対象となる文字の範囲を指定します。
例として「英大文字(A~Z)」と「スペース」を許可するクラス「UPPER-CASE-ONLY」を作成する場合、以下のように定義します。
SPECIAL-NAMES.
CLASS UPPER-CASE-ONLY IS “A” THRU “Z”, ” “.
あとは、Procedure Divisionでこの名前を使って判定を行うだけです。複雑なOR条件を何度も書く必要はありません。
4. サンプルプログラム
以下のコードを参考にしてください。そのままコピー&ペーストして動作確認が可能です。
IDENTIFICATION DIVISION.
PROGRAM-ID. CLASS-SAMPLE.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
- ここでクラス名を定義します
SPECIAL-NAMES.
CLASS UPPER-CASE-ONLY IS “A” THRU “Z”, ” “.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-INPUT-DATA PIC X(5) VALUE “HELLO”.
PROCEDURE DIVISION.
- 判定の実施
IF WS-INPUT-DATA IS UPPER-CASE-ONLY
DISPLAY “入力データは英大文字とスペースのみです:正常”
ELSE
DISPLAY “不正な文字が含まれています:エラー”
END-IF.
STOP RUN.
5. 応用・注意点:現場で役立つヒント
注意点1:文字セットの範囲指定
THRUを使う際は、EBCDICなどの文字コード順序に基づいていることに注意してください。意図しない文字が含まれていないか、開発環境のコード体系を改めて確認しましょう。
応用:共通化のすすめ
現場では、よく使う入力ルール(英数字、数値のみ、全角カタカナなど)をCOPY句として作成し、複数のプログラムで共有するのが一般的です。そうすることで、仕様変更があった際も1箇所の修正で全プログラムに対応できます。
陥りやすいバグ
「IS CLASS名」は、項目全体がそのクラスに含まれている必要があります。一部でも含まれない文字があると偽(FALSE)となります。「一部でも含まれていたらOK」という条件とは異なりますので、要件に合わせて使い分けてください。
慣れると手放せなくなる便利な機能です。ぜひ皆さんのプログラムでも活用してみてください!

コメント