導入:なぜ今、RANGE関数なのか
COBOLの現場で長年コードを見ていると、最大値と最小値を個別に求めて、最後に引き算をしている箇所をよく見かけます。もちろん間違いではありませんが、コードが冗長になり、ミスも入り込みやすくなります。
今回紹介する「FUNCTION RANGE」は、データのばらつきを判定する際に、MAXとMINを個別に算出する手間を省き、一行で差分を導き出すための強力なツールです。保守性を高め、バグの温床を減らすために、ぜひ活用してください。
基礎知識:FUNCTION RANGEとは
FUNCTION RANGEは、引数として指定した数値群の中から最大値と最小値を見つけ出し、その差(MAX – MIN)を戻り値として返す組込関数です。
従来の手続き型プログラミングでは、ループを回して現在の値と最大・最小を比較し、フラグを立てて…といった処理が必要でしたが、これを使えばシステム側が最適化されたアルゴリズムで処理してくれるため、記述ミスが劇的に減ります。
実装・解決策
実装のポイントは「引数の渡し方」です。配列(テーブル)全体を対象とする場合は、添字に「ALL」を指定します。これにより、テーブル内の全要素を自動的に走査してくれます。
もし、特定の範囲だけ計算したい場合は、必要な要素だけを引数に並べることも可能です。ただし、実務ではテーブルデータに対する統計処理が多いため、まずは「ALL」指定のパターンをマスターしましょう。
サンプルプログラム
以下のコードは、売上データの配列から最大値と最小値の差(値の幅)を算出する例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. RANGE-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 5件の売上データを格納する配列
01 WS-SALES-TABLE.
05 WS-SALES PIC 9(5) OCCURS 5 TIMES VALUE 0.
01 WS-SPREAD PIC 9(5).
PROCEDURE DIVISION.
- テストデータのセット
MOVE 1000 TO WS-SALES(1).
MOVE 5000 TO WS-SALES(2).
MOVE 2000 TO WS-SALES(3).
MOVE 8000 TO WS-SALES(4).
MOVE 3000 TO WS-SALES(5).
- FUNCTION RANGEを使用して最大値と最小値の差を取得
- ここでは 8000 – 1000 = 7000 が結果として格納される
COMPUTE WS-SPREAD = FUNCTION RANGE(WS-SALES(ALL)).
DISPLAY “計算された売上の幅は: ” WS-SPREAD.
GOBACK.
応用・注意点
現場で活用する際に注意すべき点が2つあります。
1. データの初期化(ゼロ埋め):配列の一部しか使用していない場合、使用していない領域が初期値(0など)のままだと、RANGE関数がそれを最小値として認識してしまいます。計算対象の要素だけを確実に範囲に含めるか、未定義の領域を極端な値で埋めるなどの工夫が必要です。
2. データ型の一致:比較対象のデータ型が混在していると、コンパイラや実行環境によって予期せぬキャストが発生する可能性があります。対象配列は必ず同一のデータ型で定義するように心がけてください。
これらを押さえておけば、複雑なロジックを簡潔に保つことができます。ぜひ明日のコーディングから取り入れてみてください。

コメント