【COBOL学習|初心者向け】IF文で全桁チェック!ALL表意定数でデータ操作の作法をマスターしよう

皆さん、こんにちは!ベテランCOBOL技術者の〇〇です。
今回は、COBOLのIF文を使ったデータ操作の基本中の基本、「ALL表意定数」についてお話しします。

1. なぜALL表意定数が重要なのか?

データ処理をしていると、「ある項目が全て特定の文字で埋まっているか」をチェックしたい場面がよくありますよね?例えば、

  • 入力されたデータが初期値(空白など)のままで変更されていないか?
  • 一時的にデータを「\」などでマスクして、後で元に戻せるようにしたい。
  • 特定のパターンで埋め尽くされているか確認したい。

このような時、1文字ずつループでチェックするのは手間がかかりますし、コードも長くなりがちです。ALL表意定数を使えば、そんな面倒な処理をたった一行で、しかも分かりやすく記述できるんです。これが、効率的で意図が伝わりやすい「データ操作の作法」というわけです。

2. ALL表意定数ってなんだ?

ALL表意定数とは、COBOLで用意されている特別な書き方で、「指定した文字を、指定した回数だけ繰り返した文字列」を表現するものです。

例えば、

  • `ALL “”` は、`”“` のように、アスタリスク(\)が繰り返された文字列を意味します。
  • `ALL SPACES` は、`” “` のように、スペースが繰り返された文字列を意味します。(SPACESはCOBOLの予約語で、空白を表します。)

これらをIF文で使うことで、項目の内容をまとめて判定できるのです。

3. ALL表意定数を使った実装方法

ALL表意定数を使う一番簡単な方法は、IF文の条件式で直接指定することです。
例えば、作業用項目 `WS-STR` が全てアスタリスク(\)で埋められているか確認したい場合は、次のように書きます。

IF WS-STR = ALL “”
DISPLAY “WS-STRは全てアスタリスクです。”
END-IF.

また、作業用バッファ `WS-BUFFER` が全てスペースで埋められているか確認したい場合は、このように書きます。

IF WS-BUFFER = ALL SPACES
DISPLAY “WS-BUFFERは全てスペースです。”
END-IF.

この書き方だと、ループ処理を書く必要がなく、コードがスッキリしますよね。

4. サンプルプログラム

では、実際にALL表意定数を使った簡単なサンプルプログラムを見てみましょう。

IDENTIFICATION DIVISION.
PROGRAM-ID. ALL-EXAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-TEST-AREA1 PIC X(10) VALUE ALL “”.
01 WS-TEST-AREA2 PIC X(10) VALUE “ABCDEFGHIJ”.
01 WS-TEST-AREA3 PIC X(10) VALUE SPACES.
01 WS-TEST-AREA4 PIC X(10) VALUE ““.
01 WS-TEST-AREA5 PIC X(5) VALUE ALL ” “.

PROCEDURE DIVISION.
MAIN-LOGIC.
DISPLAY “— ALL表意定数テスト開始 —“.

> AREA1 (全てアスタリスク) のテスト
IF WS-TEST-AREA1 = ALL “”
DISPLAY “WS-TEST-AREA1 は期待通り全てアスタリスクです。”
ELSE
DISPLAY “WS-TEST-AREA1 のチェックで問題発生!”
END-IF.

> AREA2 (アスタリスクではない) のテスト
IF WS-TEST-AREA2 = ALL “”
DISPLAY “WS-TEST-AREA2 は全てアスタリスクです。(これは間違い)”
ELSE
DISPLAY “WS-TEST-AREA2 は全てアスタリスクではありません。 (正解)”
END-IF.

> AREA3 (全てスペース) のテスト
IF WS-TEST-AREA3 = ALL SPACES
DISPLAY “WS-TEST-AREA3 は期待通り全てスペースです。”
ELSE
DISPLAY “WS-TEST-AREA3 のチェックで問題発生!”
END-IF.

> AREA4 (ALL “” と同じ内容) のテスト
IF WS-TEST-AREA4 = ALL “”
DISPLAY “WS-TEST-AREA4 は期待通り全てアスタリスクです。”
ELSE
DISPLAY “WS-TEST-AREA4 のチェックで問題発生!”
END-IF.

> AREA5 (ALL SPACES と同じ内容) のテスト
IF WS-TEST-AREA5 = ALL SPACES
DISPLAY “WS-TEST-AREA5 は期待通り全てスペースです。”
ELSE
DISPLAY “WS-TEST-AREA5 のチェックで問題発生!”
END-IF.

> 補足: ALL表意定数の繰り返し回数は、比較対象の項目の長さに依存します。
> 例: PIC X(5) の項目を ALL “” で比較した場合、”” と比較されます。
> PIC X(10) の項目を ALL “” で比較した場合、”” と比較されます。
IF WS-TEST-AREA5 = ALL “”
DISPLAY “WS-TEST-AREA5 は全てアスタリスクです。(これは間違い)”
ELSE
DISPLAY “WS-TEST-AREA5 は全てアスタリスクではありません。 (正解)”
END-IF.

DISPLAY “— ALL表意定数テスト終了 —“.
STOP RUN.

このサンプルでは、`WS-TEST-AREA1` には `ALL “”` で初期値を設定しています。`WS-TEST-AREA2` は通常の文字列です。`WS-TEST-AREA3` には `SPACES` で初期値を設定しています。
それぞれの項目に対して `ALL “”` や `ALL SPACES` と比較し、正しく判定できるかを確認しています。
特に最後の `WS-TEST-AREA5` の例で、ALL表意定数の繰り返し回数が比較対象の項目の長さに依存することが分かります。

5. 応用と注意点

  • 項目の長さ: ALL表意定数で比較する際、指定した表意定数の繰り返し回数は、比較対象となる項目の長さに自動的に合わせられます。例えば、`PIC X(10)` の項目を `ALL “”` と比較すると、COBOL内部では `` という10文字の文字列として扱われます。
  • 大文字・小文字: 文字列比較では、大文字と小文字は区別されます。もし、大文字・小文字を区別せずに比較したい場合は、事前に `UPPER-CASE` 関数などを使って文字列を統一する処理が必要になります。(ただし、COBOLの標準機能で直接指定するより、データ定義で工夫する方が一般的な場合もあります。)
  • 数値項目との比較: ALL表意定数は基本的に英数字項目(PIC X)に対して使用します。数値項目(PIC 9など)に対して直接ALL表意定数と比較することはできません。数値項目の場合は、数値としての比較(例: `IF WS-NUM = ZERO` など)を行うか、一旦英数字項目に変換してから比較する必要があります。

ALL表意定数は、IF文でのデータチェックを簡潔かつ効率的に行うための非常に便利な機能です。ぜひマスターして、あなたのCOBOLコーディングに役立ててください!

コメント

タイトルとURLをコピーしました